一、通常HTTP协议向服务器传参有几种途径 :

提取URL的特定部分,如/weather/shanghai/2018,可以在服务器端的路由中用正则表达式截取;

查询字符串(query string),形如key1=value1&key2=value2;

请求体(body)中发送的数据,比如表单数据、json、xml;

在http报文的头(header)中。

1.URL中参数的获取

在定义路由URL时,可以使用正则表达式提取参数的方法从URL中获取请求参数,Django会将提取的参数直接传递到视图的传入参数中。

  1. 1未命名参数按定义顺序传递

  注意:参数获取的顺序与url中参数的位置一一对应,不能互换

url(r'^users/([a-z]+)/(\d{4})/$', views.get_user),

def get_user(request, name, ID):
print('name=%s' % name)
print('id=%s' % id)
return HttpResponse('OK')

  1.2 命名参数按名字传递

  注意:如果在路由中指定了参数的名字,name接收参数时,必须要使用路由中指定的参数名称,不能换成其他名字,此时,两个参数位置可以互换。

url(r'^users/(?P<name>[a-z]+)/(?P<id>\d{4})/$', views.users),

def weather(request, name, id):
print('name=%s' % name)
print('id=%s' % id)
return HttpResponse('OK')

2.获取请求路径中的查询字符串参数
(形如?k1=v1&k2=v2),可以通过request.GET属性获取,返回QueryDict对象。

什么是QueryDict对象?

定义在django.http.QueryDict

HttpRequest对象的属性GET、POST都是QueryDict类型的对象

与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况

  2.1方法get():根据键获取值

  • 如果一个键同时拥有多个值将获取最后一个值
  • 如果键不存在则返回None值,可以设置默认值进行后续处理
dict.get('key',value)==>可简写为: dict['key']

  2.2方法getlist():根据键获取值,值以列表返回,可以获取指定键的所有值

  如果键不存在则返回空列表[],可以设置默认值进行后续处理

dict.getlist('键',默认值)

  2.3获取参数实例

  访问路径:/user/qs/?a=1&b=2&a=3

注意:查询字符串不区分请求方式,客户端GET,POST方式的请求,都可以通过request.GET获取请求中的查询字符串数据。

url(r'^qs/$',views.get_value,name='g_v'),

def get_value(request):
a = request.GET.get('a') #3
b = request.GET.get('b') #2
num_list = request.GET.getlist('a') #['1','3']
print(a)
print(b)
print(num_list) return HttpResponse(reverse('user:get_value'))

3.请求体中的参数

  3.1表单数据获取

  通过request.POST来获取

  注意:Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在开发测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF中间件

url(r'^getbody/$',views.get_body),

def get_body(request):
form_data = request.POST.get('c')
print(form_data)
return HttpResponse(form_data)

  3.2非表单数据获取

  非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。request.body返回bytes类型

import json

url(r'^getjson/$',views.get_body_json),

def get_body_json(request):
# 得到的是一个二进制数据
json_str = request.body
print(json_str) # b'{\n "f":200,\n "d":300\n \n}'\
# 对二进制数据进行解码,解码得到json数据
json_str = json_str.decode()
print(json_str) # {"f":200,"d":300}
# 将json数据转化成字典形式
json_data = json.loads(json_str)
print(json_data) # {'f': 200, 'd': 300}
# 获取json数据,使用字典方式取值
print(json_data['d']) # 300
print(json_data['f']) # 200
return HttpResponse('ok')

4.例如:Django获取http请求头内容

  通过view函数传递过来的 reuqest,使用request.META.get("header key")来获取

  注意:

    header key必须大写,前缀必须是"HTTP",后面如果连接符是横线“-”,要改成下划线“_”。例如你的header的key为api_auth,那在Django中应该使用request.META.get("HTTP_API_AUTH")来获取请求头的数据。

5.其他常用HttpRequest对象属性

request.method 请求方式

request.path 请求路径

request.user 请求的用户对象

request.FILES 一个类似于字典的对象,包含所有的上传文件

request.encoding 一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。

url(r'^otherattr/$', views.other_attr),

def other_attr(request):
print(request.method) # POST
print(request.path) # /user/otherattr/
print(request.encoding) # None:表示使用浏览器的默认设置,一般为utf-8,这个属性是可写的,
# 可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。

  

 

  

Django中获取参数(路径,查询,请求头,请求体)的更多相关文章

  1. Flask中获取参数(路径,查询,请求体,请求头)

    上一篇中已经讲述了:HTTP协议向服务器传参有几种途径{ 链接 } 在Flask中同样通过这4中传参途径进行归纳: 1. URL中路径参数的获取: 拓展: # 路由参数/路径参数:http://127 ...

  2. 使用HTTP协议向服务器传参的方式及django中获取参数的方式

    使用HTTP协议向服务器传参的四种方式 URL路径携带参数,形如/weather/beijing/2018; 查询字符串(query string),形如key1=value1&key2=va ...

  3. go的gin框架从请求中获取参数的方法

    前言: go语言的gin框架go里面比较好的一个web框架, github的start数超过了18000.可见此框架的可信度 如何获取请求中的参数 假如有这么一个请求: POST   /post/te ...

  4. JSP userBean setProperty直接从request中获取参数

    JSP userBean setProperty直接从request中获取参数: form表单Jsp: <%@ page language="java" import=&qu ...

  5. Java中获取文件路径

    Java中获取文件路径 1.实例说明 (1)得到 ClassPath的绝对URI路径 Thread.currentThread().getContextClassLoader().getResourc ...

  6. Android中获取文件路径的方法总结及对照

    最近在写文件存贮,Android中获取文件路径的方法比较多,所以自己也很混乱.找了好几篇博客,发现了以下的路径归纳,记录一下,以备不时之需 Environment.getDataDirectory() ...

  7. web项目中获取各种路径的方法

    ~Apple   web项目中各种路径的获取 1.可以在servlet的init方法里 String path = getServletContext().getRealPath("/&qu ...

  8. SpringMvc如何获取请求头请求体的消息

    对接第三方服务,说传递的POST请求中,Request Header中有需要的参数,Request Body为XML格式,包括创建消息正文和属性. 刚开始我以为可以通过 HttpServletRequ ...

  9. Django中的跨表查询,多表查询。

    一:Django中的ORM进行操作. 必须掌握的十三条: <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 & ...

随机推荐

  1. 分析比较 opacity: 0、visibility: hidden、display: none 优劣和适用场景

    总结: 结构: display:none: 会让元素完全从渲染树中消失,渲染的时候不占据任何空间, 不能点击, visibility: hidden:不会让元素从渲染树消失,渲染元素继续占据空间,只是 ...

  2. netty用法总结

    /**decoder和encoder,如果不需要解析,就使用系统的 * ch.pipeline().addLast(new StringDecoder()); * ch.pipeline().addL ...

  3. haproxy 在centos上cannot bind 端口的问题

    setsebool -P haproxy_connect_any=1 要不把selinux干掉也行

  4. 《Dotnet9》系列-开源C# Winform控件库强力推荐

    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...

  5. 视频剪辑什么鬼?Python 带你高效创作短视频

    ​阅读文本大概需要 10 分钟. 近两年,抖音.快手将短视频推到风口浪尖上,要生产出高质量的视频,离不开视频剪辑这一环节:在全民剪片浪潮中,大众使用最多的剪辑软件如:Pr.FCPX.剪印.Vue 等. ...

  6. Homebrew的安装

    Homebrew是一款Mac OS平台下的软件包管理工具. 安装方法:命令行输入 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubuserc ...

  7. [ASP.NET Core 3框架揭秘] 依赖注入[6]:服务注册

    通过<利用容器提供服务>我们知道作为依赖注入容器的IServiceProvider对象是通过调用IServiceCollection接口的扩展方法BuildServiceProvider创 ...

  8. pytho GUI编程之Tkinter

    摘录 python核心编程s GUI(Graphical User Interface)图形用户界面. Tcl.Tk和Tkinter Tkinter是python的默认GUI库.它基于Tk工具包,该工 ...

  9. 深入理解 ZK集群中通过Processor保证数据一致性

    入口 书接上篇博客中的ZK集群启动后完成数据的统一性恢复后,来到启动ZkServer的逻辑,接下来的重点工作就是启动不同角色的对应的不同的处理器Processor 如上图查看ZooKeeperServ ...

  10. Dubbo学习系列之十四(Seata分布式事务方案AT模式)

    一直说写有关最新技术的文章,但前面似乎都有点偏了,只能说算主流技术,今天这个主题,我觉得应该名副其实.分布式微服务的深水区并不是单个微服务的设计,而是服务间的数据一致性问题!解决了这个问题,才算是把分 ...