Django框架CBV装饰器中间件auth模块CSRF跨站请求问题

作者:wuzhixian 时间:2021-03-25 09:42:01 

CBV添加装饰器

给CBV添加装饰器有三种方法,三种方法都需要导入模块:


from django.utils.decorators import method_decorator

第一种直接在方法上面添加:


from django.utils.decorators import method_decorator

class MyLogin(View):
@method_decorator(auth)
def get(self, request):
   return HttpResponse('Is from get')

def post(self, request):
   return HttpResponse('Is from post')

第二种是在类上面添加:


from django.utils.decorators import method_decorator

@method_decorator(auth, name='get')  # 方法名
class MyLogin(View):
def get(self, request):
   return HttpResponse('Is from get')

def post(self, request):
   return HttpResponse('Is from post')

第三种是重写as_view()里面的dispatch方法,这种添加完装饰器之后类里面的所有方法都被添加上了。


from django.utils.decorators import method_decorator

class MyLogin(View):
   @method_decorator(auth)
   def dispatch(self, request, *args, **kwargs):
       super.__init__()
   def get(self, request):
       return HttpResponse('Is from get')

def post(self, request):
       return HttpResponse('Is from post')

Django中间件

介绍

Django默认有7个中间件:


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',
]

浏览器从请求到响应的过程中,Django需要通过这7个中间件处理,这7个中间件都默认继承了MiddlewareMixin。

Django支持程序员自定义中间件并且暴露程序员五个可自定义的方法。

  • process_request

  • process_response

  • process_view

  • process_template_response

  • process_exception

如何自定义中间件

1.在项目名或者应用名下创建一个任意名称的文件夹(在应用下创建路径有提示,但如果在项目下创建就没有提示了)

2.在该文件夹内创建一个任意名称的py文件

3.在该py文件内书写类(该类必须继承MiddlewareMixin)


from django.utils.deprecation import MiddlewareMixin

然后在这个类里面就可以自定义五个方法了

(这五个并不是全部都需要书写,用几个写几个)

4.需要将类的路径以字符串的形式注册到配置文件中才能生效(也就是setting.py里面的MIDDLEWARE里面)

process_request

  1. 请求过来的的时候需要经过每一个中间件里面的process_request方法结果顺序是按照配置文件中注册的中间件自上而下依次执行。

  2. 如果中间件没有定义process_request方法,那么会直接跳过执行该中间件。

  3. 如果该方法返回了HttpResponse对象,那么该请求将不再继续往后执行而是直接原路返回(校验失败不允许访问)process_request方法就是用来做全局相关的所有限制功能

process_response

  1. 响应走的时候需要经过每一个中间件里面的process_response方法。该方法有两个额外的参数request, response。

  2. 该方法必须返回一个HttpResponse对象

默认返回形参response也可以自定义返回HttpResponse

  1. 顺序是按照配置文件中注册的中间件自下而上依次执行。

如果没有定义的话,直接跳过执行。

process_view

在路由匹配成功之后执行视图函数之前,会自动执行中间件里面的该方法,顺序自上而下依次执行

process_template_response

返回的HttpResponse对象有render属性的时候才会触发

process_exception

当视图函数中出现异常的情况下触发

csrf跨站请求伪造

因为CSRF攻击利用的是冲着浏览器分不清发起请求是不是真正的用户本人,所以防范的关键在于在请求中放入黑客所不能伪造的信息。从而防止黑客伪造一个完整的请求欺骗服务器。

而Django就使用token验证来防范CSRF。

CSRF在Django中作为一个独立的组件,MIDDLEWARE里面将它注释掉,它便不再执行。

如果想要提交的post请求能够通过csrf验证,需要在html页面里面的from表单里添加一段验证字符串。

csrf验证 form表单


<form action="" method="post">
   {% csrf_token %}
   <input type="text" placeholder="用户名">
   <input type="password" placeholder="密码">
   <input type="submit">
</form>

Ajax csrf验证


<script>
   $('.btn').click(function (){
       $.ajax({

url:'',
           type:'post',
           // 第一种方式
           // data:{'username':'jesse', 'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]')},
           // 第二种
           data:{'username':'jesse', 'csrfmiddlewaretoken':'{{ csrf_token }}'},
           success:function(){

}
       })
   })
</script>

CSRF跨站请求的装饰器

csrf中间件会验证所有的方法都验证,但是我们会碰到所有的方法都验证,但是有几个函数不验证的。这时候就要用到装饰器。

需要验证的加这个装饰器:


@csrf_protect

不需要验证的加这个装饰器:


@csrf_exempt

# 如果该函数有返回的html不能再加{% csrf_token %}

csrf_protect装饰器也可以加在CBV当中,与CBV添加装饰器的用法一致。

csrf_exempt装饰器只能改写dispatch方法来添加。

Django Auth组件

Django用户认证组件一班用在用户的登录注册上,用于判断当前用户是否合法,调用该组件需要导入auth模块,而且auth的认证功能,依赖于auth_user表。

首先创建一个超级用户,这样就可以登录Djangoadmin后台了,点击pycharm上面的tools菜单内的Run manage.py Task,输入命令(首先库内得有auth_user表才能创建)


createsuperuser
# 根据提示输入密码邮箱

使用需要导入auth模块:


from django.contrib import auth

auth模块实际使用(验证用户,设置session)


from django.shortcuts import render, HttpResponse, redirect

# Create your views here.
from django.views import View
from django.contrib import auth

def login(request):
   if request.method == 'POST':
       username = request.POST.get('username')
       password = request.POST.get('password')
       # 利用auth模块验证用户是否合法
       '''
       1.自动去auth_user表中进行验证
       2.把密码自动加密进行比对
       '''
       # 该方法验证正确会返回用户对象,错误会返回None
       user_obj = auth.authenticate(request, username=username, password=password)
       print(user_obj)
       if user_obj:
           auth.login(request, user_obj)  # 相当于设置session,记录用户状态
           return redirect('/home/')
   return render(request, 'login.html')

除了验证用户和设置session之外auth模块还可以设置验证装饰器。


from django.contrib.auth.decorators import login_required

# 同样的使用auth自带的装饰器也需要导入login_required

@login_required(login_url='/login/')
# 该装饰器使用的时候需要传 没有登录 返回的路由,不传默认访问自带的地址account/login
def func(request):
   return HttpResponse('FUNC PAGE')

修改密码


is_right = request.user.check_password(old_pwd)
if is_right:
 # 判断两次密码是否一致
 if new_pwd == re_pwd:
   # 修改密码
   request.user.set_password(new_pwd)
   requesr.user.save()  # 保存到数据库
   return redirect('/login/')

注销功能


def logout(request):
 auth.logout(request)  # 清除cookie
 return redirect('/home/')

注册入库


from django.contrib.auth.model import User
# 需要导入模块

def register(request):
 if request.method == 'POST':
   username = request.POST.get('username')
   password = request.POST.get('password')
   User.object.create(username=username,password=password)  # 密码是名文
   # create_user 密码是密文

auth_user表的扩展

auth_user表的字段是系统帮我们创建的,在使用的过程中难免会碰到字段不能满足我们需求的情况,那么这种情况该如何对该表进行扩展呢?

扩展auth_user表需要在models.py中进行,首先我们需要导入一个模块:


form django.contrib.auth.models import AbstractUser

增加字段需要继承AbstractUser


class UserInfo(AbstractUser):
 phone = models.CharField(max_lenth=32)
 addr = models.CharFiled(max_lenth=32)
 # 增加字段

增加完字段之后必须在settings.py中写一个配置


AUTH_USER_MODEL = 'app01.UserInfo'
# 应用名称.类名

需要注意的是:一旦扩展类执行过迁移命令就不能再扩展了

来源:https://www.cnblogs.com/wuzhixian/p/15178286.html

标签:Django,CBV,装饰器
0
投稿

猜你喜欢

  • Python编程通过懒属性提升性能

    2022-04-01 09:48:43
  • python常用数据结构元组详解

    2022-08-14 08:14:44
  • 解决linux下使用python打开terminal时报错的问题

    2022-10-06 10:46:25
  • XML入门教程:XML CDATA的作用

    2007-11-07 14:08:00
  • linux下python使用sendmail发送邮件

    2023-02-27 00:14:33
  • python和bash统计CPU利用率的方法

    2023-10-15 06:28:25
  • 读写xml文件的2个小函数

    2007-08-23 12:59:00
  • Python使用APScheduler实现定时任务过程解析

    2023-01-23 19:20:35
  • Python爬虫爬取杭州24时温度并展示操作示例

    2022-01-04 14:43:33
  • Flask框架中request、请求钩子、上下文用法分析

    2022-04-17 23:05:08
  • Python 3.x 新特性及10大变化

    2023-02-05 09:17:36
  • 如何基于Python爬虫爬取美团酒店信息

    2023-10-11 00:12:45
  • Python实现的多叉树寻找最短路径算法示例

    2023-03-07 16:37:23
  • Python迭代器和生成器介绍

    2022-03-22 07:41:24
  • pytorch 图像预处理之减去均值,除以方差的实例

    2022-04-20 13:43:45
  • 很酷的JQuery Solar System

    2007-12-15 08:09:00
  • python实现的一只从百度开始不断搜索的小爬虫

    2022-05-20 10:46:18
  • Hibernate Oracle sequence的使用技巧

    2023-07-06 05:18:42
  • python并发编程多进程 互斥锁原理解析

    2023-04-07 04:06:34
  • python爬虫用scrapy获取影片的实例分析

    2023-09-25 09:22:30
  • asp之家 网络编程 m.aspxhome.com