全书目录

第十四篇:Django 完全指南 —— 中央行政城区宇宙

第十一章:认证 —— 门禁、工牌、会话与权限系统

1 分钟 341 字 第 285 / 962 个阅读单元

中央行政城区不是谁都能进内部办公楼。

Django 自带一整套认证体系:

  • 用户 User
  • 会话 session
  • 登录登出
  • 权限 permission
  • 用户组 group

先接入官方自带登录视图:

py
from django.contrib import admin
from django.contrib.auth.views import LoginView, LogoutView
from django.urls import include, path

urlpatterns = [
    path("admin/", admin.site.urls),
    path("permits/", include("permits.urls")),
    path("accounts/login/", LoginView.as_view(), name="login"),
    path("accounts/logout/", LogoutView.as_view(), name="logout"),
]

给登录成功后的跳转加个配置:

py
LOGIN_REDIRECT_URL = "permits:index"
LOGOUT_REDIRECT_URL = "login"

对需要登录的窗口加门禁:

py
from django.contrib.auth.decorators import login_required

@login_required
def create(request):
    ...

如果还要更细权限,比如只有审批员能改状态:

py
from django.contrib.auth.decorators import permission_required

@permission_required("permits.change_permit", raise_exception=True)
def approve(request, pk):
    ...

认证流程本质上是:

text
用户提交账号密码
    │
    ▼
Django 验证身份
    │
    ▼
服务端建立 session
    │
    ▼
浏览器拿到 sessionid cookie
    │
    ▼
后续请求自动带 cookie
    │
    ▼
request.user 可用

你在 View 和 Template 里都能直接用认证结果:

  • request.user.is_authenticated
  • request.user.username
  • 模板里根据是否登录显示不同按钮

一个非常重要、且常被晚学到的经验:

如果项目确定要自定义用户模型,尽量在第一次 migrate 之前就定下来。

这是 Django 老工程里最经典的“早知道”问题之一。