Django HttpResponseRedirect 与重定向

标签 django redirect httpresponse

鉴于以下情况:

def add(request):    
    if request.method == "POST":
        task = request.POST.get('task')        
        form = NewTaskForm(request.POST)
        if form.is_valid():
            task = form.cleaned_data["task"]            
            request.session['tasks'] += [task]           
        
            # return HttpResponseRedirect(reverse("tasks:index"))
            return redirect('tasks:index')
        
        else:
            return render(request, "tasks/add.html",{
                "form": form
            })
    return render(request, "tasks/add.html",{
        "form": NewTaskForm()
    })

有什么区别,为什么你会使用其中一个而不是另一个:

return HttpResponseRedirect(reverse("tasks:index"))

和:

return redirect('tasks:index')

最佳答案

redirect(…)implemented as [GitHub] :

def redirect(to, *args, permanent=False, **kwargs):
    redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect
    return <b>redirect_class(</b>resolve_url(to, *args, **kwargs)<b>)</b>

其中 resolve_urlreverse(…) function [Django-doc] 周围的一层,正如我们在 source code [GitHub] 中看到的那样:

def resolve_url(to, *args, **kwargs):
    """
    Return a URL appropriate for the arguments passed.
    The arguments could be:
        * A model: the model's `get_absolute_url()` function will be called.
        * A view name, possibly with arguments: `urls.reverse()` will be used
          to reverse-resolve the name.
        * A URL, which will be returned as-is.
    """
    # If it's a model, use get_absolute_url()
    if hasattr(to, 'get_absolute_url'):
        return to.get_absolute_url()

    if isinstance(to, Promise):
        # Expand the lazy instance, as it can cause issues when it is passed
        # further to some Python functions like urlparse.
        to = str(to)

    if isinstance(to, str):
        # Handle relative URLs
        if to.startswith(('./', '../')):
            return to

    # Next try a reverse URL resolution.
    try:
        return reverse(to, args=args, kwargs=kwargs)
    except NoReverseMatch:
        # If this is a callable, re-raise.
        if callable(to):
            raise
        # If this doesn't "feel" like a URL, re-raise.
        if '/' not in to and '.' not in to:
            raise

    # Finally, fall back and assume it's a URL
    return to

因此,这是一种更“丰富”的 URL 解析方式,因为:

  1. 如果该对象有 .get_absolute_url() method [Django-doc]它将返回该方法的结果;
  2. 如果是一个Promise,它将评估该promise;
  3. 如果是相对URL,则返回该URL;和
  4. 如果reverse(…)失败并且它看起来像一个URL,它将返回您传递给它自己的值,从那时起它假设它是一个(绝对)网址。

因此,它不仅旨在找到具有该名称的 View ,而且还执行一些额外的操作。

此外,通过重定向,使用参数的方式更加方便。如果网址如下所示:

app_name = 'tasks'

urlpatterns = [
    # …,
    path('page/<b><slug:myslug></b>/', some_view, name='page')
]

然后,当您使用 reverse(...) 时,您可以为 myslug 参数提供一个值:

return HttpResponseRedirect(reverse('tasks:index'<b>, args=('value',)</b>))

或者:

return HttpResponseRedirect(reverse('tasks:index'<b>, kwargs={'myslug': 'value'}</b>))

对于重定向,您可以使用:

return redirect('tasks:index'<b>, 'value'</b>)

或者:

return redirect('tasks:index'<b>, myslug='value'</b>)

关于Django HttpResponseRedirect 与重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64840329/

相关文章:

java - 如果 servlet 什么都不做,servlet 容器会做什么?

jquery - 具有验证和多表单处理的 Django Ajax 提交

python - Django : redirect still remains in the same page

asp.net - 文件名包含空格的 TransmitFile

.htaccess - htaccess - 防止热链接/网页抓取并将攻击者的网页重定向到警告页面

c - 运行程序的多个输入

python - 如何将模型字段传递给 JsonResponse 对象

python - get_absolute_url 和 url 模板标签

python - django-social-auth : custom response during pipeline execution

python - 以哈希形式将密码存储在 MySQL 数据库中 Django App