python的Web框架,Django框架中的请求与响应
請(qǐng)求與響應(yīng)
簡(jiǎn)單流程圖
我們先來(lái)了解一個(gè)請(qǐng)求與響應(yīng)的大概流程?
視圖函數(shù)接受到的request到底是個(gè)什么對(duì)象呢?
服務(wù)器接收到http協(xié)議的請(qǐng)求后,會(huì)根據(jù)報(bào)文創(chuàng)建HttpRequest對(duì)象視圖函數(shù)的第一個(gè)參數(shù)是HttpRequest對(duì)象在django.http模塊中定義了HttpRequest對(duì)象的API,下面我們來(lái)列出這個(gè)對(duì)象的方法。
| path | 一個(gè)字符串,表示請(qǐng)求頁(yè)面的完整路徑,不包括域名 |
| method | 一個(gè)字符串,表示請(qǐng)求使用的HTTP方法,常用值包括:'GET'、'POST' |
| *encoding | 一個(gè)字符串,表示提交的數(shù)據(jù)的編碼方式, |
| GTE | 一個(gè)類似于字典的對(duì)象,包含get請(qǐng)求方式的所有參數(shù) |
| POST | 一個(gè)類似于字典的對(duì)象,包含post請(qǐng)求方式的所有參數(shù) |
| FILES | 一個(gè)類似于字典的對(duì)象,包含所有的上傳文件 |
| COOKIES | 一個(gè)標(biāo)準(zhǔn)的python字典,包含所有的cookie,鍵和值都為字符串 |
| sessin | 一個(gè)即可讀有可寫(xiě)的類似字典的對(duì)象,表示當(dāng)前的會(huì)話,只有當(dāng)Django啟動(dòng)會(huì)話的支持時(shí)才可用,詳細(xì)內(nèi)容見(jiàn)"狀態(tài)保存" |
| 方法:is_ajax() | 如果請(qǐng)求是通過(guò)XMLHttpRequest發(fā)起的,則返回True |
*encoding:如果為None則表示使用瀏覽器的默認(rèn)設(shè)置,一般為utf-8,這個(gè)屬性是可寫(xiě)的,可以通過(guò)修改它來(lái)修改訪問(wèn)表單數(shù)據(jù)使用的編碼,接下來(lái)對(duì)屬性的任何訪問(wèn)將使用新的encoding值
POST登錄提交的html例子
html中的form表單解析
1 <form action="提交地址,為空為當(dāng)前頁(yè)" method="默認(rèn)為POST請(qǐng)求"> 2 3 # 如果是post請(qǐng)求,會(huì)有安全的問(wèn)題,需要加上csrf的方法,才可以使用post請(qǐng)求。 4 {% csrf_token %} 5 6 <p>用戶名:<input type="text" name="必須要給的屬性,用于后臺(tái)獲取參數(shù)得到的key"></p> 7 <p>密碼:<input type="password" name="必須要給的屬性,用于后臺(tái)獲取參數(shù)得到的key"></p> 8 <p>用戶名:<input type="submit" value="登錄"></p> 9 </form>?
views中的簡(jiǎn)單邏輯判斷寫(xiě)法:
因?yàn)榈卿涰?yè)面有GET請(qǐng)求,也有POST的請(qǐng)求,所以需要再視圖的時(shí)候需要進(jìn)行判斷,做出反應(yīng)。
1 def login(request): 2 3 if request.method =='POST' 4 5 # userame和password 這個(gè)key是前端網(wǎng)頁(yè)傳過(guò)來(lái)的類似的字典方式。 6 username = request.POST.get('username','') 7 password = request.POST.get('password','') 8 9 # 如果賬號(hào)和密碼是對(duì)的,則跳轉(zhuǎn)到首頁(yè) 10 if username == 'aaa' and password == '123456': 11 return redirect(reverse('teacher:index')) 12 else: 13 此處添加賬戶密碼錯(cuò)誤的返回結(jié)果 14 15 # 如果是GET方法則把login頁(yè)面返回過(guò)去 16 return render(request, 'teacher/login.html')?
get以及post方式訪問(wèn)如何的獲取多個(gè)參數(shù)
當(dāng)網(wǎng)頁(yè)是get訪問(wèn)的時(shí)候,且是多個(gè)參數(shù)的時(shí)候,取值是什么樣的呢。
訪問(wèn)的網(wǎng)頁(yè)url例子: http://127.0.0.1:8000/teacher/login/?hobby=籃球&hobby=足球&hobby=羽毛球?
正常的取值方法,只能獲取到一個(gè)值
#一鍵多值的情況下,只能拿到一個(gè)值 >>> request.GET.get('hobby') '羽毛球'?
getlist:拿多個(gè)值的時(shí)候,需要getlist
>>> request.GET.getlist('hobby') ['籃球','足球','羽毛球'] POST方法相同,只需要修改'GET'為'POST'即可。文件上傳
需要設(shè)置上傳文件存放的路徑,setting中設(shè)置,同時(shí)需要新建文件夾。
1 #測(cè)試用的,名字可以隨意取,暫時(shí)路徑為根目錄下的文件夾。 2 UPLOAD_ROOT = os.path.join(BASE_DIR,'upload')?
html中form的基礎(chǔ)寫(xiě)法
1 <form action="" method="post" enctype="multipart/form-data"> 2 {% scrf_token %} 3 <p>請(qǐng)選擇你要上傳的文件:<input type="file" name="file" multiple></p> 4 <p><input type="submit" value="上傳"></p> 5 </form> 6 7 enctype="multipart/form-data":只有form表帶擁有這個(gè)屬性的時(shí)候,才有上傳文件的功能 8 multiple:選擇文件需要帶有才可以上傳多個(gè)文件?
配置view: 判斷file,如果有文件,則創(chuàng)建文件夾(文件夾名為當(dāng)天日期)
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 #如果有多個(gè)文件,則循環(huán)取出, 9 for file in files: 10 #文件名 11 day_dir = datetime.noe.strftime('%Y%m%d') 12 #絕對(duì)路徑拼接 13 pre_dir = os.path.join(UPLOAD_ROOT,day_dir) 14 15 #判斷文件夾是否存在,需要注意當(dāng)前用戶是否有權(quán)限 16 if not os.path.exists(pre_dir): 17 os.mkdir(pre_dir) #如果不存在則創(chuàng)建文件夾 18 19 # 拿到用戶上傳過(guò)來(lái)的文件名,和路徑拼接 20 filename = os.path.join(pre_dir, file.name) 21 22 # 寫(xiě)數(shù)據(jù)(二進(jìn)制) 23 with open(filename, 'wb') as f: 24 #chunks是一個(gè)以文件流的形式取值。如果文件較大,以read的方式取值則會(huì)耗費(fèi)資源。 25 for line in file.chunks(): 26 f.write(line) 27 return HttpResponse('上傳成功') 28 29 return render(request, 'teacher/upload.html')?
?HTTPResponse對(duì)象:
from django.http import HttpResponse?
| content | 表示返回的內(nèi)容,字節(jié)類型 |
| charset | 表示response采用的編碼字符集,字符串類型 |
| status_code | 響應(yīng)的HTTP響應(yīng)狀態(tài)碼 |
| content-type | 指定輸出的MIME類型,請(qǐng)求頭 |
| 方法 | 作用 |
| init | 使用頁(yè)內(nèi)容實(shí)例化HttpResponse對(duì)象 |
| write(content) | 以文件的方式寫(xiě),可以分次寫(xiě) |
| flush() | 以文件的方式輸出緩存區(qū) |
| set_cookie(key, value='', max_age=None, expires=None) | 設(shè)置Cookie |
| key、value | 都是字符串類型 |
| max_age | 是一個(gè)整數(shù),表示在指定數(shù)秒后過(guò)期 |
| expires | 是一個(gè)datetime或timedelta對(duì)象,會(huì)話將在這個(gè)指定的日期/時(shí)間過(guò)期。 |
| max_age與expires二選一 | max_age與expires二選一,如果不指定過(guò)期時(shí)間,則關(guān)閉瀏覽器就失效 |
| deleta_cookie(key) | 刪除指定的key的cookie,如果key不存在則數(shù)秒也不發(fā)送 |
*expires:注意datetime和timedelta值只有在使用PickleSerializer時(shí)才可序列化。
JsonResponse 返回json數(shù)據(jù),只能接受字典類型
如何返回一個(gè)json數(shù)據(jù),這里先演示一個(gè)查詢數(shù)據(jù)的接口 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)?
?
轉(zhuǎn)載于:https://www.cnblogs.com/hua888/p/10469663.html
總結(jié)
以上是生活随笔為你收集整理的python的Web框架,Django框架中的请求与响应的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用 VirtualBox + Vagr
- 下一篇: 安装PHP出现make: *** [sa