Flask Security - TemplateAssertionError: no filter named 'urlencode'
Flask Security - TemplateAssertionError: no filter named 'urlencode'
我刚刚将 flask-security 添加到我的 flask 项目中。它在本地工作,但在 OpenShift 上报告此错误:
TemplateAssertionError: no filter named 'urlencode'
不知道是不是库版本不对,或者怎么调试。这是我的 setup.py 包裹清单:
install_requires=['Flask==0.10.1',
'SQLAlchemy==0.9.8',
'Flask-SQLAlchemy==2.0',
'Flask-Security==1.7.4',
'Werkzeug==0.9.5',
'blinker==1.3',
'Flask-Login==0.2.11',
'Flask-Mail==0.9.1',
'Flask-Principal==0.4.0',
'Flask-Script==2.0.5',
'Flask-WTF==0.10.3',
'itsdangerous==0.24',
'passlib==1.6.2'
]
我已经解决了这个问题,方法是在我的本地机器上执行 'pip freeze',然后将库一个一个地复制到 setup.py。虽然我仍然不确定哪一个产生了错误,可能是 jinja2 的错误版本。
urlencode
过滤器是 added to jinja
in v2.7. But GAE only supports v2.6。在我的 app.yaml
中将版本更改为 "latest" 仍然使用 2.6 运行(注意 python27_lib/versions/third_party/jinja2-2.6/jinja2/environment.py
路径):
...
File "/base/data/home/apps/s~healthier-staging/1.386037228785871893/lib/flask/templating.py", line 128, in render_template
context, ctx.app)
File "/base/data/home/apps/s~healthier-staging/1.386037228785871893/lib/flask/templating.py", line 110, in _render
rv = template.render(context)
File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/jinja2-2.6/jinja2/environment.py", line 894, in render
return self.environment.handle_exception(exc_info, True)
File "/base/data/home/apps/s~healthier-staging/1.386037228785871893/lib/flask_security/templates/security/_menu.html", line 4, in template
<li><a href="{{ url_for_security('login') }}{% if 'next' in request.args %}?next={{ request.args.next|urlencode }}{% endif %}">Login</a></li>
TemplateAssertionError: no filter named 'urlencode'`
我通过手动添加一个简单的过滤器(复制添加到 jinja 的代码)修复了这个问题:
def do_urlescape(value):
"""Escape for use in URLs."""
return urllib.quote(value.encode('utf8'))
app.jinja_env.globals['urlencode'] = do_urlescape
我刚刚将 flask-security 添加到我的 flask 项目中。它在本地工作,但在 OpenShift 上报告此错误:
TemplateAssertionError: no filter named 'urlencode'
不知道是不是库版本不对,或者怎么调试。这是我的 setup.py 包裹清单:
install_requires=['Flask==0.10.1',
'SQLAlchemy==0.9.8',
'Flask-SQLAlchemy==2.0',
'Flask-Security==1.7.4',
'Werkzeug==0.9.5',
'blinker==1.3',
'Flask-Login==0.2.11',
'Flask-Mail==0.9.1',
'Flask-Principal==0.4.0',
'Flask-Script==2.0.5',
'Flask-WTF==0.10.3',
'itsdangerous==0.24',
'passlib==1.6.2'
]
我已经解决了这个问题,方法是在我的本地机器上执行 'pip freeze',然后将库一个一个地复制到 setup.py。虽然我仍然不确定哪一个产生了错误,可能是 jinja2 的错误版本。
urlencode
过滤器是 added to jinja
in v2.7. But GAE only supports v2.6。在我的 app.yaml
中将版本更改为 "latest" 仍然使用 2.6 运行(注意 python27_lib/versions/third_party/jinja2-2.6/jinja2/environment.py
路径):
...
File "/base/data/home/apps/s~healthier-staging/1.386037228785871893/lib/flask/templating.py", line 128, in render_template
context, ctx.app)
File "/base/data/home/apps/s~healthier-staging/1.386037228785871893/lib/flask/templating.py", line 110, in _render
rv = template.render(context)
File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/jinja2-2.6/jinja2/environment.py", line 894, in render
return self.environment.handle_exception(exc_info, True)
File "/base/data/home/apps/s~healthier-staging/1.386037228785871893/lib/flask_security/templates/security/_menu.html", line 4, in template
<li><a href="{{ url_for_security('login') }}{% if 'next' in request.args %}?next={{ request.args.next|urlencode }}{% endif %}">Login</a></li>
TemplateAssertionError: no filter named 'urlencode'`
我通过手动添加一个简单的过滤器(复制添加到 jinja 的代码)修复了这个问题:
def do_urlescape(value):
"""Escape for use in URLs."""
return urllib.quote(value.encode('utf8'))
app.jinja_env.globals['urlencode'] = do_urlescape