1. 程式人生 > >Django之重定向

Django之重定向

Python

1.什麽是重定向
重定向:就是通過各種方法將各種網絡請求重新定個方向轉到其它位置
Django中的重定向: 當視圖函數處理完成一個邏輯後,不需要向客戶端呈現數據,而是轉回到其它頁面(可以理解為調用其它的視圖函數)
通俗理解為:視圖轉向視圖,即一個視圖跳轉到另一個視圖.而不是直接返回到模板html.
2.什麽時候用到重定向
如添加成功、修改成功、刪除成功後顯示數據列表,而數據的列表視圖已經開發完成,此時不需要重新編寫獲取列表的代碼,而是轉到這個視圖
3.HttpResponseRedirect
Django中提供了HttpResponseRedirect對象實現重定向功能,這個類繼承自HttpResponse,被定義在django.http模塊中,返回的狀態碼為302
1.直接返回模板html


普通視圖函數
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之重定向