2012-12-01 18 views
7

Więc mam routing przed żądaniem dla mojego modułu użytkownika. Ale teraz chcę uzyskać dostęp do g.users również z innych projektów. Znalazłem jedyny sposób, aby to zrobić, to skopiować poniższy kod do każdego pojedynczego planu.Gdzie mogę umieścić mój projekt before_request

Próbowałem umieścić go w mojej app.py na @ app.before_request, ale wtedy masz błędy, ponieważ musisz zaimportować sesję, g, User, a następnie wciąż otrzymujesz _requestglobal błędy w innych miejscach.

@app.before_request 
def before_request(): 
    g.user = None 
    if 'user_id' in session: 
    g.user = User.query.get(session['user_id']); 

Jakie jest najlepsze miejsce, aby je umieścić?

dostaję dużo:

AttributeError: '_RequestGlobals' object has no attribute 'user' 
+1

'app.before_request' * powinien * działać. Czy możesz podać przykład miejsca, w którym otrzymasz 'AttributeError' podczas używania' app.before_request'? –

+0

Cholera, najwyraźniej nie ustawiłem go w @ aplikacji, dodałem funkcję, ale zapomniałem jej użyć. Teraz wydaje się, że działa dobrze z @app w każdym schemacie. Myślałem, że inne plany tego nie widzą. – Dexter

Odpowiedz

3

myślę, że robi to dobrze, próbując zainicjować użytkownikowi before_request, problemem jest to, że g obiekt ma nic przed zamówienie, więc trzeba radzić sobie z nim inaczej . Najpierw należy pobrać ciasteczka z pliku before_request, a następnie dodać je do sesji, skąd może być g. Myślę, że warto byłoby przyjrzeć się lub użyć logowania Flask. Lub po prostu read the code z tego, a może da ci kilka pomysłów.

+0

szukałem tego. Ale nie rozumiem, dlaczego jest to potrzebne, ponieważ myślałem, że w kolbie już utworzono automatyczny plik cookie, aby zachować dane sesji. – Dexter

8

Buleprint.before_request jest wywoływany przed każdym żądaniem w ramach projektu. Jeśli chcesz zadzwonić przed wszystkimi projektami, użyj numeru before_app_request.

13

Trochę późno tu jednak:
To co mam zrobić:
użyć zmiennej Blueprint ustawić przed życzenie

myblueprint = Blueprint('myblueprint', __name__, template_folder="templates") 

def before_myblueprint(): 
    #code here 

myblueprint.before_request(before_myblueprint) 
1

jestem nawet później tutaj, ale zwiększając na odpowiedź Johnstona , możesz użyć tego samego dekoratora before_request, na przykład:

bp_v1 = Blueprint('api_v1', __name__) 

@bp_v1.before_request 
def before_anything(): 
    pass 
Powiązane problemy