问题描述
我的开发服务器中的链接相对于'/',而在生产中它们相对于'/ 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>
我尝试使用蓝图为路由添加前缀,而不是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')
解决方法
蓝图应该可以很好地满足您在不同环境中添加不同路线的要求。根据给定的代码,您可能会忘记使用蓝图时更改路由装饰器。将@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='/')