python - Flask {{ request.script_root|tojson|safe }} 不返回值

标签 python flask jinja2

我正在遵循许多基本 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/

相关文章:

python - 加载MLFlow模型时如何加载私有(private)python包?

python - 在 python 中读取 Freebase 数据转储,读取几行?

python - PIP安装包但有些找不到

python - Flask 中的全局变量是线程安全的吗?如何在请求之间共享数据?

python - 使用 memory_profiler 分析 Flask 应用程序中的行

Python3 tkinter Canvas ,设置相对宽度和高度

python - 当我使用 import urlparse 时,Heroku 日志显示 "No module named ' urlparse'"

backbone.js - Jinja2、Backbone.js 和渐进增强

yaml - 在 Ansible-YAML 中使用相对路径引用多维数组中的另一个元素

ansible - 如何按值对字典进行排序