Django视图(二)
Django視圖(二)
文章目錄
- Django視圖(二)
- 一、HttpReqeust對象
- 1.QueryDict對象
- 2.GET屬性
- 3.POST屬性
- 二、HttpResponse對象
- 1.屬性
- 2.方法
- 3. **`示例`**
- 4.調用模板
- 三、子類JsonResponse
- 1.示例
- 四、子類HttpResponseRedirect
- 1.示例
- 2.重定向簡寫函數redirect
一、HttpReqeust對象
1.QueryDict對象
- 定義在django.http.QueryDict
- HttpRequest對象的屬性GET、POST都是QueryDict類型的對象
- 與python字典不同,QueryDict類型的對象用來處理同一個鍵帶有多個值的情況
- 方法get():根據鍵獲取值
- 如果一個鍵同時擁有多個值將獲取最后一個值
- 如果鍵不存在則返回None值,可以設置默認值進行后續處理
- 方法getlist():根據鍵獲取值,值以列表返回,可以獲取指定鍵的所有值
- 如果鍵不存在則返回空列表[],可以設置默認值進行后續處理
2.GET屬性
請求格式:在請求地址結尾使用?,之后以"鍵=值"的格式拼接,多個鍵值對之間以&連接。
例:網址如下
http://www.itcast.cn/?a=10&b=20&c=python其中的請求參數為:
a=10&b=20&c=python- 分析請求參數,鍵為’a’、‘b’、‘c’,值為’10’、‘20’、‘python’。
- 在 Django中可以使用HttpRequest對象的GET屬性獲得get方方式請求的參數。
- GET屬性是一個QueryDict類型的對象,鍵和值都是字符串類型。
- 鍵是開發人員在編寫代碼時確定下來的。
- 值是根據數據生成的。
3.POST屬性
使用form表單請求時,method方式為post則會發起post方式的請求,需要使用HttpRequest對象的POST屬性接收參數,POST屬性是一個QueryDict類型的對象。
問:表單form如何提交參數呢?
答:表單控件name屬性的值作為鍵,value屬性的值為值,構成鍵值對提交。
-
如果表單控件沒有name屬性則不提交。
-
對于checkbox控件,name屬性的值相同為一組,被選中的項會被提交,出現一鍵多值的情況。
-
鍵是表單控件name屬性的值,是由開發人員編寫的。
-
值是用戶填寫或選擇的。
-
示例
1)打開booktest/views.py文件,創建視圖show_reqarg。
#接收請求參數 def show_reqarg(request):if request.method == 'GET':a = request.GET.get('a') #獲取請求參數ab = request.GET.get('b') #獲取請求參數bc = request.GET.get('c') #獲取請求參數creturn render(request, 'booktest/show_getarg.html', {'a':a, 'b':b, 'c':c})else:name = request.POST.get('uname') #獲取namegender = request.POST.get('gender') #獲取genderhobbys = request.POST.getlist('hobby') #獲取hobbyreturn render(request, 'booktest/show_postarg.html', {'name':name, 'gender':gender, 'hobbys':hobbys})2)打開booktest/urls.py文件,配置url。
url(r'^show_reqarg/$', views.show_reqarg),3)修改templates/booktest目錄下的index.html,添加代碼如下:
<html> <head><title>首頁</title> </head> <body> ... ...3.提交數據的兩種方式:
get方式:<br/> <a href="/show_reqarg/?a=1&b=2&c=python">get方式提交數據</a><br/> post方式:<br/> <form method="post" action="/show_reqarg/">姓名:<input type="text" name="uname"><br/>性別:男<input type="radio" name="gender" value="男"/>女<input type="radio" name="gender" value="女"/><br/>愛好:吃飯<input type="checkbox" name="hobby" value="吃飯"/>睡覺<input type="checkbox" name="hobby" value="睡覺"/>打豆豆<input type="checkbox" name="hobby" value="打豆豆"/><br><input type="submit" value="提交"> </form> <br/> </body> </html>4)運行服務器。
http://127.0.0.1:8000/瀏覽效果如下圖:
5)在templates/booktest目錄下創建show_getarg.html,show_postarg.html,代碼如下:
show_getarg.html:
<html> <head><title>GET方式提交數據</title> </head> <body> a:{{ a }}<br/> b:{{ b }}<br/> c:{{ c }}<br/> </body> </html>show_postarg.html:
<html> <head><title>POST方式提交數據</title> </head> <body> name:{{ name }}<br/> gender:{{ gender }}<br/> hobbys: <ul>{% for hobby in hobbys %}<li>{{ hobby }}</li>{% endfor %} </ul> </body> </html>6)點擊鏈接GET方式提交數據,瀏覽效果如下圖:
7)后退到index頁面,輸入數據如下,點擊提交,瀏覽效果如下圖:
二、HttpResponse對象
視圖在接收請求并處理后,必須返回HttpResponse對象或子對象。在django.http模塊中定義了HttpResponse對象的API。HttpRequest對象由Django創建,HttpResponse對象由開發人員創建。
運行服務器,在瀏覽器中瀏覽首頁,可以在瀏覽器“開發者工具”中看到響應信息如下圖:
標號3為響應頭信息,點擊標號4處可以查看響應體信息。
1.屬性
- content:表示返回的內容。
- charset:表示response采用的編碼字符集,默認為utf-8。
- status_code:返回的HTTP響應狀態碼。
- content-type:指定返回數據的的MIME類型,默認為’text/html’。
2.方法
- init:創建HttpResponse對象后完成返回內容的初始化。
- set_cookie:設置Cookie信息。
- set_cookie(key, value=’’, max_age=None, expires=None)
cookie是網站以鍵值對格式存儲在瀏覽器中的一段純文本信息,用于實現用戶跟蹤。
max_age是一個整數,表示在指定秒數后過期。
expires是一個datetime或timedelta對象,會話將在這個指定的日期/時間過期。 max_age與expires二選一。
如果不指定過期時間,在關閉瀏覽器時cookie會過期。
- delete_cookie(key):刪除指定的key的Cookie,如果key不存在則什么也不發生。
- write:向響應體中寫數據。
3. 示例
直接返回數據
1)打開booktest/views.py文件,定義視圖index2如下:
def index2(request):str='<h1>hello world</h1>'return HttpResponse(str)2)打開booktest/urls.py文件,配置url。
url(r'^index2/$',views.index2),3)運行服務器,在瀏覽器中打開如下網址。
http://127.0.0.1:8000/index2/運行效果如下圖:
如果使用這種方式構造一個漂亮豐富的頁面,對于開發人員真是會發瘋,于是就有了下面的方式:
4.調用模板
可以將html、css、js定義到一個html文件中,然后由視圖來調用。
1)打開booktest/views.py文件,定義視圖index3如下:
from django.template import RequestContext, loader ... def index3(request):#加載模板t1=loader.get_template('booktest/index3.html')#構造上下文context=RequestContext(request,{'h1':'hello'})#使用上下文渲染模板,生成字符串后返回響應對象return HttpResponse(t1.render(context))2)打開booktest/urls.py文件,配置url。
url(r'^index3/$',views.index3),3)在templates/booktest/目錄下創建index3.html,代碼如下:
<html> <head><title>使用模板</title> </head> <body> <h1>{{h1}}</h1> </body> </html>4)運行服務器,在瀏覽器中打開如下網址。
http://127.0.0.1:8000/index3/運行效果如下圖:
- 調用模板簡寫函數render
每次調用模板時都要執行加載、上下文、渲染三個步驟,為了簡化操作,Django定義了render()函數封裝了以上三個步驟的代碼,定義在django.shortcuts模塊中。
1)打開booktest/views.py文件,定義視圖index3如下:
from django.shortcuts import render ... def index3(request):return render(request, 'booktest/index3.html', {'h1': 'hello'})三、子類JsonResponse
在瀏覽器中使用javascript發起ajax請求時,返回json格式的數據,此處以jquery的get()方法為例。
- 類JsonResponse繼承自HttpResponse對象,被定義在django.http模塊中,創建對象時接收字典作為參數。
JsonResponse對象的content-type為’application/json’。
1.示例
1)在booktest/views.py文件中定義視圖json1、json2,代碼如下:
from django.http import JsonResponse ... def json1(request):return render(request,'booktest/json1.html') def json2(request):return JsonResponse({'h1':'hello','h2':'world'})2)在booktest/urls.py文件中配置url。
url(r'^json1/$', views.json1),url(r'^json2/$', views.json2),3)創建目錄static/js/,把jquery文件拷貝到這個目錄下。
4)打開test3/settings.py文件,在文件最底部,配置靜態文件查找路徑,并且要求開啟調試
5)在templates/booktest/目錄下創建json1.html,代碼如下:
<html> <head><title>json</title><script src="/static/js/jquery-1.12.4.min.js"></script><script>$(function () {$('#btnJson').click(function () {$.get('/json2/',function (data) {ul=$('#jsonList');ul.append('<li>'+data['h1']+'</li>')ul.append('<li>'+data['h2']+'</li>')})});});</script> </head> <body> <input type="button" id="btnJson" value="獲取json數據"> <ul id="jsonList"></ul> </body> </html>6)運行服務器,在瀏覽器中輸入如下地址。
http://127.0.0.1:8000/json1/7)點擊按鈕"獲取json數據"后瀏覽如下圖。
ajax代碼執行過程如下:
1.發起請求。
2.服務器端視圖函數執行。
3.執行回調函數。
四、子類HttpResponseRedirect
- 當一個邏輯處理完成后,不需要向客戶端呈現數據,而是轉回到其它頁面,如添加成功、修改成功、刪除成功后顯示數據列表
- 而數據的列表視圖已經開發完成,此時不需要重新編寫列表的代碼,而是轉到這個視圖就可以,此時就需要模擬一個用戶請求的效果,從一個視圖轉到另外一個視圖,就稱為重定向。
Django中提供了HttpResponseRedirect對象實現重定向功能,這個類繼承自HttpResponse,被定義在django.http模塊中,返回的狀態碼為302。
1.示例
1)在booktest/views.py文件中定義視圖red1,代碼如下:
from django.http import HttpResponseRedirect ... # 定義重定義向視圖,轉向首頁 def red1(request):return HttpResponseRedirect('/')2)在booktest/urls.py文件中配置url。
url(r'^red1/$', views.red1),3)在地址欄中輸入網址如下:
http://127.0.0.1:8000/red1/4)回車后,瀏覽器地址欄如下圖。
2.重定向簡寫函數redirect
在django.shortcuts模塊中為重定向類提供了簡寫函數redirect。
1)修改booktest/views.py文件中red1視圖,代碼如下:
from django.shortcuts import redirect ... def red1(request):return redirect('/')總結
以上是生活随笔為你收集整理的Django视图(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django视图(一)
- 下一篇: Django视图(三)