原文链接: 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代码剖析MD5算法实现过程

    Java基础-使用JAVA代码剖析MD5算法实现过程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  2. Hadoop生态圈-Kafka的完全分布式部署

    Hadoop生态圈-Kafka的完全分布式部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要内容就是搭建Kafka完全分布式,它是在kafka本地模式(https:/ ...

  3. artTemplate

    1.http://www.cnblogs.com/jiqiyoudu/p/4588042.html

  4. HDU 1262 寻找素数对 模拟题

    题目描述:输入一个偶数,判断这个偶数可以由哪两个差值最小的素数相加,输出这两个素数. 题目分析:模拟题,注意的是为了提高效率,在逐个进行判断时,只要从2判断到n/2就可以了,并且最好用打表法判断素数. ...

  5. Metasploit输出重定向到文件

    Metasploit是我们经常会使用到的神器,但是运行exploit/run无法保存输出信息,查看不是很方便. 现在可以使用spool来保存输出信息: Metasploit Framework Con ...

  6. 服务器环境配置安装(mysql+redis+nodejs+nginx)

    公司用来测试的服务器挂了,最后重装了系统,需要重新配置程序运行环境,linux上安装不是很熟悉,特此记录一下. 首先获取系统版本信息: 参考:获取Linux系统版本信息 一.mysql 1. 安装 安 ...

  7. centos7.2 安装 composer

    安装Composer https://pkg.phpcomposer.com/#how-to-install-composer  # 下载composer.phar curl -sS https:// ...

  8. Linux中Samba详细安装【转】

    转自:http://www.cnblogs.com/whiteyun/archive/2011/05/27/2059670.html 为了实现Windows主机与Linux服务器之间的资源共享,Lin ...

  9. 八、mini2440裸机程序之UART(2)UART0与PC串口通信【转】

    转自:http://blog.csdn.net/shengnan_wu/article/details/8309417 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.相关原理图 2.相关寄 ...

  10. 高通Trustzone and QSEE介绍

    http://blog.csdn.net/iamliuyanlei/article/details/52625968