python - URL 和副作用 (Django)

标签 python django url post django-views

我想知道是否可以(特别是在 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/

相关文章:

http - 漂亮的网址和尾部斜杠

python - 找出游戏板上两个正方形之间的最短距离

python - cv2.connectedComponents 在打印结果后再次调用时崩溃

python-3.x - get_queryset不影响djangorest框架ModelViewSet中的查询

c# - 文件路径是url吗?

javascript - 用 JavaScript 替换部分 URL

python - matplotlib 轮廓输入数组顺序

python - 循环以从给定列表中选择特定数字

Django 检查查询集响应是否为空

python - 断言错误: Cannot apply DjangoModelPermissionsOrAnonReadOnly on a view that does not set `.queryset` or have a `.get_queryset()` method