Django在模板标签中读取cookie

时间:2014-10-10 14:11:59

标签: python django

是否可以在模板标签中读取cookie?

我将cookie设置在中间件中,但我想读取模板标签。

def process_response(self, request, response):
    response.set_cookie('changed', 'yes')
    response.set_cookie('choose', request.LANGUAGE_CODE)
    return response

由于

3 个答案:

答案 0 :(得分:3)

您必须使用 takes_context

创建模板标记
@register.simple_tag(takes_context = True)
def custom_template_tag_name(context, value1, value2):
    request = context['request']
    result = request.COOKIES.get('cookie_name', '')
    return result

答案 1 :(得分:2)

应该接受马科斯的回答。

以下是我在案例中使用Marcos的答案:

1 - Django视图(在views.py中):

from django.shortcuts import render_to_response

def helloWorld(request):
    response = render_to_response("awesomeapp/hello.html", {
            'person_name': "Mark"
        }, context_instance=RequestContext(request))
    person_age = 26
    response.set_cookie('the_new_number', person_age, max_age = 5000000) # 5million secs is almost two months, adjust as appropriate
    return response

2 - 在marktags.py中:

# To read cookies within django template, from http://stackoverflow.com/questions/26301447/django-read-cookie-in-template-tag
@register.simple_tag(takes_context = True)
def cookie(context, cookie_name): # could feed in additional argument to use as default value
    request = context['request']
    result = request.COOKIES.get(cookie_name,'') # I use blank as default value
    return result

请注意,我所有自定义过滤器的marktags.py文件为stored inside the templatetags directory (在我的情况下,我使用django-allauth,因此我将自定义文件marktags.py保存在template_tags.py文件夹中的myapp/allauth/account/templatetags文件旁边

3 - 最后,hello.html包含以下内容:

<head>
    {% load marktags %}
</head>

<body>
    {{ person_name }} is {% cookie 'the_new_number' %} years old.
</body>

请注意{%语法,而不是{{来访问Cookie

这是another example

如果您不熟悉Cookie,我建议您使用扩展程序 EditThisCookie。 您只能看到服务器了解人名的显示方式,但浏览器的cookie包含人的年龄值

答案 2 :(得分:2)

由于cookie是键/值对,您可以使用点符号读取模板中cookie的值,如下所示。

在您的观点中:

def process_response(self, request, response):
response.set_cookie('changed', 'yes')
response.set_cookie('choose', request.LANGUAGE_CODE)
return response

在你的模板中:

{{ request.COOKIES.cookie_name }}