【问题标题】:modify flask url before routing在路由前修改烧瓶 url
【发布时间】:2017-11-22 22:32:30
【问题描述】:

我的 Flask 应用程序的 url 路由定义为

self.add_url_rule('/api/1/accounts/<id_>', view_func=self.accounts, methods=['GET'])

问题是对这个应用程序进行查询的应用程序之一在 /api/1//accounts/id 之类的 url 中添加了额外的 /。我无法更正发出此类查询的应用程序,因此我无法更改它。

为了解决这个问题,目前我已经添加了多个规则

self.add_url_rule('/api/1/accounts/<id_>', view_func=self.accounts, methods=['GET'])
self.add_url_rule('/api/1//accounts/<id_>', view_func=self.accounts, methods=['GET'])

这样的路线有很多,这是一种丑陋的解决方法。烧瓶中有没有办法在 URL 到达路由逻辑之前修改它?

【问题讨论】:

    标签: python python-2.7 url flask


    【解决方案1】:

    我会在路径到达 Flask 之前对其进行规范化,方法是让托管 WSGI 容器的 HTTP 服务器或位于堆栈之前的代理服务器执行此操作,或者使用 WSGI 中间件。

    后者很容易写:

    import re
    from functools import partial
    
    
    class PathNormaliser(object):
        _collapse_slashes = partial(re.compile(r'/+').sub, r'/')
    
        def __init__(self, application):
            self.application = application
    
        def __call__(self, env, start_response):    
            env['PATH_INFO'] = self._collapse_slashes(env['PATH_INFO'])                                                                                                  
            return self.application(env, start_response)
    

    您可能希望记录您正在应用此转换,以及 REMOTE_HOST 和 HTTP_USER_AGENT 条目等诊断信息。就个人而言,我会强制该特定应用程序尽快生成完整的 URL。

    查看您的 WSGI 服务器文档,了解如何添加额外的 WSGI 中间件组件。

    【讨论】:

    • 对于flask,WSGI中间件可以写成ohadp.com/…
    • @ShriShinde:是的,在代码中包装.wsgi_app 属性是一种选择。许多 WSGI 服务器也允许您使用文本配置;使用您认为最适合您的部署的任何内容。
    猜你喜欢
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    相关资源
    最近更新 更多