首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为所有Flask路由添加前缀

为所有Flask路由添加前缀
EN

Stack Overflow用户
提问于 2013-09-24 03:39:27
回答 7查看 112K关注 0票数 121

我有一个前缀,我想添加到每个路由。现在,我在每个定义中将一个常量添加到路由。有没有办法自动做到这一点?

代码语言:javascript
复制
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"
EN

回答 7

Stack Overflow用户

发布于 2013-09-24 05:24:13

您可以将您的路线放在蓝图中:

代码语言:javascript
复制
bp = Blueprint('burritos', __name__,
                        template_folder='templates')

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

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

然后使用前缀将蓝图注册到应用程序中:

代码语言:javascript
复制
app = Flask(__name__)
app.register_blueprint(bp, url_prefix='/abc/123')
票数 117
EN

Stack Overflow用户

发布于 2016-05-19 03:52:08

因此,我认为一个有效的答案是:前缀应该在开发完成后使用的实际服务器应用程序中进行配置。Apache、nginx等。

但是,如果您希望在调试中运行Flask应用程序时在开发过程中使用此方法,请查看this gist

Flask的DispatcherMiddleware来拯救你了!

我将把代码复制到这里以供后人使用:

代码语言:javascript
复制
"Serve a Flask app on a sub-url during localhost development."

from flask import Flask


APPLICATION_ROOT = '/spam'


app = Flask(__name__)
app.config.from_object(__name__)  # I think this adds APPLICATION_ROOT
                                  # to the config - I'm not exactly sure how!
# alternatively:
# app.config['APPLICATION_ROOT'] = APPLICATION_ROOT


@app.route('/')
def index():
    return 'Hello, world!'


if __name__ == '__main__':
    # Relevant documents:
    # http://werkzeug.pocoo.org/docs/middlewares/
    # http://flask.pocoo.org/docs/patterns/appdispatch/
    from werkzeug.serving import run_simple
    from werkzeug.wsgi import DispatcherMiddleware
    app.config['DEBUG'] = True
    # Load a dummy app at the root URL to give 404 errors.
    # Serve app at APPLICATION_ROOT for localhost development.
    application = DispatcherMiddleware(Flask('dummy_app'), {
        app.config['APPLICATION_ROOT']: app,
    })
    run_simple('localhost', 5000, application, use_reloader=True)

现在,当将上面的代码作为独立的Flask应用程序运行时,http://localhost:5000/spam/将显示Hello, world!

在对另一个答案的评论中,我表达了我希望做这样的事情:

代码语言:javascript
复制
from flask import Flask, Blueprint

# Let's pretend module_blueprint defines a route, '/record/<id>/'
from some_submodule.flask import module_blueprint

app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/api'
app.register_blueprint(module_blueprint, url_prefix='/some_submodule')
app.run()

# I now would like to be able to get to my route via this url:
# http://host:8080/api/some_submodule/record/1/

DispatcherMiddleware应用到我设计的示例中:

代码语言:javascript
复制
from flask import Flask, Blueprint
from flask.serving import run_simple
from flask.wsgi import DispatcherMiddleware

# Let's pretend module_blueprint defines a route, '/record/<id>/'
from some_submodule.flask import module_blueprint

app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/api'
app.register_blueprint(module_blueprint, url_prefix='/some_submodule')
application = DispatcherMiddleware(Flask('dummy_app'), {
    app.config['APPLICATION_ROOT']: app
})
run_simple('localhost', 5000, application, use_reloader=True)

# Now, this url works!
# http://host:8080/api/some_submodule/record/1/
票数 5
EN

Stack Overflow用户

发布于 2019-01-10 19:30:28

代码语言:javascript
复制
from flask import Flask

app = Flask(__name__)

app.register_blueprint(bp, url_prefix='/abc/123')

if __name__ == "__main__":
    app.run(debug='True', port=4444)


bp = Blueprint('burritos', __name__,
                        template_folder='templates')

@bp.route('/')
def test():
    return "success"
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18967441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档