Django Auth登录实战

前言

**目标:实现用户登录和注销功能。**涉及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

python 复制代码
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中间件过滤逻辑

python 复制代码
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配置中间件

python 复制代码
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',    # 新增位置
]

源代码

Giteedjango-ums: 基于Django Python Web框架 + MySQL + Bootstrap 开发的用户管理系统, 目前包括:部门管理、用户管理、认证-注册登录、文件上传等功能。记得Star关注项目更新!

关注我,我会不断更新 Django Web 开发案例,助力您熟练掌握Django。

相关推荐
白拾7 分钟前
使用Conda管理python环境的指南
开发语言·python·conda
是刃小木啦~27 分钟前
三维模型点云化工具V1.0使用介绍:将三维模型进行点云化生成
python·软件工程·pyqt·工业软件
总裁余(余登武)33 分钟前
算法竞赛(Python)-万变中的不变“随机算法”
开发语言·python·算法
一个闪现必杀技39 分钟前
Python练习2
开发语言·python
Eric.Lee20211 小时前
音频文件重采样 - python 实现
人工智能·python·深度学习·算法·audio·音频重采样
大神薯条老师1 小时前
Python从入门到高手5.1节-Python简单数据类型
爬虫·python·深度学习·机器学习·数据分析
Mr.D学长1 小时前
毕业设计 深度学习社交距离检测系统(源码+论文)
python·毕业设计·毕设
姜学迁1 小时前
Rust-枚举
开发语言·后端·rust
wdxylb1 小时前
解决Python使用Selenium 时遇到网页 <body> 划不动的问题
python
代码骑士1 小时前
【一起学NLP】Chapter3-使用神经网络解决问题
python·神经网络·自然语言处理