当URL具有get参数

时间:2015-07-06 23:56:47

标签: python flask chromium

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))

1 个答案:

答案 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 -