Làm cách nào để kiểm tra xem người dùng đã đăng nhập chưa (làm thế nào để sử dụng đúng user.is_authenticated)?


250

Tôi đang xem qua trang web này nhưng dường như không thể tìm ra cách để làm điều này vì nó không hoạt động. Tôi cần kiểm tra xem người dùng trang hiện tại đã đăng nhập (xác thực) chưa và đang thử:

request.user.is_authenticated

mặc dù chắc chắn rằng người dùng đã đăng nhập, nó chỉ trả về:

>

Tôi có thể thực hiện các yêu cầu khác (từ phần đầu tiên trong url ở trên), chẳng hạn như:

request.user.is_active

trong đó trả về một phản ứng thành công.


1
is_authenticated (cả mẫu bên trong và bên ngoài) luôn trả về True - bất kể người dùng có thực sự đăng nhập hay không. Để xác định một cách xác thực nếu người dùng đã đăng nhập, giải pháp duy nhất dường như là so sánh ngày / thời gian cuối cùng của họ với thời gian chờ
Tony Suffolk 66

Câu trả lời:


509

Cập nhật cho Django 1.10+ : is_authenticatedhiện là một thuộc tính trong Django 1.10. Phương thức này vẫn tồn tại để tương thích ngược, nhưng sẽ bị xóa trong Django 2.0.

Dành cho Django 1.9 trở lên :

is_authenticatedlà một chức năng. Bạn nên gọi nó như thế nào

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

Như Peter Rowell đã chỉ ra, điều có thể khiến bạn vấp ngã là trong ngôn ngữ mẫu Django mặc định, bạn không sử dụng dấu ngoặc đơn để gọi các hàm. Vì vậy, bạn có thể đã thấy một cái gì đó như thế này trong mã mẫu:

{% if user.is_authenticated %}

Tuy nhiên, trong mã Python, nó thực sự là một phương thức trong Userlớp.


oh ok .. cảm ơn vì thông tin, điều đó có lý do tại sao nó không hoạt động, trừ khi tôi bỏ lỡ điều gì đó, nó thực sự không rõ ràng về điều này trong tài liệu django
Rick

2
@Rick: Tôi xin khác với bạn. is_authenticated () là mục thứ hai được liệt kê trong phần phương thức của mô hình lớp. Người dùng. Điều gì có thể gây nhầm lẫn là các mẫu ngôn ngữ nào không sử dụng dấu () 's, vì vậy bạn có thể thấy một cái gì đó giống như {% if user.is_authenticated%}. Bạn sẽ nhận được một lỗi nếu bạn đặt () 's trong. (Xem docs.djangoproject.com/en/dev/topics/auth/...docs.djangoproject.com/en/1.2/topics/templates/#variables )
Peter Rowell

2
@Peter, họ không sử dụng () trong các ví dụ, tôi nhận ra rằng tôi chắc chắn rằng họ đã giải thích ở đâu đó rằng đó là một phương pháp và cách thực hiện đúng, thật tuyệt khi API sử dụng cú pháp thực tế để nó có thể nhanh chóng được đưa vào bởi một người mới tham gia một dự án như Django, chỉ là một tiểu thư thú cưng mà tôi đoán khi tôi có xu hướng lướt qua mọi thứ nhưng tôi nhận ra rằng tôi nên nhìn gần hơn, cảm ơn vì sự giúp đỡ
Rick

4
@Rick: Tôi hoàn toàn đồng ý với bạn về cú pháp đời thực. Tôi đã nghe những lý do khập khiễng (những gì tôi cho là) ​​mà họ không sử dụng ngôn ngữ lập trình "thực" cho hệ thống mẫu, nhưng đó là những gì họ đã làm. Bạn có thể chọn sử dụng Jinja2 ( jinja.pocoo.org/2 ) và nó sẽ cung cấp cho bạn toàn bộ khả năng của Python, nhưng vì phần lớn các ứng dụng của bên thứ 3 sử dụng hệ thống Django nên thường rất khó để trộn lẫn chúng. Hãy xem ExprTag ( djangosnippets.org/snippets/9 ) để biết cách lấy biểu thức bên trong các mẫu Django. Nó hoạt động.
Peter Rowell

3
@ Bấm vào tài liệu nói những điều khác nhau cho phiên bản khác nhau. Có vẻ như đối với 1.10, nó không còn là một phương pháp nữa
yairchu

32

Django 1.10+

Sử dụng một thuộc tính, không phải là một phương thức:

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

Việc sử dụng phương pháp cùng tên không được chấp nhận trong Django 2.0 và không còn được đề cập trong tài liệu Django.


Lưu ý rằng đối với Django 1.10 và 1.11, giá trị của tài sản là một CallableBoolvà không phải là boolean, có thể gây ra một số lỗi lạ. Ví dụ: tôi đã có một khung nhìn trả về JSON

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

rằng sau khi cập nhật vào tài sản request.user.is_authenticatedđã ném ngoại lệ TypeError: Object of type 'CallableBool' is not JSON serializable. Giải pháp là sử dụng JsonResponse, có thể xử lý đúng đối tượng CallableBool khi tuần tự hóa:

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

1
nhưng is_authenticated (cả mẫu bên trong và bên ngoài) luôn trả về True cho người dùng thực (và Sai cho người dùng ẩn danh) - bất kể người dùng có thực sự đăng nhập hay không.
Tony Suffolk 66

Điều đó không sao vì phương pháp này được sử dụng request.user. Việc người dùng có đăng nhập hay không chỉ quan trọng trong ngữ cảnh của yêu cầu, ví dụ như phiên trình duyệt.
Mark Chackerian

Giả sử ứng dụng đăng xuất chính xác người dùng - Tôi đã thấy một số không.
Tony Suffolk 66

22

Khối sau nên hoạt động:

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

2
nhưng is_authenticated (cả mẫu bên trong và bên ngoài) luôn trả về True - bất kể người dùng có thực sự đăng nhập hay không.
Tony Suffolk 66

Tài liệu nói: Thuộc tính chỉ đọc luôn luôn đúng (trái ngược với AnonymousUser.is_authenticated luôn là Sai). Đây là một cách để biết người dùng đã được xác thực hay chưa. Điều này không ngụ ý bất kỳ quyền nào và không kiểm tra xem người dùng có hoạt động hay có phiên hợp lệ hay không. Mặc dù thông thường, bạn sẽ kiểm tra thuộc tính này trên request.user để tìm hiểu xem liệu nó có được xác thực bởi Phần mềm xác thực (đại diện cho người dùng đang đăng nhập hiện tại không), bạn nên biết thuộc tính này là Đúng cho bất kỳ trường hợp Người dùng nào.
Sopan

Vì vậy, nếu bạn muốn hiển thị - người dùng chưa được xác thực là "Chào mừng khách" và xác thực người dùng là "Chào mừng .USERNAME" thì khối sau trong các mẫu có thể hoạt động: {% if user.is_authenticated%} <p> Chào mừng {{user.username }} !!! </ p> {% khác%} <p> Chào mừng khách !!! </ p> {% endif%}
Sopan

7

Theo quan điểm của bạn:

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

Trong bạn chức năng điều khiển thêm trang trí:

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

nhưng is_authenticated (cả mẫu bên trong và bên ngoài) luôn trả về True - bất kể người dùng có thực sự đăng nhập hay không.
Tony Suffolk 66

tốt hơn cho người dùng request.user.is_authenticatednếu bạn biết rằng ứng dụng của bạn sẽ luôn đăng xuất người dùng
Tony Suffolk 66

0

Nếu bạn muốn kiểm tra người dùng được xác thực trong mẫu của mình thì:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.