如何在django中设置或获取cookie值

zjm*_*126 33 django cookies

这是我的代码:

from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext
from django import http
from django.http import HttpResponse 

def main(request, template_name='index.html'):
    HttpResponse.set_cookie('logged_in_status', 'zjm1126')
    context ={
              'a':a,
              'cookie':HttpResponse.get_cookie('logged_in_status'),
    }

    return render_to_response(template_name, context)
    #return http.HttpResponsePermanentRedirect(template_name)
Run Code Online (Sandbox Code Playgroud)

它引发了这个例外:

unbound method set_cookie() must be called with HttpResponse instance as first argument (got str instance instead)
Run Code Online (Sandbox Code Playgroud)

我能做什么?

Yuj*_*ita 109

你不能只是开始在HttpResponse类上调用方法,你必须实例化它,例如response = HttpResponse("Hello World"),调用cookie方法,然后从你的视图中返回它.

response = render_to_response(template_name, context)

response.set_cookie('logged_in_status', 'never_use_this_ever') 
return response
# remember my other answer: 
# it's a terrrible idea to set logged in status on a cookie.
Run Code Online (Sandbox Code Playgroud)

获取cookie:

request.COOKIES.get('logged_in_status') 
# remember, this is a terrible idea.
Run Code Online (Sandbox Code Playgroud)

  • +1因为它让我大声笑:)并导致他是对的. (11认同)
  • @avi,我不确定我的其他答案在哪里,但这是一个糟糕的主意,因为客户端可以很容易地修改cookie,因此使用cookie来确定用户是否登录是非常不安全的.我可以轻松地将我的cookie`logd_in_status`设置为True而无需登录. (8认同)
  • 重点是:不要使它成为布尔标志,而是某种session_id.所以客户端不能只"决定"它已登录.当然,auth会为你做这件事. (4认同)
  • 你的其他答案在哪里以及为什么它不好? (3认同)
  • 可以设置登录状态(我一直这样做)只是不要在服务器端代码中使用它. (2认同)
  • @ cs01,“此外,如果客户端使用HTTPOnly标志发送cookie,则它们也无法修改”。这仅适用于浏览器客户端。在浏览器之外操作httponly cookie非常简单,因此,尽管您大体上是正确的,但我认为假设HTTPOnly cookie不会被篡改是不好的。我同意你的其他观点。 (2认同)