前言
目标:实现用户登录和注销功能。涉及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 redirect
class 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关注项目更新!
如果本文对你有帮助,记得点赞关注,你的支持是我最大的动力!
如果您有任何疑问或建议,欢迎在评论区留言,一起探讨交流!