2017-01-24 2 views
0

В настоящее время я использую следующий код в моем прототипе:«Когда пользователь проходит проверку подлинности» в термос

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

Однако я запрограммирован логин пользователя с помощью flask_login. Поэтому мне нужно изменить эту функцию, чтобы запускать ONCE, когда пользователь вошел в систему не только при первом запросе сайта.

Однако я попытался использовать @login_required, это явно не запускает эту функцию.

ответ

1

Это обычная проблема, и как Django, так и Flask используют концепцию под названием «сигналы».

Функция входа в систему испускает сигнал, и в этом случае функция инициализации прослушивает (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) 

Также представляется жизнеспособным и более легким для чтения

+0

Это полезный старт. У меня есть несколько вопросов: во-первых, я немного смущен относительно того, какую оболочку я бы поставил над функцией init выше, чтобы соединить() или прослушать сигнал. Будет ли это @connect или как эта часть процесса работает? –

+0

у вас нет. 'user_logged_in_signal.connect (init, app)' заставляет его прослушивать сигнал – codyc4321

+0

Кажется, из http://flask.pocoo.org/docs/0.12/signals/ вы можете поместить этот декоратор прямо над 'init':' @ user_logged_in_signal.connect_via (приложение) '. пример выше – codyc4321

Смежные вопросы