在Django视图中设置cookie的最佳方法是什么?

2024-03-28 23:34:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在修改一个类似于以下内容的Django视图:

class ListBase(DashboardAccessMixin, OrderingMixin, FilterMixin, SearchMixin):

    def get(self, request, *args, **kwargs):
        if should_delete_filter_cookie(request, path=reverse('dashboard:families')):
            request.COOKIES.pop('filters', None)

        self.query_dict = query_dict_from_params_or_cookies(request)

        return super().get(request, *args, **kwargs)

    def render_to_response(self, context, **response_kwargs):
        response = super().render_to_response(context, **response_kwargs)

        path = reverse('dashboard:families')

        if should_delete_filter_cookie(self.request, path=path):
            response.delete_cookie('filters', path=path)
        elif list(self.request.GET.items()):
            response.set_cookie('filters', self.request.GET.urlencode(), path=path)

        return response

其中辅助函数should_delete_filter_cookiequery_dict_from_params_or_cookies定义为

^{pr2}$

视图有一个filter_form和一个search_form(通过相应的mixin),它们与self.query_dict绑定。此外,我们遵循命名约定,UpdateView和{}的URL只是ListView的URL的“扩展”:例如,前者是/dashboard/families,后者只是dashboard/families/1(但不是{})。在

ListView现在是这样的,当您从UpdateView返回它时,它将保留以前通过从cookies中获取self.query_dict而应用的筛选器。在

我想知道的是为什么should_delete_filter_cookie被调用两次,分别是在get()方法和{}方法中。只做一次还不够吗?在

另外,为什么在render_to_response方法中使用response.set_cookie,而不仅仅是get()方法中使用response.set_cookie?在

在更基本的层面上,我正在努力理解request.COOKIES和{}之间的区别。例如,在下面的测试用例中

from django.test import SimpleTestCase, RequestFactory
from django.urls import reverse
from http.cookies import SimpleCookie


class SearchFilterTest(SimpleTestCase):
    def setUp(self):
        # Use a RequestFactory instead of a Client to obtain Request objects instead of Response objects
        self.factory = RequestFactory()

    def test_get_with_cookies(self):
        self.client.cookies = SimpleCookie({'filters': 'q=Christine'})
        response = self.client.get(
            reverse('dashboard:families'),
            HTTP_REFERER=reverse('dashboard:family', kwargs={'pk': 1, 'tab': 'case-management'}))
        import ipdb; ipdb.set_trace()

如果我进入调试器,我会发现response.cookies是空的SimpleCookie,即使已经为测试客户机设置了cookie:

ipdb> response.cookies
<SimpleCookie: >

response.cookies是否仅表示用response.set_cookie设置的cookies,而不是原始请求附带的cookie?在

另外,在这个用例中,在get()render_to_response()方法中设置cookie的最佳方法是什么?在


Tags: path方法selfgetcookieresponserequestfilter