第八章、視圖詳解 -- HttpReqeust

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的調試工具查看上述屬性

實例演練: 獲到請求的pathmethon信息

  • 修改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對象的屬性GETPOST都是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)
  • 打開表單視圖,並提交

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章