博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django2.0——请求与响应(上)
阅读量:5939 次
发布时间:2019-06-19

本文共 3541 字,大约阅读时间需要 11 分钟。

客户端与服务段通过http协议进行数据的传输,而http协议是一种双向单工的,且主动发起连接的只有客户端。故数据的传送就离不开请求和响应,客户端每发起一个请求,服务端就是返回一个响应。在django的视图函数中的第一个参数就是request,即每一个request都对应着一个视图函数来给这个请求返回响应,返回响应的方式就是通过return来返回一个HttpRespons方法。下面就请求和响应两个方面来分别进行介绍。

Request

django在接收到http协议请求后会创建一个HttpRequest的请求对象,而视图函数的第一个参数request就是HttpRequest对象在django.http模块中定义了HttpRequest对象的API。通过request我们可以知道很多关于请求的信息,下面是一些常用request属性。

  • path:一个字符串,返回url的路径部分。
  • method:一个字符串,返回请求的方式,大多是“GET”和“POST”两种方式。
  • encoding:一个字符串,返回提交数据的编码方式,若是None,则表示使用的是浏览器的默认设置,一般是utf-8.
  • GET:一个类似于字典的对象,返回get请求方式的所有参数。
  • POST:一个类似于字典的对象,返回post请求方式的所有参数。
  • FILES:一个类似于字典的对象,返回所有上传的文件。
  • is_ajax():判断是否是一个Ajax请求,及是否是XMLHttpRequest发起的。
  • is_secure():判断请求是否安全。
  • COOKIES:一个标准的python字典对象,包含所有的cookie,其键和值都是字符串。
  • session:一个可读写的类字典对象,表示当前session。
  • content-type:返回文本类型,如text/html。

下面以小例子来展示,在模板下的test.html写一个简单的form表单。

    
index

视图函数如下所示,配置的url分别是/index和/index/get.

from django.http import HttpResponsefrom django.shortcuts import reverse,redirect,renderdef index(request):    return render(request,'book/test.html')def get(request):    a = request.GET.get('a')    b = request.GET.get('b')    print (request.GET,request.encoding,request.content_type,request.content_params,request.method,request.is_ajax(),request.is_secure(),request.path,request.COOKIES)    return HttpResponse(a+b)

表单输入如下图所示:

视图函数中打印的结果如下:

None text/plain {} GET False False /index/get/ {}

可以发现request.GET方法得到的是一个QueryDict对象,该对象支持与字典一样的get方法和直接用key取value。

下面我们将表单的方法改为post试试,结果报了一个403的页面。从报错信息我们发现CSRF证书失效,故请求被阻止。所以一般在post方法的表单中我们都会加上一句{% csrf_token %},这是Django提供的防止伪装提交请求的功能。

    
index
{% csrf_token %}

视图函数如下:

def get(request):    a = request.POST.get('a')    b = request.POST.get('b')    print (request.POST,request.encoding,request.content_type,request.content_params,request.method,request.is_ajax(),request.is_secure(),request.path,request.COOKIES)    return HttpResponse(a+b)

打印的结果为:

None application/x-www-form-urlencoded {} POST False False /index/get/ {'csrftoken': '0jafBDd29VSQnXQxmcq0Xohte3Ym8yHi9AUKPjrOW2TlHffwBqtHc68zJmzNcdnY'}

可以发现post请求的数据增加了一个浏览器自己加上的键值对csrfmiddlewaretoken来提高数据传送的安全性。

表单中的name表示后台获取数据的key,数据存放在相应的value中。

QueryDict不同于字典的是,他可以存在一键多值的情况,所以仅仅用get方法只能取出一个值,对于一键多值的情况,我们常用getlist方法,

下面我们将表单的两个name都设为a,视图函数如下:

def get(request):    a1 = request.POST.get('a')    a2 = request.POST.getlist('a')    print(a1,a2)    return HttpResponse(a2)

打印结果为:55      ['25', '55']

对于这种情况,get只会取最后一个值,getlist将多个值组成一个列表。

文件上传

简易的文件上传表单如下:上传文件不能是get方法,一般都是post方法,且form标签内必须加入enctype="multipart/form-data",不然上传的内容会变成空。为了不报403的错误,同样要加上 {% csrf_token %}。

    
index
{% csrf_token %}

我们先要建立一个文件夹来存放上传的文件,我再静态文件static目录下新建一个media文件夹,并在setting中进行配置,加入

MEDIA_ROOT= os.path.join(BASE_DIR,'static/media')

视图函数如下:

# C:\Users\dragon忘我\PycharmProjects# -*- coding:utf-8 -*-# author:龙from django.http import HttpResponsefrom django.shortcuts import reverse,redirect,renderfrom django_hello.settings import MEDIA_ROOTimport osdef index(request):    return render(request,'book/test.html')def file(request):    f = request.FILES.get('a')    f_name = os.path.join(MEDIA_ROOT,f.name)    with open(f_name,'wb') as ff:        for i in f.chunks():  #chunks方法用来读取传来的内容            ff.write(i)    return HttpResponse(666)

上述代码的f是一个上传文件的对象,故它也有普通文件对象的常用方法,如read、open、readline、readlines等等。我们用chunks方法取代read是因为,如果上传的文件很大,把它读到内存中将会使得你的系统变卡,而chunks方法是将一个文件分块进行上传,默认的这个值是2.5M,当然这个值是可以调节的。

转载于:https://www.cnblogs.com/longwhite/p/10397669.html

你可能感兴趣的文章
讲给普通人听的分布式数据存储
查看>>
《C++面向对象高效编程(第2版)》——3.13 采用语义
查看>>
《 短文本数据理解》——2.5小结
查看>>
如何编写一个全新的 Git 协议
查看>>
马云携阿里17位创始人及合伙人捐赠浙大一院5.6亿,杭州渐成中国硅谷
查看>>
《libGDX移动游戏开发从入门到精通》一第2章 libGDX的架构分析
查看>>
《配置管理最佳实践》——2.10 建立构建过程
查看>>
《C++入门经典(第5版•修订版)》——2.6 问与答
查看>>
PLM调研第二天
查看>>
《精通Linux设备驱动程序开发》——1.5 Linux发行版
查看>>
《JavaScript面向对象编程指南》——第1章 引言1.1 回顾历史
查看>>
《乐高EV3机器人搭建与编程》——2.2 颜色设计
查看>>
13 种在 Linux 系统上检测 CPU 信息的工具
查看>>
《Hack与HHVM权威指南》——1.5.2 覆盖方法的类型
查看>>
5 步助你成为一名优秀的 Docker 代码贡献者
查看>>
《术以载道——软件过程改进实践指南》—第1章1.3节如何实施CMMI
查看>>
Harris’s Linked List
查看>>
(流式、lambda、触发器)实时处理大比拼 - 物联网(IoT)\金融,时序处理最佳实践
查看>>
什么Linux服务器最适合你?
查看>>
git 换行符问题,统一linux风格
查看>>