我的开发服务器中的链接相对于“/”,而在生产中它们相对于“/flask/”。如何在 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>
我尝试使用蓝图为路由添加前缀,而不是按照为所有 Flask 路由添加前缀中建议的链接添加前缀,但它不起作用:
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')
蓝图应该可以很好地满足您在不同环境下添加不同路线的要求。根据给定的代码,您可能在使用蓝图时忘记更改路线装饰器。将
@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='/')
这个帖子有点旧,但我在搜索同一问题的信息时发现了这个页面。
我发现不需要使用蓝图。我们可以使用常规的
@app.route
并动态生成 url。
只需更换:
<a href="{url}">System Information</a>
与:
<a href="{{ url_for('info') }}">System Information</a>
请注意,
{{ url_for('info') }}
中的“info”是函数的名称:info()
,而不是路线@app.route('/info/')
。
完整
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="{{ url_for('info') }}">System Information</a>
"""
@app.route('/info/')
def info():
return f"""
Platform: {platform.platform()}<br>
Python version: {sys.version}<br>
Flask version: {__version__}
"""