一、重定向
1、什么是重定向
服務(wù)器向?yàn)g覽器發(fā)送一個(gè)302狀態(tài)碼以及一個(gè)Location消息頭,瀏覽器收到返回消息會(huì)立即向重定向地址發(fā)出請(qǐng)求
2、為什么要使用重定向技術(shù)
- 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)等
- 我們有些時(shí)候我們需要跳轉(zhuǎn)站點(diǎn)外的網(wǎng)站,比如登錄,第三方支付,
- 當(dāng)您未登錄并請(qǐng)求需要身份驗(yàn)證的URL(如Django管理員)時(shí),Django會(huì)將您重定向到登錄頁(yè)面。當(dāng)您成功登錄時(shí),Django會(huì)將您重定向到您最初請(qǐng)求的URL
3、重定向原理
4、特點(diǎn)
- 重定向地址可以是任意地址
- 重定向后瀏覽器的地址會(huì)發(fā)生變化
- 至少兩次請(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ū)別
- 臨時(shí)重定向(響應(yīng)狀態(tài)碼:302)和永久重定向(響應(yīng)狀態(tài)碼:301)對(duì)普通用戶(hù)來(lái)說(shuō)是沒(méi)什么區(qū)別的,它主要面向的是搜索引擎
- 302重定向只是暫時(shí)的重定向,搜索引擎會(huì)抓取新的內(nèi)容而保留舊的地址,因?yàn)榉?wù)器返回302,所以,搜索搜索引擎認(rèn)為新的網(wǎng)址是暫時(shí)的。
- 而301重定向是永久的重定向,搜索引擎在抓取新的內(nèi)容的同時(shí)也將舊的網(wǎng)址替換為了重定向之后的網(wǎng)址。
四、使用
1、HttpResponseRedirect
- 說(shuō)明
HttpResponseRedirect 參數(shù)可以是絕對(duì)路徑跟相對(duì)路徑 - 示例代碼
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
- 概要
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完成很多操作 - 函數(shù)
redirect(to, *args, **kwargs)
- 參數(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ù)
- to
- 示例代碼
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
- 說(shuō)明
反向解析名稱(chēng) - 函數(shù)
reverse('命名空間:別名',*args ,**kwargs)
- 參數(shù)說(shuō)明
- viewname
1、視圖函數(shù)的名字
2、namespace:name
? namespace是應(yīng)用的命名空間
? name是view視圖的別名. - args
元組類(lèi)型,可變參數(shù)傳遞的值 - *kwargs
字典類(lèi)型,可變參數(shù)傳遞的值
- viewname
- 示例代碼
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'))
- 命名空間
# 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'))
- 使用別名
# url.py url(r'login/', views.login_view, name='login'), # views.py def redi2(request): return redirect(reverse('login'))
- 包含參數(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)
- 包含關(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ū)別
- render:不會(huì)發(fā)送兩次請(qǐng)求,相當(dāng)于界面刷新,地址欄不會(huì)發(fā)生改變
- redirect:發(fā)送兩次請(qǐng)求,地址欄發(fā)生改變