Flask似乎没有在每个案例中的get参数之前在url端添加斜杠。但只是在这种情况下这样做。
它将/ users?uid = 1更改为/ users /?uid = 1
将其更改为tha后,它甚至会给我404错误。 “在服务器上找不到请求的URL。如果您手动输入了URL,请检查拼写并重试。”
以下是代码:
from flask import Flask, render_template, jsonify, Response, request
app = Flask(__name__)
@app.route("/users")
@app.route("/post")
@app.route("/bookmarks")
@app.route("/<target>")
def category_browser(target = ""):
if(target != "" and target not in ['categories']):
return render_template("404.html")
else:
return render_template("view.html")
if(__name__ == "__main__"):
app.debug = True;
app.run(port=int(80))
答案 0 :(得分:1)
当您将路由定义为@app.route("/users/")
时,您在Chromium的实例中有一个陈旧的缓存条目。您之后更改为@app.route("/users")
,Chrome仍将其缓存为尾随/
。尝试使用隐身模式访问此简单示例,并查看/users?uid=1
保持不变且未报告404。这是我最初第一次访问它时发生的事情(使用Chrome 42)。
127.0.0.1 - - [07/Jul/2015 14:02:39] "GET /users?target=1 HTTP/1.1" 200 -
然后停止该脚本(感谢完整的几乎自包含的示例)并将@app.route("/users/")
添加到路由列表中,下面原始@app.route("/users/")
路由(要有更高的优先顺序,以便Flask首先触发重定向),即:
@app.route("/users")
@app.route("/users/")
(或者只是删除@app.route("/users")
装饰者)
现在尝试在隐身会话中再次访问同一页面,请注意在您的控制台中:
127.0.0.1 - - [07/Jul/2015 14:04:11] "GET /users?target=1 HTTP/1.1" 301 -
127.0.0.1 - - [07/Jul/2015 14:04:11] "GET /users/?target=1 HTTP/1.1" 200 -
啊,你的重定向。删除我们刚添加的额外行,再次尝试/users?target=1
,这就是:
127.0.0.1 - - [07/Jul/2015 14:07:22] "GET /users/?target=1 HTTP/1.1" 404 -
Chrome会根据隐身模式中的缓存条目默默地将网址重写为/users/?target=1
,并且会反映,因为只有该网址会显示在Flask访问日志中。
如果您希望同时支持这两种方法,则必须这样做:
@app.route("/users/")
@app.route("/users")
然后两种访问方法都有效:
127.0.0.1 - - [07/Jul/2015 14:08:49] "GET /users/?target=1 HTTP/1.1" 200 -
127.0.0.1 - - [07/Jul/2015 14:08:59] "GET /users?target=1 HTTP/1.1" 200 -
而不是导致:
127.0.0.1 - - [07/Jul/2015 14:10:00] "GET /users?target=1 HTTP/1.1" 301 -
127.0.0.1 - - [07/Jul/2015 14:10:00] "GET /users/?target=1 HTTP/1.1" 200 -