【问题标题】:Flask Security - TemplateAssertionError: no filter named 'urlencode'Flask 安全性 - TemplateAssertionError:没有名为“urlencode”的过滤器
【发布时间】:2015-03-21 11:02:04
【问题描述】:

我刚刚在我的烧瓶项目中添加了烧瓶安全性。它在本地工作,但在 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'

  ]

【问题讨论】:

    标签: python-2.7 flask openshift flask-security


    【解决方案1】:

    urlencode 过滤器是 added to jinja in v2.7。但是 GAE only supports v2.6。在我的app.yaml 中将版本更改为“最新”仍以 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
    

    【讨论】:

      【解决方案2】:

      我已经解决了这个问题,方法是在我的本地机器上执行“pip freeze”,并将库一个一个复制到 setup.py。虽然我仍然不确定哪个产生了错误,可能是 jinja2 的错误版本。

      【讨论】:

        猜你喜欢
        • 2012-01-10
        • 2023-04-06
        • 2019-01-12
        • 2017-04-26
        • 2012-06-03
        • 2014-03-02
        • 2012-05-28
        • 2014-12-01
        • 2015-05-08
        相关资源
        最近更新 更多