五十二、django 中间件,csrf跨站请求伪造,auth模块表

五十二、django 中间件,csrf跨站请求伪造,auth模块表,第1张

概述django 中间件 django中间件事类似django的保安,请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models), 响应走的时候也需要经过中间件才能到达web服务网关接口 django中间件中有五个用户可以自定义的方法 django中间件可以用来做什么? 1.网站全局的身份校验,访问频率限制,权
django 中间件
    django中间件事类似django的保安,请求的时候需要先经过中间件才能到达django后端(urls,vIEws,templates,models),    响应走的时候也需要经过中间件才能到达web服务网关接口
django中间件中有五个用户可以自定义的方法
django中间件可以用来做什么?
1.网站全局的身份校验,访问频率限制,权限校验。。只要涉及到全局的校验都可以在中间件中完成
2.django的中间件是所有web框架中,做的最好

需要掌握的方法有:
1.process_request()方法
规律
1.请求来的时候,会经过每个中间件里面的process_request方法
2.请求来的时候会从上往下依次执行process_request方法,如果没有会直接跳过,去下一个
3.当process_request()方法中,return httpResponse("")对象, 会直接值返回给浏览器,后面中间件和视图层就不走了
基于该特点就可以做访问频率限制,身份校验,权限校验

2.process_response()方法
规律
1.响应走的时候。等到执行完视图函数,会由下往上依次执行process_response方法,如果没有会直接跳过,去下一个
2.必须return response,因为形参response指代的就是返回给前端的数据

了解:
3.process_vIEw()
#.在路由匹配成功,视图函数执行之前触发
4.process_exception()
#只要视图函数一旦报错,立马会触发process_exception方法
5.process_template_response()
# 当你返回的httpResponse对象中必须包含render属性才会触发

总结:只要形参中有response,就必须返回,response是给前端的信息

自定义我们自己的中间件:
1.如果想自定义中间件,就必须先继承MIDdlewareMixin
2.定义中间件,要去settings里面中间件手动添加

from django.utils.deprecation import MIDdlewareMixinfrom django.shortcuts import httpResponseclass MyMdd(MIDdlewareMixin):    def process_request(self,request):        print("我是第一个中间件process_request方法")        # return httpResponse("逗比")    def process_response(self,request,response):        print("我是第一个中间件process_response方法")        # print(response)        return response    def process_vIEw(self,vIEw_func,vIEw_args,vIEw_kwargs):        print(vIEw_func)        print(vIEw_args)        print(vIEw_kwargs)        print("我是第一个中间件process_vIEw方法")    def process_exception(self,exception):        print("我是第一个 process_exception")    def process_template_response(self,response):        print("我是第一个中间件process_template_response方法")        return responseclass MyMdd1(MIDdlewareMixin):    def process_request(self,request):        print("我是第二个中间件process_request方法")    def process_response(self,response):        print("我是第二个中间件process_response方法")        return response    def process_vIEw(self,vIEw_kwargs):        print(vIEw_func)        print(vIEw_args)        print(vIEw_kwargs)        print("我是第二个中间件process_vIEw方法")    def process_exception(self,exception):        print("我是第二个 process_exception")    def process_template_response(self,response):        print("我是第一个中间件process_template_response方法")        return response
自定义中间件代码

 

csrf跨站请求伪造

钓鱼网站:简单说就是把网站页面给用户一模一样,让用户去输入转帐信息,通过隐藏标签,把装给对方的信息,进行修改,达到自己的目的

防止钓鱼网站的思路:
网站会给返回用户的form表单页面 偷偷塞一个随机字符串
请求到来的时候 会先比对随机字符串,是否一致,如果不一致就直接拒绝

该随机字符串有一下特点:
1.同一个浏览器每一次访问都不一样
2.不同的浏览器绝对不会重复

1.form表单发送post请求的时候 需要你在form表单下写:
{% csrf_token %}
2.AJAX发送post请求 如何避免csrf校验
1.先在页面上写{% csrf_token %},利用标签查找 获取该input键信息
data:{‘username‘:‘jason‘,‘csrfmIDdlewaretoken‘:$(‘[name=csrfmIDdlewaretoken]‘).val()},
2.直接书写{{ csrf_token }}
data:{‘username‘:‘jason‘,‘csrfmIDdlewaretoken‘:‘{{ csrf_token }}‘},
3.你可以将该获取随机键值对的方法 写到一个Js文件,之后导入即可
{% load static %}
{#<script src="{% static ‘setJs.Js‘ %}"></script>#}
<script>
$(‘#b1‘).click(function () {            $.AJAX({                url:‘‘,type:‘post‘,// 第一种方式                data:{‘username‘:‘jason‘,// 第二种方式                data:{‘username‘:‘jason‘,// 第三种方式 :直接引入Js文件                data:{‘username‘:‘jason‘},success:function (data) {                    alert(data)                }            })        </script>

1.当你往回走哪全局都需要校验csrf的时候 有几个不需要校验该如何处理
2.当你网站全局不校验csrf的时候 有几个需要校验又该如何处理
# 校验csrf
from django.vIEws.decorators.csrf import csrf_exempt,csrf_protect #
from django.utils.decorators import method_decorator
这两个装饰器在CBV装饰有区别

csrf_exempt 取消校验
只能给display加装饰器
@method_decorator(csrf_exempt) # 第一种可以不检验
def dispatch(self,*args,**kwargs):
return super().dispatch(request,**kwargs)

csrf_protect 校验,三种方式

# 第一种校验方式:        # @method_decorator(csrf_protect,name="post")        class MyVIEw(VIEw):            # 第三校验种方式:            # @method_decorator(csrf_protect)  # 这种方式get和post都加上了            def dispatch(self,**kwargs):                return super().dispatch(request,**kwargs)            def get(self,request):                return httpResponse("get")            # 第二种方式:            # @method_decorator(csrf_protect)            def post(self,request):                return httpResponse("post")
auth模块
执行数据库迁移命令之后 会生成很多表 其中的auth_user是一张用户相关的表格
添加数据
执行 createsuperuser 创建超级用户 这个超级用户就可以登陆django admin 后台
方法:
1. # 查询auth表
user_obj = auth.authenticate(username=username,password=password)
# 查询表的情况,返回对象,里面密码存的是密文


2.auth.login(request,user_obj) # 将用户状态记录到session表中,客户端session 同上
# 只要执行力这一句话 你就可以在后端任意位置通过request.user获取到当前用户对象"""
# print(request.user.username)
# print(request.user.password)

3.判断用户是否登陆,登陆是True
# request.user.is_authenticated)


4.修改密码的方法:
is_right = request.user.check_password(old_password) # 自动加密,核对数据库的密码是否正确
if is_right: # 核对正确就是True
print(is_right)
request.user.set_password(new_password) # 设置新密码
request.user.save() # 保存修改密码信息



5.注销
# 注销
@login_required
def logout(request):
auth.logout(request) # 前后端的session值都一起删掉 等价于flush
return httpResponse("退出了")

auth模块登陆装饰器
from django.contrib.auth.decorators import login_required
可以在settings里面配置:
LOGIN_URL = "/land/",以后登陆都调到此网页


用auth自定义表,可以添加字段,同时使用auth模块语法 from django.db import models from django.contrib.auth.models import AbstractUser 第二种方式 使用类的继承可以用auth表添加字段 class Userinfo(AbstractUser): # 千万不要跟原来表中的字段重复 只能创新 phone = models.BigIntegerFIEld() avatar = models.fileFIEld(upload_to="/avatar") 还需要在文件配置中告诉django不使用默认的表 告诉django不再使用之前的表,使用自定义的表 AUTH_USER_MODEL = "app01.Userinfo" # 应用名.类名
总结

以上是内存溢出为你收集整理的五十二、django 中间件,csrf跨站请求伪造,auth模块表全部内容,希望文章能够帮你解决五十二、django 中间件,csrf跨站请求伪造,auth模块表所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1190914.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存