在路由之前修改 Flask 的 URL

5

我的Flask应用程序具有所定义的URL路由:

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

问题是一个应用程序在查询此应用程序时向URL中添加了额外的/,例如/api/1//accounts/id。我无法控制使这种查询的应用程序,因此我无法更改它。
目前,为了解决这个问题,我已经添加了多个规则。
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'])

有许多这样的路由,这是一个丑陋的解决方案。在 Flask 中有没有一种方法可以在 URL 进入路由逻辑之前修改它?

1个回答

5

在传递给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中间件可以按照https://ohadp.com/adding-a-simple-middleware-to-your-flask-application-in-1-minutes-89782de379a1中提到的方式编写。 - shrishinde
@ShriShinde:是的,将.wsgi_app属性包装在代码中是一种选择。许多WSGI服务器也允许您使用文本配置;使用最适合您部署的任何内容。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接