如何在Django中设置Cookie,然后渲染模板?

How to set cookie in Django and then render template?

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

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

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

1
2
3
4
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,但这看起来确实很丑。 有没有更好的方法可以做到这一点? 谢谢。


这是怎么做的:

1
2
3
4
5
6
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


如果只需要在渲染模板时设置cookie值,则可以尝试以下操作:

1
2
3
4
5
6
7
8
9
10
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


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

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

1
2
3
4
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})