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

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

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

目录

*

+ 1.URL路径参数
+
* 位置参数
* 关键字参数
+ 2. Django中的QueryDict对象
+ 3. 查询字符串Query String
+ 4. 请求体
+
* 4.1 表单类型 Form Data
* 4.2 ⾮表单类型 Non-Form Data
+ 5. 请求头
+ 6. 其他常⽤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


from django.urls import re_path
from film import views

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

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

from django.http import HttpRequest, HttpResponse

def httpRequestView(request, uname, age):
    return HttpResponse(f'My name is {uname} and I am {age} years old!')

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

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

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

关键字参数

url


from django.urls import path, re_path
from project01 import views

urlpatterns = [
    re_path('^people/(?P\w+)/(?P\d+)/$', views.peopleView),

    path('people///', views.peopleView),
]

视图函数

from django.http import HttpResponse

def peopleView(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))

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

访问:

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

2. Django中的QueryDict对象

HttpRequest对象的属性 GET、POSTQueryDict类型的对象。

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

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

GET请求 &#xFF1A;<wsgirequest: 22 get ' people awei></wsgirequest:>

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

python字典不同, QueryDict类型的对象⽤来处理同⼀个键带有多个值的情况。

⽅法 get():根据键获取值

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

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

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

; 3. 查询字符串Query String

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

视图函数


from django.http import HttpResponse

def queryView(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')

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

路由

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

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

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

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

4. 请求体

请求体数据格式不固定,可以是表单类型字符串,可以是 JSON字符串,可以是 XML字符串,应区别对待。

可以发送请求体数据的请求⽅式有 POST&#x3001;PUT&#x3001;PATCH&#x3001;DELETE

Django默认开启了 CSRF防护,会对上述请求⽅式进⾏ CSRF防护验证,在测试时可以关闭 CSRF防护机制,⽅法为在 settings.py⽂件中注释掉 CSRF中间件,如:

4.1 表单类型 Form Data

前端发送的表单类型的请求体数据,可以通过 request.POST属性获取,返回
QueryDict对象。

def postView(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 请求')

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

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

4.2 ⾮表单类型 Non-Form Data

⾮表单类型的请求体数据, Django⽆法⾃动解析,可以通过 request.body属性获取最原始的请求体数据,⾃⼰按照请求体格式( JSON&#x3001;XML等)进⾏解析。

request.body返回 bytes类型。

例如要获取请求体中的如下 JSON数据


{"uname": "awei", "age": 22+}

可以进⾏如下⽅法操作:

import json

def post_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, 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 get_headers(request):
    print(request.META['CONTENT_TYPE'])
    return HttpResponse('OK')

6. 其他常⽤HttpRequest对象属性

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

Original: https://blog.csdn.net/m0_68744965/article/details/127601571
Author: 北极的三哈
Title: 【Django框架】——22 Django视图 04 HttpRequest对象

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/733909/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球