django框架——csrf相关装饰器、基于中间件思想编写项目、auth认证模块

系列文章目录

第一章 django安装与介绍

第二章 django基础使用

第三章 路由层

第四章 虚拟环境、django版本区别、视图层

第五章 模板层

第六章 模型层(上)

第七章 模型层(下)

第八章 ajax

第九章 sweetalert前端插件、序列化组件、批量数据操作、分页器、Forms组件(上)

第十章 forms组件(下)、ModelForm简单使用、cookie与session简单使用

第十一章 django操作cookie补充、django操作session、CBV添加装饰器的三种方式、django中间件常见方法、csrf


文章目录

  • 系列文章目录
  • 一、csrf相关装饰器
    • 1.针对FBV
    • 2.针对CBV
  • 二、基于中间件思想编写项目
    • 为什么要使用中间件的形式来导入模块
    • 1.对django配置文件的理解
    • 2.如何实现django配置文件导入模块
  • 三、auth认证模块
    • 1.authenticate()
    • 2.login()
    • 3.user
    • 4.is_authenticated()
    • 5.校验登录装饰器
    • 6.密码
      • 1.check_password()
      • 2.set_password()
    • 7.logout(request)
    • 8.注册用户
    • 9.拓展auth_user表
      • 方法1
      • 方法2


一、csrf相关装饰器

csrf中间件是django用于网站防伪的,在配置文件中配置完毕后,只要是有提交数据的操作都要经过csrf组件的防伪验证

当我们在项目中有的位置不需要防伪验证时需要使用csrf的装饰器为对应的功能关闭csrf验证

from django.views.decorators.csrf import csrf_exempt,csrf_protect
csrf_exempt # 忽略csrf校验
csrf_protect # 开启csrf校验

1.针对FBV

@csrf_protect\@csrf_exempt
def login(request):
    return render(request,'login.html')

2.针对CBV

csrf_protect 三种CBV添加装饰器的方式都可以

 class Index(views.View):
     @method_decorator(csrf_protect)
     def get(self, request):
         # username = request.get_signed_cookie('username', salt='加盐')
         username = request.session.get('username')
         return render(request, 'index.html', locals())

 @method_decorator(csrf_protect, name='get')
 class Index(views.View):

     def get(self, request):
         # username = request.get_signed_cookie('username', salt='加盐')
         username = request.session.get('username')
         return render(request, 'index.html', locals())

class Index(views.View):

    @method_decorator(csrf_protect)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    def get(self, request):
        # username = request.get_signed_cookie('username', salt='加盐')
        username = request.session.get('username')
        return render(request, 'index.html', locals())

csrf_exempt 只有一种方式可以生效(给重写的dispatch方法装)

class Index(views.View):

    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    def get(self, request):
        # username = request.get_signed_cookie('username', salt='加盐')
        username = request.session.get('username')
        return render(request, 'index.html', locals())

二、基于中间件思想编写项目

为什么要使用中间件的形式来导入模块

项目开发完毕后会在服务器上启动之后没有意外是不会停止的,这种是时候当我们需要修改项目功能(新增、修改、删除、不使用等),这个时候就需要去修改核心的业务逻辑层代码。但随意修改业务逻辑层往往伴随很多问题(需要修改的代码正在使用、修改部分为核心代码必选先停止服务器等),针对这些问题,往往修改一次需要付出很高的代价,这个时候以中间件和配置文件的形式来使功能模块化,可随意修改删除将节省很高的成本

1.对django配置文件的理解

通过学习django7个中间件,我们知道在MIDDLEWARE中配置的不单单是一个字符串而是相当于导入模块的操作

2.如何实现django配置文件导入模块

importlib模块
该模块能够将字符串转化为对应的py文件路径,然后获取py文件(注:不能导入py文件中的类)

python反射
使用反射获取对象中的类、方法、变量

通过以上俩种代码可以完成将字符串路径所对应的py中的类、方法、变量转变为

1.创建一个my_mid包
创建func1.py、func2.py、func3.py
在这里插入图片描述
2.为三个py文件设置功能函数
func1.py

class Show1(object):
    def __init__(self, msg):
        self.msg =msg

    def show_p(self):
        print(f'你启用了func1组件的show_p功能,你传入了一个参数:%s'% self.msg)

    def show_p1(self):
        print(f'你启用了func1组件的show_p1功能,你传入了一个参数:{self.msg}')

func2.py

class Show2(object):
    def __init__(self, msg):
        self.msg = msg

    def show_p(self):
        print(f'你启用了func2组件的show_p功能,你传入了一个参数:%s'%self.msg)

    def show_p1(self):
        print(f'你启用了func2组件的show_p1功能,你传入了一个参数:{self.msg}')

func3.py

class Show3(object):
    def __init__(self, msg):
        self.msg = msg

    def show_p(self):
        print(f'你启用了func3组件的show_p功能,你传入了一个参数:%s'%self.msg)

    def show_p1(self):
        print(f'你启用了func3组件的show_p1功能,你传入了一个参数:{self.msg}')

3.编写获取配置文件并转化为对象调用功能

    def run_way():
        # 1.获取配置文件中的路径
        from djangoceshi1 import settings
        # 2.对获取的路径进行处理
        total_mid = []
        # 3.将配置文件中的路径分开处理
        for MY_MID in settings.MY_MIDS:
            py_name, class_name = MY_MID.rsplit('.', maxsplit=1)
            # 4. 获取py文件后获取class对象
            import importlib
            py_obj = importlib.import_module(py_name)
            class_obj = getattr(py_obj, class_name)
            total_mid.append(class_obj)
        # 5.使用封装好的total_mid 可以不封装直接在for中调用
        for mid in total_mid:
            obj = mid('参数')
            obj.show_p()
            obj.show_p1()

完成以上步骤只需要触发即可
eg:

#随意在任意地方调用
run_way()

django框架——csrf相关装饰器、基于中间件思想编写项目、auth认证模块_第1张图片
运行结果:
在这里插入图片描述

django框架——csrf相关装饰器、基于中间件思想编写项目、auth认证模块_第2张图片
运行结果:
在这里插入图片描述


三、auth认证模块

auth是django提供给的快速完成用户相关功能的模块:
用户相关功能:创建、认证、编辑…

auth模块django也配套提供了一张用户表
执行数据库迁移命令之后默认产生的auth_user

django自带的admin后台管理用户登录参考的就是auth_user表
创建admin后台管理员用户:

python manage.py createsuperuser

auth_user表结构
django框架——csrf相关装饰器、基于中间件思想编写项目、auth认证模块_第3张图片

使用auth模块需要先导入

from django.contrib import auth

1.authenticate()

提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。

如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。

authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。

user = auth.authenticate(username='username',password='password')

2.login()

该函数接受一个HttpRequest对象,以及一个经过认证的User对象。

该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据(一般情况储存在django_session中)。

def login(request):
	user = auth.authenticate(username='username',password='password')
	login(request, user)

3.user

对request使用.user可以获取当前请求中的user对象

def login(request):
	user = request.user
	

4.is_authenticated()

用来判断当前请求是否通过了认证(是否已存在session)。(实质上就是查看session)

request.user.is_authenticated()

5.校验登录装饰器

auth 给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。

from django.contrib.auth.decorators import login_required
	@login_required(login_url='/lg/')  # 局部配置
	@login_required  # 全局配置
	LOGIN_URL = '/lg/'  # 需要在配置文件中添加配置

若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ’ 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。

from django.contrib.auth.decorators import login_required
# 1.局部配置
	@login_required(login_url='/lg/')  # 局部配置 只对此处有效
# 2.全局配置
	@login_required  # 全局配置,之后使用该装饰器都会生效
	
	LOGIN_URL = '/lg/'  # 需要在配置文件中添加配置

6.密码

1.check_password()

auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。

密码正确返回True,否则返回False。

request.user.check_password('密码') 

2.set_password()

auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。

注意:设置完一定要调用用户对象的save方法

  request.user.set_password('新密码')
  request.user.save()

7.logout(request)

该函数接受一个HttpRequest对象,无返回值。

当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

auth.logout(request)

8.注册用户

auth为我们提供了俩种用户的创建
create_superuser为超级用户,该方法需要提供用户名、密码、邮箱等
create_suser为普通用户,该方法需要提供用户名、密码等

from django.contrib.auth.models import User
  User.objects.create_superuser(username='用户名1', password='密码1', email='[email protected]')
  User.objects.create_suser(username='用户名2', password='密码2')

9.拓展auth_user表

方法1

直接使用一对一关系让别的表关联auth_user表
这样可以变相的增加auth_user表的字段

方法2

当我们设计用户表时想要拥有更多字段并且可以使用django提供的登录、注册等功能。这个时候继承auth_user表,这样可以拓展字段还能继续使用django提供的便捷功能。

from django.contrib.auth.models import AbstractUser
class Users(AbstractUser):
    # 编写AbstractUser类中没有的字段 不能是AbstractUser已拥有的字段
    phone = models.BigIntegerField()
    addr = models.CharField(max_length=32)

编写完毕需要去配置文件中设置

AUTH_USER_MODEL = 'app01.Users'

此时迁移表就能完成拥有auth_user功能和字段的新用户表
注意:
1.迁移操作是否已有记录,有就将其删除
2.迁移操作是否已生成表,是最好删除所有表(可以只删除auth前缀的表)

练手项目:
bbs论坛

你可能感兴趣的:(django框架,web框架,django,中间件,csrf)