在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的发送和接收。Cookie包含会话ID〔…〕

然后将连接到服务器A的浏览器重定向到从服务器B返回的URL,但会丢弃cookie信息。连接到服务器A的客户端没有cookie,因此不会将其传递给服务器B。

并且除非服务器B与服务器A在同一域上,否则您无法将cookie传递给客户端。浏览器不会将从一个域接收到的cookie发送到另一个域;stackoverflow.com/em>的cookie不应该与google.com共享,如果他们这样做,那将是一个非常大的安全问题。

因此,如果服务器A和服务器B位于两个不同的域上(例如,服务器A的foo.bar.example和服务器B的spam.ham.example(,则在将客户端重定向到服务器B时,您没有将cookie传递给客户端的路径。在这种情况下,您必须让服务器A直接连接到新的服务器B URL,并从响应中传递cookie。

如果服务器A和服务器B确实共享一个域(foo.bar.examplespam.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

最新更新