Program Club

플라스크에서 g.user global을 사용하는 방법

proclub 2021. 1. 8. 20:48
반응형

플라스크에서 g.user global을 사용하는 방법


Flask의 g 변수를 이해하면 로그인 후 현재 사용자를 보유하는 것과 같이 데이터를 숨길 수있는 전역 위치를 제공해야합니다. 이 올바른지?

로그인 한 후 사이트 전체에서 내 사용자 이름을 내 탐색에 표시하고 싶습니다.

내 견해에는

from Flask import g #among other things

로그인 중에

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

g.user에 액세스 할 수없는 것 같습니다. 대신, 내 base.html 템플릿에 다음이있을 때 ...

<ul class="nav">
    {% if session['logged_in'] %}
        <li class="inactive">logged in as {{ g.user.username }}</li>
    {% endif %}
</ul>

오류가 발생합니다.

jinja2.exceptions.UndefinedError
UndefinedError: 'flask.ctx._RequestGlobals object' has no attribute 'user'

그렇지 않으면 로그인이 제대로 작동합니다. 내가 무엇을 놓치고 있습니까?


gA는 스레드 지역 및 당 요청 (참조입니다 프록시에 참고 ). session것입니다 또한 지역의 스레드 만, 기본 컨텍스트에서 MAC 서명 쿠키에 지속되고 클라이언트로 전송.

당신이 겪고있는 문제는 session(클라이언트로 보내지고 클라이언트가 우리에게 다시 보내기 때문에) 각 요청에 대해 재 구축되는 반면에 데이터 세트 g 요청 의 수명 동안 만 사용할 수 있다는 것입니다 .

간단한 일을 수행하는 방법 (참고 simple != secure- 당신이 한 번 봐 걸릴 확보 필요하다면 플라스크-로그인을 ) 단순히 세션에 사용자의 ID를 추가하고 각 요청의 사용자를로드하는 것입니다 :

@app.before_request
def load_user():
    if session["user_id"]:
        user = User.query.filter_by(username=session["user_id"]).first()
    else:
        user = {"name": "Guest"}  # Make it better, use an anonymous User instead

    g.user = user

사소한 수정, g 객체는 이제 요청 컨텍스트 대신 응용 프로그램 컨텍스트에 바인딩됩니다.

"Flask 0.10부터 이것은 응용 프로그램 컨텍스트에 저장되고 더 이상 요청 컨텍스트에 저장되지 않습니다. 즉, 응용 프로그램 컨텍스트 만 바인딩되고 아직 요청이 아닌 경우 사용할 수있게됩니다."


나는 전역을 모두 제거하고 응용 프로그램을 작업을 수행하는 함수 집합으로 생각하고 각 함수에는 입력과 출력이 있으며 전역을 건 드리면 안됩니다. 사용자를 가져 와서 전달하면 코드를 훨씬 더 테스트 할 수 있습니다. 더 나은 방법 : 플라스크를 제거하고 플라스크는 다음과 같은 전역을 사용하여 홍보합니다.

from flask import request

참조 URL : https://stackoverflow.com/questions/13617231/how-to-use-g-user-global-in-flask

반응형