Django2.0——请求与响应(上)
客户端与服务段通过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表单。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title> index</title>
</head>
<body>
<form action="get/" method="get">
<input type="text" name="a"> <br>
<input type="text" name="b"> <br>
<input type="submit" value="提交">
</form>
</body>
</html>
视图函数如下所示,配置的url分别是/index和/index/get.
from django.http import HttpResponse
from django.shortcuts import reverse,redirect,render
def 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)
表单输入如下图所示:
视图函数中打印的结果如下:
<QueryDict: {'a': ['55'], 'b': ['45']}> None text/plain {} GET False False /index/get/ {}
可以发现request.GET方法得到的是一个QueryDict对象,该对象支持与字典一样的get方法和直接用key取value。
下面我们将表单的方法改为post试试,结果报了一个403的页面。从报错信息我们发现CSRF证书失效,故请求被阻止。所以一般在post方法的表单中我们都会加上一句{% csrf_token %},这是Django提供的防止伪装提交请求的功能。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title> index</title>
</head>
<body>
<form action="get/" method="post">
{% csrf_token %}
<input type="text" name="a"> <br>
<input type="text" name="b"> <br>
<input type="submit" value="提交">
</form>
</body>
</html>
视图函数如下:
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)
打印的结果为:
<QueryDict: {'csrfmiddlewaretoken': ['6P747LQffzkdh1loMSQ5lGQkxPAyeXW5f6Rzlr412GlIBjKn16TMAoHq28bZiCCL'],
'a': ['sdfs'], 'b': ['sf']}>
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 %}。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title> index</title>
</head>
<body>
<form action="file/" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="a"> <br>
<input type="submit" value="提交">
</form>
</body>
</html>
我们先要建立一个文件夹来存放上传的文件,我再静态文件static目录下新建一个media文件夹,并在setting中进行配置,加入
MEDIA_ROOT= os.path.join(BASE_DIR,'static/media')
视图函数如下:
# C:\Users\dragon忘我\PycharmProjects
# -*- coding:utf-8 -*-
# author:龙
from django.http import HttpResponse
from django.shortcuts import reverse,redirect,render
from django_hello.settings import MEDIA_ROOT
import os
def 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,当然这个值是可以调节的。
Django2.0——请求与响应(上)的更多相关文章
- Django2.0——请求与响应(下)
上篇讲完了请求,这篇接着讲下响应,django响应类型大致有以下几种 HttpResponse:返回简单的字符串 render:渲染模板 redirect:重定向 JsonResponse:返回jso ...
- ThinkPHP5.0框架开发--第6章 TP5.0 请求和响应
ThinkPHP5.0框架开发--第6章 TP5.0 请求和响应 第6章 TP5.0 请求和响应 ===================================== 上次复习 1.新建控制器 ...
- jmeter——JSON提取器(从上一个请求的响应结果提取参数传给下一个请求)
记录一个参数提取过程,可供后续参考. 1. 查看响应报文的结构 将上一个请求的响应报文复制到Notepad++编辑器 JSON Viewer是Notepad++的JSON插件, Notepad++的P ...
- Jmeter之Json Path Extractor 接受上一个请求的响应参数
最近在使用Jmeter进行接口测试,被一个问题困扰了很久,就是第二个请求如何接收上一个请求响应中的参数,刚开始尝试着用网上普遍说的正则表达式,长了了N多次之,都没有达到我想要的效果,被整的够惨,于是, ...
- 基于centos7+nginx+uwsgi+python3+django2.0部署Django项目
0.序言 本文讲解如何基于centos7+nginx+uwsgi+python3+django2.0把windows上的本地项目部署到云服务器上. 本文服务器上的django项目和虚拟环境的路径将建立 ...
- 《玩转Django2.0》读书笔记-探究视图
<玩转Django2.0>读书笔记-探究视图 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 视图(View)是Django的MTV架构模式的V部分,主要负责处理用户请求 ...
- 《玩转Django2.0》读书笔记-编写URL规则
<玩转Django2.0>读书笔记-编写URL规则 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. URL(Uniform Resource Locator,统一资源定位 ...
- 《玩转Django2.0》读书笔记-Django配置信息
<玩转Django2.0>读书笔记-Django配置信息 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 项目配置是根据实际开发需求从而对整个Web框架编写相应配置信息. ...
- Django2.0路由层-URLconf
目录 DJango2.0路由层-URLconf 概述 urlpatterns 实例 path转换器 自定义path转换器 使用正则表达式 命名组(有名分组) URLconf匹配请求URL中的哪些部分 ...
随机推荐
- Linux应用可通过USB访问Android设备-Chrome OS 75版发布
导读 谷歌已经为支持的Chromebook设备发布了Chrome OS 75操作系统,这是一个主要版本,增加了各种新功能,最新安全补丁和其他改进. 对于大多数Chromebook设备,Chrome O ...
- 操作数据库的SqlHelper类
public static class SqlHelper { public static readonly string connstr = ConfigurationManager.Connect ...
- mysql IF-IFNULL和IF-ISNULL同样逻辑的运行差别
首先,目标记录是存在的 SELECT * FROM d_device_user_bind dub WHERE dub.`uid`='222222222221' 其次, SELECT dub.uid,d ...
- 10.swoole学习笔记--进程队列通信
<?php //进程仓库 $workers=[]; //最大进程数 $worker_num=; //批量创建进程 ;$i<$worker_num;$i++){ //创建子进程 $proce ...
- 062-PHP函数按值传参,交换数值函数
<?php function swap($x,$y){ //定义交换数值函数 $temp=$x; $x=$y; $y=$temp; } $m=5; $n=15; echo "交换前:& ...
- Spring配置数据源的三种方法
前言:今天接触新项目发现用的是JNDI配置数据源,用度娘倒腾了一会也没弄好,只好用平常用的方法,结果发现BasicDataSource和DriverManagerDataSource也是不同的,所以记 ...
- Pip,pywin32,whl文件下载网址,mayavi安装包,PyQt5安装,PyMuPDF安装等注意事项
(1)pip安装的包不一定是用户想要的位置,此时可以用 -t 选项来指定位置. 例如目标位置是/usr/local/lib/python2.7/site-packages/ ,要安装xlrd 这个包 ...
- K8S Kubernetes 简单介绍 转自 http://time-track.cn/kubernetes-trial.html Kubernetes初体验
这段时间学习了一下 git jenkins docker 最近也在看 Kubernetes 感觉写得很赞 也是对自己对于K8S 有了进一步得理解 感谢 倪 大神得Blog 也希望看到这篇Bl ...
- sql 左联 右联 内联的区别
如有表a(col1,col2),a,1b,1 b(col1,col2)a,3c,2 内部联接是指只返回符合联接条件的资料,如select * from a join b on a.col1 = b.c ...
- DataStructuresAndAlogorithm--红黑树
简介 为了理解红黑树(red-black tree)是什么,首先需要知道二叉树. 定义1:二叉树是结点的有限集合,该集合或者为空集,或者是由一个根和两棵互不相交的,称为该根的左子树和右子树的二叉树组成 ...