【问题标题】:passing a website as a parameter in REST API python; error with "/" [duplicate]在 REST API python 中将网站作为参数传递; “/”错误[重复]
【发布时间】:2021-12-18 19:57:25
【问题描述】:

我正在尝试将网站作为参数传递。如果网站中没有“/”,它就可以工作。例如:http://192.168.1.156:2434/www.cookinglight.com 刮取其页面上所有图像的烹饪灯;但是,如果我传入http://192.168.1.156:2434/https://www.cookinglight.com/recipes/chicken-apple-butternut-squash-soup,则会收到无效响应。这是我当前的代码:

import json
from flask import Flask, render_template

from imagescraper import image_scraper

app = Flask(__name__)

@app.route("/", methods = ['GET'])
def home():
    return render_template('index.html')

@app.route("/<site>", methods = ['GET'])
def get_image(site):
    return json.dumps(image_scraper(site))


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=2434, debug=True)
import requests
from bs4 import BeautifulSoup


def image_scraper(site):
    """scrapes user inputed url for all images on a website and
    :param http url ex. https://www.cookinglight.com
    :return dictionary key:alt text; value: source link"""
    search = site.strip()
    search = search.replace(' ', '+')

    website = 'https://' + search
    response = requests.get(website)

    soup = BeautifulSoup(response.text, 'html.parser')
    img_tags = soup.find_all('img')
    # create dictionary to add image alt tag and source link
    images = {}
    for img in img_tags:
        try:
            name = img['alt']
            link = img['src']
            images[name] = link
        except:
            pass
    return images

我尝试了 urlllib,但没有任何成功。任何帮助将不胜感激!我是学生所以还在学习!!

更新:

我相信这是 stackoverflow 帖子中描述的问题

Need to allow encoded slashes on Apache

【问题讨论】:

  • 对网站 URL 进行 URL 编码。
  • 如果您使用/ 发送网址,那么它会尝试查找类似route("/&lt;arg1&gt;/&lt;arg2&gt;/&lt;arg3&gt;") 的路由,这会产生问题 - 您必须将/ 转换为代码%hex。或以/?site=your_url 发送,然后以request.args["site"] 获取它
  • 如果您收到invalid response,则将此有问题的回复(不在 cmets 中)显示为文本。我们不会运行代码来查看invalid response 并且我们无法在您的脑海中阅读。
  • 总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是截图,不是链接到外部门户)有问题(不是评论)。还有其他有用的信息。
  • 这是错误:未找到服务器上未找到请求的 URL。如果您手动输入了 URL,请检查您的拼写并重试。

标签: python api rest flask


【解决方案1】:

Flask 使用 / 作为 url 中的参数之间的分隔符 - 因此您可以创建 route("/&lt;arg1&gt;/&lt;arg2&gt;/&lt;arg3&gt;")(或在博客中流行的 route("/&lt;year&gt;/&lt;month&gt;/&lt;day&gt;"))并且您可以在变量 arg1arg2、@987654330 中获取值@ - 当您尝试将您的网址与/ 一起使用时,它也会将其视为"/&lt;arg1&gt;/&lt;arg2&gt;/&lt;arg3&gt;" 并尝试查找类似route("/&lt;arg1&gt;/&lt;arg2&gt;/&lt;arg3&gt;") 的路线,但找不到它并给出错误404

route("/&lt;site&gt;") 只能匹配没有/ 的字符串。 site 只是变量名 - 这并不意味着它会将其视为带有/ 的url

如果你想使用/ 作为单个参数的一部分,而不是作为参数之间的分隔符,那么你需要&lt;path:site&gt;

from flask import Flask

app = Flask(__name__)

@app.route("/")
def home():
    return "Hello World"

@app.route("/<path:site>")
def get_image(site):
    return f"OK: {site}"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=2434)#, debug=True)

另见Variable Rules


编辑:

issue 无关。 Flask 是专门为使用 / 作为特殊字符来分隔值而创建的。

【讨论】:

  • 谢谢,但我认为这是根本问题:stackoverflow.com/questions/4390436/…
  • 这不是潜在的问题,但烧瓶被创建为使用 / 作为参数之间的分隔符。
  • 如果您使用https://www.cookinglight.com/recipes/chicken-apple-butternut-squash-soup,那么flask 将其视为5 个参数"http:"""www.cookinglight.comrecipeschicken-apple-butternut-squash-soup - 它不匹配/&lt;site&gt; 只需要一个参数而不需要 /。并且flask 具有path: 将其作为单个参数与所有/
猜你喜欢
  • 2019-08-12
  • 1970-01-01
  • 2013-08-13
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 2021-10-04
相关资源
最近更新 更多