Django 在模板标签中读取 cookie

use*_*840 4 python django

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

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

def process_response(self, request, response):
    response.set_cookie('changed', 'yes')
    response.set_cookie('choose', request.LANGUAGE_CODE)
    return response
Run Code Online (Sandbox Code Playgroud)

谢谢

Mar*_*ayo 5

你必须用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
Run Code Online (Sandbox Code Playgroud)


Mar*_*ark 5

马科斯的回答应该被接受。

以下是我如何在我的案例中使用 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

请注意,我拥有所有自定义过滤器的 marktags.py 文件存储在templatetags目录中 (在我的情况下,我使用 django-allauth,因此我将自定义文件保存marktags.pytemplate_tags.py文件myapp/allauth/account/templatetags夹中的文件旁边)

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

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

<body>
    {{ person_name }} is {% cookie 'the_new_number' %} years old.
</body>
Run Code Online (Sandbox Code Playgroud)

注意{%语法,不是{{为了访问cookie

这是另一个例子

如果您不熟悉cookie,我建议您使用EditThisCookie等扩展程序 。你可以看到只有服务器知道这个人的名字是如何显示的,但是浏览器的 cookie 包含了这个人的年龄值


Hma*_*rix 5

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

在您看来:

def process_response(self, request, response):
response.set_cookie('changed', 'yes')
response.set_cookie('choose', request.LANGUAGE_CODE)
return response
Run Code Online (Sandbox Code Playgroud)

在你的模板中:

{{ request.COOKIES.cookie_name }}
Run Code Online (Sandbox Code Playgroud)

  • 简单 :) 虽然最好将它包装在一个 `{% if request.COOKIES.cookie_name %}` 中。 (2认同)