python - 烧瓶上的开发和生产服务器中的不同链接前缀
问题描述
我的开发服务器中的链接是相对于“/”的,而在生产中它们是相对于“/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__}
"""
编辑。使用蓝图的正确方法我认为是这样的,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('/')
to@bp.route('/')
和@app.route('/info')
to@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='/')
推荐阅读
- javascript - 移动设备中的粘性标题外壳锚点问题
- c++ - 如何声明特征稀疏矩阵数组
- reactjs - NextJS 上的跨域 iframe 调整大小?
- javascript - 如何从“red”之类的字符串中获取 rgb 值?
- postgresql - 具有相同场的棱柱关系
- css - 仅在移动肖像上定位 Firefox 的 CSS 规则
- java - Android中的Toast不显示并跳出方法
- python - Python Pandas 多索引名称警告
- python - Python Pandas:仅当过滤条件与列匹配时,才将数据帧中的行复制到新数据帧
- python - pandas:根据列表和另一列条件替换逗号分隔列中的相应值