2009-09-13 38 views

回答

14
import os 

if os.environ['REQUEST_METHOD'] == 'GET': 
    # blah 
0

这不是直接回答你的问题。但是你的问题源于错误的做法。

不要编写Python CGI脚本。

编写一个mod_wsgi应用程序。更好的是,使用Python Web框架。有几十个。选择一个像Werkzeug

WSGI标准(在PEP 333中描述)使得在Web请求中查找东西变得更加容易。

mod_wsgi实现比CGI更快更安全。

Web框架也比编写自己的CGI脚本或mod_wsgi应用程序更简单。

+0

我会研究一下mod_wsgi,但这只是一个临时解决方案,因为我们很快就会转向dango。 – cfischer

0

为什么你需要区分GET和HEAD?

通常情况下,你不应该区分,应该像GET一样处理HEAD请求。这是因为HEAD请求是为了返回与GET完全相同的头文件。唯一的区别是不会有任何回应内容。仅仅因为没有响应内容,但并不意味着您不必再返回有效的Content-Length头或其他头,这些头依赖于响应内容。

在mod_wsgi中,各个人都指着你,在某些情况下,它实际上会故意将请求方法从HEAD更改为GET,以防止错误地对待HEAD的人以不同的方式处理。完成此操作的具体情况是Apache输出过滤器已注册的位置。在这种情况下完成它的原因是因为输出过滤器可能希望看到响应内容,并从中产生额外的响应标头。如果您决定不打算为HEAD请求生成任何响应内容,您将剥夺内容的输出过滤器,并且它们添加的标头可能不会同意从GET请求返回的内容。这最终的结果是你可以填充缓存和浏览器的操作。

同样可以适用于Apache后面的CGI脚本,因为在这种情况下输出过滤器仍然可以添加。对于CGI脚本来说,没有任何措施可以防止用户愚蠢,并为HEAD请求做不同的事情。

+0

一些有效的链接检查程序使用HEAD方法访问我网站上的资源。它们是无害的。 OTOH,一个gazillion机器人使用GET来访问我的网站。这就是为什么我需要分辨差异。 – cfischer

+0

如果您正在收到您不想要的请求,您应该尝试通过使用重写模块或允许检查标头的其他模块查看代理字符串来尝试在服务器上阻止它。为什么它仍然需要通过CGI脚本? –