gpt4 book ai didi

python - Django 编程 - 如何重定向到原始 url

转载 作者:行者123 更新时间:2023-12-02 02:16:51 25 4
gpt4 key购买 nike

我有一个包含许多页面的网站 www.example.com

在每个页面上我都放置了一个特殊的按钮,该按钮链接到唯一的 URL www.example.com/task1

一旦单击此按钮,Django url patten 就会将其传递给我的专用函数 task1

我的问题是task1完成后如何刷新原始URL,我发现request.path只能传输/task1。有什么想法可以取回按钮分配的 URL。请引用我的task1函数。

def task1(request):
'''
do task1 job
'''
return render(request, request.path)
# above return could not render the original URL which I clicked from.

最佳答案

在 task1 函数的链接中,包含当前 URL 作为查询字符串:

<a href="task1/?next={{ request.get_full_path }}">Task 1</a>

然后在 View 中:

from django.shortcuts import redirect

def task1(request):
# Do task 1...
next = request.GET.get('next')
if next:
return redirect(next)
# some fallback here…
<小时/>

为了完整起见,根据 @Alasdair 的评论,您可以模仿 Django 的操作来确保重定向 URL 的安全:

from django.conf import settings
from django.shortcuts import redirect
from django.utils.http import url_has_allowed_host_and_scheme


def task1(request):
# Do task 1...
pass

# Return the user-originating redirect URL if it's safe.
redirect_to = request.GET.get("next")
url_is_safe = url_has_allowed_host_and_scheme(
url=redirect_to,
allowed_hosts=settings.ALLOWED_HOSTS,
require_https=request.is_secure(),
)
if url_is_safe and redirect_to:
return redirect(redirect_to)
return redirect("http://www.example.com")

原文见https://github.com/django/django/blob/master/django/contrib/auth/views.py#L68 ,尽管这是一个基于类的 View ,而不是像这里那样的基于函数的 View 。

<小时/>

为了使这个答案能够长期经受住 future 的考验:

  1. 阅读下面的评论; @mlissner 说的是有道理的,例如,关于 Django 3+ 中的重命名,
  2. 请注意,如果您不写入数据库,则对用户输入(即使是查询字符串和 GET 请求)进行操作也会产生安全隐患。

关于python - Django 编程 - 如何重定向到原始 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46805965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com