Django笔记6–装饰器、中间件实现Session限定访问

在有登录的系统中,有些页面可以不登录账户就可以访问,如:登录页、注册页等等,而有些网页则只能在登录成功之后才能跳转,如:个人信息主页,购物车页等等。
此时可以使用session记录登录状态来限制范围权限。
记录两种实现方法:
①在视图函数中,执行视图函数前,通过调用装饰器来获取session中的登录信息,判断是否登录成功,进而函数返回对应的页面。
②使用中间件,在接收到客户端访问请求时,获取session记录的登录信息,并对比客户端请求访问的路由,判断是否执行,未登录且访问需登录的网页,直接中断执行返回登录页,否则正常执行视图函数。

本案例中
登录页(login.html)、注册页(register.html)、退出页(loginout.html)可随意访问,
首页(index.html)、详情页(detail.html)需登录后访问.

具体方法见: 二、实现方法

一、搭建项目

1、创建项目

1、创建django项目

django-admin startproject Xxxx

2、创建数据库

create database Xxxx character set utf8;

3、项目内导入静态文件

Django笔记6--装饰器、中间件实现Session限定访问

4、配置项目
settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'LoginCS',
        'HOST': 'localhost',
        'USER': 'root',
        'PASSWORD': '123123',
        'PORT': '3306'
    }
}

STATICFILES_DIRS = [
    (os.path.join(BASE_DIR,'static')),
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

_ init _.py:

import pymysql

pymysql.install_as_MySQLdb()

2、创建应用

1、创建应用

python manage.py startapp Xxxx

2、注册应用
settings.py:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'user',
]

3、创建模型

3、迁移文件

1、生成迁移文件

python manage.py makemigrations

2、迁移

python manage.py migrate

4、配置路由

settings.py文件同级目录中的urls.py文件:

from django.conf.urls import url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/',login),
    url(r'^loginout/',loginout),
]

5、创建视图函数

views.py:

import hashlib
import re

from django.http import HttpResponseRedirect
from django.shortcuts import render

from user.models import logininfo

def login(request):

    if request.method == 'GET':
        return render(request, 'login.html')
    else:

        uname = request.POST.get('use_rname')
        pwd = request.POST.get('pdw')
        cache = request.POST.get('cache')

        if len(uname) < 5 or len(uname) > 20:
            return render(request,'login.html',{'errMsg':'用户名必须在5-20个字符'})
        elif len(pwd) < 8 or len(pwd) > 20:
            return render(request,'login.html',{
                'errMsg':'密码不符合规范,8-20个字符'
            })

        user = logininfo.objects.filter(username=uname)
        if user:

            sha1=hashlib.sha256()
            sha1.update(pwd.encode('utf-8'))
            sha1_pwd = sha1.hexdigest()
            if user[0].pwd != sha1_pwd:

                return render(request, 'login.html', {
                    'errMsg': '密码错误!'
                })
            else:
                res = HttpResponseRedirect('/')

                res.set_cookie('username',uname)

                request.session['is_login'] = True
                return res
        else:
            return render(request, 'login.html', {
                'errMsg': '用户未注册!'
            })

def register(request):

    if request.method == 'GET':
        return render(request, 'register.html')
    else:

        uname = request.POST.get('user_name')
        pwd = request.POST.get('pwd')
        confirmPwd = request.POST.get('cpwd')
        email = request.POST.get('email')
        allow = request.POST.get('allow')

        if len(uname) < 5 or len(uname) > 20:
            return render(request, 'register.html', {
                'errMsg': '用户名必须在5-20个字符'
            })
        if len(pwd) < 8 or len(pwd) > 20:
            return render(request, 'register.html', {
                'errMsg': '密码不符合规范,8-20个字符'
            })
        if pwd != confirmPwd:
            return render(request, 'register.html', {
                'errMsg': '两次输入密码不一致'
            })

        if re.match('^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email) == None:
            return render(request, 'register.html', {
                'errMsg': '邮箱不符合规范'
            })

        if allow != 'on':
            return render(request, 'register.html', {
                'errMsg': '请同意网站协议'
            })

        user = logininfo.objects.filter(username=uname)
        if user:
            return render(request, 'register.html', {
                'errMsg': '用户名已存在'
            })
        else:
            newUser = logininfo()
            newUser.username = uname

            sha256 = hashlib.sha256()
            sha256.update(pwd.encode('utf-8'))
            sPwd = sha256.hexdigest()
            newUser.password = sPwd
            newUser.email = email
            newUser.is_active = 0
            newUser.save()

            return HttpResponseRedirect('/login')

def loginout(request):

    request.session.flush()
    return render(request,'login.html')

def index(request):

    return render(request, 'index.html')

def detail(request):

    return render(request, 'detail.html')

二、实现方法

1、装饰器实现访问限制

1、views.py同级目录中创建装饰器文件zsq.py:

from django.http import HttpResponseRedirect

def a(func):
    def inner(request):

        is_login = request.session.get('is_login')
        if is_login:
            return func(request)
        else:
            return HttpResponseRedirect('/login')
    return inner

2、views.py文件中引入装饰器并使用

from .zsq import a

@a
def index(request):

    return render(request, 'index.html')

@a
def detail(request):

    return render(request, 'detail.html')

此时浏览器直接访问
首页:http://127.0.0.1:8000/index/
详情页:http://127.0.0.1:8000/detail/
都将强制跳转到登录页面:http://127.0.0.1:8000/login/
只有登录成功后才能访问。

2、中间件实现限制访问

1、创建中间件文件Middleware.py:


from django.http import HttpResponseRedirect
from django.utils.deprecation import MiddlewareMixin

whiteUrls = ['/login/','/register/','/loginout/','/admin/']

class UserAuthMiddleWare(MiddlewareMixin):

    def process_request(self,request):
        print(request.path)
        if request.path not in whiteUrls and request.path.startswith('/admin') == False:
            is_login = request.session.get('is_login',None)
            if not is_login:
                return HttpResponseRedirect('/login')

2、settings.py文件中注册创建的中间件:

MIDDLEWARE = [
    。。。。。

    'LoginCS.Middleware.UserAuthMiddleWare',
]

3、注释前面使用的装饰器

from .zsq import a

def index(request):

    return render(request, 'index.html')

def detail(request):

    return render(request, 'detail.html')

此时浏览器直接访问
首页:http://127.0.0.1:8000/index/
详情页:http://127.0.0.1:8000/detail/
都将强制跳转到登录页面:http://127.0.0.1:8000/login/
只有登录成功后才能访问。

Original: https://blog.csdn.net/Nty268/article/details/122094200
Author: The_Caibe
Title: Django笔记6–装饰器、中间件实现Session限定访问

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/736523/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Flask 极致细节:4. 数据库的搭建

    Flask 极致细节:4. 数据库的搭建 此章节主要介绍如何专业地使用 pymysql, flask-sqlalchemy, flask-migrate对数据库进行搭建,版本更新,…

    Python 2023年8月13日
    059
  • 第三章. Pandas入门—数据的增加,修改和删除

    第三章. Pandas入门 3.6 数据的增加,修改和删除 1. DataFrame对象数据的增加: 1).按行增加数据: 1).&#x589E;&#x52A0;&…

    Python 2023年8月7日
    094
  • PySpark之SparkSQL基本操作

    SparkSQL DataFrame的优点: DataFrame的推出,让Spark具备了处理大规模结构化数据的能力,不仅比原有的RDD转化方式更加简单易用,而且获得了更高的计算性…

    Python 2023年8月8日
    060
  • Numpy系列(五):函数库之2随机数及概率分布

    Numpy系列目录 文章目录 一、 简介 二、 思维导图 三、 Numpy随机数及概率分布 * 1. 随机数 – 1.1 api版本说明 1.2 简单随机数 1.3 设…

    Python 2023年8月27日
    074
  • 粒子群优化算法及其应用

    产生背景 粒子群优化(Particle Swarm Optimization, PSO)算法是由美国普渡大学的Kennedy和Eberhart于1995年提出,它的基本概念源于对鸟…

    Python 2023年10月9日
    0116
  • 一切皆对象和深浅拷贝

    1.元类 元类的来源是:python中一切皆对象。 1.1 什么是元类 元类就是用来实例化产生类的类 关系:元类—实例化—类(自定义的类)—实例…

    Python 2023年11月1日
    034
  • Python中zip函数讲解

    zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表。具体意思不好用文字来表述,直接看示例: x = [1, 2, 3] y = [4, 5, 6] z =…

    Python 2023年5月24日
    073
  • pandas-datareader

    pandas-datareader介绍 Pandas库提供了专门从财经网站获取金融数据的API接口,可作为量化交易股票数据获取的另一种途径,该接口在urllib3库基础上实现了以客…

    Python 2023年8月22日
    065
  • SQL(及存储过程)跑得太慢怎么办?

    SQL作为目前最常用的数据处理语言,广泛应用于查询、跑批等场景。当数据量较大时,使用SQL(以及存储过程)经常会发生跑得很慢的情况,这就要去优化SQL。优化SQL有一些特定的套路,…

    Python 2023年9月26日
    043
  • python基础(14):模块

    使用模块 作用域 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。 为了编写可维护的代码,我们把很多 函数分组,分别放到 不同的文件…

    Python 2023年9月25日
    035
  • unittest 测试框架 与 pytest 测试框架 区别 对比 优劣 分析

    抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 Original: https://blo…

    Python 2023年9月13日
    056
  • matplotlib之pyplot模块——绘制对数线图(loglog()、semilogx()、semilogy())

    当前有效 matplotlib版本为: 3.4.1。 对数图 常规图表坐标轴采用算术尺度(线形尺度)。对数图即坐标轴采用对数尺度的图表。对数图分为双对数图和半对数图,双对数图是两个…

    Python 2023年9月2日
    057
  • 【从小白开始学python系列八】数值类型

    类型是类别,例如,男性和女性被分为两类。 [En] Types are categories, for example, men and women are divided int…

    Python 2023年5月24日
    060
  • 用python实现微信、钉钉等软件多开

    我发现坛友分享的很多都是通过cmd 去start 多个微信虽然我可以打开更多,但它不够灵活。比如,我早上登录了一个微信,下午就不好用了。 [En] Although I can o…

    Python 2023年5月24日
    0120
  • Python中的SSTI (一)

    Flask是一个轻量级的python的web框架。轻量级说明他只适用于构建小型网站。 SSTI,Server-Site Template Injection,即服务器模板注入。同X…

    Python 2023年8月10日
    060
  • python爬虫把数据保存到csv、mysql中

    啧,放假几天游戏玩腻了,啥都不想干,突然想起来python这玩意,无聊就来玩玩 目录 先是保存csv里面 然后保存到mysql里 目标:起点 主要是拿到这几个数据 分析下网页 一个…

    Python 2023年9月29日
    076
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球