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

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 MiddlewareMixin
from django.shortcuts import HttpResponse

class 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, request, view_func, view_args, view_kwargs):
        print(view_func)
        print(view_args)
        print(view_kwargs)
        print("我是第一个中间件process_view方法")

    def process_exception(self, request, exception):
        print("我是第一个 process_exception")

    def process_template_response(self, request, response):
        print("我是第一个中间件process_template_response方法")
        return response

class MyMdd1(MiddlewareMixin):
    def process_request(self, request):
        print("我是第二个中间件process_request方法")

    def process_response(self, request, response):
        print("我是第二个中间件process_response方法")
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        print(view_func)
        print(view_args)
        print(view_kwargs)
        print("我是第二个中间件process_view方法")

    def process_exception(self, request, exception):
        print("我是第二个 process_exception")

    def process_template_response(self, request, 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‘,‘csrfmiddlewaretoken‘:$(‘[name=csrfmiddlewaretoken]‘).val()},
                // 第二种方式
                data:{‘username‘:‘jason‘,‘csrfmiddlewaretoken‘:‘{{ csrf_token }}‘},
                // 第三种方式 :直接引入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, request, *args, **kwargs):                return super().dispatch(request, *args, **kwargs)

    csrf_protect 校验,三种方式
# 第一种校验方式:
        # @method_decorator(csrf_protect, name="post")
        class MyView(View):
            # 第三校验种方式:
            # @method_decorator(csrf_protect)  # 这种方式get和post都加上了
            def dispatch(self, request, *args, **kwargs):
                return super().dispatch(request, *args, **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" # 应用名.类名

原文地址:https://www.cnblogs.com/wukai66/p/11604461.html

时间: 2024-10-22 21:03:15

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

☆Django☆---中间件 csrf跨站请求伪造 auth模块 settings功能插拔式源码

Django中间件 django生命周期图 中间件: 概念: Django中间件就类似于 django的保安   请求 的时候需要先经过中间件才能到达django后端(urls, views)   响应 走的时候也需要经过中间件才能到达web服务网关接口 django默认的七个中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.Session

Django框架进阶7 django请求生命周期流程图, django中间件, csrf跨站请求伪造, auth认证模块

django请求生命周期流程图 djang中间件 它是django的门户 只要是全局相关的功能你都应该考虑使用django中间件来帮你完成 全局用户身份校验 全局用户访问频率校验 用户访问黑名单 用户访问白名单 # 只要以后用django开发业务 设计到全局相关的功能 你就考虑用中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.Sessio

Python Django 生命周期 中间键 csrf跨站请求伪造 auth认证模块 settings功能插拔式源码

一 django 生命周期 二 django中间键 1.什么是中间键 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的功能. 简单来说就相当于django门户,保安:它本质上就是一个自定义类,类中定义了几个方法. 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models): 响应走的时候也需要经过中间件才能到达w

Django框架(十六)-- 中间件、CSRF跨站请求伪造

一.什么是中间件 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出 二.中间件的作用 如果你想修改请求,例如被传送到view中的HttpRequest对象. 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现. 可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现. Django默认的中间件:(在django项目的settings模块中,有一个 MIDDLE

Django框架之中间件、CSRF跨站请求伪造

一.中间件 1.什么是中间件 中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的功能. 中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法. 2.Django中的中间件 django默认有7个中间件 MIDDLEWARE = [ 'django.middlewar

Django中间件、csrf跨站请求伪造以及基于Django中间件思想实现功能的插拔式配置

一.django中间件 1.1解释:django中间件是类似于是django的保安,请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models),响应走的时候也需要经过中间件才能到达web服务网关接口 1.2django默认的七个中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.Session

ajax向Django前后端提交请求和CSRF跨站请求伪造

1.ajax登录示例 urls.py from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login_ajax/$', views.login_ajax, name='login_ajax'), url(r'^index/$', views.index, n

Django框架 之 基于Ajax中csrf跨站请求伪造

ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({     data: {csrfmiddlewaretoken: '{{ csrf_token }}' }, }); 方式二 1 2 3 4 5 <form> {% csrf_token %} </form><br><br><br>$.ajax({<br>...<br>data:{ "csrfmiddlewaretoken":

Django之cfrs跨站请求伪造和xfs攻击

跨站请求伪造 一.简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功能有分为全局和局部. 全局: 中间件 django.middleware.csrf.CsrfViewMiddleware 局部: @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件. @csrf_exempt,取消当前函数防跨站请