【问题标题】:Django: what is the difference between redirect to a view function and redirect to a url (from urls.py file)Django:重定向到视图函数和重定向到 url 有什么区别(来自 urls.py 文件)
【发布时间】:2018-01-25 23:05:01
【问题描述】:

哪种做法更好/标准?

  return redirect('index')
  return redirect('/users/new')

index 是视图函数

/users/new 是来自 urls.py 的 urlpatterns

【问题讨论】:

    标签: django redirect view django-urls


    【解决方案1】:

    直接使用网址是discouraged by Django's documentation(我的粗体字):

    在处理 Django 项目时,一个常见的需求是获取最终形式的 URL,用于嵌入生成的内容(视图和资产 URL、显示给用户的 URL 等)或用于处理导航流在服务器端(重定向等)

    强烈希望避免对这些 URL 进行硬编码(这是一种费力、不可扩展且容易出错的策略)。同样危险的是设计特殊机制来生成与 URLconf 描述的设计平行的 URL,这可能导致生成的 URL 随着时间的推移变得陈旧。

    在其他情况下,您可能希望使用reverse(){% url %},或者将get_absolute_url() 方法添加到您的模型中。

    【讨论】:

    • 我仍然不清楚reverse() 的用法我直接使用了网址名称:redirect('url-name') 并且似乎工作正常。事实上,我认为它确实使代码更清晰。 url 名称是否仍然被认为是硬编码? reverse() 适合哪里?
    • 我还发现我可以像这样简单地调用另一个视图函数:`return another_view_function(request)`(用我的代码“创造性”)但我不确定这是否是合法的好习惯.
    • @theMobDog, reverse() 为您构建所需的 URL。你可以随心所欲地使用它。这可能是重定向,也可能不是。 reverse() 是一种抽象,让您可以考虑视图函数,而不是 URL。 redirect() 做了一些不同的事情:它返回一个 HttpResponseRedirect 对象。这不是字符串;这是可以从您的视图返回的内容,这将导致用户的浏览器通过HTTP 301 or 302加载另一个页面。
    • URL 名称是对 URL 模式的抽象,只要您仔细命名您的 URL,它们不应该经常更改。使用 URL 名称可能比直接使用模式更好。我不会推荐return another_view_function(request)。如果要重定向,请使用redirect()。这样你的意图就更清楚了,并且你正在利用 HTTP 的内置重定向。
    【解决方案2】:

    我认为您示例中的索引不是视图函数,而是 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"

    【讨论】:

      猜你喜欢
      • 2013-10-02
      • 2013-10-05
      • 2016-12-08
      • 1970-01-01
      • 2012-10-29
      • 2012-09-01
      • 2019-11-12
      • 2021-06-16
      • 1970-01-01
      相关资源
      最近更新 更多