Python 设置和获取cookie时获取密钥错误

Python 设置和获取cookie时获取密钥错误,python,django,session,session-cookies,keyerror,Python,Django,Session,Session Cookies,Keyerror,在Django中设置和获取cookie时,我遇到了一个奇怪的异常。 尝试打印cookie值时出现密钥错误。有人能通过查看堆栈跟踪告诉我原因吗 异常类型:KeyError at/NewHandBook/welcome 异常值:“cookie\u user\u name”为什么它不工作 您正在对响应设置cookie,因此只有通过中间件运行后来自客户端的下一个请求才会具有cookie。无论是否使用中间件,任何客户端对服务器的第一个请求都不会设置此cookie(或任何其他cookie) 旁注: 最好在这

在Django中设置和获取cookie时,我遇到了一个奇怪的异常。 尝试打印cookie值时出现密钥错误。有人能通过查看堆栈跟踪告诉我原因吗

异常类型:KeyError at/NewHandBook/welcome 异常值:“cookie\u user\u name”

为什么它不工作 您正在对响应设置cookie,因此只有通过中间件运行后来自客户端的下一个请求才会具有cookie。无论是否使用中间件,任何客户端对服务器的第一个请求都不会设置此cookie(或任何其他cookie)

旁注: 最好在这里使用故障保护代码:无论如何,登录页面不应该因为没有设置GET参数而中断。如果这是站点的入口点,它甚至不应该返回错误。我猜你只是想显示一个漂亮的“欢迎回来”信息

你的饼干是这样的:

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,因为这不是您希望客户端存储的内容,而是您希望在服务器上处理它(而且它已经到达服务器)

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

def login(request):
    userName = request.GET.get('uname')
    print("################################")
    print(userName)
    UserName = {"Name": userName}
    return render(request, 'login/login.html', UserName)
因此,您只需要找到一种方法将其存储在中间件中,并在登录处理程序中读回。这就是本课程的目的。当第一个请求从客户端(使用Django)传入时,您就有了一个会话。 会话通过登录而存在,只要会话存在,您就可以访问其中存储的任何数据(即:只要会话cookie存储在客户机上且未过期)

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


您在登录前是否先访问了sessionHandler?如果未设置cookie,代码将中断。@DanielRoseman yes!!!在执行登录之前,我已经执行了sessionHandler方法,并且在sessionHandler中打印cookie值也引发了相同的异常。@ababak您能告诉我有什么方法可以检查cookie是否与在浏览器控制台中的签入分开。@vivek.p.nmanu只需使用
cookie\u user=request.COOKIES.get('cookie\u user\u name')
并验证
cookie\u user不是None
def login(request):
    userName = request.GET.get('uname')
    print("################################")
    print(userName)
    UserName = {"Name": userName}
    return render(request, 'login/login.html', UserName)