python - 为所有Flask路线添加前缀

标签 python routes flask

我有一个前缀要添加到每个路由。现在,我在每个定义处都向路线添加了一个常量。有没有一种方法可以自动执行此操作?

PREFIX = "/abc/123"

@app.route(PREFIX + "/")
def index_page():
  return "This is a website about burritos"

@app.route(PREFIX + "/about")
def about_page():
  return "This is a website about burritos"

最佳答案

答案取决于您如何为该应用程序提供服务。

子安装在另一个WSGI容器中

假设您将在WSGI容器(mod_wsgi,uwsgi,gunicorn等)中运行此应用程序;您实际上需要将该应用程序作为该WSGI容器的子部分挂载在该前缀处(任何讲WSGI的东西都可以使用),并将 APPLICATION_ROOT 配置值设置为您的前缀:

app.config["APPLICATION_ROOT"] = "/abc/123"

@app.route("/")
def index():
    return "The URL for this page is {}".format(url_for("index"))

# Will return "The URL for this page is /abc/123/"

设置 APPLICATION_ROOT 配置值只是将Flask的 session cookie限制为该URL前缀。 Flask和Werkzeug出色的WSGI处理功能将自动为您处理其他所有事情。

正确重新安装您的应用程序的示例

如果不确定第一段的含义,请看一下其中装有Flask的示例应用程序:
from flask import Flask, url_for
from werkzeug.serving import run_simple
from werkzeug.wsgi import DispatcherMiddleware

app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/abc/123'

@app.route('/')
def index():
    return 'The URL for this page is {}'.format(url_for('index'))

def simple(env, resp):
    resp(b'200 OK', [(b'Content-Type', b'text/plain')])
    return [b'Hello WSGI World']

app.wsgi_app = DispatcherMiddleware(simple, {'/abc/123': app.wsgi_app})

if __name__ == '__main__':
    app.run('localhost', 5000)

将请求代理到应用

另一方面,如果您将在Flask应用程序的WSGI容器的根目录下运行它并代理对它的请求(例如,如果它是FastCGI的,或者如果nginx是proxy_pass,则请求子目录-终结点到独立的uwsgi / gevent服务器,则您可以:
  • 使用一个蓝图,正如Miguel在his answer中指出的那样。
  • 或使用DispatcherMiddleware中的werkzeug(或su27's answer中的PrefixMiddleware)将您的应用程序重新安装到您使用的独立WSGI服务器中。 (请参见上面的正确重新安装您的应用的示例,以获取要使用的代码)。
  • 关于python - 为所有Flask路线添加前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50702471/

    相关文章:

    python - 单个 cmd.exe session 的临时文件关联

    python - 根据各种参数选择div

    ember.js - Emberjs - 如何在没有父路由内容的情况下渲染嵌套路由模板?

    python - Jsonify 自定义对象列表

    javascript - Flask:在整个应用程序中记住变量 + DOM 操作

    python - REST api 中的普通(非 HTML)错误页面

    python - 函数名中的数字

    python - Flask 自定义登录和模板渲染

    javascript - @Get ('*' ) 不匹配空 (NestJS)

    ruby-on-rails - 资源的匹配和动词等价物是什么?