首页 > 解决方案 > Django 开发 Web 服务器缓存重定向吗?

问题描述

我有一个 Django 视图,我在用户登录后将其重定向到:

    # settings.py
    from django.urls import reverse_lazy
    ...
    LOGIN_REDIRECT_URL = reverse_lazy('login-redirect')

    # account/urls.py
    urlpatterns = [
        path('', include('django.contrib.auth.urls')),
        ...
    ]

    # home/views.py
    from account.models import Member

    def login_redirect(request):
            """
            Redirect member to appropriate page when they log in.
            """
            member = Member.objects.get(user__id__exact=request.user.id)
            if member.has_profile:
                    return redirect('homepage', member_id=member.id)
            else:
                    return redirect('profile-create', member_id=member.id)

如果我在 condition 时启动 Django 的开发服务器并执行此代码member.has_profile = True,Django 会按预期将我重定向到主页视图。但是,如果我随后进入数据库并将 has_profile 设置为 False,重新启动 Web 服务器并再次执行代码,我的网站就像代码没有执行一样。相反,我立即再次被发送到主页视图。我可以通过查看终端控制台看到这一点:

[19/Feb/2021 ...] "GET /account/login/ HTTP/1.0" 200 4268       # I'm using Django's default login method
[19/Feb/2021 ...] "POST /account/login HTTP/1.0" 302 0
[19/Feb/2021 ...] "GET /home/login_redirect/ HTTP/1.0" 200 4599

即使我正在重新启动服务器并清除浏览器的缓存,也会发生这种情况。事实上,我可以编辑 login_redirect 函数,让它只包含一行pass,登录后我仍然会被发送到主页。

    def login_redirect(request):
        pass

为什么会这样?我没有做永久重定向。我不应该在 login_redirect 方法中使用重定向方法将用户发送到不同的页面,具体取决于他们是否有个人资料?

标签: djangodjango-views

解决方案


默认情况下是 Django 使用Local-memory cachingDjango Docs

Django 有一个Dummy caching用于开发的 - Django Docs

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
    }
}

您还可以使用装饰器- 是一个视图装饰器,它添加标头以确保响应不会被浏览器或其他缓存缓存。never_cache

from django.views.decorators.cache import never_cache

@never_cache
def login_redirect(request):
    ...

推荐阅读