前言
目标:实现用户登录和注销功能。涉及django登录知识点,如登录的用户名密码如何验证,输出错误如何提示,当用户未登陆时访问功能页面如何让用户去登录(DjangoAuth,类似过滤器)等。
效果图
开发计划
- 部门管理---已完成
- 用户管理---已完成
- 认证(登录/注销)---已完成
- 数据统计---开发中
- 文件上传---待开发
...........
Cookie与Session
Cookie 和 Session 是Web开发中用于跟踪用户状态和识别用户的两种技术。
Cookie 是一个小型的数据文件,由网站创建并保存在用户的计算机或其他设备上,用于存储用户的浏览信息和个人偏好。每当用户访问该网站时,浏览器会将Cookie发送到服务器,服务器通过这些信息来识别用户,并为其提供定制化的内容或记住用户的登录状态。Cookie可以设置为在浏览器关闭后立即过期,也可以设置为在未来的某个日期过期。
Session 是一种在服务器端存储用户数据的技术。当用户访问网站并执行某些操作(如登录、购物等)时,服务器会创建一个Session,并为该用户分配一个唯一的ID。这个ID通常存储在用户浏览器的Cookie中,但也可以通过其他方法传递,如URL参数或隐形表单字段。服务器使用这个ID来识别用户,并在用户会话期间保存和检索用户数据。与Cookie不同,Session数据存储在服务器上,因此可以存储更多的数据,且不会受到浏览器存储限制的影响。
共同点
都用于跟踪用户状态。
都可以用来存储用户偏好、购物车内容、登录信息等。
不同点
存储位置:Cookie存储在客户端,Session存储在服务器端。
存储容量:Cookie有大小限制,Session通常没有限制。
安全性:Session通常比Cookie更安全,因为敏感数据存储在服务器端。
持久性:Cookie可以设置过期时间,Session通常在用户会话结束后或服务器重启时消失。
性能:Session需要服务器资源来维持,而Cookie则完全由客户端处理。
代码案例
登录逻辑
views.py
def login(request):
"""用户登录"""if request.method == 'GET':form = LoginForm()return render(request, 'login.html', {'form':form})form = LoginForm(request.POST)# 表单字段验证if form.is_valid():# 查询数据库匹配用户名密码是否正确user_obj = models.UserInfo.objects.filter(**form.cleaned_data).first()print(user_obj)if not user_obj:form.add_error('password', '用户名或密码错误')return render(request, 'login.html', {'form': form})request.session['info'] = {'id': user_obj.id, 'username': user_obj.username}# 设置 session 过期时间为30分钟request.session.set_expiry(60 * 30)return redirect('/user/list/')return render(request, 'login.html', {'form', form})def logout(request):
"""用户注销"""request.session.flush()return redirect('/login/')class LoginForm(BootstrapForm):username = forms.CharField(label="用户名",widget=forms.TextInput,required=True)password = forms.CharField(label="密码",widget=forms.PasswordInput(render_value=True),required=True,)
Django中间件过滤逻辑
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirectclass AuthMiddleware(MiddlewareMixin):def process_request(self, request):# 0.排除那些不需要登录就能访问的页面# request.path_info 获取当前用户请求的URL /login/if request.path_info in ["/login/", "/image/code/"]:return# 1.读取当前访问的用户的session信息,如果能读到,说明已登陆过,就可以继续向后走。info_dict = request.session.get("info")# print(info_dict)if info_dict:return# 2.没有登录过,重新回到登录页面return redirect("/login/")
然后在settings.py配置中间件
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware','ums.middleware.auth.AuthMiddleware', # 新增位置
]
源代码
Gitee:django-ums: 基于Django Python Web框架 + MySQL + Bootstrap 开发的用户管理系统, 目前包括:部门管理、用户管理、认证-注册登录、文件上传等功能。记得Star关注项目更新!
关注我,我会不断更新 Django Web 开发案例,助力您熟练掌握Django。