django中的request对象详解

django中的request对象详解

我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将 HttpRequest对象 作为第一个参数传入该函数。
我们来看一看这个HttpRequest对象有哪些属性或者方法:

属性

属性详细
HttpRequest.scheme请求的协议,一般为http或者https,字符串格式(以下属性中若无特殊指明,均为字符串格式)。
HttpRequest.bodyhttp请求的主体,二进制格式 。
HttpRequest.path所请求页面的完整路径(但不包括协议以及域名),也就是相对于网站根目录的路径。
HttpRequest.path_info获取具有 URL 扩展名的资源的附加路径信息。相对于HttpRequest.path,使用该方法便于移植。
HttpRequest.method获取该请求的方法,比如: GET POST …
HttpRequest.encoding获取请求中表单提交数据的编码。
HttpRequest.content_type获取请求的MIME类型(从CONTENT_TYPE头部中获取),django1.10的新特性。
HttpRequest.content_params获取CONTENT_TYPE中的键值对参数,并以字典的方式表示,django1.10的新特性。
HttpRequest.GET返回一个 querydict 对象(类似于字典,本文最后有querydict的介绍),该对象包含了所有的HTTP GET参数
HttpRequest.POST返回一个 querydict ,该对象包含了所有的HTTP POST参数,通过表单上传的所有 字符 都会保存在该属性中。
HttpRequest.COOKIES返回一个包含了所有cookies的字典。
HttpRequest.FILES返回一个包含了所有的上传文件的 querydict 对象。通过表单所上传的所有 文件 都会保存在该属性中。 key的值是input标签中name属性的值,value的值是一个UploadedFile对象。
HttpRequest.META返回一个包含了所有http头部信息的字典。
HttpRequest.session中间件属性
HttpRequest.site中间件属性
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 、方法

方法详细
HttpRequest.user.get_username()注意:方法的圆括号在templates标签中必需省略!!获取username。尽量使用该方法来代替使用username字段
HttpRequest.user.get_full_name()注意:方法的圆括号在templates标签中必需省略!!获取first_name和last_name
HttpRequest.user.short_name()注意:方法的圆括号在templates标签中必需省略!!获取first_name
HttpRequest.user.set_password(raw_password)注意:该方法无法在template标签中使用!!设置密码
HttpRequest.user.check_password(raw_password)注意:该方法无法在template标签中使用!!如果raw_password与用户密码相等,则返回True

方法

方法详细
HttpRequest.get_host()返回请求的源主机。example: 127.0.0.1:8000
HttpRequest.get_port()django1.9的新特性。
HttpRequest.get_full_path()返回完整路径,并包括附加的查询信息。example: “/music/bands/the_beatles/?print=true”
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’)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值