[英]Return request context after requests.post
我有一個服務器A,它使用python的請求模塊( r = request.post(url=url)
)向服務器B發出POST請求。 服務器B修改請求並返回帶有重定向到URL的響應。 我可以通過在服務器A上執行redirect(r.url)
來訪問重定向的url,但是我需要將修改后的請求上下文與它一起傳遞。 這可能嗎?
場景:服務器A在python Flask上運行。
r = requests.post(url='https://serverb.com/validateToken', data={'token':'abc'})
redirect(r.url)
服務器B在python Django上運行。
def validateToken(request):
# On successful validation
request.session[key] = mapped_token_to_user_id
redirect('/successfulToken') # On server B
當訪問/successfulToken
,服務器B檢查是否在請求對象上存在會話,但是由於重定向,該請求是裸露的。
Django服務器將設置一個cookie來標識與會話關聯的客戶端:
request.session[key] = mapped_token_to_user_id
請參閱Django會話文檔 :
會話框架使您可以基於每個站點訪問者存儲和檢索任意數據。 它在服務器端存儲數據,並抽象化cookie的發送和接收。 Cookies包含會話ID [...]
然后,您將連接到服務器A的瀏覽器重定向到服務器B返回的URL,但是您丟棄了cookie信息。 連接到服務器A的客戶端沒有cookie,因此不會將其傳遞給服務器B。
並且, 除非服務器B與服務器A處於同一域中,否則您無法將該Cookie傳遞給客戶端。 瀏覽器不會將從一個域接收的cookie發送到另一個域; 例如,不應與stack.flow.com的 cookie共享google.com ,否則,這將是一個很大的安全問題。
因此,如果服務器A和服務器B位於兩個不同的域(例如,服務器A的foo.bar.example
和服務器B的spam.ham.example
),那么在重定向時就沒有路徑將cookie傳遞給客戶端客戶端到服務器B。在這種情況下,您必須讓服務器A 直接連接到新的服務器B URL,並傳遞響應中的cookie。
如果服務器A和服務器B確實共享一個域( foo.bar.example
和spam.bar.example
共享.bar.example
作為域名),則可以為該共享域名設置cookie(在.
前綴上名稱)告訴客戶端它可以與同一域名中的所有服務器共享此Cookie。
無論哪種方式,您都需要提取會話cookie。 Django使用的默認名稱是sessionid
:
session_cookie = r.cookies['sessionid']
如果要從服務器A連接到新的URL,則需要將該cookie添加到傳出請求中( requests.get(url, cookies={'sessionid': session_cookie}
)。
如果要通過重定向將其提供給客戶端,請在返回之前在響應中進行設置:
response = redirect(r.url)
response.set_cookie('sessionid', session_cookie, domain='.bar.example')
return response
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.