0


【Django框架】——22 Django视图 04 HttpRequest对象

在这里插入图片描述

在这里插入图片描述

目录

利⽤

HTTP

协议向服务器传参有以下几种途径:

  • 提取URL的特定部分,如/app/zhangsan/18/,可以在服务器端的路由中⽤正则表达式截取;
  • 查询字符串(query string),形如key1=value1&key2=value2
  • 请求体(body)中发送的数据,⽐如表单数据、json、xml
  • http报⽂的头(header)中。

1.URL路径参数

如果想从

URL

中获取值,需要在正则表达式中使⽤分组
获取值分为两种⽅式

  • 位置参数 参数的位置不能错
  • 关键字参数 参数的位置可以变,跟关键字保持⼀致即可

注意:两种参数的⽅式不要混合使⽤,在⼀个正则表达式中只能使⽤⼀种参数⽅式

分别使⽤以上两种获取

URL

值的⽅式提取出

20 60 http://127.0.0.1:8000/20/60/

位置参数

路由

url
# urls.pyfrom django.urls import re_path
from film import views

urlpatterns =[
    re_path('^httprequest/(\w+)/(\d+)/$', views.httpRequestView),]

在这里插入图片描述
视图函数

# views.pyfrom django.http import HttpRequest, HttpResponse

# Create your views here.defhttpRequestView(request, uname, age):return HttpResponse(f'My name is {uname} and I am {age} years old!')

在这里插入图片描述

访问:

http://127.0.0.1:8000/httprequest/awei/22/

在这里插入图片描述

关键字参数

url

# /urls.pyfrom django.urls import path, re_path
from project01 import views

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

视图函数

from django.http import HttpResponse

defpeopleView(request, age, name):"""
    :param request: 
    :param age: 
    :param name: 
    :return: 
    """print(name)return HttpResponse('My name is %s and I am %s year old!'%(name, age))

在这里插入图片描述

访问:
在这里插入图片描述

2. Django中的QueryDict对象

HttpRequest

对象的属性

GET、POST

QueryDict

类型的对象。

访问

:http://127.0.0.1:8000/people/awei/22/

在这里插入图片描述

GET

请求

:<WSGIRequest: GET '/people/awei/22/'>

在这里插入图片描述

python

字典不同,

QueryDict

类型的对象⽤来处理同⼀个键带有多个值的情况。

⽅法

get()

:根据键获取值

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

⽅法

getlist()

:根据键获取值,值以列表返回,可以获取指定键的所有值

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

3. 查询字符串Query String

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

形如?k1=v1&k2=v2

),可以通过

request.GET

属性获取,返回

QueryDict

对象。

视图函数

# /get/?uname=awei&age=22&age=18/from django.http import HttpResponse

defqueryView(request):
    uname = request.GET.get('uname')
    age = request.GET.get('age')
    age_list = request.GET.getlist('age')print(f'uname={uname}')print(f'age={age}')print(f'age_list={age_list}')return HttpResponse('QueryDict')

在这里插入图片描述

路由

urlpatterns =[
    path('query/', views.queryView)]

访问:

http://127.0.0.1:8000/query/?uname=awei&age=22&age=18/

在这里插入图片描述

重要:查询字符串不区分请求⽅式,即假使客户端进⾏

POST

⽅式的请求,依然可以通过

request.GET

获取请求中的查询字符串数据。

4. 请求体

请求体数据格式不固定,可以是表单类型字符串,可以是

JSON

字符串,可以是

XML

字符串,应区别对待。

可以发送请求体数据的请求⽅式有

POST、PUT、PATCH、DELETE

Django

默认开启了

CSRF

防护,会对上述请求⽅式进⾏

CSRF

防护验证,在测试时可以关闭

CSRF

防护机制,⽅法为在

settings.py

⽂件中注释掉

CSRF

中间件,如:

4.1 表单类型 Form Data

前端发送的表单类型的请求体数据,可以通过

request.POST

属性获取,返回

QueryDict

对象。

defpostView(request):
    uname = request.POST.get('uname')
    age = request.POST.get('age')
    alist = request.POST.getlist('uname')print(f'uname={uname}')print(f'age={age}')print(f'age_list={alist}')return HttpResponse('Post 请求')

在这里插入图片描述

在这里插入图片描述

4.2 ⾮表单类型 Non-Form Data

⾮表单类型的请求体数据,

Django

⽆法⾃动解析,可以通过

request.body

属性获取最原始的请求体数据,⾃⼰按照请求体格式(

JSON、XML

等)进⾏解析。

request.body

返回

bytes

类型。

例如要获取请求体中的如下

JSON

数据

# 注意测试时,key value必须⽤双引号,value为数字时可以不加。{"uname":"awei","age":22+}

可以进⾏如下⽅法操作:

import json

defpost_json(request):
    json_dict = json.loads(request.body.decode())print(req_data['uname'])print(req_data['age'])return HttpResponse('OK')

5. 请求头

可以通过

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,ifany.

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,ifany.

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

具体使⽤如:

defget_headers(request):print(request.META['CONTENT_TYPE'])return HttpResponse('OK')

6. 其他常⽤HttpRequest对象属性

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

本文转载自: https://blog.csdn.net/m0_68744965/article/details/127601571
版权归原作者 北极的三哈 所有, 如有侵权,请联系我们删除。

“【Django框架】——22 Django视图 04 HttpRequest对象”的评论:

还没有评论