Django之重定向
阿新 • • 發佈:2018-04-20
Python1.什麽是重定向
重定向:就是通過各種方法將各種網絡請求重新定個方向轉到其它位置
Django中的重定向: 當視圖函數處理完成一個邏輯後,不需要向客戶端呈現數據,而是轉回到其它頁面(可以理解為調用其它的視圖函數)
通俗理解為:視圖轉向視圖,即一個視圖跳轉到另一個視圖.而不是直接返回到模板html.
2.什麽時候用到重定向
如添加成功、修改成功、刪除成功後顯示數據列表,而數據的列表視圖已經開發完成,此時不需要重新編寫獲取列表的代碼,而是轉到這個視圖
3.HttpResponseRedirect
Django中提供了HttpResponseRedirect對象實現重定向功能,這個類繼承自HttpResponse,被定義在django.http模塊中,返回的狀態碼為302
1.直接返回模板html
重定向:就是通過各種方法將各種網絡請求重新定個方向轉到其它位置
Django中的重定向: 當視圖函數處理完成一個邏輯後,不需要向客戶端呈現數據,而是轉回到其它頁面(可以理解為調用其它的視圖函數)
通俗理解為:視圖轉向視圖,即一個視圖跳轉到另一個視圖.而不是直接返回到模板html.
2.什麽時候用到重定向
如添加成功、修改成功、刪除成功後顯示數據列表,而數據的列表視圖已經開發完成,此時不需要重新編寫獲取列表的代碼,而是轉到這個視圖
3.HttpResponseRedirect
Django中提供了HttpResponseRedirect對象實現重定向功能,這個類繼承自HttpResponse,被定義在django.http模塊中,返回的狀態碼為302
普通視圖函數 def normalViewFn(request): # 直接返回模板html return render(request, ‘booktest/area.html‘) ``` 以上代碼演示的是視圖函數返回模板html.而我們要做的是視圖轉向到視圖. 所以我們繼續往下看. 2.重定向:轉向到視圖 ``` from django.http import HttpResponseRedirect 定義重定義向視圖,轉向首頁 def red(request): return HttpResponseRedirect(‘/‘) ``` 分析: 這裏重定向到 "/" , 其實相當於在瀏覽器重新訪問了"http://127.0.0.1:8000/".這是會找到 / 對應的視圖函數,然後執行視圖函數內部代碼. 畫圖分析: 首頁對應的視圖函數假如是index. ![](http://i2.51cto.com/images/blog/201804/20/73bd5726493d34100d4adb01ac8d0f88.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)![](http://i2.51cto.com/images/blog/201804/20/1323c9320fa0e39ee78c9cd85d2b7489.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 3.重定向(簡寫版) ``` from django.shortcuts import redirect 定義重定義向視圖簡寫函數,轉向首頁 def redirectViewShortFn(request): return redirect(‘/‘) ``` 註意: redirect()函數的介紹請看後邊章節. 4.狀態碼302補充 302用來做臨時跳轉: 比如未登陸的用戶訪問用戶中心重定向到登錄頁面。 訪問404頁面會重新定向到首頁。 4.redirect()函數 1.介紹 redirect()函數用於重定向.是HttpResponseRedirect()的簡寫. 我們想要了解一個函數,需要先讀一讀他的源碼. 函數源碼如下: (django版本為2.0.1.) def redirect(to, *args, permanent=False, **kwargs): Return an HttpResponseRedirect to the appropriate URL for the arguments passed. The arguments could be: * A model: the model‘s `get_absolute_url()` function will be called. * A view name, possibly with arguments: `urls.reverse()` will be used to reverse-resolve the name. * A URL, which will be used as-is for the redirect location. By default issues a temporary redirect; pass permanent=True to issue a permanent redirect redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect return redirect_class(resolve_url(to, *args, **kwargs)) 核心翻譯如下: 將HttpResponseRedirect返回給傳遞的參數的相應URL。 怎麽理解這句話呢? 其實就是根據你傳遞的第一個參數to,來判斷,到底要轉向到哪?轉向到一個模型,視圖,還是一個url. to參數可以為以下幾種情況: ?一個模型:模型的get_absolute_url()函數將被調用。 ?視圖名稱,可能使用參數:reverse()將用於反向解析名稱。 ?一個絕對的或相對的URL,將按原樣用於重定向位置。 默認情況下會發出臨時重定向; 如果修改參數permanent為True將發出永久重定向。 2. 轉向到視圖 如果要重定向到視圖,我們需要使用反向解析reverse() 1.傳遞路徑參數 def fan3(request,id1,id2): return HttpResponse(id1+‘ ‘ + id2) def fan4(request): #重定向到fan3 return redirect(reverse(‘booktest:fan3‘,args=(10,100))) 註意: reverse(‘namespace:name‘,關鍵字參數). ? 這裏的namespace是應用的命名空間. ? name是view視圖的別名. 關於fan3的namespace和name的相關配置: 1.在項目的urls.py中做如下配置: urlpatterns = [ path(‘admin/‘, admin.site.urls), url(r‘^‘,include(‘booktest.urls‘,namespace=‘booktest‘)), ] 2.在應用的urls.py中做如下配置: app_name = ‘booktest‘ # django2.0版本需要添加app_name= ‘namespace‘ urlpatterns = [ url(r‘^fan(\d+)_(\d+)/$‘, views.fan3, name=‘fan3‘), ] 2.傳遞關鍵字參數 def fan5(request,id,age): return HttpResponse(id+‘ ‘+age) def fan6(request): #重定向到fan5 return redirect(reverse(‘booktest:fan5‘,kwargs={‘id‘:100,‘age‘:30})) 關於fan5的namespace和name的相關配置: 1.在項目的urls.py中做的配置與上一個相同: 2.在應用的urls.py中做如下配置: app_name = ‘booktest‘ # django2.0版本需要添加app_name= ‘namespace‘ urlpatterns = [ url(r‘^fan(?P<id>\d+)(?P<age>\d+)/$‘, views.fan5, name=‘fan5‘) ] 3.傳遞普通參數 def updateOrderState(request): get_data = request.GET response = HttpResponseRedirect(reverse(‘order:orderQuery‘) + "?args=" + json.dumps(get_data)) return response def orderQuery(request): args = request.GET.get(‘args‘) args_dict = json.loads(args) xxx 這裏我們可以直接在reverse()後邊通過?拼接參數. 只不過要傳遞很多數據的時候,一般我們采用的是將字典轉換為字符串. json.dumps() 可以將字典變為字符串. json.loads() 可以將字符串變為字典.
Django之重定向