我想知道是否可以(特别是在 Django 中)拥有一个仅用于具有副作用的操作的 URL,该 URL 仅用于通过 POST 访问,并且基本上对用户不可见。比方说,为了使这个具体化,我在我的网站上有一个小的消息传递系统,用户应该能够从他们的收件箱做很多事情,比如:
- 删除消息
- 将消息标记为已读
- 将邮件报告为垃圾邮件
所有这些都会导致页面刷新,但会返回到同一页面。我想知道如何围绕这个设计我的 URL 和 View 。我看到(至少)两个选项,但我不知道哪个更符合习惯。
选项 1)
每个操作都有一个单独的 URL 和 View 。因此,/inbox/delete-message/映射到 views.delete_message,等等。在每个 View 的末尾,它都会重定向回/inbox/。
我喜欢使用此选项将事物清楚地分开的方式。如果用户以某种方式发现自己向/inbox/delete-message/发送了 GET 请求,这会出现一种奇怪的情况(我会抛出一个错误页面吗?静静地重定向它们?)。
选项 2)
对每个操作使用相同的 URL 和 View ,并有一个标识操作的 POST 参数。所以我会有一个相当长的收件箱 View ,其中会有一堆 if 语句来测试是 request.POST['action'] == 'delete' 还是 request.POST['delete'] == 'true' 或其他.
我觉得这个选项不太干净,但我也觉得它更常见。
Djangonauts 更喜欢哪个?或者还有比上述任何一个更好的选择吗?
最佳答案
修改后的选项 #1 是最好的方法。考虑一下:假设我们不是在谈论网络应用程序,而是只是设计一个收件箱类。您更喜欢哪个,多种方法(delete_message()
、mark_as_spam()
等),还是一个大方法(do_stuff(action)
)?当然,您会使用单独的方法。
每个 Action 都有一个单独的 URL,每个都有一个单独的 View ,这是更可取的。如果您不喜欢最后的重定向,请不要使用它。相反,有一个返回 HttpResponse 的 render_inbox(request)
方法,并在每个 View 的末尾调用该方法。当然,在 POST 之后重定向是防止双重操作的好方法,并且始终为用户留下一致的 URL。
更好的方法可能是使用 Ajax 来隐藏操作,但这涉及更多。
关于python - URL 和副作用 (Django),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3126969/