原文链接: 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. [转]Python numpy函数hstack() vstack() stack() dstack() vsplit() concatenate()

    Python numpy函数hstack() vstack() stack() dstack() vsplit() concatenate() 觉得有用的话,欢迎一起讨论相互学习~Follow Me ...

  2. Spark记录-spark报错Unable to load native-hadoop library for your platform

    解决方案一: #cp $HADOOP_HOME/lib/native/libhadoop.so  $JAVA_HOME/jre/lib/amd64 #源码编译snappy---./configure  ...

  3. poj 1776 Task Sequences

    http://poj.org/problem?id=1776 题意: 有一个机器要完成N个作业, 给你一个N*N的矩阵, M[i][j]=1,表示完成第i个作业后不用重启机器,继续去完成第j个作业 M ...

  4. SQL语句(八)按条件查询

    SELECT * FROM student SELECT sclass, snumb, sname FROM student --物理班有哪些同学 --年龄小于20岁的有哪些同学? --定价在30元以 ...

  5. [转载]AngularJS学习笔记

    http://www.zouyesheng.com/angular.html 关于AngularJS 关于本文档 开始的例子 依赖注入 作用域 数据绑定与模板 6.1. 数据->模板 6.2. ...

  6. Linux - ssh 连接问题

    SSH 连接方式 ssh -p 22 user@192.168.1.209 # 从linux ssh登录另一台linux ssh -p 22 root@192.168.1.209 CMD # 利用ss ...

  7. 第8月第12天 python json.dumps danmu

    1.json.dumps return JsonResponse({ 'status': WechatMessage.POST_METHOD_REQUIRED[1], 'status_code': W ...

  8. Struts2不扫描jar包中的action

    今天在做一个二开的项目,将struts打成jar包放在WEB-INF的目录下却扫描不到指定的路径,也就是http访问访问不到我们指定的action,其他代码可以正常使用,就是访问不到action.st ...

  9. mongo批量操作存在更新否则插入

    def save_data(ok_ps): ns = [] for ok in ok_ps: ok['last_use_time'] = 0 ok['protocol'] = 0 # 协议类型 0:h ...

  10. c#调用c++ dll 入坑记录

    1.DLL引用坑 [DllImport("NetDLL.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConve ...