【问题标题】:Multiple URL segment in Flask and other Python frameowrksFlask 和其他 Python 框架中的多个 URL 段
【发布时间】:2012-06-02 10:46:12
【问题描述】:

我正在 Bottle 和 Flask 中构建一个应用程序,看看我更喜欢哪个,因为 Django 的“包含电池”太多了。

我已经阅读了两者的路由文档,这些文档非常清晰易懂,但我正在努力寻找一种方法来处理未知的、可能无限数量的 URL 段。即:

http://www.example.com/seg1/seg2/seg3/seg4/seg5.....

我正在考虑使用类似的东西

@app.route(/< path:fullurl >)
使用正则表达式删除不需要的字符并将 fullurl 字符串拆分为与段数相同长度的列表,但这似乎非常低效。

大多数 PHP 框架似乎都有一种构建段变量名称数组的方法,无论数量如何,但 Flask、Bottle 或 Django 似乎都没有类似的选项,我似乎需要指定确切的段数捕获变量。几个 PHP cms 似乎立即将前 9 个段作为变量收集,任何不再作为完整路径传递的内容,然后按照我上面提到的方式进行分解。

我不了解 URL 路由中的工作方式吗?字符串拆分方法真的效率低下还是最好的方法?或者,有没有办法将未知数量的段直接收集到 Flask 中的变量中?

我是 Python 框架的新手,所以五岁的孩子的解释会有所帮助,

非常感谢。

【问题讨论】:

    标签: python frameworks flask


    【解决方案1】:

    拆分字符串不会给您的程序带来任何低效率。就性能而言,它是框架完成的 URL 处理的一个微不足道的补充。它也适合一行代码。

    @app.route('/<path:fullurl>')
    def my_view(fullurl):
        params = fullurl.split('/')
    

    【讨论】:

    • 感谢您的性能建议,我目前正在构建的网站一般访问者很少,但每月两次,它在不到一小时的时间内就吸引了数千名访问者,因此页面响应时间很重要这段时间。
    • 建议的解决方案是可行的方法。如果处理更加困难并且您将在多个地方使用,您还可以定义自定义转换器。相关文档在这里:flask.pocoo.org/docs/0.12/api/#url-route-registrations
    【解决方案2】:

    我本人对 Flask 还很陌生,但从我目前的工作来看,我很确定这个想法是你有很多小的路由/视图方法,而不是一个巨大的切换野兽.

    例如,如果您有这样的网址:

    http://example.com/unit/57/
    http://example.com/unit/57/page/23/
    http://example.com/unit/57/page/23/edit
    

    你会这样路由它:

    @app.route('/unit/<int:unit_number>/')
    def display_unit(unit_number):
        ...
    
    @app.route('/unit/<int:unit_number>/page/<int:page_number>/')
    def display_page(unit_number, page_number):
        ...
    
    @app.route('/unit/<int:unit_number>/page/<int:page_number>/edit')
    def page_editor(unit_number, page_number):
        ...
    

    这样做有助于在您的应用程序中保留某种结构并依赖框架来路由内容,而不是获取 URL 并自己完成所有路由。然后,您还可以使用蓝图来处理不同的功能。

    我承认,我很难想到在 URL 中可能需要无限数量的部分?

    【讨论】:

    • 我一直在研究一些 CMS 系统,它们在其功能中列出了无限的细分市场,因为我正在构建的网站有 11 个细分市场。我还想在其他项目中重新使用基本系统,并希望确保我能走上正轨。不过,我现在要稍微重构一下网站,多亏您的建议,我将使用多路由 Flask 装饰器和几个页面处理程序/调度程序。
    【解决方案3】:

    有效:

    @app.route("/login/<user>/<password>")
    def login(user, password):
        app.logger.error('An error occurred')
        app.logger.error(password)
        return "user : %s password : %s" % (user, password)
    

    然后:

    http://example.com:5000/login/jack/hi

    输出:

    user : jack password : hi
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-16
      • 2013-01-13
      • 2021-11-25
      • 2012-10-18
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多