相关疑难解决方法(0)

如何在烧瓶中使用g.user global

据我了解Flask中的g变量,它应该为我提供一个存储数据的全局位置,例如在登录后保存当前用户.它是否正确?

我希望我的导航在整个站点登录后显示我的用户名.

我的观点包含

from Flask import g #among other things
Run Code Online (Sandbox Code Playgroud)

在登录期间,我分配

user = User.query.filter_by(username = form.username.data).first()
if validate(user):
    session['logged_in'] = True
    g.user = user
Run Code Online (Sandbox Code Playgroud)

我似乎无法访问g.user.相反,当我的base.html模板具有以下内容时......

<ul class="nav">
    {% if session['logged_in'] %}
        <li class="inactive">logged in as {{ g.user.username }}</li>
    {% endif %}
</ul>
Run Code Online (Sandbox Code Playgroud)

我收到错误:

jinja2.exceptions.UndefinedError
UndefinedError: 'flask.ctx._RequestGlobals object' has no attribute 'user'
Run Code Online (Sandbox Code Playgroud)

登录否则工作正常.我错过了什么?

python jinja2 flask flask-login

56
推荐指数
2
解决办法
5万
查看次数

我如何使2.7 python上下文管理器线程安全

我有一个大型的python应用程序,它运行在Django服务上.我需要关闭某些操作的权限测试,所以我创建了这个上下文管理器:

class OverrideTests(object):

    def __init__(self):
        self.override = 0

    def __enter__(self):
        self.override += 1

    # noinspection PyUnusedLocal
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.override -= 1
        assert not self.override < 0

    @property
    def overriding(self):
        return self.override > 0

override_tests = OverrideTests()
Run Code Online (Sandbox Code Playgroud)

然后,应用程序的各个部分可以使用上下文管理器覆盖测试:

with override_tests:
    do stuff
    ...
Run Code Online (Sandbox Code Playgroud)

在do stuff中,上述上下文管理器可以在不同的功能中多次使用.计数器的使用使这一点得到控制,它似乎工作得很好......直到线程介入.

一旦涉及线程,全局上下文管理器就会被重用,因此测试可能会被错误地覆盖.

这是一个简单的测试用例 - 如果thread.start_new_thread(do_id, ())使用简单的替换线do_it但是如图所示失败,则可以正常工作:

def stat(k, expected):
    x = '.' if override_tests.overriding == expected else '*'
    sys.stdout.write('{0}{1}'.format(k, x))


def do_it_inner():
    with override_tests:
        stat(2, True)
    stat(3, True)  # outer …
Run Code Online (Sandbox Code Playgroud)

python django multithreading python-2.7

10
推荐指数
1
解决办法
682
查看次数