十三 Django-重定向機(jī)制

一、重定向

1、什么是重定向

服務(wù)器向?yàn)g覽器發(fā)送一個(gè)302狀態(tài)碼以及一個(gè)Location消息頭,瀏覽器收到返回消息會(huì)立即向重定向地址發(fā)出請(qǐng)求

2、為什么要使用重定向技術(shù)

  1. URL重定向技術(shù),我們?cè)诰W(wǎng)站建設(shè)中,時(shí)常會(huì)遇到需要網(wǎng)頁(yè)重定向的情況:網(wǎng)站調(diào)整(如改變網(wǎng)頁(yè)目錄結(jié)構(gòu));網(wǎng)頁(yè)被移到一個(gè)新地址;網(wǎng)頁(yè)擴(kuò)展名改變這種情況下;,如果不做重定向,則用戶(hù)收藏夾或搜索引擎數(shù)據(jù)庫(kù)中舊地址只能讓訪(fǎng)問(wèn)客戶(hù)得到一個(gè)404頁(yè) 面錯(cuò)誤信息,訪(fǎng)問(wèn)流量白白喪失;再者某些注冊(cè)了多個(gè)域名的網(wǎng)站,也需要通過(guò)重定向讓訪(fǎng)問(wèn)這些域名的用戶(hù)自動(dòng)跳轉(zhuǎn)到主站點(diǎn)等
  2. 我們有些時(shí)候我們需要跳轉(zhuǎn)站點(diǎn)外的網(wǎng)站,比如登錄,第三方支付,
  3. 當(dāng)您未登錄并請(qǐng)求需要身份驗(yàn)證的URL(如Django管理員)時(shí),Django會(huì)將您重定向到登錄頁(yè)面。當(dāng)您成功登錄時(shí),Django會(huì)將您重定向到您最初請(qǐng)求的URL

3、重定向原理

image

4、特點(diǎn)

  1. 重定向地址可以是任意地址
  2. 重定向后瀏覽器的地址會(huì)發(fā)生變化
  3. 至少兩次請(qǐng)求

5、注意

網(wǎng)頁(yè)中如果有ajax請(qǐng)求不能使用重定向技術(shù),因?yàn)橹囟ㄏ蚴菫g覽器機(jī)制

三、分類(lèi)

1、臨時(shí)重定向

302重定向又稱(chēng)之臨時(shí)重定向或者暫時(shí)性轉(zhuǎn)移

我們之前網(wǎng)站的域名是 a.com,現(xiàn)在替換成了 b.com。但是用戶(hù)并不知道域名改了,所以還是在瀏覽器里輸入 a.com,Web服務(wù)器在收到請(qǐng)求后,在響應(yīng)中包含狀態(tài)碼 302 及 b.com。用戶(hù)的瀏覽器在收到響應(yīng)后,輸入欄仍是顯示舊網(wǎng)址,但是顯示的是 b.com的內(nèi)容。

2、永久重定向

顧名思義,301永久重定向應(yīng)該是永久性的。永久重定向告訴瀏覽器,“您正在尋找的東西不再是這個(gè)地址。它現(xiàn)在在這個(gè)新的地址,它將再也不會(huì)在舊地址。“

永久重定向就像一個(gè)商店標(biāo)志,上面寫(xiě)著:“我們搬家了。我們的新店就在附近。“這個(gè)改變是永久性的,所以下次你想去商店時(shí),你會(huì)直接去新地址。

注意:永久重定向可能會(huì)產(chǎn)生意想不到的后果。在使用永久重定向之前完成本指南或直接跳到“永久重定向是永久性的”部分。

處理重定向時(shí),瀏覽器的行為類(lèi)似:當(dāng)URL返回永久重定向響應(yīng)時(shí),此響應(yīng)將被緩存。下次瀏覽器遇到舊URL時(shí),它會(huì)記住重定向并直接請(qǐng)求新地址。

緩存重定向可以節(jié)省不必要的請(qǐng)求,從而提供更好,更快的用戶(hù)體驗(yàn)。

此外,臨時(shí)和永久重定向之間的區(qū)別與搜索引擎優(yōu)化相關(guān)。

3、區(qū)別

  1. 臨時(shí)重定向(響應(yīng)狀態(tài)碼:302)和永久重定向(響應(yīng)狀態(tài)碼:301)對(duì)普通用戶(hù)來(lái)說(shuō)是沒(méi)什么區(qū)別的,它主要面向的是搜索引擎
  2. 302重定向只是暫時(shí)的重定向,搜索引擎會(huì)抓取新的內(nèi)容而保留舊的地址,因?yàn)榉?wù)器返回302,所以,搜索搜索引擎認(rèn)為新的網(wǎng)址是暫時(shí)的。
  3. 而301重定向是永久的重定向,搜索引擎在抓取新的內(nèi)容的同時(shí)也將舊的網(wǎng)址替換為了重定向之后的網(wǎng)址。

四、使用

1、HttpResponseRedirect

  1. 說(shuō)明
    HttpResponseRedirect 參數(shù)可以是絕對(duì)路徑跟相對(duì)路徑
  2. 示例代碼
    def redi1(request):
        # 跳轉(zhuǎn)站內(nèi)的路徑
        return HttpResponseRedirect('/')
        # 跳轉(zhuǎn)站內(nèi)的路徑帶參數(shù)
        # return HttpResponseRedirect('/user/change/?uid=1')
        #  站外不帶參數(shù)
        # return HttpResponseRedirect('https://www.baidu.com/')
        #  站外帶參數(shù)1
        # return HttpResponseRedirect('http://gank.io/api/data/%E7%A6%8F%E5%88%A9/20/3/')
        #  站外跳轉(zhuǎn)帶參數(shù)2
        # return HttpResponseRedirect('https://www.apiopen.top/satinApi?type=1&page=1')
    

2、redirect

  1. 概要
    redirect()函數(shù)用于重定向.是HttpResponseRedirect()的簡(jiǎn)寫(xiě).,而且還和render在同一個(gè)模塊下,方便導(dǎo)入,如果不需要使用HttpResponseRedirect構(gòu)建復(fù)雜的返回的話(huà)使用這個(gè)很方便,因?yàn)閞edirect返回的就是HttpResponseRedirect對(duì)象,并且接受的參數(shù)有args,*kwargs,所以可以代替HttpResponseRedirect完成很多操作
  2. 函數(shù)
    redirect(to, *args, **kwargs)
    
  3. 參數(shù)說(shuō)明
    • to
      1、一個(gè)絕對(duì)的或相對(duì)的URL,將按原樣用于重定向位置。
      2、視圖名稱(chēng),可能使用參數(shù):reverse()將用于反向解析名稱(chēng)。
      3、一個(gè)模型:模型的get_absolute_url()函數(shù)將被調(diào)用。
    • *args
      可變參數(shù)
    • **kwargs
      關(guān)鍵字參數(shù)
  4. 示例代碼
    def redi2(request):
        # return redirect('/')
        # return redirect('https://www.apiopen.top/satinApi?type=1&page=2')
        # return redirect('/users/login/')
       # 配合reverse使用
        return redirect(reverse('login'))
    

3、reverse

  1. 說(shuō)明
    反向解析名稱(chēng)
  2. 函數(shù)
     reverse('命名空間:別名',*args ,**kwargs)
    
  3. 參數(shù)說(shuō)明
    • viewname
      1、視圖函數(shù)的名字
      2、namespace:name
      ? namespace是應(yīng)用的命名空間
      ? name是view視圖的別名.
    • args
      元組類(lèi)型,可變參數(shù)傳遞的值
    • *kwargs
      字典類(lèi)型,可變參數(shù)傳遞的值
  4. 示例代碼
       def redi2(request):
           # return redirect('/')
           # return redirect('https://www.apiopen.top/satinApi?type=1&page=2')
           # return redirect('/users/login/')
          # 配合reverse使用
           return redirect(reverse('login'))
    
  5. 命名空間
    # urls.py
    #在一級(jí)路由
    # namespace='user'  命名空間
    include('user_auth.urls', namespace='user') 
    # 二級(jí)路由
    url(r'login/', views.login_view, name='login'), 
    #也可以直接使用別名 # 注意不要在一級(jí)路由中使用命名空間 
    views.py
    def redi2(request):
        return redirect(reverse('user:login'))
    
  6. 使用別名
    # url.py
     url(r'login/', views.login_view, name='login'),
    # views.py
    def redi2(request):
        return redirect(reverse('login'))
    
  7. 包含參數(shù)
    # url.py
    url(r'list/(\d+)/(\d+)/', views.list, name='list'),
    #/list/10/1/
    # views.py
    def redi3(request):
        return redirect(reverse('list', args=(1, 10)))
    # 跳轉(zhuǎn)的視圖函數(shù)
    def list(request,page,size):
        return HttpResponse(page)
    
  8. 包含關(guān)鍵字參數(shù)
    # urls.py
    url(r'list/(?P<uid>\d+)/(?P<username>\d+)', views.list, name='list'),
    # views.py
    def redi3(request):
        return redirect(reverse('list', kwargs={'uid': '10','username':'老王'}))
    # 跳轉(zhuǎn)的視圖函數(shù)
    def list(request,uid,username):
        print(uid)
        print(username)
        return HttpResponse(username)
    

五、跟render的區(qū)別

  1. render:不會(huì)發(fā)送兩次請(qǐng)求,相當(dāng)于界面刷新,地址欄不會(huì)發(fā)生改變
  2. redirect:發(fā)送兩次請(qǐng)求,地址欄發(fā)生改變
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。