【发布时间】:2018-01-25 23:05:01
【问题描述】:
哪种做法更好/标准?
return redirect('index')
return redirect('/users/new')
index 是视图函数
/users/new 是来自 urls.py 的 urlpatterns
【问题讨论】:
标签: django redirect view django-urls
哪种做法更好/标准?
return redirect('index')
return redirect('/users/new')
index 是视图函数
/users/new 是来自 urls.py 的 urlpatterns
【问题讨论】:
标签: django redirect view django-urls
直接使用网址是discouraged by Django's documentation(我的粗体字):
在处理 Django 项目时,一个常见的需求是获取最终形式的 URL,用于嵌入生成的内容(视图和资产 URL、显示给用户的 URL 等)或用于处理导航流在服务器端(重定向等)
强烈希望避免对这些 URL 进行硬编码(这是一种费力、不可扩展且容易出错的策略)。同样危险的是设计特殊机制来生成与 URLconf 描述的设计平行的 URL,这可能导致生成的 URL 随着时间的推移变得陈旧。
在其他情况下,您可能希望使用reverse() 或{% url %},或者将get_absolute_url() 方法添加到您的模型中。
【讨论】:
reverse() 的用法我直接使用了网址名称:redirect('url-name') 并且似乎工作正常。事实上,我认为它确实使代码更清晰。 url 名称是否仍然被认为是硬编码? reverse() 适合哪里?
reverse() 为您构建所需的 URL。你可以随心所欲地使用它。这可能是重定向,也可能不是。 reverse() 是一种抽象,让您可以考虑视图函数,而不是 URL。 redirect() 做了一些不同的事情:它返回一个 HttpResponseRedirect 对象。这不是字符串;这是可以从您的视图返回的内容,这将导致用户的浏览器通过HTTP 301 or 302加载另一个页面。
return another_view_function(request)。如果要重定向,请使用redirect()。这样你的意图就更清楚了,并且你正在利用 HTTP 的内置重定向。
我认为您示例中的索引不是视图函数,而是 url-name
url(r'^some/url/to/index', views.index_2, name='index')
查看函数可以有index_2 名称和任何url 路径,但你使用“索引”来重定向,例如return redirect(reverse('index'))。
如您所见,redirect 只接受一个url路径,然后reverse函数接收一个url名称并返回一个url路径,在示例中reverse将返回"some/url/to/index"
【讨论】: