栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Cocos2d-x

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

Cocos2d-x 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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()


运行结果:


运行结果:


三、auth认证模块

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

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

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

python manage.py createsuperuser

auth_user表结构

使用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='asd@qq.com')
  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论坛

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/952537.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号