【Django】教程-9-登录+退出

【Django】教程-1-安装+创建项目+目录结构介绍
【Django】教程-2-前端-目录结构介绍
【Django】教程-3-数据库相关介绍
【Django】教程-4-一个增删改查的Demo
【Django】教程-5-ModelForm增删改查+规则校验【正则+钩子函数】
【Django】教程-6-搜索框-条件查询前后端
【Django】教程-7-分页,默认使用django的
【Django】教程-8-页面时间组件

15. 用户认证,可以多种方式后面会介绍

15.1

浏览器登录服务器,服务器给浏览器凭证,服务器自己存一个凭证;下次带着凭证过来,服务器验证凭证,验证通过,可继续操作
登录成功views中login添加,下面这行代码

相当于:① 会给浏览器生成一个cookie的随机字符串;

② 服务器数据库记录这个随机字符串在django_session表中;

③ 服务器记录info=小明,session, 当然你可以使用任意属性,不一定是key,可以自定义属性名字随便起。

request.session("info")="小明"

例如:

python 复制代码
def login(req):
    """用户登录"""
    """ modelform 方式添加用户"""
    if req.method == 'GET':
        user = LoginForm()
        return render(req, 'login/login.html', {"user": user})
    # 用户post提交,数据校验
    user = LoginForm(data=req.POST)
    if user.is_valid():
        # 生成cookie和session
        req.session["key"] = {"username": req.POST.get("username")}
        
        return redirect("/admin/list")
    # # 校验失败, 在页面上展示错误信息
    return render(req, 'login/login.html', {"user": user})

对每个页面添加,判断,如果没有登录属性,就跳转到登陆页面

python 复制代码
def admin_list(request):
    # 每一个views中,都需要添加,认证信息,如果没有,就跳转到登录
    request.session.get("key")
    if not info:
        return redirect("/login/")

15.2 中间件方式

  • 定义中间件
python 复制代码
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect

class AuthMiddleware(MiddlewareMixin):

    def process_request(self, request):
        print("M1 进来了!")
        # 如果没有返回值,返回None,继续往下走
        # 如果有返回值,HttpResponese 返回了,不往下走了

        # 如果是登录请求,请求继续
        if request.path_info == '/login/':
            return

        # 1. 读取当前访问的用户session信息,说明已经登录过,可以继续往下走
        info_dict = request.session.get("info")
        print(info_dict)
        if info_dict:
            # 继续往下走
            return

        # 如果没有登录信息,去登录页面
        return redirect('/login/')

    def process_response(self, response):
        print("M1 走了!")
        return response
  • 应用中间件, 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',
    # 'appTang.middleware.LoginMiddleware.LoginRequiredMiddleware',
    'appTang.middleware.auth.AuthMiddleware'
]
  • 登录views account.py
python 复制代码
from django.shortcuts import render, redirect
from appTang.forms import LoginForm


def login(req):
    """用户登录"""
    """ modelform 方式添加用户"""
    if req.method == 'GET':
        user = LoginForm()
        return render(req, 'login/login.html', {"user": user})
    # 用户post提交,数据校验
    user = LoginForm(data=req.POST)
    if user.is_valid():
        # 需要添加用户认证成功信息
        req.session["info"] = {"username": req.POST.get("username")}
        print("登录成功")
        return redirect("/admin/list")


    # # 校验失败, 在页面上展示错误信息
    return render(req, 'login/login.html', {"user": user})
  • 退出
python 复制代码
def logout(req):
    """注销"""
    req.session.clear();
    return redirect("/admin/list")
相关推荐
wqq63108551 小时前
Python基于Vue的实验室管理系统 django flask pycharm
vue.js·python·django
Q_Q19632884751 小时前
python大学生爱心校园互助代购网站_nyvlx_django Flask vue pycharm项目
python·django·flask
wxin_VXbishe7 小时前
C#(asp.net)学员竞赛信息管理系统-计算机毕业设计源码28790
java·vue.js·spring boot·spring·django·c#·php
码界筑梦坊7 小时前
330-基于Python的社交媒体舆情监控系统
python·mysql·信息可视化·数据分析·django·毕业设计·echarts
码界筑梦坊8 小时前
325-基于Python的校园卡消费行为数据可视化分析系统
开发语言·python·信息可视化·django·毕业设计
码界筑梦坊9 小时前
327-基于Django的兰州空气质量大数据可视化分析系统
python·信息可视化·数据分析·django·毕业设计·数据可视化
WangYaolove131419 小时前
基于python的在线水果销售系统(源码+文档)
python·mysql·django·毕业设计·源码
意疏1 天前
程序员兼职如何选择靠谱的软件外包平台 与 我的避坑经验
django
vx_biyesheji00011 天前
豆瓣电影推荐系统 | Python Django 协同过滤 Echarts可视化 深度学习 大数据 毕业设计源码
大数据·爬虫·python·深度学习·django·毕业设计·echarts
玄同7651 天前
Python 后端三剑客:FastAPI/Flask/Django 对比与 LLM 开发选型指南
人工智能·python·机器学习·自然语言处理·django·flask·fastapi