사용자가 로그인했는지 확인하는 방법 (user.is_authenticated를 올바르게 사용하는 방법)?


250

이 웹 사이트를 살펴보고 있지만 작동하지 않는 방법을 알 수없는 것 같습니다. 현재 사이트 사용자가 로그인 (인증)되었는지 확인해야합니다.

request.user.is_authenticated

사용자가 로그인했는지 확인하더라도 다음과 같이 반환됩니다.

>

위의 URL의 첫 번째 섹션에서 다음과 같은 다른 요청을 할 수 있습니다.

request.user.is_active

성공적인 응답을 반환합니다.


1
is_authenticated (내부 및 외부 템플릿 모두)는 사용자가 실제로 로그인했는지 여부에 관계없이 항상 True를 반환합니다. 사용자가 로그인했는지 확인하기 위해 유일한 해결책은 마지막으로 본 날짜 / 시간을 시간 초과와 비교하는 것 같습니다
Tony Suffolk 66

답변:


509

Django 1.10+ 업데이트 : is_authenticated이제 Django 1.10의 속성입니다. 이 방법은 이전 버전과의 호환성을 위해 여전히 존재하지만 Django 2.0에서는 제거됩니다.

Django 1.9 이상 :

is_authenticated함수입니다. 당신은 그것을 이렇게 불러야합니다

if request.user.is_authenticated():
    # do something if the user is authenticated

Peter Rowell이 지적했듯이 기본 장고 템플릿 언어에서는 함수를 호출하기 위해 괄호를 사용하지 않습니다. 따라서 템플릿 코드에서 다음과 같은 것을 보았을 것입니다.

{% if user.is_authenticated %}

그러나 파이썬 코드에서는 실제로 User클래스 의 메소드입니다 .


오 그래 .. 정보 덕분에, 왜 그런지 이해가 안되는데 왜 뭔가를 놓치지 않으면 장고 문서에서 이것에 대해 명확하지 않습니다
Rick

2
@ 릭 : 나는 당신과 달라달라고 간청합니다. is_authenticated ()는 클래스 models.User 의 메소드 섹션에 나열된 두 번째 항목 입니다. 혼란 스러울 수있는 것은 템플릿 언어 가 후행 ()을 사용 하지 않기 때문에 {user if is.authentic _ %%}와 같은 내용이 표시 될 수 있습니다. ()를 넣으면 오류가 발생합니다 ( docs.djangoproject.com/en/dev/topics/auth/…docs.djangoproject.com/en/1.2/topics/templates/#variables 참조) )
Peter Rowell

2
@Peter, 예제에서 ()를 사용하지 않습니다. 어딘가에서 메소드와 방법을 설명했다고 확신합니다 .API가 실제 구문을 사용하여 API를 구현할 때 좋습니다. 빨리 장고와 같은 프로젝트에 새로운 사람이 촬영 될 수있다, 나는 도움을 주셔서 감사합니다 나는 일을 통해 탈지하는 경향이 있지만, 내가 더 가까이보고해야 실현 추측 초조 단지 애완 동물

4
@Rick : 실제 구문에 대해 전적으로 동의합니다. 템플릿 시스템에 "실제"프로그래밍 언어를 사용하지 않았다고 생각하는 이유를 들었습니다. Jinja2 ( jinja.pocoo.org/2 ) 를 사용하도록 선택할 수 있으며 완전한 Python 기능을 제공하지만 압도적 인 대다수의 타사 앱이 Django 시스템을 사용하기 때문에 종종 그것들을 혼합하기가 어렵습니다. Django 템플릿 내부에서 표현식을 얻는 방법 은 ExprTag ( djangosnippets.org/snippets/9 )를 참조하십시오. 효과가있다.
피터 로웰

3
@Rick 설명서는 버전마다 다른 내용을 말합니다. 외모 1.10에 대해 더 이상 방법처럼
yairchu

32

장고 1.10+

메소드가 아닌 속성을 사용하십시오 .

if request.user.is_authenticated: # <-  no parentheses any more!
    # do something if the user is authenticated

Django 2.0에서는 같은 이름의 방법을 사용하지 않으며 Django 문서에서는 더 이상 언급하지 않습니다.


Django 1.10 및 1.11의 경우 속성 값은 CallableBool부울이 아니며 이상한 버그가 발생할 수 있습니다. 예를 들어 JSON을 반환하는 뷰가 있습니다.

return HttpResponse(json.dumps({
    "is_authenticated": request.user.is_authenticated()
}), content_type='application/json') 

속성 request.user.is_authenticated으로 업데이트 한 후 예외가 발생했습니다 TypeError: Object of type 'CallableBool' is not JSON serializable. 해결책은 직렬화 할 때 CallableBool 객체를 올바르게 처리 할 수있는 JsonResponse를 사용하는 것입니다.

return JsonResponse({
    "is_authenticated": request.user.is_authenticated
})

1
그러나 is_authenticated (내부 및 외부 템플릿 모두)는 사용자의 실제 로그인 여부에 관계없이 항상 실제 사용자의 경우 True를, 익명 사용자의 경우 False를 반환합니다.
Tony Suffolk 66

이 방법은에 사용되기 때문에 괜찮습니다 request.user. 사용자가 로그인했는지 여부는 브라우저 세션과 같이 요청 컨텍스트에서만 중요합니다.
Mark Chackerian

응용 프로그램이 사용자를 올바르게 로그 아웃한다고 가정하면 그렇지 않은 것을 보았습니다.
Tony Suffolk 66

22

다음 블록이 작동해야합니다.

    {% if user.is_authenticated %}
        <p>Welcome {{ user.username }} !!!</p>       
    {% endif %}

2
그러나 is_authenticated (내부 및 외부 템플릿 모두)는 사용자가 실제로 로그인했는지 여부에 관계없이 항상 True를 반환합니다.
Tony Suffolk 66

문서는 다음과 같이 말합니다. 항상 참인 읽기 전용 특성 (항상 False 인 AnonymousUser.is_authenticated와 반대). 이것은 사용자가 인증되었는지 알 수있는 방법입니다. 이것은 권한을 의미하지 않으며 사용자가 활성 상태인지 또는 유효한 세션이 있는지 확인하지 않습니다. 일반적으로 request.user에서이 속성을 확인하여 AuthenticationMiddleware (현재 로그인 한 사용자를 나타냄)에 의해 채워 졌는지 여부를 확인하지만이 속성이 모든 User 인스턴스에 대해 True임을 알아야합니다.
Sopan

따라서 인증되지 않은 사용자를 "Welcome Guest"로 표시하고 사용자를 "Welcome .USERNAME"으로 인증하려는 경우 템플릿의 다음 블록이 작동합니다. {% if user.is_authenticated %} <p> 환영합니다 {{user.username }} !!! </ p> {% else %} <p> 손님 환영합니다 !!! </ p> {% endif %}
Sopan

7

당신의 관점에서 :

{% if user.is_authenticated %}
<p>{{ user }}</p>
{% endif %}

컨트롤러 기능에서 데코레이터를 추가하십시오.

from django.contrib.auth.decorators import login_required
@login_required
def privateFunction(request):

그러나 is_authenticated (내부 및 외부 템플릿 모두)는 사용자가 실제로 로그인했는지 여부에 관계없이 항상 True를 반환합니다.
Tony Suffolk 66

request.user.is_authenticated응용 프로그램이 항상 사용자를 로그 아웃한다는 것을 알고 있다면 사용자에게 더 좋습니다
Tony Suffolk 66

0

템플릿에서 인증 된 사용자를 확인하려면 다음을 수행하십시오.

{% if user.is_authenticated %}
    <p>Authenticated user</p>
{% else %}
    <!-- Do something which you want to do with unauthenticated user -->
{% endif %}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.