django - 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 方法中使用重定向方法将用户发送到不同的页面,具体取决于他们是否有个人资料?
解决方案
默认情况下是 Django 使用Local-memory caching
(Django 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):
...
推荐阅读
- r - 使用特征多项式根在 ggplot2 中绘制单位圆
- reactjs - 反应切换不改变布尔值
- c++ - 引用字典值以减少查找
- java - 没有实现任何类,接口是如何被实例化的?
- javascript - 使用带有 React Native 的 Firebase 登录后如何永远保持登录状态
- python - 将 html 转换为 xml Python chilkat
- r - 如果交换也存在于 R 中的数据框中,则删除行
- windows - 无法在 MySQL 8 中使用 DBeaver 7 创建新列、约束、索引
- java - 如何将 JSON 转换为 Java 对象?
- python - 将 RSA 解密从 PyCrypto 迁移到 PyCryptodome