通过请求模块调用视图不会创建正确的会话数据

时间:2019-06-09 19:57:27

标签: python django python-requests

假设我有如下两种视图:

def get_session_key(request):
    return JsonResponse({'session_key': request.session.session_key})

def test(request):
    import requests
    r = requests.get('http://127.0.0.1:8000/get_session_key')
    return HttpResponse(r)
  1. 为什么要自己调用get_session_key返回有效的响应-包含会话密钥-而从testrequests调用此函数将返回{"session_key": null}

  2. 是否可以使用requests调用此视图并仍然获得有效的会话密钥?

1 个答案:

答案 0 :(得分:1)

  

为什么要自己调用get_session_key返回一个有效的响应-包含会话密钥-而通过测试从请求中调用此函数将返回{"session_key": null}

会话ID存储在cookie中,如documentation on How to use Cookies中所述:

  

Django为匿名会话提供全面支持。会话框架使您可以基于每个站点访问者存储和检索任意数据。它在服务器端存储数据,并抽象化cookie的发送和接收。 Cookie包含会话ID -并非数据本身(除非您使用的是基于Cookie的后端)。

现在,如果您使用requests库进行呼叫,那么您当然不会将这些cookie传递给系统,因此您在没有cookie的情况下进行了通话,因此没有会​​话标识符。

但是,在发出GET请求时,您可以使用request.COOKIES [Django-doc]获取cookie,例如:

def test(request):
    import requests
    r = requests.get(
        'http://127.0.0.1:8000/get_session_key',
        cookies=request.COOKIES
    )
    return HttpResponse(r.content)

由于会话ID位于cookie中,因此对于这种情况,发出GET请求没有多大意义。