ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

django中的request对象详解

2021-10-22 10:04:23  阅读:224  来源: 互联网

标签:HttpRequest get request django 获取 json 详解 print


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’)

标签:HttpRequest,get,request,django,获取,json,详解,print
来源: https://blog.csdn.net/EFFORT_yf/article/details/120900046

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有