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