zoukankan      html  css  js  c++  java
  • Django中request,return常用属性和对象以及ajax中CSRF问题

    二、request对象常用属性:

    AttributeDescription
    path 请求页面的全路径,不包括域名端口参数。例如: /users/index
    method 一个全大写的字符串,表示请求中使用的HTTP方法,常用值:GET, POSTDELETEPUT等。以下三种为 GET 请求:
    • form 表单默认提交(或者method指定为get)
    • 在浏览器中输入地址直接请求
    • 网页中的超链接(a标签)
    user
    • 已登录:AbstractUser对象;
    • 未登录:AnonymousUser对象;
      判断是否已经登录: request.user.is_authenticated(),返回true表示已经登录
    GET 类似字典的 QueryDict 对象,包含 GET 请求的所有参数
    POST 类似字典的 QueryDict 对象,包含 POST 请求的所有键值对参数(表单post提交的参数)
    body 获取原始的请求体数据,获取到的数据为bytes类型
    META python 字典类型,封装了请求头headers中的数据
    REMOTE_ADDR – 客户端的IP地址 
    REQUEST_METHOD — 一个字符串,例如"GET" 或"POST
    CONTENT_TYPE – 请求的正文的MIME 类型


    注意:对于用户添加到请求头中的键值,Django会给键加上前缀 HTTP_再转换成大写,再把键值保存到request.META中 
    官方文档参考
    COOKIES 一个标准的 python 字典,包含所有的 cookies, 键和值都是字符串
    session 可读可写的类似字典的对象: django.contrib.sessions.backends.db.SessionStore
    Django 提供了 session 模块,默认就会开启用来保存 session 数据

    HttpResponse对象
    响应对象主要有三种形式:
    
    HttpResponse()
    render()
    redirect()
    HttpResponse()括号内直接跟一个具体的字符串作为响应体,比较直接很简单,所以这里主要介绍后面两种形式。
    render(request, template_name, [context])

    def index(request):
    timmer = datetime.datetime.now()
    li = [1, 2, 3, 4, 5, 6]
    context = {"ls": {"age": [1, 2, 3, 4, 5], 'like': 'woman'}, 'ss': {"age": 15, 'like': 'woman'}}
    #把所有局部变量全都传过去
    return render(request, 'index.html', locals())

    
     
    结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
    参数:
         request: 用于生成响应的请求对象。
    
         template_name:要使用的模板的完整名称,可选的参数
    
         context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
    
         render方法就是将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体。
    
    redirect() 传递要重定向的一个硬编码的URL
    def my_view(request): return redirect('/some/url/') 也可以是一个完整的URL: def my_view(request): return redirect('http://example.com/') 

     JsonResponse对象

    1. 帮助我们将数据转换为json字符串,再返回给客户端
    2. 会设置响应头 Content-Type 为 application/json

       from django.http import JsonResponse
      
       def resp(request):
           return JsonResponse({'city': 'beijing', 'subject': 'python'})
      
    3. 当包含的内容中包含中文时,会返回该中文对应的编码,例如:

       def resp(request):
      
           # 最终看到的效果是: {"name": "u5f20u4e09"}
           response = JsonResponse({"name":"张三"})
           return response
      

      解决:JsonResponse(data, json_dumps_params={'ensure_ascii':False})

    4. JsonResponse可以接收非字典数据,需要指定 safe=False

    当发送ajax请求时候,发送的内容为json类型,原生Django不能自动解析json数据手动解析

    $("#demo").click(function () {
        $.ajax(
            {
                url: '/ajax/',
                contentType: 'application/json',
                method: 'post',
                data: JSON.stringify({
                    "name": "ls", "age": 12
                }),
                success: function (response) {
                    alert(response['name'])
                    $('.show').html(response['name'])
                }
    
            }
        )
    })

    python代码

    def ajax(request):
        if request.method == "GET":
            return render(request, 'ajax.html')
        else:
            json_dict = json.loads(request.body.decode('utf8'))
            print(json_dict)
            return JsonResponse({'name': 'l1111'})

     接受文件的时候

     file = request.FILES.get('files')
    
            with open(file.name, 'wb') as a:
                for i in file:
                    a.write(i)
            return HttpResponse('ok')

    scrf,跨域请求伪造问题

    1.表单中添加

    {% csrf_token %} 为input 标签 type = hidden
    <form action="/demo">
        用户名:<input type="text">
        {% csrf_token %}
    </form>

    2.ajax添加

    在ajax中带着这个值,csrfmiddlewaretoken:'{{ csrf_token  }}
    function myajax(){
    
        var temp = $('#ajax_id').val();
        $.ajax({
            url:'/ajax_app/test',
            type:'POST',
            data:{data1:temp,csrfmiddlewaretoken:'{{ csrf_token  }}'},
            success:function (arg) {
                var obj = jQuery.parseJSON(arg);
                $('#ajax_id').val(obj.msg);
            },
            error:function () {
                alert("failed");
            }
        });
     
    }

     第三种csrf解决方案

    <script src="{% static 'js/jquery.cookie.js' %}"></script>
    $.ajax({
     
    headers:{"X-CSRFToken":$.cookie('csrftoken')},
     
    })
  • 相关阅读:
    python 函数(二)
    python 函数(一)
    python 文件操作
    python标准数据类型 Bytes
    购物车代码
    关于python数据类型的一些举例
    栈的应用实例
    python 数据类型
    python相关的编码,运算
    Oracle篇 之 查询行及概念
  • 原文地址:https://www.cnblogs.com/ls1997/p/10943910.html
Copyright © 2011-2022 走看看