python接口自動化(十八)--重定向(Location)(詳解)


簡介

   在實際工作中,有些接口請求完以后會重定向到別的url,而你卻需要重定向前的url。URL主要是針對虛擬空間而言,因為不是自己獨立管理的服務器,所以無法正常進行常規的操作。但是自己又不希望通過主域名的二級目錄進行訪問,而

是希望通過主域名的二級域名進行訪問。所以這個時候就會用到URL重定向。

  重定向過程好比有個綽號叫“瀏覽器”的人寫信找張三借錢,張三回信說沒有錢,讓“瀏覽器”去找李四借,並將李四現在的通信地址告訴給了“瀏覽器 ”。於是,“瀏覽器”又按張三提供通信地址給李四寫信借錢,李四收到信后就把錢匯給了“瀏覽

器”。可見,“瀏覽器”一共發出了兩封信和收到了兩次回復,“ 瀏覽器”也知道他借到的錢出自李四之手。具體可以通過 HttpServletResponse.sendRedirect  實現。  

  RequestDispatcher.forward 方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求並得到了響應結果,並不知道在服務器程序內部發生了轉發行為。這個過程好比綽號叫“ 瀏覽器”的人寫信找張三借錢,張三沒有錢,於

是張三找李四借了一些錢,甚至還可以加上自己的一些錢,然后再將這些錢匯給了“瀏覽器”。可見,“瀏覽器”只 發出了一封信和收到了一次回復,他只知道從張三那里借到了錢,並不知道有一部分錢出自李四之手。

1、請求轉發(requestDispatcher)

該動作是服務器行為,在web容器中進行的,客戶端對於跳轉是不知道的,地址欄中顯示的URL是不會變化的,因為請求轉發中是一次請求,相同的request,可以在請求中設置屬性對象(setAttribute())來實現數據共享

request.getRequestDispatcher(URL).forward(request,response);

 

2、請求重定向(sendRedirect,也稱為間接的請求轉發)

該動作是客戶端行為,服務器會向客戶端返回一個301狀態碼並攜帶一個Location屬性表名應請求的地址,然后客戶端按照服務器返回的地址重新發送請求,地址欄中顯示的URL是會變化的因為請求重定向中是兩次不同的請求request,無法實

現數據共享

response.sendRedirect(URL);

 

重定向

  URL重定向主要是指主域名主域名www.xusseo.com下的二級目錄,如www.xusseo.com/wap,但是由於wap是一個新的站點,所以正確的域名應該是應該是wap.xusseo.com。但是訪問的文件夾卻是www.xusseo.com/wap,這種訪問則被

稱之為重定向。

常見的重定向分為301重定向和302重定向。重定向是一種比較特別的優化方式,因為需要通過代碼來實現,從而變相提高權重值。所以在特殊情況下,如果使用重定向過於嚴重,則會被搜索引擎判定為不是正當的優化。

1、301重定向代表永久性轉移(Permanently Moved)

301重定向被稱之為永久性重定向,主要是針對一些永久性更改的網站,而且這種重定向一旦做好,將會對網站的優化大有好處。

2、302重定向代表暫時性轉移(Temporarily Moved )

302重定向的使用並不多見,它通常被稱之為暫時性的轉移。302重定向的使用常見於meta重定向和JavaScript重定向。而這種重定向是典型的不正當行為,很容易被搜索引擎發現,並將其重定向的網址定義為不合法網站,做出懲罰。

3、以博客園舉個簡單的場景案例,先登錄博客園打開我的博客首頁,進入任意一個頁面都可以,在這里進我的隨筆編輯界面,記住這個地址:https://i.cnblogs.com/EditPosts.aspx?opt=1

4.退出博客園登錄,把剛才我的隨筆這個地址https://i.cnblogs.com/EditPosts.aspx?opt=1輸入瀏覽器回車,抓包會看到這個請求狀態碼是 302,瀏覽器地址欄瞬間刷新跳到登錄首頁去了

禁止重定向(allow_redirects)

1、用 get 方法請求:https://i.cnblogs.com/EditPosts.aspx?opt=1

2、打印狀態碼是 200,這是因為 requets 庫自動處理了重定向請求了,這里留作疑問。聰明的你一定或許猜到了,不知道的后邊帶你去解密,筆者就喜歡抽絲剝繭的那種感覺,帶你一層一層揭開它神秘的面紗

3、自動處理重定向地址后,我們就獲取不到重定向后的 url 了,就無法走下一步,這里我們可以設置一個參數禁止重定向:allow_redirects=False(allow_redirects=True 是啟動重定向),然后就可以看到 status_code 是 302 了

獲取重定向后地址

1、在第一個請求后,服務器會下發一個新的請求鏈接,在 response 的 headers 里,如下抓包:Location

2、代碼實現獲取Location 地址

3、參考代碼

 1 # coding:utf-8
 2 import requests
 3 # 請求頭
 4 headers = {
 5     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
 6 }
 7 s = requests.session()
 8 # 打開我的隨筆
 9 r = s.get('https://i.cnblogs.com/EditPosts.aspx?opt=1',
10 headers=headers,
11 allow_redirects=False,
12 verify=False)
13 # 打印狀態碼,自動處理重定向請求
14 print (r.status_code)
15 new_url = r.headers["Location"]
16 print (new_url)

 小結

  在工作和學習中,我們不僅需要知其然,還必須知其所以然。前邊留的疑問或許你已經查資料知道其原因了。我這里還是用老辦法,看源碼!看源碼!看源碼!重要的事說三遍。

1、從get方法入手

我們知道使用requests的get方法傳入url就可以訪問此網站,但是這個過程是怎么做的呢,今天就帶着這個疑問對其進行進一步探究。

打開pycharm,在pycharm中通過ctrl(command)+🖱️左鍵我們可以定位到方法的位置。

我們首先進入sessions.py文件,看到get方法如下:

可以發現該方法就兩句話

先看第一句,kwargs.setdefault('allow_redirects', True),下面我們來說說kwargs在這里的用處

2、kwargs

kwargs是字典類型,setdefault的作用是給字典鍵名allow_redirects賦值,如果該鍵不存在,賦給其默認值,也就是第二參數True。

好了到此為止,就解決大家的疑問了,有興趣的小伙伴可以繼續往下分析。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM