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

我们来看一看这个HttpRequest对象有哪些属性或者方法:

属性:

1 HttpRequest.scheme   请求的协议,一般为http或者https,字符串格式(以下属性中若无特殊指明,均为字符串格式)

2 HttpRequest.body    http请求的主体,二进制格式。

3 HttpRequest.path 所请求页面的完整路径(但不包括协议以及域名),也就是相对于网站根目录的路径。

4 HttpRequest.path_info 获取具有 URL 扩展名的资源的附加路径信息。相对于HttpRequest.path,使用该方法便于移植。

if the WSGIScriptAlias for your application is set to “/minfo”, then path might be “/minfo/music/bands/the_beatles/” and path_info would be “/music/bands/the_beatles/”.
5 HttpRequest.method 获取该请求的方法,比如: GET POST …

6 HttpRequest.encoding 获取请求中表单提交数据的编码。

7 HttpRequest.content_type 获取请求的MIME类型(从CONTENT_TYPE头部中获取),django1.10的新特性。

8 HttpRequest.content_params 获取CONTENT_TYPE中的键值对参数,并以字典的方式表示,django1.10的新特性。

9 HttpRequest.GET 返回一个 querydict 对象(类似于字典,本文最后有querydict的介绍),该对象包含了所有的HTTP GET参数

10 HttpRequest.POST 返回一个 querydict ,该对象包含了所有的HTTP POST参数,通过表单上传的所有 字符 都会保存在该属性中。

11 HttpRequest.COOKIES   返回一个包含了所有cookies的字典。

12 HttpRequest.FILES    返回一个包含了所有的上传文件的 querydict 对象。通过表单所上传的所有 文件 都会保存在该属性中。

key的值是input标签中name属性的值,value的值是一个UploadedFile对象

13 HttpRequest.META 返回一个包含了所有http头部信息的字典

View Code
14 HttpRequest.session 中间件属性

15 HttpRequest.site   中间件属性

16 HttpRequest.user   中间件属性,表示当前登录的用户。

HttpRequest.user实际上是由一个定义在django.contrib.auth.models 中的 user model 类 所创建的对象。

该类有许多字段,属性和方法。列举几个常用的: 获取更详细信息–>官方文档。

1 字段:

username 用户名

first_name

last_name

email

password

groups

user_permissions,

is_staff 布尔值,标明用户是否可以访问admin页面

is_superuser

last_login 上一次登陆时间

date_joined 用户创建时间

2 属性

is_authenticated 布尔值,标志着用户是否已认证。在django1.10之前,没有该属性,但有与该属性同名的方法。

3 方法

1 HttpRequest.user.get_username() 注意:方法的圆括号在templates标签中必需省略!!

获取username。尽量使用该方法来代替使用username字段

2 HttpRequest.user.get_full_name() 注意:方法的圆括号在templates标签中必需省略!!

获取first_name和last_name

3 HttpRequest.user.short_name() 注意:方法的圆括号在templates标签中必需省略!!

获取first_name

4 HttpRequest.user.set_password(raw_password) 注意:该方法无法在template标签中使用!!

设置密码

5 HttpRequest.user.check_password(raw_password) 注意:该方法无法在template标签中使用!!

如果raw_password与用户密码相等,则返回True

方法:

1 HttpRequest.get_host() 返回请求的源主机。example: 127.0.0.1:8000

2 HttpRequest.get_port() django1.9的新特性。

3 HttpRequest.get_full_path() 返回完整路径,并包括附加的查询信息。example: “/music/bands/the_beatles/?print=true”

4 HttpRequest.bulid_absolute_uri(location) 返回location的绝对uri,location默认为request.get_full_path()。

Example: “https://example.com/music/bands/the_beatles/?print=true”

QueryDict

是一个类似于Python中字典的一种对象,他是Python中字典的子类,所以继承了字典的所有方法,

当然QueryDict对字典的某些方法进行了加工,并补充了一些独特的方法。这里列出部分方法。详情请看: 官方文档 。

1 QueryDict.get(key,default=None) 返回key所对应的value,若key不存在,则返回default的值

2 QueryDict.update(other_dict) 更新

3 QueryDict.values() 列出所有的值

4 QueryDict.items() 列出所有的键值对,若一个key有多个值,只显示最后一个值。

5 QueryDict.pop(key) 删除某个键值对

6 QueryDict.getlist(key) 根据输入的key返回一个Python中的list

7 QueryDict.dict() 返回QueryDict的字典的表现形式

附加解释示例:

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

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

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

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

在http报文的头(header)中。

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

一、未命名参数按定义顺序传递

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

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

def weather(request, city, year):
print(‘city=%s’ % city)
print(‘year=%s’ % year)
return HttpResponse(‘OK’)

二、命名参数按名字传递

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

url(r’^weather/(?P[a-z]+)/(?P\d{4})/$’, views.weather),

def weather(request, year, city):
print(‘city=%s’ % city)
print(‘year=%s’ % year)
return HttpResponse(‘OK’)

2.获取请求路径中的查询字符串参数

(形如?k1=v1&k2=v2),可以通过request.GET属性获取,返回QueryDict对象。

什么是QueryDict对象?

定义在django.http.QueryDict

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

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

【1】方法get():根据键获取值

如果一个键同时拥有多个值将获取最后一个值

如果键不存在则返回None值,可以设置默认值进行后续处理

dict.get(‘键’,默认值) 可写为: dict[‘键’]

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

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

dict.getlist(‘键’,默认值)
获取参数实例

访问路径:/user/qs/?a=10&b=20&a=30

url(r’^qs/$’,views.qs,name=‘qs’),

def qs(request):
  a = request.GET.get(‘a’) #30
  b = request.GET.get(‘b’) #20
  num_list = request.GET.getlist(‘a’) #[‘10’,‘30’]
  print(a)
  print(b)
  print(num_list)

return HttpResponse(reverse(‘user:qs’))
重要:查询字符串不区分请求方式,即假使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据。

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.其他常用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值。
  return HttpResponse(‘success’)

django中的request对象详解相关推荐

  1. jsp获得服务器响应返回信息,JSP request对象详解

    JSP request对象详解 request是HttpServletRequest类的实例.客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应. 方法 1. st ...

  2. 【JavaScript 教程】ES6 中的 Promise对象 详解

    [JavaScript 教程]ES6 中的 Promise对象 详解 1.Promise对象含义 promise是异步编程的一种解决方法. 所谓promise,简单说是一个容器,里面保存着某个未来才会 ...

  3. JS中的event 对象详解

    JS中的event 对象详解 JS的event对象 Event属性和方法: 1. type:事件的类型,如onlick中的click: 2. srcElement/target:事件源,就是发生事件的 ...

  4. Javascript中的Document对象详解

    Document对象详解 document 文挡对象 - JavaScript脚本语言描述           -------------------------------------------- ...

  5. 【JavaWeb】Request对象详解

    HTTP之Request:接上一篇博文HTTP协议详细. 本文目录 一.Request请求 1.Request对象和Response对象的原理 2.Request对象继承体系结构 3.Request功 ...

  6. Pandas中的Series对象详解(含Python代码)

    1.初识Series对象 Pandas中的Series对象是一个带索引数据构成的一维数组. 可以用一个数组来创建Series对象: import pandas as pd data=pd.Series ...

  7. 前端开发:JS中的Window对象详解

    前言 在前端开发过程中,关于全局对象的使用是非常常用的,其实每个JS环境中都一个全局对象,尤其是在实际开发过程中全局范围内创建任何变量都是这个全局对象的属性,且任何函数都是它的方法.在实际浏览器环境下 ...

  8. Servlet中三大域对象详解----[笔记]

    刚学javaWeb时对一些信息的获取有一些不懂,请求行获取的信息和请求域获取的信息有什么不一样的?除了方法不一样-但是搞清楚了原理,一切迎刃而解;如果你也有疑惑,那就看看这篇文章吧! 请求行与请求域 ...

  9. JS中的this对象详解

    2019独角兽企业重金招聘Python工程师标准>>> JS中this关键字很常见,但是它似乎变幻莫测,让人抓狂.这篇文章就来揭示其中的奥秘. 借助阮一峰老师的话:它代表函数运行时, ...

最新文章

  1. 关于 Deployer 部署结构
  2. Linux 防火墙工具--iptables
  3. [THUPC2019]不等式/[51Nod1598]方程最小值
  4. 2017-2018-1 20155332实验三 实时系统报告
  5. 如何让手游内存占用更小?从内存消耗iOS实时统计开始
  6. Linux 常用解压和压缩命令
  7. ASP .NET MVC 之Entity Framework入门教程及源码
  8. 如何查看一个组件的 classid是多少_万一免五(万1免5)是骗人的吗?如何查看自己的交易费率是多少?万一免五最新问题汇总!...
  9. 酸奶小妹升级成酸奶妈妈了!
  10. VSCode开发react-native app进行android apk打包
  11. OA系统审批流程思路梳理
  12. python实现堆栈 后进先出 LIFO
  13. VulkanAPI架构
  14. Android攻城狮认识ContextMenu
  15. python实现BMI计算器
  16. 史上很全的注册表修改大全
  17. python x 0b1010_下面代码的输出结果是
  18. 系统集成项目管理工程师10大管理47个过程域输入输出工具(项目整体管理)
  19. 替换=(等于号)正则表达式
  20. 文字识别(四)--大批量生成文字训练集

热门文章

  1. C3P0连接池使用教程
  2. 感情,只要变了,就回不去了:伤感日志
  3. mongodb java 查询 日期_Java中的日期MongoDB查询
  4. MyBatis 批量插入数据到Oracle
  5. 基于fabric和hg的自动化部署
  6. (二)JVM成神路之剖析Java类加载子系统、双亲委派机制及线程上下文类加载器
  7. 8.10~8.15周题库
  8. 【OpenCV】—图像金子塔与图片尺寸缩放
  9. 算法修炼之练气篇——练气九层
  10. Redis 集群,分布式,微服务概念和区别理解