【问题标题】:Flask - url_for automatically escapes '=' to '%3D'Flask - url_for 自动将“=”转义为“%3D”
【发布时间】:2016-07-10 21:38:49
【问题描述】:

所以.. 我对 Flask 的 url_for 有一些问题。该代码仍然有效.. 但是当用户导航到由 url_for 生成的链接时,该链接在地址栏中看起来很糟糕。

也就是说,我有一个装饰视图函数如下:

@app.route("/")
@app.route("/page=<int:number")
def index(number=0):
    return "Index Page: {}".format(number)

这一切都很好,除非我尝试为该路由生成一个 url。调用:

url_for("index", number=10)

产量:domain.tld:80/page%3D10

有没有办法绕过这个问题?当它内置到路由本身时,我希望返回 '=' 而不是 '%3D'。

当我在断言中测试它并发现路由最终与我预期的不同时,我才注意到它正在这样做。

目前,我的测试用例通过使用 urllib.parse.unquote 修复 url 以进行测试来规避该问题。我可能只对所有网址都这样做,因为我不会有任何用户输入来担心导致问题的那些..但它的存在是有原因的......:P

【问题讨论】:

    标签: python-3.x flask


    【解决方案1】:

    您可以选择不将参数构建到路由本身,而是使用查询参数:

    from flask import Flask, render_template, request, url_for
    
    app = Flask(__name__)
    
    @app.route("/")
    def index():
        page = request.args.get('page', 0, type=int)
        print(url_for("index", page=10)) # yields /?page=10
        return "Index Page: {}".format(page)
    
    app.run(debug=True)
    

    我对路由使用查询参数,你避免了Flask在路由定义中编码=符号的问题。

    【讨论】:

    • 这可以工作..但它会导致一个函数负责许多路由,因为我还在那个下面定义了一个@app.route("/post=&lt;int:number&gt;")...所以对于我的用例来说它没有t 实际上解决了我的问题.. 而是.. 它使视图逻辑更加复杂。
    • 最终,我决定采用这个解决方案并重写我的路线。主要是因为即使我可以使用一些 lua-esque 模式来重新分配 flask.url_for 函数并将其更改为可以纠正此错误的东西……但为了一点点收获要做很多工作。此外,重写我的路线让我在未来可以更灵活地使用参数,所以我会继续这样做。
    猜你喜欢
    • 2015-02-02
    • 2015-11-21
    • 2016-10-18
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    相关资源
    最近更新 更多