如何在 Django/Wagtail 中检索 cookie 以设置 Python 变量

How to retrieve a cookie in Django/Wagtail to set Python variable

我正在建立一个网站,该网站将根据用户来自的省份提供一些不同的内容。如果没有设置 cookie,我已经使用 jQuery/Bootstrap 设置了模式 window 以在用户登陆网站时弹出:

base.html

<script type="text/javascript">
  $(document).ready(function() {
    if (Cookies.get('province') == null) {
     $('#provinceModal').modal('show');
    }

    $('button#ontario').click(function() {
        Cookies.set('province', 'ontario');
        $('#provinceModal').modal('hide');
    });
    $('button#alberta').click(function() {
        Cookies.set('province', 'alberta');
        $('#provinceModal').modal('hide');
    });
    $('button#quebec').click(function() {
        Cookies.set('province', 'quebec');
        $('#provinceModal').modal('hide');
    });
  });
</script>

cookie 设置正确,点击其中一个按钮后我可以在浏览器中看到它们。我遇到的问题是使用 Python 检索 cookie。我想保存省份变量,然后使用if语句显示某些内容(取决于省份等于什么)。

我试过了,我可以将 cookie 打印到控制台:

cookies.py

import Cookie
import os
import requests


def get_cookies():
    s = requests.session()
    r = s.get("http://www.twitter.com")

    cookie =  r.cookies['_twitter_sess']

    return cookie

如何将此值传递给 Python 中的变量以在模板中使用?我不确定下一步该做什么。我错过了什么?

您正在使用 Python Cookie 模块,而不是 HttpRequest 对象设置的 django 模块,如 。 (现已过时,但请继续阅读!)

在您看来正在处理 JQuery 弹出窗口的后端(假设您将它发送到 Django 中的端点并且该代码是您视图中的一个片段),您想使用 request.session 文档来检查和设置 cookie 的状态。

例如,在 Django 视图中,它看起来像这样:

def a_standard_view(request):
    print request.session

您可以继续检查 cookie 设置是否正常运行,方法是使用(同样,这是我最初链接的部分):

从 django.http 导入 HttpResponse 来自 django.shortcuts 导入渲染

def faux_login(request):
    if request.method == 'POST':
        if request.session.test_cookie_worked():
            request.session.delete_test_cookie()
            return HttpResponse("You're logged in.")
        else:
            return HttpResponse("Please enable cookies and try again.")
    request.session.set_test_cookie()
    return render(request, 'foo/login_form.html') 

在您的特定实例中,您将需要一个端点(因此 /ajax/province/ 或类似的)来处理您的 jquery。您的 Jquery 需要将 get call to hit that endpoint 与您尝试存储在会话数据中的任何详细信息一起使用。

我找到了使用模板标签解决我的问题的方法。

@register.simple_tag(takes_context = True)
def get_cookies(context, value1, value2):
    request = context['request']
    result = request.COOKIES.get('province', '')
    return result

我可以通过这种方式找到省份 cookie 值,并像这样在我的模板中使用它:

{% if request.COOKIES.province == 'ontario' %}
    <li><a href="#">Link</a></li>
{% endif %}

这似乎是实现我正在寻找的功能的最简单方法。