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

时间:2016-12-05 19:42:49

标签: jquery python django cookies wagtail

我正在建立一个网站,根据用户来自哪个省份,该网站会有一些不同的内容。如果没有设置cookie,我在用户登陆网站时使用jQuery / Bootstrap设置一个模态窗口:

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中的变量以在模板中使用?我不确定下一步该做什么。我错过了什么?

2 个答案:

答案 0 :(得分:4)

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

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

例如,在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') 

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

答案 1 :(得分:0)

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

@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 %}

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