网址和副作用(Django)

2024-05-17 12:51:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否可以(特别是在Django中)使用一个只用于有副作用的操作的URL,它只打算通过POST访问,并且用户基本上看不到它。比如说,为了使这一点具体化,我在我的网站上有一个小小的消息系统,用户可以从收件箱中做很多事情,比如:

  • 删除消息
  • 将邮件标记为已读
  • 将邮件报告为垃圾邮件

所有这些都会导致页面刷新,但会返回到同一页面。我想知道如何围绕这个设计我的网址和视图。我看到(至少)两种选择,我不知道哪个更符合习惯。在

选项1)

每个操作都有一个单独的URL和视图。所以,/inbox/delete message/映射到views.delete_消息,以此类推。在每个视图的末尾,它会重定向回/inbox/。在

我喜欢用这个选项把事情清楚地分开。如果一个用户发现一个奇怪的页面/发送一个邮件/我自己会抛出一个错误?无声地重新引导他们?)。在

选项2)

对每个操作使用相同的URL和视图,并具有标识该操作的POST参数。所以我会有一个相当长的收件箱视图,其中会有一堆if语句来测试请求.POST['action']==“删除”,或请求.POST['delete']=='true'或其他。在

这种选择对我来说不那么干净,但我也觉得它更常见。在

Djangonauts更喜欢哪个?或者还有比以上两种方法更好的选择吗?在


Tags: django用户视图消息url网站选项邮件
3条回答

我认为这两个选项都没有问题,但是从性能的角度来看,2可能更好。在发布操作之后,您可以在不重定向的情况下呈现收件箱,这样可以减少HTTP流量。在

如果您正在编写一个web2.0消息传递应用程序,那么您将使用AJAX调用,并且根本不会加载新页面。该过程将按如下方式进行:

  1. 用户单击[删除]以获取消息。此按钮绑定了一个javascript操作。此操作执行以下操作:

    i.更改用户界面以指示正在发生的事情(使消息变灰或设置沙漏)。在

    二。向/messages/inbox/1234/delete发送请求。(其中1234是指示哪个消息的某个标识符)

    iii.当来自服务器的响应返回时,应指示成功或失败。在当前UI中反映此状态。例如,如果成功,请刷新收件箱视图(或只删除已删除的项目)。

在服务器端,现在可以为每个需要的操作(即/delete、/flag等)创建一个URL处理程序。在

如果想使用更RESTful的方法,可以使用HTTP操作本身来指示要执行的操作。因此,不是在URL中包含delete,而是在操作中。因此,使用DELETE /messages/inbox/1234代替GET或POST。要设置已读标志,请使用SET /messages/inbox/1234?read=true。在

我不知道在Django中实现后一个建议有多简单,但总的来说,最好使用协议(在本例中是HTTP),而不是通过将操作编码为URL或参数来解决它。在

修改后的选项1是最好的方法。考虑一下这个:假设我们不是在讨论一个web应用程序,而是在设计一个inbox类。你更喜欢哪种方法,多个方法(delete_message()mark_as_spam(),等等),还是一个大方法(do_stuff(action))?当然你会用不同的方法。在

最好为每个操作提供一个单独的URL,每个操作都有一个单独的视图。如果你不喜欢最后的重定向,那就不要使用它。相反,使用一个返回HttpResponse的render_inbox(request)方法,并在每个视图的末尾调用该方法。当然,在发布后重定向是防止双重操作的一个好方法,并且总是给用户留下一个一致的URL。在

更好的方法是使用Ajax来隐藏操作,但这涉及更多。在

相关问题 更多 >