Django Auth登录实战

发布时间:2024年01月06日

前言

目标:实现用户登录和注销功能。涉及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',    # 新增位置
]

源代码

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

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

文章来源:https://blog.csdn.net/lizhongjun1005/article/details/135425260
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。