【问题标题】:'When a user is authenticated' in FlaskFlask 中的“当用户通过身份验证时”
【发布时间】:2017-01-24 22:41:59
【问题描述】:

目前,我在原型中使用以下代码:

@app.before_first_request
def init():
 global project
 project = user_project.Project()
 project.init()

但是,我现在使用 flask_login 编写了一个用户登录。因此,我需要更改此功能以触发用户登录后,而不仅仅是在首次请求站点时触发。

我尝试了@login_required,但这并没有明确启动此功能。

【问题讨论】:

    标签: python flask global-variables global flask-login


    【解决方案1】:

    这是一个常见的问题,Django 和 Flask 都使用了一个叫做“信号”的概念。

    让用户登录函数发出信号,并让 init 函数监听(在本例中为connect())信号。

    遵循本指南:

    http://flask.pocoo.org/docs/0.12/signals/

    from flask import Flask, current_app, request
    from blinker import Namespace
    
    custom_signals = Namespace()
    user_logged_in_signal = custom_signals.signal('logged-in')
    
    
    def init(app, user, **extra):
     global project
     project = user_project.Project()
     project.init()
    
    user_logged_in_signal.connect(init, app)
    
    # example login
    def login():
        # user logs in
        user = login(username, password)
        user_logged_in_signal.send(current_app._get_current_object(), user=user)
        return Response()
    

    这个更中肯:http://code.runnable.com/UqFCHJklakUbAAJT/creating-and-sending-signal-in-flask-for-python

    @user_logged_in_signal.connect_via(app)
    def init(sender, user, **extra):
       global project
       project = user_project.Project()
       project.init()
    

    没有

    user_logged_in_signal.connect(init, app)
    

    似乎也可行且更易于阅读

    【讨论】:

    • 这是一个有益的开始。我确实有几个问题:首先,我有点困惑我将在上面的 init 函数上放置什么包装器来连接()或监听信号。是@connect 还是这部分流程是如何工作的?
    • 你没有。 user_logged_in_signal.connect(init, app) 让它监听信号
    • flask.pocoo.org/docs/0.12/signals看来,你可以把这个装饰器放在init的正上方:@ user_logged_in_signal.connect_via(app)。现在上面的例子
    • 我正在尝试这个但收到以下错误:TypeError: __call__() 恰好需要 3 个参数(给定 2 个)
    • 我会追溯它的调用,查找如何使用该函数,并添加必要的参数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2013-07-20
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多