用戶發送請求時攜帶的參數后端需要使用,而不同的發送參數的方式對應了不同的提取參數的方式
利用HTTP協議向服務器傳參有幾種途徑?
1.查詢字符串數據(query string):
形如:?key1=value1&key2=value2
比如:http://127.0.0.1:8000/?name =lx&age=0中的?name =lx
1)獲取請求路徑中的查詢字符串參數,形如:?k1=v1&k2=v2
2)可以通過request.GET屬性獲取,并返回QueryDict類型的對象
1
2
3
4
5
6
7
8
|
class TestQuery(View): def get( self , request): # 獲取查詢字符串參數name、age name = request.GET.get( 'name' , 'lx' ) age = request.GET.get( 'age' , '0' ) return HttpResponse( '查詢字符串參數:%s %s' % (name, age)) |
重要提示:
提取查詢字符串參數不區分請求方式,即使客戶端進行POST方式的請求,依然可以通過request.GET獲取請求中的查詢字符串參數。
QueryDict補充:
1)QueryDict是由Django自己封裝的一個數據類型,繼承自python的字典Dict,它被定義在django.http.QueryDict中專門用來存儲請求中提取的查詢字符串參數和請求體參數.即,HttpRequest對象中的屬性GET、POST都是QueryDict類型的數據
2. 提取請求體數據
1)可以發送請求體數據的請求方式有:POST、PUT、PATCH、DELETE
2)請求體數據格式不固定,常見的有:表單類型數據和JSON字符串類型,我們應區別對待
2.1 表單類型請求體數據(Form Data)
前端發送的表單類型的請求體數據,可以通過request.POST屬性獲取,并返回QueryDict對象。
1
2
3
4
5
6
7
8
|
class TestQuery(View): def post( self , request): # 獲取表單類型請求體參數中的username、password username = request.POST.get( 'username' ) password = request.POST.get( 'password' ) return HttpResponse( '表單類型請求體參數:%s %s' % (username, password)) |
重要提示:
request.POST只能用來獲取POST表單發送的請求體數據
2.2 非表單類型請求體數據(Non-Form Data):JSON
1)非表單類型的請求體數據,Django無法自動解析,可以通過request.body屬性獲取最原始的請求體數據
2)request.body獲取的是bytes類型的請求體原始數據
1
2
3
4
5
6
7
8
9
10
11
12
|
class TestQuery(View): def post( self , request): # 獲取請求體中原始的JSON數據 json_str = request.body # 使用json模塊將原始的JSON數據轉字典 json_dict = json.loads(json_str) # 請求體參數中的username、password username = json_dict.get( 'username' ) password = json_dict.get( 'password' ) return HttpResponse( '表單類型請求體參數:%s %s' % (username, password)) |
結果展示:
3. URL路徑參數:提取URL路徑中的特定部分數據
1)在定義路由時,可以從URL中獲取特定部分的路徑參數
2)Django的路由系統會將提取的路徑參數傳遞到視圖的內部
3)path()和re_path()都可以提取路徑參數
需求1:http://127.0.0.1:8000/pratice/register/18/
提取路徑中的數字18
需求2:http://127.0.0.1:8000/pratice/register/18500000000/
提取路徑中的手機號18500000000
3.1 path()提取路徑參數
測試path()提取普通路徑參數:http://127.0.0.1:8000/pratice/register/18/
path(‘pratice/register/int:age/', views.URLParam1View.as_view()),
1
2
3
4
5
6
|
class TestQuery(View): def get( self , request, age): #提取路徑參數是在路由中完成的,因為路徑是在路由系統中處理的 print ( '提取的路徑傳參:' ,age) return HttpResponse( 'path()提取普通路徑參數:%s' % age) |
路由中提取路徑參數時,使用的關鍵字,必須跟視圖中參數名一致
思考:
實現需求1時提取age數字的int:age是什么?
路由轉換器
Django默認封裝了一些正則表達式,用于在path()中要提取路徑參數時使用
默認的路由轉換器:
位置在django.urls.converters.py
1
2
3
4
5
6
7
|
DEFAULT_CONVERTERS = { 'int' : IntConverter(), # 匹配正整數,包含0 'path' : PathConverter(), # 匹配任何非空字符串,包含了路徑分隔符 'slug' : SlugConverter(), # 匹配字母、數字以及橫杠、下劃線組成的字符串 'str' : StringConverter(), # 匹配除了路徑分隔符(/)之外的非空字符串,這是默認的形式 'uuid' : UUIDConverter(), # 匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00 } |
源碼解析:
實現需求2
http://127.0.0.1:8000/pratice/register/18500000000/
提取路徑中的手機號18500000000
問題:
1)默認的路由轉換器中,沒有專門用來匹配手機號的路由轉換器
2)所以在使用path()實現需求2時,就無法直接使用默認的路由轉換器
解決方案:
如果默認的路由轉換器無法滿足需求時,我們就需要自定義路由轉換器
在任意可以被導入的python文件中,都可以自定義路由轉換器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
from django.urls import path, register_converter from . import views class MobileConverter: """自定義路由轉換器:匹配手機號""" # 匹配手機號碼的正則 regex = '1[3-9]\d{9}' def to_python( self , value): # 將匹配結果傳遞到視圖內部時使用 return int (value) def to_url( self , value): # 將匹配結果用于反向解析傳值時使用 return str (value) # 注冊自定義路由轉換器 # register_converter(自定義路由轉換器, '別名') register_converter(MobileConverter, 'mobile' ) urlpatterns = [ # path('pratice/register/<‘路由轉換器':<變量>, views.TestQuery.as_view()), # path('pratice/register/<int:age>', views.TestQuery.as_view()), path( 'pratice/register/<mobile:phone_num>' , views.TestQuery.as_view()), ] |
1
2
3
4
5
6
|
class TestQuery(View): def get( self , request,phone_num): #提取路徑參數是在路由中完成的,因為路徑是在路由系統中處理的 print ( '提取的路徑傳參:' ,phone_num) return HttpResponse( 'path()提取普通路徑參數:%s' % phone_num) |
效果展示
3.2 re_path()提取路徑參數
1
|
re_path(r '^pratice/register/(?P<phone_num>1[3-9]\d{9})/$' , views.TestQuery.as_view()), |
1
2
3
4
5
6
|
class TestQuery(View): def get( self , request,phone_num): #提取路徑參數是在路由中完成的,因為路徑是在路由系統中處理的 print ( '提取的路徑傳參:' ,phone_num) return HttpResponse( 'path()提取普通路徑參數:%s' % phone_num) |
3.3 path()和re_path()如何選擇?
1)path()語法相對簡潔一些,如果沒有路徑參數要提取或者要提取的路徑參數可以使用默認的路由轉換器實現時,就選擇path()。
2)re_path()語法相對復雜一些,但是,如果希望在匹配路由時,由自己編寫所有的正則式,就選擇re_path()。
需要注意的是,在使用re_path()時,網絡地址正則表達式一定要寫完整,要有嚴格的開頭和結尾
4. 請求頭
可以通過request.META屬性獲取請求頭headers中的數據,request.META為字典類型。
常見的請求頭如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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). |
1
2
3
4
5
6
7
|
class HeadersParamView(View): """提取請求頭參數""" def get( self , request): # 獲取請求頭中文件的類型 ret = request.META.get( 'CONTENT_TYPE' ) return http.HttpResponse( 'go' ) |
5. 其他常用HttpRequest對象屬性
method:一個字符串,表示請求使用的HTTP方法,常用值包括:'GET'、'POST'。
FILES:一個類似于字典的對象,包含所有的上傳文件。
COOKIES:一個字符串,包含了瀏覽器自動發送的cookie緩存數據。
user:請求中認證出來的用戶對象。
到此這篇關于Django使用HTTP協議向服務器傳參方式小結的文章就介紹到這了,更多相關Django HTTP協議向服務器傳參內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/weixin_47906106/article/details/119700560