플라스크에서 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 객체는 이제 요청 컨텍스트 대신 응용 프로그램 컨텍스트에 바인딩됩니다.
나는 전역을 모두 제거하고 응용 프로그램을 작업을 수행하는 함수 집합으로 생각하고 각 함수에는 입력과 출력이 있으며 전역을 건 드리면 안됩니다. 사용자를 가져 와서 전달하면 코드를 훨씬 더 테스트 할 수 있습니다. 더 나은 방법 : 플라스크를 제거하고 플라스크는 다음과 같은 전역을 사용하여 홍보합니다.
from flask import request
참조 URL : https://stackoverflow.com/questions/13617231/how-to-use-g-user-global-in-flask
'Program Club' 카테고리의 다른 글
| io 리디렉션을 사용하지 않고 명령 줄에서 파일에 텍스트 추가 (0) | 2021.01.08 |
|---|---|
| 1024 미만의 포트에 권한이 부여되는 이유는 무엇입니까? (0) | 2021.01.08 |
| cpp.react 라이브러리의 C ++ 소스 코드에서 이상한 "-> * []"표현식 (0) | 2021.01.08 |
| Dagger 2 예제 (0) | 2021.01.08 |
| 호스팅 된 CouchDB 서비스 제공자가 있습니까? (0) | 2021.01.08 |