天天看點

python的Web架構,Django架構中的請求與響應請求與響應

python的Web架構,Django架構中的請求與響應

請求與響應

簡單流程圖

我們先來了解一個請求與響應的大概流程 

視圖函數接受到的request到底是個什麼對象呢?

伺服器接收到http協定的請求後,會根據封包建立HttpRequest對象視圖函數的第一個參數是HttpRequest對象在django.http子產品中定義了HttpRequest對象的API,下面我們來列出這個對象的方法。

request屬性 說明
path 一個字元串,表示請求頁面的完整路徑,不包括域名
method 一個字元串,表示請求使用的HTTP方法,常用值包括:'GET'、'POST'
*encoding 一個字元串,表示送出的資料的編碼方式,
GTE 一個類似于字典的對象,包含get請求方式的所有參數
POST 一個類似于字典的對象,包含post請求方式的所有參數
FILES 一個類似于字典的對象,包含所有的上傳檔案
COOKIES 一個标準的python字典,包含所有的cookie,鍵和值都為字元串
sessin 一個即可讀有可寫的類似字典的對象,表示目前的會話,隻有當Django啟動會話的支援時才可用,詳細内容見"狀态儲存"
方法:is_ajax() 如果請求是通過XMLHttpRequest發起的,則傳回True

*encoding:如果為None則表示使用浏覽器的預設設定,一般為utf-8,這個屬性是可寫的,可以通過修改它來修改通路表單資料使用的編碼,接下來對屬性的任何通路将使用新的encoding值

POST登入送出的html例子

html中的form表單解析

1  <form action="送出位址,為空為目前頁" method="預設為POST請求">
2     
3         # 如果是post請求,會有安全的問題,需要加上csrf的方法,才可以使用post請求。
4         {% csrf_token %}
5         
6         <p>使用者名:<input type="text" name="必須要給的屬性,用于背景擷取參數得到的key"></p>
7         <p>密碼:<input type="password" name="必須要給的屬性,用于背景擷取參數得到的key"></p>
8         <p>使用者名:<input type="submit" value="登入"></p>
9     </form>      

views中的簡單邏輯判斷寫法:

因為登入頁面有GET請求,也有POST的請求,是以需要再視圖的時候需要進行判斷,做出反應。

1 def login(request):
 2 
 3     if request.method =='POST'
 4     
 5         # userame和password 這個key是前端網頁傳過來的類似的字典方式。
 6         username = request.POST.get('username','')
 7         password = request.POST.get('password','')
 8         
 9         # 如果賬号和密碼是對的,則跳轉到首頁
10         if username == 'aaa' and password == '123456':
11             return redirect(reverse('teacher:index'))
12         else:
13             此處添加賬戶密碼錯誤的傳回結果
14 
15     # 如果是GET方法則把login頁面傳回過去
16     return render(request, 'teacher/login.html')      

get以及post方式通路如何的擷取多個參數

當網頁是get通路的時候,且是多個參數的時候,取值是什麼樣的呢。

通路的網頁url例子:      
http://127.0.0.1:8000/teacher/login/?hobby=籃球&hobby=足球&hobby=羽毛球      

正常的取值方法,隻能擷取到一個值

#一鍵多值的情況下,隻能拿到一個值
>>> request.GET.get('hobby')
'羽毛球'      

getlist:拿多個值的時候,需要getlist

>>> request.GET.getlist('hobby')
['籃球','足球','羽毛球']      
POST方法相同,隻需要修改'GET'為'POST'即可。
      

檔案上傳

需要設定上傳檔案存放的路徑,setting中設定,同時需要建立檔案夾。

1 #測試用的,名字可以随意取,暫時路徑為根目錄下的檔案夾。
2 UPLOAD_ROOT = os.path.join(BASE_DIR,'upload')      

html中form的基礎寫法

1 <form action="" method="post" enctype="multipart/form-data">
2     {% scrf_token %}
3     <p>請選擇你要上傳的檔案:<input type="file" name="file" multiple></p>
4     <p><input type="submit" value="上傳"></p>
5 </form>
6 
7 enctype="multipart/form-data":隻有form表帶擁有這個屬性的時候,才有上傳檔案的功能
8 multiple:選擇檔案需要帶有才可以上傳多個檔案      

配置view: 判斷file,如果有檔案,則建立檔案夾(檔案夾名為當天日期)

1 from datetime import datetime
 2 from crm.setting import UPLOAD_ROOT
 3 import os
 4 
 5 def upload(request):
 6     if request.method == 'POST':
 7         files = request.FILES.getlist('file', None)
 8         #如果有多個檔案,則循環取出,
 9         for file in files:
10             #檔案名
11             day_dir = datetime.noe.strftime('%Y%m%d')
12             #絕對路徑拼接
13             pre_dir = os.path.join(UPLOAD_ROOT,day_dir)
14                 
15             #判斷檔案夾是否存在,需要注意目前使用者是否有權限
16             if not os.path.exists(pre_dir):
17                 os.mkdir(pre_dir)   #如果不存在則建立檔案夾
18                 
19             # 拿到使用者上傳過來的檔案名,和路徑拼接
20             filename = os.path.join(pre_dir, file.name)
21                 
22             # 寫資料(二進制)
23             with open(filename, 'wb') as f:
24                 #chunks是一個以檔案流的形式取值。如果檔案較大,以read的方式取值則會耗費資源。
25                 for line in file.chunks():
26                     f.write(line)
27             return HttpResponse('上傳成功')
28             
29     return render(request, 'teacher/upload.html')      

HTTPResponse對象:

from django.http import HttpResponse      
屬性 作用
content 表示傳回的内容,位元組類型
charset 表示response采用的編碼字元集,字元串類型
status_code 響應的HTTP響應狀态碼
content-type 指定輸出的MIME類型,請求頭
方法
init 使用頁内容執行個體化HttpResponse對象
write(content) 以檔案的方式寫,可以分次寫
flush() 以檔案的方式輸出緩存區
set_cookie(key, value='', max_age=None, expires=None) 設定Cookie
key、value 都是字元串類型
max_age 是一個整數,表示在指定數秒後過期
expires 是一個datetime或timedelta對象,會話将在這個指定的日期/時間過期。
max_age與expires二選一 max_age與expires二選一,如果不指定過期時間,則關閉浏覽器就失效
deleta_cookie(key) 删除指定的key的cookie,如果key不存在則數秒也不發送

*expires:注意datetime和timedelta值隻有在使用PickleSerializer時才可序列化。

JsonResponse 傳回json資料,隻能接受字典類型

如何傳回一個json資料,這裡先示範一個查詢資料的接口      
1 def students_api(request):
2     sex = request.GET.get('sex','')
3     sex = int(sex)
4     res = Students.objects.values('name','age','sex','phone').filter(sex=sex)
5     res = dect('data':res)
6     return JsonResponse(res)      

原文位址

https://www.cnblogs.com/hua888/p/10469663.html https://www.cnblogs.com/hua888/p/10469663.html