【django】HttpRequest对象(更新)

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 【django】HttpRequest对象(更新),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

回想⼀下,利⽤HTTP协议向服务器传参有⼏种途径?
a、提取URL的特定部分,如/film/zhangsan/20/,可以在服务器端的路由中⽤正则表达式截取;
b、查询字符串(query string),形如key1=value1&key2=value2;
c、请求体(body)中发送的数据,⽐如表单数据、json、xml;
d、在http报⽂的头(header)中。

一. URL路径参数

1、如果想从URL中获取值,需要在正则表达式中使⽤分组,
2、获取值分为两种⽅式
2.1、位置参数
a、参数的位置不能错
2.2、关键字参数

a、参数的位置可以变,跟关键字保持⼀致即可
注意:两种参数的⽅式不要混合使⽤,在⼀个正则表达式中只能使⽤⼀种参数⽅式

1、位置参数

子路由:

from django.urls import re_path
from film import views
urlpatterns = [  
		re_path('^people/(\w+)/(\d+)/$',views.peopleView)
]

视图:

def peopleView(request,age,name): 
	print(name) 
return HttpResponse('%s-%s'%(name,age))

2、关键字参数

子路由

re_path('^people/(?P<name>\w+)/(?P<age>\d+)/$',views.peopleView)
path('people/<str:name>/<int:age>/',views.peopleView),

视图

def peopleView(request,age,name): 
	print(name) 
return HttpResponse('%s-%s'%(name,age))

二、django中的QueryDict对象

HttpRequest对象的属性GET、POST都是QueryDict类型的对象
与python字典不同,QueryDict类型的对象⽤来处理同⼀个键带有多个值的情况

1、request.GET:获取的是QueryDict对象
1、request.GET.get(‘键’):根据键获取值

  • 如果⼀个键同时拥有多个值将获取最后⼀个值
  • 如果键不存在则返回None值,可以设置默认值进⾏后续处理
  • request.GET.get.get(‘键’,默认值)

2、request.GET.getlist(‘键’):根据键获取值,值以列表返回,可以获取指定键的所有值

  • 如果键不存在则返回空列表[],可以设置默认值进⾏后续处理
  • request.GET.getlist(‘键’,默认值)

在这里插入图片描述

def peopleView(request):
    print(request.GET)                          <QueryDict: {'name': ['kb'], 'age': ['18']}>
    print(request.GET.get('name1'))             None
    print(request.GET.get('name'))              kb
    print(request.GET.getlist('name'))          ['kb']
    print(request.GET.getlist('name1','wu'))    wu
    return HttpResponse('response')

三、查询字符串Query String

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

def get(request): 
a = request.GET.get('a') 
b = request.GET.get('b') 
alist = request.GET.getlist('a') 
print(a)   # 3 
print(b)   # 2 
print(alist) # ['1', '3'] 
return HttpResponse('OK')

特别注意:查询字符串不区分请求⽅式,即假使客户端进⾏POST⽅式的请求,依然可以通过request.GET获取请求中的查询字符串数据。

四、请求体

请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,可以是XML字符串,应区别对待。
可以发送请求体数据的请求⽅式有POST、PUT、PATCH、DELETE。
Django默认开启了CSRF防护,会对上述请求⽅式进⾏CSRF防护验证,在测试时可以关闭CSRF防护机制,⽅法为在settings.py⽂件中注释掉CSRF中间件,

4.1 表单类型 Form Data

前端发送的表单类型的请求体数据,可以通过request.POST属性获取,返回QueryDict对象。
在这里插入图片描述

def post(request): 
	print(request.POST)					<QueryDict: {'a': ['666'], 'b': ['666']}>
	a = request.POST.get('a') 			666
	b = request.POST.get('b') 			888
	print(request.POST.getlist('a'))	['666']
	print(a) 
	print(b) 
	print(alist) 
return HttpResponse('OK')

4.2 ⾮表单类型 Non-Form Data

⾮表单类型的请求体数据,Django⽆法⾃动解析,可以通过request.body属性获取最原始的请求体数据,⾃⼰按照请求体格式(JSON、XML等)进⾏解析。request.body返回bytes类型。
在这里插入图片描述

def peopleView(request):
    #请求体
    #将字节数据解码成json格式的字符串
    data=request.body.decode()				<class 'str'>
    print(type(data))
    #将json格式的字符串转换为字典格式的
    data=json.loads(data)
    print(type(data))						<class 'dict'>
    print(data)								{'uname': 'kb', 'age': 18}
    print(data.get('uname'))				kb

    return HttpResponse('response')

五、请求头

可以通过request.META属性获取请求头headers中的数据,request.META为字典类型。

常见的请求头:

CONTENT_LENGTH– The length of the request body (as a string).
CONTENT_TYPE– The MIME type of the request body.
HTTP_ACCEPT– Acceptable content types for the response.
HTTP_ACCEPT_ENCODING– Acceptable encodings for the response.
HTTP_ACCEPT_LANGUAGE– Acceptable languages for the response.
HTTP_HOST– The HTTP Host header sent by the client.
HTTP_REFERER– The referring page, if any.
HTTP_USER_AGENT– The client’s user-agent string.QUERY_STRING– The query string, 
as a single (unparsed) string.
REMOTE_ADDR– The IP address of the client.
REMOTE_HOST– The hostname of the client.
REMOTE_USER– The user authenticated by the Web server, if any.
REQUEST_METHOD– A string such as"GET"or"POST".
SERVER_NAME– The hostname of the server.
SERVER_PORT– The port of the server (as a string).
def testview(request):
	print(request.META)
    print(request.META.get('HTTP_HOST'))
return HttpResponse('hello')

六、其他常⽤HttpRequest对象属性

1、method: ⼀个字符串,表示请求使⽤的HTTP⽅法,常⽤值包括:‘GET’、‘POST’。
2、user: 请求的⽤户对象。
3、path: ⼀个字符串,表示请求的⻚⾯的完整路径,不包含域名和参数部分。
4、encoding: ⼀个字符串,表示提交的数据的编码⽅式。如果为None则表示使⽤浏览器的默认设置,⼀般为utf-8。这个属性是可写的,可以通过修改它来修改访问表单数据使⽤的编码,接下来对属性的任何访问将使⽤新的encoding值。
5、FILES: ⼀个类似于字典的对象,包含所有的上传⽂件。

在这里插入图片描述

def testview(request):
	print(request.FILES)
    return HttpResponse('hello')

<MultiValueDict: {‘a’: [<InMemoryUploadedFile: 新建 XLS 工作表.xls (application/vnd.ms-excel)>]}>
[16/Dec/2021 23:08:58] “POST /film/test/ HTTP/1.1” 200 5

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123489.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!