HttpReqeust對象
- 服務器接收到http協議的請求後,系統會根據報文自動創建
HttpRequest
對象- 視圖處理函數的第1個參數必須是
HttpRequest
對象
屬性
下列屬性除非特別說明,都是隻讀的
屬性 | 類型 | 說明 |
---|---|---|
path | 字符串 | 請求頁面的完整路徑,不包含域名和參數部分 |
method | 字符串 | 請求方式:get、post |
encoding | 字符串 | 編碼方式:None、utf-8 |
GET | QueryDict | get請求方式的所有參數 |
POST | QueryDict | post請求方式的所有參數 |
FILES | 字典 | 上傳文件數據 |
COOKIES | 字典 | cookie數據 |
session | 字典 | session數據 |
可以通過chrome的調試工具查看上述屬性
實例演練: 獲到請求的path
和methon
信息
- 修改urls.py文件:
url(r'^req/$', views.req),
- 修改views.py文件:
def req(request):
path = request.path
method = request.method
ret = 'path:' + path + "<br>" + 'method:' + method
return HttpResponse(ret)
QueryDict對象
- 定義在
django.http.QueryDict
HttpRequest
對象的屬性GET
、POST
都是QueryDict
類型的對象- 與python字典不同,
QueryDict
類型的對象用來處理同一個鍵帶有多個值的情況 - 方法
get()
:根據鍵獲取值 - 如果一個鍵同時擁有多個值將獲取最後一個值
- 如果鍵不存在則返回None值,可以設置默認值進行後續處理
dict.get('鍵',默認值)
可簡寫爲
dict['鍵']
- 方法
getlist()
:根據鍵獲取值,值以列表返回,可以獲取指定鍵的所有值 - 如果鍵不存在則返回空列表[],可以設置默認值進行後續處理
dict.getlist('鍵',默認值)
POST屬性
- 使用post方式提交form表單時,通過POST屬性接收參數,類型爲QueryDict
- 表單標籤通過name屬性的值作爲鍵,value屬性的值作爲值,構成鍵值對提交,發果沒有name屬性則不能提交表單
- 對於checkbox標籤,相同name屬性的值爲一組,被選中的項會被提交,出現一鍵多值的情況
- 鍵是表單標籤name屬性的值,由開發人員編寫,值是用戶填寫或選擇的
- 語法格式:
request.POST.get('name屬性')
或request.POST.getlist('name屬性')
實例演練: 提交帶有用戶名、密碼的表單
- 在
templates/app
目錄下創建表單頁面form.html
,編碼如下:action
屬性設置表單提交後的處理函數爲/app/req/
<form action="/app/req/" method="post">
username <input type="text" name="username" value="zhang3"> <br>
password <input type="password" name="password" value="123"> <br>
<input type="submit">
</form>
- 修改
urls.py
文件,爲form.html
頁面添加url路由
url(r'^form/$', views.form),
- 修改
views.py
文件,添加視圖處理函數
def form(request):
return render(request, 'app/form.html')
- 點擊提交後出現錯誤
- 修改
setting.py
文件的MIDDLEWARE
配置項,將CsrfViewMiddleware
一行註釋掉
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
- 修改
views.py
文件的req()
函數,編碼如下:
def req(request):
name = request.POST.get('username')
passwd = request.POST.get('password')
ret = 'name:' + name + "<br>" + 'passwd:' + passwd
return HttpResponse(ret)
實例演練: 獲得單選、多選和下拉菜單的數據
- 修改
form.html
文件,編碼如下:
<form action="/app/req/" method="post">
性別:
男<input type="radio" name="gender" value="男" checked/>
女<input type="radio" name="gender" value="女"/><br/>
愛好:
吃飯<input type="checkbox" name="hobby" value="吃飯" checked/>
睡覺<input type="checkbox" name="hobby" value="睡覺"/>
打豆豆<input type="checkbox" name="hobby" value="打豆豆" checked/><br>
址址:
<select name="address" id="">
<option value="ln" selected>遼寧省</option>
<option value="jl">吉林省</option>
</select> <br>
<input type="submit">
</form>
- 修改
req()
函數,編碼如下:
def req(request):
gender = request.POST.get('gender')
hobby = request.POST.getlist('hobby') # 愛好有多個值,返回一個list
address = request.POST.get('address')
ret = ""
for h in hobby:
ret += h + ", "
rets = 'hobby:' + ret + '<br>'
rets += 'gender:' + gender + '<br>' + 'address:' + address
return HttpResponse(rets)
- 打開表單視圖,並提交