사용자가 로그인했는지 확인하는 방법 (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.