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

kbd*_*dev 4 python django cookies jquery wagtail

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

基本文件

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

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

我已经试过了,我能够将 cookie 打印到控制台:

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

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

Wit*_*ail 5

您使用的是 Python Cookie 模块,而不是 HttpRequest 对象设置的 django 模块,如本答案中所述。(现在已经过时了,但请继续阅读!)

在您处理该 JQuery 弹出窗口的后端的视图中(大概是您将其发送到 Django 中的端点,并且该代码是您视图中的一个片段),您想使用request.session文档来检查和设置你的饼干。

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

def a_standard_view(request):
    print request.session
Run Code Online (Sandbox Code Playgroud)

您可以通过使用(同样,这是我最初链接的部分)继续检查 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') 
Run Code Online (Sandbox Code Playgroud)

在您的特定实例中,您将需要一个处理 jquery 的端点(例如 /ajax/province/ 或类似的)。您的 Jquery 将需要使用get 调用来使用您尝试存储在会话数据中的任何详细信息来访问该端点