احراز هویت آماده، فقط قالب لازم دارد
اپ django.contrib.auth همهی Viewهای ورود و خروج و مدیریت رمز را آماده دارد. کافی است urlهای آن را include کنید و قالبهایش را بسازید. به لطف Custom User فصل اول، فرم ورود خودش برچسب «موبایل» را بهجای «نام کاربری» نشان میدهد، چون از USERNAME_FIELD میخواند.
# config/urls.py
urlpatterns += [path("accounts/", include("django.contrib.auth.urls"))]
# settings.py
LOGIN_URL = "login"
LOGIN_REDIRECT_URL = "orders:list"
LOGOUT_REDIRECT_URL = "pages:home"
SESSION_COOKIE_AGE = 60 * 60 * 24 * 14 # دو هفته
PASSWORD_HASHERS = [
"django.contrib.auth.hashers.Argon2PasswordHasher", # pip install argon2-cffi
"django.contrib.auth.hashers.PBKDF2PasswordHasher",
]
| نام url | آدرس | قالب |
|---|---|---|
| login | accounts/login/ | registration/login.html |
| logout | accounts/logout/ (فقط POST) | registration/logged_out.html |
| password_change | accounts/password_change/ | registration/password_change_form.html |
| password_reset | accounts/password_reset/ | registration/password_reset_form.html |
| password_reset_confirm | accounts/reset/<uidb64>/<token>/ | registration/password_reset_confirm.html |
قالب ورود و دکمهی خروج
{# templates/registration/login.html #}
{% extends "base.html" %}
{% block content %}
<form method="post">
{% csrf_token %}
{{ form.as_div }}
<input type="hidden" name="next" value="{{ next }}">
<button type="submit">ورود</button>
</form>
{% endblock %}
{# در navbar: خروج از Django 5.0 فقط با POST #}
<form method="post" action="{% url 'logout' %}">
{% csrf_token %}
<button type="submit">خروج</button>
</form>
ورود و خروج دستی در کد
from django.contrib.auth import authenticate, login, update_session_auth_hash
user = authenticate(request, mobile="09121234567", password="...") # یا username=
if user is not None:
login(request, user)
# بعد از تغییر رمز توسط خود کاربر، تا از Session خارج نشود:
update_session_auth_hash(request, user)
بازیابی رمز پیشفرض جنگو با ایمیل کار میکند. اگر کاربران شما فقط موبایل دارند، بازیابی را با کد پیامکی (درس ۳۰) بسازید.
نکتههایی که کمتر کسی میداند
- از Django 5.0 خروج با GET حذف شده است؛ لینک سادهی
<a href="/accounts/logout/">خطای 405 میدهد و باید فرم POST با توکن CSRF باشد. - Django 5.1 میدلور
LoginRequiredMiddlewareرا آورد: همهی صفحات بهطور پیشفرض لاگین میخواهند و صفحات عمومی را با دکوراتور@login_not_requiredباز میکنید؛ برای پنلهای داخلی امنترین پیشفرض است. - LoginView پارامتر
nextرا باurl_has_allowed_host_and_schemeبررسی میکند تا ریدایرکت به سایت مهاجم (open redirect) ممکن نباشد؛ اگر ورود دستی مینویسید، همین تابع را خودتان صدا بزنید. login()شناسهی Session را عوض میکند (جلوگیری از session fixation) اما دادههای Session مهمان مثل سبد خرید را نگه میدارد.- فهرست
PASSWORD_HASHERSرا که عوض کنید، رمز کاربران قدیمی در اولین ورود موفق خودکار با الگوریتم جدید دوباره هش میشود؛ مهاجرت بیدردسر به Argon2.