【问题标题】:How to set cookie in Django and then render template?如何在 Django 中设置 cookie 然后渲染模板?
【发布时间】:2013-06-08 02:17:21
【问题描述】:

我想在视图中设置一个 cookie,然后让该视图呈现一个模板。据我了解,这是设置cookie的方法:

def index(request):
    response = HttpResponse('blah')
    response.set_cookie('id', 1)
    return response

但是,我想设置一个 cookie,然后渲染一个模板,如下所示:

def index(request, template):
    response_obj = HttpResponse('blah')
    response_obj.set_cookie('id', 1)
    return render_to_response(template, response_obj)   # <= Doesn't work

模板将包含链接,单击这些链接将执行检查我正在设置的 cookie 的其他视图。做我在上面第二个例子中展示的正确方法是什么?我知道我可以为我的模板创建一个包含所有 HTML 的字符串,并将该字符串作为参数传递给 HttpResponse ,但这看起来真的很难看。难道没有更好的方法来做到这一点吗?谢谢。

【问题讨论】:

    标签: django cookies django-views


    【解决方案1】:
                    response = render(request, 'admin-dashboard.html',{"email":email})
                    #create cookies
                    expiry_time = 60 * 60 #in seconds
                    response.set_cookie("email_cookie",email,expiry_time);
                    response.set_cookie("classname","The easylearn academy",expiry_time);
    

    【讨论】:

      【解决方案2】:

      如果您只需要在渲染模板时设置 cookie 值,您可以尝试这样的操作:

      def view(request, template):
          # Manually set the value you'll use for rendering
          # (request.COOKIES is just a dictionnary)
          request.COOKIES['key'] = 'val'
          # Render the template with the manually set value
          response = render(request, template)
          # Actually set the cookie.
          response.set_cookie('key', 'val')
      
          return response
      

      【讨论】:

        【解决方案3】:

        接受的答案会在模板呈现之前设置 cookie。这行得通。

        response = HttpResponse()
        response.set_cookie("cookie_name", "cookie_value")
        response.write(template.render(context))
        

        【讨论】:

          【解决方案4】:

          这是怎么做的:

          from django.shortcuts import render
          
          def home(request, template):
              response = render(request, template)  # django.http.HttpResponse
              response.set_cookie(key='id', value=1)
              return response
          

          【讨论】:

          • 您首先实例化了一个 HttpResponse 但什么也不做。 render 返回一个响应,您将其分配到同一个变量中,然后您在该变量上设置 cookie 并最终返回。您的答案将等同于删除response = HttpResponse() 行。
          • 我可能误解了一些东西,但问题不是“如何在 渲染模板之前设置 cookie”?
          【解决方案5】:
          def index(request, template):
              response = HttpResponse('blah')
              response.set_cookie('id', 1)
              id = request.COOKIES.get('id')
              return render_to_response(template,{'cookie_id':id})
          

          【讨论】:

          • 然后在您的模板中,您可以根据您的 cookie 是否设置来显示链接。例如:{% if cookie_id %} #要显示的链接 {%endif%}
          • 感谢您的回复。但是,这看起来不太对。您的代码正在请求中查找名为“id”的 cookie。但是,在收到该请求之前不会设置 cookie,因此它不会存在。
          • 我想一种简单的方法就是在渲染创建cookie的模板时在客户端运行一些JavaScript。但是我仍然很好奇我上面所问的是否可以在服务器端完成。
          • 我没有收到错误,但您显示的代码不起作用,我认为原因是我描述的。
          • 试试这个 id = request.COOKIES.get('id',None)
          猜你喜欢
          • 2019-12-04
          • 2021-11-25
          • 1970-01-01
          • 2022-09-27
          • 1970-01-01
          • 2017-10-13
          • 2020-04-23
          • 1970-01-01
          • 2022-07-22
          相关资源
          最近更新 更多