【发布时间】: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