【问题标题】:How to check for cookie support in a middleware that uses sessions in Django?如何在 Django 中使用会话的中间件中检查 cookie 支持?
【发布时间】:2012-10-18 20:09:34
【问题描述】:

我有一个中间件,可以为每个新用户自动创建一个用户帐户并重定向:

class LogNewUser(object):

    def process_request(self, request):

        user_id = request.session.get('uid', None)

        if not user_id:
            user = User.objects.create(username=generate_name())
            request.session['uid'] = user.pk
            return redirect(request.path)

        else:
            request.user = User.objects.get(pk=user_id)

当然,如果浏览器禁用了 cookie,这会创建一个无限重定向循环。

我想测试用户是否启用了 cookie,如果是,做我的事情,如果没有,创建一个特定的用户对象,该对象对于所有非 cookie 用户都是相同的。

我尝试了 request.session.set_test_cookie()request.session.test_cookie_worked() 的不同组合,但找不到实现我想要的方法。

【问题讨论】:

  • 检查cookie的问题是你可以设置一个cookie,但只能在下一个请求中检查...
  • 我知道问题所在,我正在寻找解决方案。我昨天凌晨 4 点发现的!
  • 很好,请告诉我们:)
  • 我现在就写下来^^
  • 你也在找那个@Jingo 吗?

标签: django cookies middleware


【解决方案1】:

我意识到挑战在于找到一种方法来表明您已经尝试设置测试 cookie。由于 HTTP 是无状态的,唯一的方法是将信息封装到我们重定向到的 URL 中,然后在中间件中再次捕获它:

class LogNewUser(object):

    def process_request(self, request):

        if 'testcookie' in request.path:

            next = request.GET.get('next', '/')

            if not request.session.test_cookie_worked():
                return render(request, 'cookie_error.html')

            request.session.delete_test_cookie()

            user = User.objects.create(username=generate_name())
            request.session['uid'] = user.pk
            return redirect(request.GET.get('next', '/'))

        if not request.user.is_authenticated():

            user_id = request.session.get('uid', None)

            if not user_id:

                request.session.set_test_cookie()
                return redirect('/testcookie/?next=%s' % request.path)

            request.user = User.objects.get(pk=uid)

在此代码中,我们无法为所有非 cookie 用户创建用户对象。这是因为如果不对每个请求进行重定向,这种技术是不可能的,这会杀死 POST 请求。但是:

  • 我在这里处理这种情况,将非 cookie 用户重定向到解释问题的模板以及为他们的浏览器打开 cookie 的方法。
  • 如果您确实需要,可以使用 session ID in the URL query string 绕过此问题。

【讨论】:

    猜你喜欢
    • 2011-05-15
    • 2010-10-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2012-03-06
    • 1970-01-01
    相关资源
    最近更新 更多