2017-06-20 152 views
5

我的瓶的应用已URL路由定义为修改烧瓶URL路由

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

问题是进行查询到这个程序的应用程序的一个增加了额外的/在像/API/1 //账户/ 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访问路由逻辑之前修改URL?

回答

4

通过让承载WSGI容器的HTTP服务器或位于堆栈之前的代理服务器,或者通过使用WSGI中间件,我会在路径到达Flask之前进行规范化。

后者很容易写:

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中间件组件。

+0

对于烧瓶,WSGI中间件可以按照https://ohadp.com/adding-a-simple-middleware-to-your-flask-application-in-1-minutes-89782de379a1中提到的方法书写。 – shrishinde

+0

@ShriShinde:是,在代码中包装'.wsgi_app'属性是一种选择。许多WSGI服务器也允许您使用文本配置;使用您认为最适合您的部署的任何内容。 –