【问题标题】:Getting key error while setting and getting cookie设置和获取 cookie 时出现关键错误
【发布时间】:2020-01-07 01:32:07
【问题描述】:

我在 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'

【问题讨论】:

  • 登录前是否先访问过sessionHandler?
  • 如果没有设置 cookie,代码将会中断。
  • @DanielRoseman 是的!!!我在执行登录之前执行了 sessionHandler 方法,并且在 sessionHandler 中打印 cookie 值也抛出了同样的异常。
  • @ababak 你能告诉我有什么方法可以检查cookie是否在浏览器控制台检查之外设置。
  • @vivek.p.nmanu 只需使用cookie_user = request.COOKIES.get('cookie_user_name') 并验证cookie_user is not None

标签: python django session session-cookies keyerror


【解决方案1】:

为什么它不起作用

您在响应中设置了 cookie,因此只有通过中间件后来自客户端的下一个请求才会有 cookie。无论有没有中间件,任何客户端向服务器发出的第一个请求永远不会设置此 cookie(或任何其他 cookie)。

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

你的cookie的方式是这样的:

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

cookies的一般方式是:

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 的会话中间件之后将您的中间件添加到链中。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2013-10-25
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多