在request.post之后返​​回请求上下文

时间:2018-11-12 21:45:35

标签: python flask python-requests

我有一个服务器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检查是否在请求对象上存在会话,但是由于重定向,请求是裸露的。

1 个答案:

答案 0 :(得分:0)

Django服务器将设置一个cookie,以标识与会话相关联的客户端:

request.session[key] = mapped_token_to_user_id

请参见Django session documentation

  

会话框架使您可以基于每个站点访问者存储和检索任意数据。它在服务器端存储数据,并抽象化cookie的发送和接收。 Cookies包含会话ID [...]

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

并且除非服务器B与服务器A位于同一域,否则您无法将该Cookie传递给客户端。浏览器不会将从一个域接收的cookie发送到另一个域; stackoverflow.com 的Cookie不应与 google.com 共享,否则,这将是一个很大的安全问题。

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

如果服务器A和服务器B确实共享一个域(foo.bar.examplespam.bar.example共享.bar.example作为域名),则可以为该共享域名设置cookie(使用名称上的.前缀)告诉客户端它可以与同一域名中的所有服务器共享此cookie。

无论哪种方式,您都需要提取会话cookie。 default name used by Django is 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