Django 和 urls.py:如何通过命名 url 进行 HttpResponseRedirect?

Posted

技术标签:

【中文标题】Django 和 urls.py:如何通过命名 url 进行 HttpResponseRedirect?【英文标题】:Django and urls.py: How do I HttpResponseRedirect via a named url? 【发布时间】:2010-11-15 13:54:58 【问题描述】:

我正在编写一个基于成员的 Web 应用程序,我需要能够在登录后重定向页面。我想在我的views.py文件中使用我的urls.py脚本中的命名url来登录应用程序,但我一生都无法弄清楚该怎么做。我有的是这样的:

def login(request): 
if request.session.has_key('user'):
    if request.session['user'] is not None:
        return HttpResponseRedirect('/path/to/page.html')

我想要完成的是:

def login(request): 
if request.session.has_key('user'):
    if request.session['user'] is not None:
        return HttpResponseRedirect url pageName

执行此操作时出现语法错误,有什么想法吗?

【问题讨论】:

【参考方案1】:

您需要使用reverse() utils 函数。

from django.urls import reverse
# or Django < 2.0 : from django.core.urlresolvers import reverse

def myview(request):
    return HttpResponseRedirect(reverse('arch-summary', args=[1945]))

args 满足您 url 正则表达式中的所有参数。您还可以通过传递字典来提供命名参数。

【讨论】:

太棒了,感谢您的帮助!我一定是在搜索 django 文档时都错了。 这几天是from django.urls import reverse @partofthething 我已更新答案以包含注释掉的导入【参考方案2】:

写 if 语句的更简洁的方式是if request.session.get('user')。 has_key 现在已弃用,并且 .get() 返回 None (默认情况下,可通过传递第二个参数来更改)。 因此,将其与 Soviut 的回复结合起来:

from django.core.urlresolvers import reverse

def login(request): 
    if request.session.get('user'):
         return HttpResponseRedirect(reverse('my-named-url'))

【讨论】:

【参考方案3】:
from django.core.urlresolvers import reverse
from django.shortcuts import redirect

def login(request):
    if request.session.get('user'):
        return redirect(reverse('name-of-url'))

另见https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls

【讨论】:

【参考方案4】:

来自Django 1.3 onwards(重定向方法隐式执行反向调用)的正确答案是:

from django.shortcuts import redirect

def login(request):
    if request.session.get('user'):
        return redirect('named_url')

【讨论】:

另外,如果您在项目中使用命名应用程序,则语法为 redirect('appName:urlName')

以上是关于Django 和 urls.py:如何通过命名 url 进行 HttpResponseRedirect?的主要内容,如果未能解决你的问题,请参考以下文章

你如何使用 Django URL 命名空间?

Django 忽略对 urls.py 的更新

django系列3.1--url的命名和反向解析

如何让 Django urls.py 识别 url 中的 # (hash)?

如何在我的 Django urls.py 中使用单个正则表达式捕获多个参数?

刷新 django 中的 urls.py 缓存