我正在遵循许多基本 Flask 教程之一,其中 {{ request.script_root|tojson|safe }}
Jinja2 模板调用应该返回应用程序的基本根(每个Flask 文档 here )。
我有一个 super 基本脚本设置,如下所示:
# app/__init__.py
from flask import Flask
# import blueprints
from .views.index import index_blueprint
# create flask app
app = Flask(__name__)
app.register_blueprint(index_blueprint)
这是我的蓝图
:
# app/views/index.py
from flask import Blueprint, render_template
index_blueprint = Blueprint('index_blueprint', __name__)
@index_blueprint.route('/')
def route_index():
return render_template('index.html')
最后,我的 index.html
模板(位于 template
文件夹中:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test</title>
<script type="text/javascript">
var $SCRIPT_ROOT = {{ request.script_root|tojson|safe }};
</script>
</head>
<body>
<p>Flask test.</p>
</body>
</html>
渲染后,$SCRIPT_ROOT
应包含脚本根目录,或者至少是一个非空字符串。但是,生成的填充模板包含一个空字符串:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test</title>
<script type="text/javascript">
var $SCRIPT_ROOT = "";
</script>
</head>
<body>
<p>Flask test.</p>
</body>
</html>
问题是为什么 {{ request.script_root|tojson|safe }}
返回空字符串?
最佳答案
我假设您正在使用 Flask 的 WSGI。在这种情况下,Flask 不知道 SCRIPT_NAME
环境变量,因为通常 HTTP 服务器的工作是将 SCRIPT_NAME
(和 PATH_INFO
)设置为好吧)。
Flask 使用此环境变量设置 script_root
属性(Request
类中的相关函数):
@cached_property
def script_root(self):
"""The root path of the script without the trailing slash."""
raw_path = wsgi_decoding_dance(self.environ.get('SCRIPT_NAME') or '',
self.charset, self.encoding_errors)
return raw_path.rstrip('/')
如果您想手动设置,可以使用中间件来实现(来自 this snippet ):
class AppMiddleware(object):
def __init__(self, app, script_name=''):
self.app = app
self.script_name = script_name
def __call__(self, environ, start_response):
script_name = self.script_name
if self.script_name:
environ['SCRIPT_NAME'] = script_name
path_info = environ['PATH_INFO']
if path_info.startswith(script_name):
environ['PATH_INFO'] = path_info[len(script_name):]
return self.app(environ, start_response)
app = Flask(__name__)
app.wsgi_app = AppMiddleware(app.wsgi_app, '/myapp')
此后,模板中的 {{ request.script_root }}
将是 /myapp
。
关于python - Flask {{ request.script_root|tojson|safe }} 不返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33318084/