利用HTTP协议向服务器传参有以下几种方式

  1. 从url中截取
  2. 使用查询字符串
  3. 在请求体中发送数据
  4. 在http报文头 header 中发送数据

1. 从url中获取截取

在定义路由规则的时候,可以使用正则表达式截取数据,然后传到视图函数中,在视图函数中使用参数接收。

例:

浏览器向后端发送了一个请求,url为 /weather/beijing/20171001

  • 未命名参数

路由

url(r'^weather/([a-z]+)/(\d{8})$', views.weather, name="weather")
def weather(request, city, date):
content = city+date
return HttpResponse(content)

视图函数要使用位置参数接收,位置要对应,响应结果 beijing20171001

  • 命名参数
url(r'^demo/', include("demo.urls", namespace="demo"))
def weather(request, date, city):
content = city+date
return HttpResponse(content)

可以使用正则表达式给参数命名,参数接收的时候位置不需要照应,响应结果 beijing20171001

  • 从url中截取参数不区分 get post请求方式。

2. QueryDict

在django的 HttpRequest 对象中,属性 GETPOST 得到的都是 django.http.QueryDict 所创建的实例,这是django自定义的一个类似字典的类。

在Python的字典中,一个键只能有一个值,当一个键赋值多次的时候,只会保留最后一个值。而在 HttpRequest 对象中,一个键往往有多个值。而 QueryDict 就可以用来处理一个键带多个值的情况。

(1). QueryDict.get(key, [default])

QueryDict.get(key, [default])

返回 key 的值。如果key 具有多个值,只返回最后(最新)的值。当key 不存在时返回一个默认值。

  

  

(2). QueryDict.getlist(key, [default])

QueryDict.getlist(key, [default])

返回 key 的值。如果key 具有多个值,以列表形式返回 key 的所有值。当key 不存在时返回一个空列表,设置了默认值则返回默认值。

3. 查询字符串

在url中格式如 ?a=1&b=2 的字符串叫做查询字符串,可以用过 request.GET 获取, request.GET 返回值是 QueryDict 对象。

url

/query?a=1&b=2&b=3

路由

url(r'^query', views.query, name="query")

视图函数

def query(request):
query_dict = request.GET
a = query_dict.get('a')
b = query_dict.getlist('b')
context = "a=%s,b=%s" % (a, b)
return HttpResponse(context)

响应结果

a=1,b=['2', '3']
  • 查询字符串不区分 get post 请求方式。

4. 请求体

请求体获得参数的各种有多种,例如 表单,json,xml...不同格式的数据要区别对待

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

django默认开启了csrf防护,会对上述的请求方式做验证,测试时可以关闭验证。

打开项目的配置文件 settings.py 注释掉 scrf中间件

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

4.1 Form表单

前端发送的表单类型的数据,可以使用 request.POST 获取, request.POST 返回值是 QueryDict 对象。

url:

demo/form

路由

url(r'^form', views.form, name="form")

表单数据

视图函数

def form(request):
form_data = request.POST
name = form_data.get("name")
age = form_data.get("age")
context = "name=%s,age=%s" % (name, age)
return HttpResponse(context)

响应结果

name=xuanli,age=18

4.2 非表单类型

非表单类型的数据django无法自动解析,需要通过 request.body 获取原始的请求体数据,然后自己根据数据类型解析。 request.body 返回值是 bytes 对象。

例如前端请求的是json数据:

url

demo/json

路由

url(r'^json', views.get_json, name="json")

json数据

{"name": "xuanli", "age": "18"}

视图函数

def get_json(request):
json_data = request.body
json_data = json_data.decode()
req_data = json.loads(json_data)
name = req_data.get("name")
age = req_data.get("age")
context = "name=%s,age=%s" % (name, age)
return HttpResponse(context)

响应结果

name=xuanli,age=18
  • python3.6不需要使用 decode() 解码

请求头


其他

django的Request-7的更多相关文章

  1. django 使用 request 获取浏览器发送的参数

    django 使用 request 获取浏览器发送的参数     转载请注明出处 https://blog.csdn.net/fanlei5458/article/details/80638348 获 ...

  2. django的request对象和response对象

    概述Django 使用 request 和 response 对象表示系统状态数据..当请求一个页面时,Django创建一个 HttpRequest 对象.该对象包含 request 的元数据. 然后 ...

  3. Python学习---Django的request扩展[获取用户设备信息]

    关于Django的request扩展[获取用户设备信息] settings.py INSTALLED_APPS = [ ... 'app01', # 注册app ] STATICFILES_DIRS ...

  4. django 修改 request 对象中的请求参数, 并重新赋值给 request 对象

    直接上代码, 实现流程看代码及注释 def your_view(self, request): method = request.method if method == "GET" ...

  5. django中request对象详解(转载)

    django中的request对象详解 Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将  HttpRequest对象  作为第一个参数传入该函数. ...

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

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

  7. 【Django】django 处理request流程细节(转)

    首先发生的是一些和 Django 有关(前期准备)的其他事情,分别是: 如果是 Apache/mod_python 提供服务,request 由 mod_python 创建的 django.core. ...

  8. 【Django】request 处理流程(转)

    Django 和其他 Web 框架的 HTTP 处理的流程大致相同,Django 处理一个 Request 的过程是首先通过中间件,然后再通过默认的 URL 方式进行的.我们可以在 Middlewar ...

  9. Django将request对象传入模板配置

    对于很多时候,需要从模板中获取很请求中很多内容,比如当前请求的url,当前的session变量中的某个值,这时候我们可以通过配置可将request对象传递进模板. django1.10版本: sett ...

  10. django的request介绍和APIView流程分析和CBV的流程分析

    首先get请求的数据都在request.GET中,request.body中没有,因为只有post请求有请求体,request.body中的数据是请求体的数据 首先,我们还是用cbv的方式来讲解 我们 ...

随机推荐

  1. SQL Server ->> 高可用与灾难恢复(HADR)技术 -- AlwaysOn可用性组(理论篇)

    因为篇幅原因,AlwaysOn可用性组被拆成了两部分:理论部分和实战部分.而实战部分又被拆成了准备工作和AlwaysOn可用性组搭建. 三篇文章各自的链接: SQL Server ->> ...

  2. Microsoft SQL Server 数据量大 导入导出 问题汇总

    问题一: 今天拿到一份有近百万条数据的Excel要导到数据库里面,我先在本地(2014)用自带Excel,然后生成脚本文件去服务器(2008)上执行:文件SQL打开不了. 解决方法: 用自带的sqlc ...

  3. Can't create new folder in windows7

    First, please use System File Checker tool to troubleshoot(诊断) this issue. If the issue persists, im ...

  4. 沉淀,再出发:Git的再次思考

    沉淀,再出发:Git的再次思考 一.前言 使用git也有很久了,后来有一段时间一直没有机会去使用,现在想来总结一下自己学习了这么长时间的一些心得感悟,我写的博客一般都是开了一个轮廓和框架,等到以后有所 ...

  5. 019sys模块

    为了和python解释器交互,控制台执行脚本后面添加变量 import  sysprint(sys.argv) def  post():    print('upload')def  download ...

  6. C#检验IIS版本、SQL Server版本、SilverLight版本

    之前做一个小项目,使用C#检验这些软件的版本,到处找了一些代码,也能作用,记录一下,以防以后用到. 一.检验IIS版本 public static bool checkIIS(string destV ...

  7. Java连接MQ的实例, 测试类

    package cjf.mq.mqclient; import com.ibm.mq.MQC; import com.ibm.mq.MQEnvironment; import com.ibm.mq.M ...

  8. LeNet 分类 FashionMNIST

    import mxnet as mx from mxnet import autograd, gluon, init, nd from mxnet.gluon import loss as gloss ...

  9. luogu P1522 Cow Tours

    嘟嘟嘟 题面挺绕的,“翻译”一下: 1.牧区是一个点,牧场是所有直接相连的点构成的联通块. 2.两个牧区之间的距离是这两个距离之间的最短路,只有直接相连的两个牧区之间的距离是欧几里得距离. 3.牧场的 ...

  10. docker-2-安装

    安装之前确定Centos的相关问题: CentOS Docker 安装 Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版 ...