本篇内容介绍了“Django下给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默认有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
请求过来的的时候需要经过每一个中间件里面的process_request方法结果顺序是按照配置文件中注册的中间件自上而下依次执行。
如果中间件没有定义process_request方法,那么会直接跳过执行该中间件。
如果该方法返回了HttpResponse对象,那么该请求将不再继续往后执行而是直接原路返回(校验失败不允许访问)process_request方法就是用来做全局相关的所有限制功能
process_response
响应走的时候需要经过每一个中间件里面的process_response方法。该方法有两个额外的参数request, response。
该方法必须返回一个HttpResponse对象
默认返回形参response也可以自定义返回HttpResponse
顺序是按照配置文件中注册的中间件自下而上依次执行。
如果没有定义的话,直接跳过执行。
process_view
在路由匹配成功之后执行视图函数之前,会自动执行中间件里面的该方法,顺序自上而下依次执行
process_template_response
返回的HttpResponse对象有render属性的时候才会触发
process_exception
当视图函数中出现异常的情况下触发
因为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_protect
不需要验证的加这个装饰器:
@csrf_exempt # 如果该函数有返回的html不能再加{% csrf_token %}
csrf_protect装饰器也可以加在CBV当中,与CBV添加装饰器的用法一致。
csrf_exempt装饰器只能改写dispatch方法来添加。
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表需要在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' # 应用名称.类名
“Django下给CBV添加装饰器的方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。