重定向/返回到Django中的相同(上一个)页面?

Posted

技术标签:

【中文标题】重定向/返回到Django中的相同(上一个)页面?【英文标题】:Redirect / return to same (previous) page in Django? 【发布时间】:2012-09-27 08:23:36 【问题描述】:

当您想在 Django 中将用户返回到同一页面时,有哪些选项,每个选项的优缺点是什么?

我知道的方法:

HTTP_REFERER GET 参数包含上一个 URL 用于存储前一个 URL 的会话数据

还有其他的吗?

【问题讨论】:

链接显示“登录后”。我是否问过“登录后”?这个问题可以是这个主题的真实概述。它不值得-1,它值得+1。哎呀 相反,逻辑与 get 或 post 没有什么不同,它只是一个重定向问题,在您定义一些推理之前没有任何利弊,您的问题很广泛,没有适当的研究或试验. 这是非常不同的。内置 Django 登录和 cmets 重定向。我的问题是针对其他情况的;) 这绝对不是建议的错误的副本。 “重复”是重定向到登录页面后的重定向,这通常是返回到引用页面的重定向(考虑从详细信息或编辑页面返回到列表页面)。请删除无效的重复标志。 +1 用于删除重复禁令。这个问题在谷歌中是这个搜索词的第一名,只有一个答案,但会有多种(更好的?)方法来解决这个问题。它与登录情况无关。 【参考方案1】:

其中一种方法是使用HTTP_REFERER 标头,如下所示:

from django.http import HttpResponseRedirect

def someview(request):
   ...
   return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

不确定这样做的缺点!

【讨论】:

我认为最大的问题是许多用户/浏览器都关闭了 http_referer。 你知道关闭页眉有多难吗?大多数用户不知道它是什么,更不用说如何关闭它了。在 Firefox 和 Chrome 中,您必须手动编辑首选项(同样,没有多少人知道如何做到这一点);在 IE 中,您根本无法禁用它(对于安全站点,它会自动禁用)。 我认为如果没有设置request.META,重定向到网站主页会更好:return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/') ) 另一个缺点是,如果在提交过程中验证失败,并且用户必须更正一些文件并重新提交,那么 HTTP_REFERER 将是表单的 url。 如果您还想保持滚动位置,请参阅this 回答。【参考方案2】:

虽然问题和答案很旧,但我认为它缺少一些选项。我没有发现这些方法有任何缺点,我很乐意知道是否有任何缺点?

request.path_info request.get_full_path()

request.build_absolute_uri()

from django.shortcuts import redirect

redirect(request.path_info) # No query parameters

redirect(request.build_absolute_uri()) # Keeps query parameters

redirect(request.get_full_path()) # Keeps query parameters

【讨论】:

您提供的所有 3 个示例都是指请求 url(如 /login/),而不是当前页面的 url(例如 /)。 链接的文档解释了这些方法的作用以及它的工作原理,如 django 文档中所述。【参考方案3】:

100% 工作示例

对于基于类的视图和函数:

from django.http import HttpResponseRedirect
    ...
    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

from django.http import HttpResponseRedirect
    ...
    return HttpResponseRedirect(self.request.META.get('HTTP_REFERER'))

示例 -

class TaskNotificationReadAllView(generic.View):

    def get(self, request, *args, **kwargs):
        TaskNotification.objects.filter(assigned_to=request.user).update(read=True)   
        print(request.META.get('HTTP_REFERER'))    
        return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

【讨论】:

【参考方案4】:

在 django 视图中,假设您没有登录,但点击了一些内容触发某些 url 的内容,例如 /board/2/new_topic 然后@login_required 会将您重定向到使用此 url 的登录页面

http://localhost:8000/signin/?next=/boards/2/new_topic/

所以我们的目标是在成功登录后重定向到 http://localhost:8000/boards/2/new_topic/ 页面,所以我们必须添加一行

  if 'next' in request.GET:
        return redirect(request.GET['next'])

如果它下一个存在,那么它将根据其他正常重定向进行重定向。

Views.py:

def signin(request):
if request.method == "POST":
    user_login_form = UserLoginForm(request.POST)
    email = request.POST['email']
    password = request.POST['password']
    user = authenticate(request, email=email, password=password)
    if user and user.is_active:
        login(request, user)
        if 'next' in request.GET:
            return redirect(request.GET['next'])
        else:
            return redirect('home')
    else:
        return render(request, 'signin.html', context='form': user_login_form)
else:
    user_login_form = UserLoginForm()
    return render(request, 'signin.html', context='form': user_login_form)

【讨论】:

以上是关于重定向/返回到Django中的相同(上一个)页面?的主要内容,如果未能解决你的问题,请参考以下文章

django重定向导致重定向到下一页,但然后返回原始?

Django:登录后重定向到上一页

Django之重定向

django:登录后重定向到引用页面[重复]

开始页面上的 Django 注册表单,没有重定向到登录页面

Django 渲染重定向到带有更改 url 的页面