一、项目背景在流浪动物救助平台中用户需要注册、登录后才能提交领养申请。Django 提供了强大的内置认证系统django.contrib.auth可以快速实现用户注册用户登录用户注销登录保护login_required装饰器本教程将逐步演示如何在现有 Django 项目中集成用户认证功能。二、环境准备2.1 项目结构animal-rescue-platform/ ├── core/ # 项目配置 │ ├── settings.py │ └── urls.py ├── animals/ # 动物档案应用 │ ├── models.py │ ├── views.py │ └── urls.py ├── adoptions/ # 领养申请应用 ├── shelters/ # 救助站应用 ├── templates/ # 模板文件 │ ├── base.html │ ├── registration/ │ │ ├── login.html │ │ └── register.html ├── static/ # 静态文件 ├── media/ # 上传文件 ├── manage.py └── db.sqlite32.2 技术栈技术版本用途Python3.8.10开发语言Django4.2.11Web 框架SQLite3.x数据库Bootstrap5.3前端样式三、配置 settings.py3.1 注册应用在core/settings.py中确保以下应用已注册INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.staticfiles, rest_framework, animals, adoptions, shelters, accounts, ]3.2 配置模板目录TEMPLATES [ { BACKEND: django.template.backends.django.DjangoTemplates, DIRS: [BASE_DIR / templates], APP_DIRS: True, OPTIONS: { context_processors: [ django.template.context_processors.debug, django.template.context_processors.request, django.contrib.auth.context_processors.auth, django.contrib.messages.context_processors.messages, ], }, }, ]3.3 添加认证配置在文件末尾添加# 用户认证配置 LOGIN_REDIRECT_URL /animals/ # 登录成功后跳转 LOGOUT_REDIRECT_URL /accounts/login/ # 注销后跳转 LOGIN_URL /accounts/login/ # 需要登录时跳转四、配置 URL 路由4.1 主路由core/urls.pyfrom django.contrib import admin from django.urls import path, include from django.shortcuts import redirect from django.conf import settings from django.conf.urls.static import static urlpatterns [ path(, lambda request: redirect(/animals/)), path(admin/, admin.site.urls), path(animals/, include(animals.urls)), path(accounts/, include(django.contrib.auth.urls)), # Django 内置登录/登出 path(accounts/, include(accounts.urls)), # 自定义注册 ] if settings.DEBUG: urlpatterns static(settings.MEDIA_URL, document_rootsettings.MEDIA_ROOT)4.2 应用路由animals/urls.pyfrom django.urls import path from . import views app_name animals urlpatterns [ path(, views.home, namehome), path(list/, views.animal_list, namelist), path(int:animal_id/, views.animal_detail, namedetail), path(register/, views.register, nameregister), # 注册 URL ]五、创建注册视图5.1 注册视图函数在animals/views.py中添加注册视图from django.shortcuts import render, redirect from django.contrib.auth.models import User from django.contrib.auth import login as auth_login def register(request): 用户注册功能 if request.method POST: username request.POST.get(username) password request.POST.get(password) password2 request.POST.get(password2) # 验证密码是否一致 if password ! password2: return render(request, registration/register.html, { error: 两次输入的密码不一致 }) # 验证用户名是否已存在 if User.objects.filter(usernameusername).exists(): return render(request, registration/register.html, { error: 用户名已被注册 }) # 创建新用户密码自动加密 user User.objects.create_user(usernameusername, passwordpassword) # 注册后自动登录 auth_login(request, user) # 跳转到首页 return redirect(/animals/) # GET 请求显示注册表单 return render(request, registration/register.html)六、创建模板文件6.1 基础模板templates/base.html!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title{% block title %}流浪动物救助平台{% endblock %}/title link hrefhttps://cdn.jsdelivr.net/npm/bootstrap5.3.0/dist/css/bootstrap.min.css relstylesheet link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/bootstrap-icons1.11.0/font/bootstrap-icons.css /head body nav classnavbar navbar-expand-lg navbar-dark bg-primary div classcontainer a classnavbar-brand href/animals/ i classbi bi-heart-fill text-danger/i 流浪动物救助平台 /a div classcollapse navbar-collapse ul classnavbar-nav ms-auto li classnav-itema classnav-link href/animals/首页/a/li li classnav-itema classnav-link href/animals/list/待领养动物/a/li {% if user.is_authenticated %} li classnav-item span classnav-link text-warning欢迎{{ user.username }}/span /li li classnav-item a classnav-link href{% url logout %}注销/a /li {% else %} li classnav-item a classnav-link href{% url login %}登录/a /li li classnav-item a classnav-link href{% url animals:register %}注册/a /li {% endif %} /ul /div /div /nav main {% block content %}{% endblock %} /main footer classbg-dark text-white text-center py-4 mt-5 div classcontainer p classmb-0© 2024 流浪动物救助平台 | 用爱温暖每一个生命/p /div /footer script srchttps://cdn.jsdelivr.net/npm/bootstrap5.3.0/dist/js/bootstrap.bundle.min.js/script /body /html6.2 登录模板templates/registration/login.html!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title用户登录 - 流浪动物救助平台/title link hrefhttps://cdn.jsdelivr.net/npm/bootstrap5.3.0/dist/css/bootstrap.min.css relstylesheet /head body classbg-light div classcontainer py-5 div classrow justify-content-center div classcol-md-5 div classcard shadow div classcard-header bg-primary text-white h4 classmb-0用户登录/h4 /div div classcard-body {% if form.errors %} div classalert alert-danger 用户名或密码错误请重试。 /div {% endif %} form methodpost {% csrf_token %} div classmb-3 label classform-label用户名/label input typetext nameusername classform-control required /div div classmb-3 label classform-label密码/label input typepassword namepassword classform-control required /div button typesubmit classbtn btn-primary w-100登录/button /form hr p classtext-center mb-0 还没有账号a href{% url animals:register %}立即注册/a /p /div /div /div /div /div /body /html6.3 注册模板templates/registration/register.html!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title用户注册 - 流浪动物救助平台/title link hrefhttps://cdn.jsdelivr.net/npm/bootstrap5.3.0/dist/css/bootstrap.min.css relstylesheet /head body classbg-light div classcontainer py-5 div classrow justify-content-center div classcol-md-5 div classcard shadow div classcard-header bg-success text-white h4 classmb-0用户注册/h4 /div div classcard-body {% if error %} div classalert alert-danger{{ error }}/div {% endif %} form methodpost action{% url animals:register %} {% csrf_token %} div classmb-3 label classform-label用户名/label input typetext nameusername classform-control required /div div classmb-3 label classform-label密码/label input typepassword namepassword classform-control required /div div classmb-3 label classform-label确认密码/label input typepassword namepassword2 classform-control required /div button typesubmit classbtn btn-success w-100注册/button /form hr p classtext-center mb-0 已有账号a href{% url login %}立即登录/a /p /div /div /div /div /div /body /html七、使用login_required保护视图7.1 保护领养申请页面在adoptions/views.py中from django.contrib.auth.decorators import login_required login_required def apply_adoption(request, animal_id): 只有登录用户才能提交领养申请 # 业务逻辑...7.2 工作原理未登录用户访问/apply/1/时自动重定向到LOGIN_URL配置的地址/accounts/login/登录成功后会自动跳转回原页面八、运行测试8.1 启动服务器python manage.py runserver8.2 功能测试功能URL操作注册http://127.0.0.1:8000/animals/register/填写用户名、密码登录http://127.0.0.1:8000/accounts/login/输入用户名、密码注销点击导航栏注销按钮退出登录九、运行截图9.1 注册页面​9.2 登录页面​9.3 登录后首页​十、MVP 原则说明本实现遵循 MVPMinimum Viable Product最小可行产品原则原则实现说明核心功能优先只实现注册、登录、注销三个核心功能不做多余功能简洁界面使用 Bootstrap 5 快速搭建简洁表单快速迭代Django 内置 auth 系统开箱即用无需从零实现可验证所有功能可手动测试验证十一、常见问题及解决11.1NoReverseMatch: Reverse for register not found原因模板中使用了{% url register %}但register路由在animals应用下有命名空间。解决改为{% url animals:register %}。11.2ModuleNotFoundError: No module named accounts原因INSTALLED_APPS中未添加accounts应用。解决检查并添加。11.3 注册后未自动登录原因注册视图中未调用login()函数。解决添加from django.contrib.auth import login as auth_login并在创建用户后调用auth_login(request, user)。11.4 密码明文存储原因使用了User.objects.create()而不是create_user()。解决使用create_user()方法密码会自动加密。十二、代码仓库项目代码已上传至 Gitee https://gitee.com/f23016209/animal-rescue-platform十三、总结通过本次实验成功在流浪动物救助平台中集成了 Django 内置的用户认证系统实现了✅ 用户注册密码加密存储✅ 用户登录Session 管理✅ 用户注销清除 Session✅ 登录状态在导航栏动态显示✅login_required保护页面Django 的django.contrib.auth模块提供了完整的认证功能大大简化了开发工作。