【问题标题】:Does Django Development Web Server Cache Redirects?Django 开发 Web 服务器缓存重定向吗?
【发布时间】:2021-02-19 20:48:01
【问题描述】:

我有一个 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)

如果我启动 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 方法中使用重定向方法将用户发送到不同的页面,具体取决于他们是否有个人资料?

【问题讨论】:

  • 你可能在你的最后一个声明中提到了一些东西。 HttpResponseRedirect 是 Django 中重定向的标准;我以前从未见过redirect()
  • @NatRiddle 重定向是一个快捷功能。默认情况下,所有重定向都不是永久性的。 docs.djangoproject.com/en/dev/topics/http/shortcuts/#redirect
  • @Ray,默认情况下 Django 使用Local-memory caching。您可以使用Dummy caching 或装饰器never_cache
  • @NatRiddle 我做了你建议的改变,但这并没有解决问题。对于我的一生,我不明白为什么会发生这种情况。

标签: django django-views


【解决方案1】:

默认情况下 Django 使用 Local-memory caching(Django Docs)

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

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

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

from django.views.decorators.cache import never_cache

@never_cache
def login_redirect(request):
    ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2019-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    相关资源
    最近更新 更多