原文链接: https://blog.csdn.net/weixin_31449201/article/details/81043326

Django中的请求与响应

一.请求request

django中的request用来获取前端传过来的数据,那么前端数据的发送方式有多种,每一种传输方式在后端对应的接收方式也不同,所以我们首先来看前端的几种数据发送方式:

1.url路径参数

对于这种数据,它在前端的url中,比如:www.baidu.com/id/

我们就可以获取这个url中的id

方法:

在定义好的视图函数或者视图类的函数中的参数加上这个id即可

比如:

def weather(request, id):
print('id=%s' % id)
return HttpResponse('OK')

2.查询字符串

什么是查询字符串?看下边的例子就好

www.baidu.com/data/?a=10&b=20&a=30   (这个路径中有两个a,因为前端有时会有一键多值的情况)

对于这种请求怎么获取a,b这两个数据呢

我们可以通过request.GET属性来获取(HttpRequest对象的属性GET、POST都是QueryDict类型的对象,通过QueryDict对象request.GET/request.POST来获取一键多值的数据)

重要:查询字符串不区分请求方式,即假使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据。

方法:

def qs(request):
a = request.GET.get('a')
b = request.GET.get('b')
alist = request.GET.getlist('a')
print(a) # 30
print(b) # 20
print(alist) # ['10', '30']
return HttpResponse('OK')

3.请求体里边的数据

请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,可以是XML字符串,应区别对待。

可以发送请求体数据的请求方式有POST、PUT、PATCH、DELETE。

Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF中间件

①表单数据

表单数据的获取通过request.POST返回的Query Dict对象来获取

注意:request.POST只能用来获取POST方式的请求体表单数据。

方法:request.POST.get()和request.POST.getlist()

如:

def get_body(request):
a = request.POST.get('a')
b = request.POST.get('b')
alist = request.POST.getlist('a')
print(a)
print(b)
print(alist)
return HttpResponse('OK')

②非表单数据

非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。

request.body返回bytes类型。

例如要获取请求体中的如下JSON数据

{"name": "fenghua", "age": 24}

方法:因为获取到的是原始二进制数据,要进行解码(字符串化,得到json数据),json_dict化(将json数据转换成字典)

例如:

import json
def get_body_json(request):
json_str = request.body
json_str = json_str.decode() # python3.6 无需执行此步
req_data = json.loads(json_str)
print(req_data['name'])
print(req_data['age'])
return HttpResponse('OK')

4.请求头里边的数据

可以通过request.META属性获取请求头headers中的数据,request.META为字典类型。

常见的请求头如:

CONTENT_LENGTH – The length of the request body (as a string).
CONTENT_TYPE – The MIME type of the request body.
HTTP_ACCEPT – Acceptable content types for the response.
HTTP_ACCEPT_ENCODING – Acceptable encodings for the response.
HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response.
HTTP_HOST – The HTTP Host header sent by the client.
HTTP_REFERER – The referring page, if any.
HTTP_USER_AGENT – The client’s user-agent string.
QUERY_STRING – The query string, as a single (unparsed) string.
REMOTE_ADDR – The IP address of the client.
REMOTE_HOST – The hostname of the client.
REMOTE_USER – The user authenticated by the Web server, if any.
REQUEST_METHOD – A string such as "GET" or "POST".
SERVER_NAME – The hostname of the server.
SERVER_PORT – The port of the server (as a string).
方法: def get_headers(request):
    print(request.META['REQUEST_METHOD'])
    return HttpResponse('haha')
5.其他常用请求对象
method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。
user:请求的用户对象。
path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。
encoding:一个字符串,表示提交的数据的编码方式。
        如果为None则表示使用浏览器的默认设置,一般为utf-8。
        这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
FILES:一个类似于字典的对象,包含所有的上传文件。 二.响应response
响应的常见类型: HttpResponse, HttpResponse子类(如HttpResponseNotFound 404), JsonResponse, redirect重定向, render 1.HttpResponse
响应头的添加:得使用响应对象
response = HttpResponse() response['name'] = ‘fenghua' 响应体的添加: 方式1:直接返回     return HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码) 方式2:构造响应对象     response = HttpResponse(响应体)     response.status_code = 状态码     return response 2.HttpResponse子类
#  直接返回404错误状态码
def http_response(request):
    return HttpResponseNotFound(响应体内容) # 返回的状态码自动设置成404,并显示前端显示的数据 3.JsonResponse
返回json格式数据,并将响应头的Content-Type设置成application/json # 响应json数据到前端
def response_json(request):
    data_json = {"name": "fenghua", "age": 24}
    # 默认把json_dict转成了json字符串
    # 再默认把json字符串转成二进制的json字符串
    # 默认将数据类型指定为 application/json     return JsonResponse(data_json) 4.redirect重定向
反向解析reverse:根据路由名称或者命名空间解析出url路径 反向解析:要是命名空间是以分离的方式:url(r'^users/', include('users.urls', namespace='users111'))                                                                 url(r'^index/$', views.index, name='index111')                                                                 则reverse方式为:reverse('users111:index111')                                                                                     或者:reverse('users:index')                 要是以一次性在主url写好的方式:url(r'^users/feng', views.feng, name='feng')                                                                     则reverse方式为:reverse('feng') redirect:根据反向解析出来的路径进行重定向 具体使用如下: # 需求:访问'response_redirect/'重定向到 'users.index'
def response_redirect(request):
    # url(r'^users/', include('users.urls', namespace='users111'))
    # url(r'^index/$', views.index, name='index111')     return redirect(reverse('users:index'))  # redirect(reverse('users111:index111')) 也可以实现 5.render返回模板
用法: render(request对象, 模板文件路径, 模板数据字典) from django.shortcuts import render
def index(request):
context={'city': '北京'}
return render(request,'index.html',context)

Django(request和response)的更多相关文章

  1. Django Request 与Response对象

    Django使用请求和响应对象在系统中传递状态.当请求页面时,Django创建一个HttpRequest对象,该对象包含关于请求的元数据. 然后Django加载适当的视图,将HttpRequest作为 ...

  2. 【转】Django中的request与response对象

    关于request与response 前面几个 Sections 介绍了关于 Django 请求(Request)处理的流程分析,我们也了解到,Django 是围绕着 Request 与 Respon ...

  3. 【Django】django 的request和response(转)

    当请求一个页面时,Django 把请求的 metadata 数据包装成一个 HttpRequest 对象,然后 Django 加载合适的 view 方法,把这个 HttpRequest 对象作为第一个 ...

  4. Django REST framework 第二章 Request and Response

    此章节开始真正的撰写REST framework的核心代码,介绍一系列必要的建立设计 Request Objects REST framework介绍了一个Request对象用来扩展常规的HttpRe ...

  5. Django中的Request和Response

    接触Django这么久了,从来没有好好学习关于Django中的Request和Response对象.借着文件上传下载的相关工作,现在总结一下也不错. 当一个页面请求过来,Django会自动创建一个Re ...

  6. DRF (Django REST framework) 中的Request 与 Response

    DRF中的Request 与 Response 1. Request - REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST f ...

  7. 二,Request和Response

    概述 在DRF中,引入了一个Request和Response对象进行请求和响应,这两个对象分别继承于Djaong中常规的HttpRequest和SimpleTemplateResponse,相比其父类 ...

  8. DRF基类APIView提供的Request、Response和序列化器的综合使用

    关于DRF基类APIView提供的Request和Response对象的作用,可以看我的另一篇博文:https://www.cnblogs.com/chichung/p/9939864.html 综合 ...

  9. DRF自带的Request和Response对象(DRF基类APIView)

    # 转载请留言联系 1.Request对象 DRF传入视图的request对象,不再是Django默认的HttpRequest对象,而是扩展了HttpRequest类的Request类的对象. RES ...

  10. Falsk中的Request、Response

    Flask 中的Response 1.HTTPResponse('helloword') "helloword" from flask import Flask # 实例化Flas ...

随机推荐

  1. Java基本语法---个人参考资料

    Java语言基础组成:关键字.标识符.注释.常量和变量.运算符.语句.函数.数组 一.标识符 标识符是在程序中自定义的一些名称,由大小写字母[a-zA-Z],数字[0-9],下划线[ _ ],特殊字符 ...

  2. Nagios服务器端配置文件详解

    Nagios服务器端安装部署详解见:http://www.cnblogs.com/ginvip/p/6505948.html Nagios 主要用于监控一台或者多台本地主机及远程的各种信息,包括本机资 ...

  3. Java日期比较

    在进行业务处理时,遇到一个需要比较日期但是不包含时分秒的判断问题 SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); ...

  4. linux离线部署redis及redis.conf详解

    一.离线部署redis 由于博主部署的虚拟机没有网络也没有gcc编译器,所以就寻找具备gcc编译器的编译环境把redis编译安装好,Copy Redis安装目录文件夹到目标虚拟机的目录下.copy时r ...

  5. linux - JDK 环境

    JDK安装 vi /etc/profile # 添加环境变量 export JAVA_HOME=/usr/local/jdk1.8.2_45 export CLASSPATH=.:$JAVA_HOME ...

  6. Python人工智能之路 - 第一篇 : 你得会点儿Python基础

    Python 号称是最接近人工智能的语言,因为它的动态便捷性和灵活的三方扩展,成就了它在人工智能领域的丰碑 走进Python,靠近人工智能 一.编程语言Python的基础 之 "浅入浅出&q ...

  7. 【SSH异常】InvalidDataAccessApiUsageException异常

    今天在整合SSH的时候,一开始我再测试的时候service层添加了注解事务调用DAO可以正常的保存,在环境中我在XML中采用了spring的OpenSessionInViewFilter解决hiber ...

  8. Ansible Tower系列 四(使用tower执行一个命令)【转】

    在主机清单页面中,选择一个主机清单,进入后,选择hosts里的主机 Paste_Image.png 点击 RUN COMMANDS MODULE 选择 commandARGUMENTS 填写 ifco ...

  9. C# 将某个方法去异步执行

    C# 将某个方法去异步执行 Task.Run(() => { string msgerror = SendPhoneCode.NewSendByTemplate(apply.PhoneNum, ...

  10. Owin中间件动手做

    摘要:本文目的是了解Owin基本原理.讲述如何从控制台创建一个自宿主的OwinHost,然后再编写一两个中间件 准备工作 首先通过VisualStudio创建一个控制台应用 然后添加Owin的Nuge ...