利用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. Linux:CentOS7卸载mysql

    步骤 方法一. 1.查看mysql安装 rpm -qa|grep -i mysql 2.卸载前关闭mysql服务 rpm -ev --nodeps mysql-community-release-el ...

  2. 《React 与 Redux 开发实例精解》出版了!

    <React 与 Redux 开发实例精解>出版了! <React 与 Redux 开发实例精解>出版了! 关于 React 与 Redux React 与 Redux, 一个 ...

  3. 为什么说 Java 程序员必须掌握 Spring Boot ?

    原作者https://www.cnblogs.com/ityouknow/p/9175980.html Spring Boot 2.0 的推出又激起了一阵学习 Spring Boot 热,就单从我个人 ...

  4. jquery获取前一个月日期

    一) 重构Date对象: // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年 ...

  5. 关于Hibernate的报错org.hibernate.MappingException: Unknown entity

    部分异常,如下 org.hibernate.MappingException: Unknown entity: com.zcd.hibernate.oneToMany.Teamat org.hiber ...

  6. 解决weblogic错误:java.sql.SQLRecoverableException: IO Error: Broken pipe

    首先说一下系统基础架构: 服务器:weblogic11g集群 数据库:oracle数据库Rac 出错信息: 1.java.sql.SQLRecoverableException: Closed Con ...

  7. 池化层pooling

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

  8. GIS中的空间参考

    GIS一般都是研究的基于地球的某个区域,例如一个国家.省或市的情况,既然地球上都有经纬度来标识,那么直接用经纬度来标识物体的位置不可以吗?但如果应用不一样,在实际中选择的空间参考系也是不一样的.例如我 ...

  9. 用条件变量实现事件等待器的正确与错误做法--转自陈硕的Blog

    用条件变量实现事件等待器的正确与错误做法 TL;DR 如果你能一眼看出 https://gist.github.com/chenshuo/6430925 中的那 8 个 Waiter classes ...

  10. 算法 - 给出一个字符串str,输出包含两个字符串str的最短字符串,如str为abca时,输出则为abcabca

    今天碰到一个算法题觉得比较有意思,研究后自己实现了出来,代码比较简单,如发现什么问题请指正.思路和代码如下: 基本思路:从左开始取str的最大子字符串,判断子字符串是否为str的后缀,如果是则返回st ...