0

我有一个用 Django 构建的无聊的公司网站,它做无聊的公司事情。

该网站的一个组成部分是一项后台任务,用于将一些无聊的公司事物从一个地方传输到另一个地方。当你转到相应的 URL 时,可以触发后台工作人员的更改(即:启动、停止、检查状态)。

这里的问题是,当我在 Chrome 中工作时,有时键入类似 URL 的一部分会导致 Chrome 发送 GET 请求(或 Django 将其解释为 GET 请求的内容)以获取作为 Web 服务一部分的页面向后台工作人员发送指令。换句话说,不按键盘上的 Enter 键,worker 就可以启动或停止。

问题不在于Chrome 的设置。是的,我可以更改设置并为自己解决问题,但这不会阻止将来有人键入 URL 并触发相同的行为。

我真正想要的是一种将这些预取调用与常规用户发起的调用区分开来的方法,但这似乎是不可能的。不过,我可能是错的。除此之外,我想要一个告诉 Chrome 不要获取该页面的设置。不幸的是,有一个无聊的公司杂物清单,阻碍了一些简单的出路。

对于将 cookie 视为垃圾的计算机和浏览器上没有网站本身的链接以供点击的非技术人员,都必须可以进行 Web 服务调用。无法将 Web 服务移动到单独的子域。Web 服务不受 Django 或任何类似本地化身份验证的保护。我希望调用仍然像在浏览器的地址栏中键入 URL 一样简单,但这不是任何要求。

4

1 回答 1

4

chrome 所做的事情被认为是“有效的”,因为在 HTTP 协议中,假设 GET 请求不会引起副作用(除了返回响应之外发生的事情,例如触发后台工作人员)。它们应被视为仅用于检索数据。换句话说,GET 请求应该是 "Safe and Idempotent"。通过让 GET 请求做的不仅仅是检索数据(例如导致后台工作程序启动),您将违反 HTTP 协议。

更改您的站点以仅在 POST 请求上触发这些“更改”。Google chrome 不会像 GET 请求那样发出任意 POST 请求。您仍然可以对用户使用 GET 请求来检索 HTML 页面,该页面可能具有允许他们执行 POST 以激活各种服务的表单,但用户点击的资源 (URL) 会产生“副作用”只有当用户发布到资源时才应该产生这种副作用。

request.method在 Django 视图中,您可以使用属性检测请求是 GET、POST 还是其他方法:

if request.method == 'POST':
    do_something()
于 2013-10-08T16:24:31.677 回答