如何在烧瓶中接受空的URL路由?

时间:2019-05-11 06:44:50

标签: python python-3.x http flask

我正在使用无法更改固件的硬件机器。我应该从他们那里做一个服务器,我唯一可以配置的就是IP和端口。

对于初学者来说,我在Flask中制作了以下服务器

from flask import Flask

app = Flask(__name__)


@app.route("/" ,methods=['GET', 'POST', 'DELETE', 'PATCH'])
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run(host='0.0.0.0',port=5000)

我遇到308错误:

error 308

然后,我使用以下通用网址方法来帮助解决我的情况。

from flask import Flask

app = Flask(__name__)


@app.route("/", defaults={"path": ""},methods=['GET', 'POST', 'DELETE', 'PATCH'])
@app.route("/<string:path>",methods=['GET', 'POST', 'DELETE', 'PATCH'])
@app.route("/<path:path>",methods=['GET', 'POST', 'DELETE', 'PATCH'])
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run(host='0.0.0.0',port=5000)

但是,我仍然遇到相同的错误:

the error

2 个答案:

答案 0 :(得分:0)

由于我还没有50个声望,所以我无法发表评论,所以我将其留在这里。

您要对路径使用path变量:

“创建为所有包含/的URL服务的Catch-All函数的一种简单方法是链接两个路由过滤器。一个用于根路径'/',另一个用于路径占位符。

我们不能只使用一个包含路径占位符的路由过滤器,因为每个占位符必须至少捕获一个字符。”

from flask import Flask
app = Flask(__name__)

@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def catch_all(path):
    return 'You want path: %s' % path

if __name__ == '__main__':
    app.run()

% curl 127.0.0.1:5000          # Matches the first rule
You want path:  
% curl 127.0.0.1:5000/foo/bar  # Matches the second rule
You want path: foo/bar

http://flask.pocoo.org/snippets/57/

答案 1 :(得分:0)

如果您坚持使用空路由,只需将 app.route 设置为 strict_slashes=False,如下所示:

from flask import reqeust
@app.route('/', methods = ['GET','POST','DELETE', 'PATCH'], 
           strict_slashes=False)
def hello():
    return f"hello, {request.method}"

由于 Flask 使用 werkzeug.routing.Rule,默认情况下启用 strict_slashes,因此访问没有尾部斜杠的分支 URL 将重定向到附加斜杠的 URL。这会导致响应 308(永久重定向)。

参考:https://werkzeug.palletsprojects.com/en/1.0.x/routing/