设置和获取Cookie时出现关键错误

时间:2019-09-04 07:37:13

标签: python django session session-cookies keyerror

在Django中设置和获取Cookie时,我遇到了一个奇怪的异常。 尝试打印Cookie值时出现键错误。有人可以通过查看堆栈跟踪http://dpaste.com/3M3ZKXW

来告诉我原因
def sessionHandler(request):
    userName = request.GET.get('uname')
    response = HttpResponse("Setting the cookie now")
    response.set_cookie('cookie_user_name', userName)
    return JsonResponse({'Response': 'success'})


def login(request):
    cookie_user = request.COOKIES['cookie_user_name']
    print("################################")
    print(cookie_user)
    UserName = {"Name": global_user_name}
    return render(request, 'login/login.html', UserName)

异常类型:/ NewHandBook / welcome上的KeyError 异常值:“ cookie_user_name”

1 个答案:

答案 0 :(得分:0)

为什么不起作用

您正在响应中设置cookie,因此只有在运行中间件后来自客户端的下一个请求才具有cookie。使用或不使用中间件,任何客户端对服务器的第一个请求都将永远不会设置此cookie(或任何其他cookie)。

旁注: 最好在此处使用故障安全代码:无论如何,登录页面不应仅因为未设置GET参数而中断。如果这是您网站的入口点,它甚至不应该返回错误。我猜您只是想显示一个很好的“欢迎回来”消息。

您的Cookie的方式如下:

CLIENT: /login?uname=foobar
 -> request w/o cookie
 -> middleware sets *response* cookies
 -> /login handler checks *request* cookies: None

cookie的一般方式是:

CLIENT: first request
 -> server sets response cookies
 -> server sends response (preferrably 2**)
CLIENT: displays response and stores cookies
CLIENT: next request with cookies
 -> server reads cookies from request (e.g. session+CSRF cookies)
 -> server sends response (again with cookies, CSRF-Token etc.)

如何使其工作

Cookie是服务器用来与客户端进行回签的东西。

在您的情况下,您已经通过GET参数从客户端发送了您想要的信息。在这种情况下,您不需要cookie,因为您不希望客户端存储该cookie,而是要在服务器上处理它(并且它已经到达服务器)。

最简单的解决方案来说明:

def login(request):
    userName = request.GET.get('uname')
    print("################################")
    print(userName)
    UserName = {"Name": userName}
    return render(request, 'login/login.html', UserName)

因此,您只需要找到一种将其存储在中间件中并在登录处理程序中读回的方法。这就是会议的目的。客户端(使用Django)收到第一个请求后,您便立即开始会话。 会话通过登录进行,只要会话存在(即:只要会话cookie存储在客户端上并且没有过期),您就可以访问其中存储的任何数据。

确保将中间件添加到Django会话中间件之后。

https://docs.djangoproject.com/en/2.2/topics/http/sessions/