【问题标题】:Different link prefix in development and production server on flask烧瓶上的开发和生产服务器中的不同链接前缀
【发布时间】:2020-12-05 08:28:43
【问题描述】:

我的开发服务器中的链接是相对于“/”的,而在生产中它们是相对于“/flask/”的。我如何在烧瓶应用程序中编写链接,以便它可以在尽可能少的变化的两个服务器上工作?

一个例子:

import sys
import platform

from flask import Flask, __version__
app = Flask(__name__)

@app.route("/")
def hello():
    return """
        Hello World!<br><br>
        <a href="/info/">System Information</a>
    """

@app.route("/info/")
def info():
    return f"""
        Platform: {platform.platform()}<br>
        Python version {sys.version}<br>
        Flask version: {__version__}
    """

if __name__ == "__main__":
    app.run()

这将在开发中工作,但在生产中工作将是:

<a href="/flask/info/">System Information</a>

我尝试使用蓝图来为路由添加前缀,而不是 Add a prefix to all Flask routes 中建议的链接,但它不起作用:

website/__init__.py

from flask import Flask, Blueprint

bp = Blueprint('myapp', __name__, template_folder='templates')
app = Flask(__name__)
app.register_blueprint(bp, url_prefix='/flask'

website/main.py

import sys
import platform
from flask import __version__

from website import app

@app.route('/')
def hello():
    return f"""
        Hello World!<br><br>
        <a href="/info/">System Information</a>
    """

@app.route('/info/')
def info():
    return f"""
        Platform: {platform.platform()}<br>
        Python version: {sys.version}<br>
        Flask version: {__version__}
    """

编辑。我认为使用bluepring的正确方法是这样的,在路由定义之后移动register_blueprint。但是链接仍然断开,因为它没有转到/flask/info,而是转到/info

website/main.py

import sys
import platform
from flask import url_for, __version__

from website import bp, app

@bp.route("/")
def hello():
    return f"""
        url = url_for('myapp.info')
        Hello World!<br><br>
        <a href="{url}">System Information</a>
    """

@bp.route("/info/")
def info():
    return f"""
        Platform: {platform.platform()}<br>
        Python version {sys.version}<br>
        Flask version: {__version__}
    """

app.register_blueprint(bp, url_prefix='/flask')

【问题讨论】:

  • 您是否尝试设置 APPLICATION_ROOT?还是其他答案?
  • 使用 APPLICATION_ROOT 时如何定义链接?像这样? 系统信息

标签: python flask hyperlink routes href


【解决方案1】:

蓝图应该可以很好地满足您在不同环境中添加不同路线的要求。根据给定的代码,您可能在使用蓝图时忘记更改路由装饰器。将@app.route('/') 更改为@bp.route('/') 并将@app.route('/info') 更改为@bp.route('/info') 应该可以工作。 (当然要先导入bp)

对于我的项目,我使用环境变量来决定蓝图前缀(不确定,您总是可以尝试一些更适合您要求的东西)。比如说FLASK_ENV,它在不同的环境下具有不同的“开发”和“生产”的价值,对应的代码是:

if os.environ.get("FLASK_ENV")=="production":
    app.register_blueprint(bp, url_prefix='/flask')
elif os.environ.get("FLASK_ENV")=="development":
    app.register_blueprint(bp, url_prefix='/')

【讨论】:

  • 解决了一半的问题。如果我这样做,生产和开发路线都以 /flask/ 开头,但现在链接已断开,因为它们与 / 相关。那么如何修复链接而不必一一更改呢?
  • “链接已损坏”是指像 html 中的 &lt;a href="/flask/info/"&gt; 这样的链接吗?如果是这样,您应该使用 Jinja2 模板作为 &lt;a href="{{url_for("bp.info")}}"&gt; 来创建“动态”链接而不是固定链接。
猜你喜欢
  • 2017-12-10
  • 2023-03-19
  • 2015-10-06
  • 2014-11-25
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
相关资源
最近更新 更多