从Python CGI检测HTTP请求类型(GET、HEAD等)

13 投票
3 回答
7252 浏览
提问于 2025-04-15 14:17

我该怎么查看我的Python CGI收到了什么HTTP请求呢?我需要对HEAD和GET这两种请求有不同的处理方式。

谢谢!

3 个回答

-1

这不是直接回答你问题的内容。不过,你的问题是因为做法不对而引起的。

不要写Python的CGI脚本。

应该写一个mod_wsgi应用程序。更好的选择是使用一个Python的网络框架。市面上有很多这样的框架。你可以选择像Werkzeug这样的。

WSGI标准(在PEP 333中有描述)让你在处理网络请求时,找到所需的东西变得简单多了。

mod_wsgi的实现比CGI更快、更安全。

使用网络框架也比自己写CGI脚本或mod_wsgi应用要简单得多。

0

为什么需要区分GET和HEAD请求?

通常情况下,你不需要特别区分这两种请求,应该把HEAD请求当作GET请求来处理。因为HEAD请求的目的就是返回和GET请求完全一样的头信息。唯一的区别是,HEAD请求不会有响应内容。不过,虽然没有响应内容,你仍然需要返回有效的Content-Length头信息,以及其他依赖于响应内容的头信息。

在mod_wsgi中,有些人提到的情况,实际上在某些情况下会故意把HEAD请求的方法改成GET。这是为了防止有人错误地把HEAD请求当作不同的请求来处理。具体来说,当注册了Apache的输出过滤器时,就会这样做。这样做的原因是,输出过滤器可能会期待看到响应内容,并根据这些内容生成额外的响应头。如果你决定不为HEAD请求生成任何响应内容,那么输出过滤器就得不到内容,这样它们添加的头信息可能就和GET请求返回的内容不一致。最终的结果就是可能会搞乱缓存和浏览器的操作。

同样的情况也适用于Apache后面的CGI脚本,因为在这种情况下也可以添加输出过滤器。不过对于CGI脚本来说,并没有什么机制来防止用户在处理HEAD请求时做出错误的操作。

17
import os

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

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答