• Django模板之认证机制(csrf_token)


    csrf认证机制:

    django中对POST请求,csrf会进行认证处理,csrf认证机制是防御跨站伪造功能,在没有任何处理的前提下,POST请求会报错。

    csrf认证中间件是在process_view执行(通过装饰器强制认证或者放行可知),同时对类中的方法进行CSRF装饰器操作需要:

      【注意只能加在dispatch方法上(或者装饰在类上指定dispatch方法),类中单独方法无效

     

             

     

     

    csrf认证--模板操作:

    模板文件中的操作:

    django项目中默认对POST请求进行了csrf认证,只需要在模板提交数据的代码块中加入模板标签{{% vsrf_token %}}即可,(不需要注销seetings.py配置文件MIDDLEWARE列表中的'django.middleware.csrf.CsrfViewMiddleware',),模板页面在渲染时会自动在相应位置渲染成隐藏的input标签:<input type="hidden" name="csrfmiddlewaretoken" value="8J4z1wiUEXt0gJSN59dLMnktrXFW0hv7m4d40Mtl37D7vJZfrxLir9L3jSTDjtG8">每次都是随机的

     

    csrf认证--模块操作: 

    views.py中首先导入模块:from django.views.decorators.csrf import csrf_exempt,csrf_protect

    1)放行认证:@csrf_exempt 

     1 @csrf_exempt    #放行csrf认证(即使settings.py中存在全局认证机制,也对此次POST请求的视图函数放行)
     2 def login(request):
     3     if request.method=="GET":
     4         return render(request,"login.html")
     5     elif request.method=="POST":
     6         name=request.POST.get("username")
     7         psd=request.POST.get("userpsd")
     8         status=models.auth(name,psd)
     9         if status:
    10             return HttpResponse("<h1>Success!</h1>")
    11         else:
    12             return render(request,"login_fail.html")

      2)强制认证:@csrf_protect

     1 @csrf_protect    #强制csrf认证(即使settings.py中不存在全局认证机制,也对此次POST请求的视图函数强制认证)
     2 def login(request):
     3     if request.method=="GET":
     4         return render(request,"login.html")
     5     elif request.method=="POST":
     6         name=request.POST.get("username")
     7         psd=request.POST.get("userpsd")
     8         status=models.auth(name,psd)
     9         if status:
    10             return HttpResponse("<h1>Success!</h1>")
    11         else:
    12             return render(request,"login_fail.html")

        login.html

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <meta http-equiv="refresh" content="">
     6     <meta name="keywords" content="">
     7     <style></style>
     8     <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
     9     <link rel="stylesheet" href="">
    10     <title>login</title>
    11 </head>
    12 <body>
    13 <form action="http://127.0.0.1:8888/login/" method="post">
    14 {#    {% csrf_token %}<!--在进行模板渲染时会自动生成一个隐藏的input标签(csrf认证标识)-->#}
    15    <table>
    16     <tr>
    17         <td>用户名:</td>
    18         <td><input type="text" name="username"></td>
    19     </tr>
    20     <tr>
    21         <td>密码:</td>
    22         <td><input type="text" name="userpsd"></td>
    23     </tr>
    24     <tr>
    25         <td><input type="reset"></td>
    26         <td><input type="submit" ></td>
    27     </tr>
    28        </table>
    29 </form>
    30 </body>
    31 </html>
    32  
  • 相关阅读:
    Redis 连接
    Redis 脚本
    Redis 事务
    Redis 发布订阅
    redis 字符串数据(string)
    Redis 键(key)
    Redis 命令
    Redis的五种数据类型
    java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 解决方案
    在命令行中运行eclipse中创建的java项目
  • 原文地址:https://www.cnblogs.com/open-yang/p/11221652.html
Copyright © 2020-2023  润新知