注销后禁用浏览器的“返回”按钮?

6

我正在使用Python和Django,当用户注销后单击返回按钮时,我希望将用户重定向到登录页面。如何实现?在哪里编写代码?

为了测试Django管理页面是否处理此问题,我登录到Django管理页面,然后退出并单击返回按钮,发现我能够看到先前的页面。为什么Django管理页面不能处理这个问题。

这是Django管理页面中注销的代码:

def logout(request):
  """
 Removes the authenticated user's ID from the request and flushes their
 session data.
 """
 request.session.flush()
 if hasattr(request, 'user'):
     from django.contrib.auth.models import AnonymousUser
     request.user = AnonymousUser()
7个回答

15

终于找到解决方法:

from django.views.decorators.cache import cache_control

@cache_control(no_cache=True, must_revalidate=True)
def func()
  #some code
  return
这将强制浏览器向服务器发出请求。

不支持Safari 13.0.3(Mac OS X Catalina 10.15.1)操作系统。 - abnerh69

9

您可能会发现,在chrome中需要使用@cache_control(no_cache = True,must_revalidate = True,no_store = True)才能完全停止任何后退按钮的查看。

关键在于对于chrome,必须使用no_store,如我在这里找到的 1


2
你在登出并点击后退后仍能看到管理员页面的原因是你看到的不是真正的页面,而是存储在你的浏览器缓存中的一个副本。请按照以下步骤操作:
1. 进入任何管理员页面 2. 点击“退出” 3. 点击浏览器的“后退”按钮 4. 按下F5或点击浏览器的“刷新”按钮。
现在你将被重定向到管理员后端的登录页面。

我粘贴的代码是django.contrib.auth.logout。这不是我的代码...我只是在使用django admin。这个问题存在于django admin中。 - Vivek S
哦,亲爱的...现在我明白你在问什么了。我会重新写我的回答。 - Martin Thurau
我知道当用户点击返回按钮时,不会向服务器发送任何请求...但我仍然不希望用户看到像谷歌那样的页面。 - Vivek S
好的,我认为这是你需要的:https://dev59.com/J0zSa4cB1Zd3GeqPpcZ6 - Adam Jurczyk

2
+1给Digital Cake的答案点赞!这也解决了在Firefox上登出后备份到缓存页面的问题。我尝试过:
@cache_control(no_cache=True, must_revalidate=True)
但没有效果。根据Digital Cake的建议,我尝试:
@cache_control(no_cache=True, must_revalidate=True, no_store=True)
现在Firefox会退回到登录界面。

@GeorgeK 它确实有效!尝试在登录视图上也放置装饰器。 - stratis
不支持Safari 13.0.3(Mac OS X Catalina 10.15.1)操作系统。 - abnerh69

2

我知道这是一个老问题,但是被接受的答案对我没有用。我遇到了同样的问题(使用django 1.8和Chrome)。

最终,我从文档(django 1.7或更高版本)中找到了解决方案。这肯定会起作用。

只需查看下面的代码

from django.contrib.auth.decorators import login_required

@login_required(login_url='/login/')
def myview(request):
    return HttpResponse(render(request,'path_to_your_view.html'))

@login_required 装饰器用于处理此问题。您可以在文档中查看更多信息。


不支持Safari 13.0.3(Mac OS X Catalina 10.15.1)操作系统。 - abnerh69

1
这是一个缓存问题。
您可以使用cache_control装饰器来强制视图不缓存:
from django.views.decorators.cache import cache_control

@cache_control(no_cache=True, must_revalidate=True, no_store=True)
def func()
  # some code
  return

这将强制浏览器向服务器发出请求。 cache_control的更多信息。

0

这要看你使用的身份验证系统是什么。如果你在使用某种自己实现的身份验证系统,你可以编写自己的 Middleware 类来将未经授权的用户重定向到登录页面。

如果你在使用某个库,可以查阅其文档,了解它如何处理未经授权的用户请求已保护页面的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接