CGIHTTPRequestHandler在Python中运行PHP或Python脚本

5 投票
4 回答
11874 浏览
提问于 2025-04-16 13:52

我正在Windows上写一个简单的Python网页服务器。

它可以正常工作,但现在我想运行动态脚本(比如PHP或Python),而不仅仅是HTML页面。

这是我的代码:

from BaseHTTPServer import HTTPServer
from CGIHTTPServer import CGIHTTPRequestHandler

class RequestsHandler(CGIHTTPRequestHandler):
    cgi_directories = ["/www"] #to run all scripts in '/www' folder
    def do_GET(self):
        try:
            f = open(curdir + sep + '/www' + self.path)
            self.send_response(200)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
            self.wfile.write(f.read())
            f.close()
        except IOError:
            self.send_error(404, "Page '%s' not found" % self.path)

def main():
    try:
        server = HTTPServer(('', 80), RequestsHandler)
        server.serve_forever()
    except KeyboardInterrupt:
        server.socket.close()

if __name__ == '__main__':
    main()

如果我把PHP代码放在www文件夹里,我能看到页面,但代码却没有被执行。

我该怎么做呢?谢谢!

4 个回答

1

你有没有把php文件设置为可执行的呢?可以用这个命令:chmod +x spam.php(这个是针对Linux系统的,我不太清楚在Windows上怎么设置文件可执行)。

你还需要在你的电脑上安装PHP解释器。

这个内容来源于一个回复,详细信息可以在这里找到。

你也可以考虑使用这个作为一种间接的替代方案。

4

我觉得你想得有点复杂了。

#!/usr/bin/env python
import CGIHTTPServer

def main():

    server_address = ('', 8000)
    handler = CGIHTTPServer.CGIHTTPRequestHandler
    handler.cgi_directories = ['/cgi']
    server = CGIHTTPServer.BaseHTTPServer.HTTPServer(server_address, handler)
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        server.socket.close()

if __name__ == '__main__':
    main()
6

你的第一个Python CGI网站

如果你是第一次搭建网页服务器,我整理了一个简单的例子,包含了所有必要的步骤来让它运行。需要创建两个文件。第一个是 server.py,这是运行网页服务器的脚本。第二个是一个Python CGI脚本,服务器会运行它并把输出发送到浏览器,显示成一个“网页”。

首先,在你的主目录或你喜欢放项目的地方,创建一个名为 simple_server 的项目文件夹。

在这个文件夹里,创建一个名为 cgi-bin 的子文件夹。然后把第一个脚本复制到一个文件中,命名为 server.py,放在 simple_server 文件夹里。接着创建一个文件,命名为 my_cgi_script.py,并把它放在 cgi-bin 文件夹里。这些文件的内容在下面的教程中有。

文件夹结构应该像这样:

|
-- [simple_server]
      |
      -- server.py
      |
      -- [cgi-bin]
            |
            -- my_cgi_script.py

你需要设置 my_cgi_script.py 的权限,使其可以执行——否则网页服务器无法运行它来生成网页输出。如果你使用的是Linux或MacOS,在命令行中输入:

$ chmod +x cgi-bin/my_cgi_script.py

在Windows上,找到这个文件,右键点击,确保它的权限允许执行。

打开命令行,进入 simple_server 文件夹,执行 server.py 脚本:

$ cd simple_server
$ python server.py

此时应该没有任何输出,默默地运行。然后在你喜欢的浏览器中新开一个标签,访问这个网址:

http://localhost:8000/cgi-bin/my_cgi_script.py

浏览器中应该会显示“hello world!”并且有很多空白作为网页(如果你没有立即看到,可以在左上角找找)。太棒了!你用Python CGI做出了你的第一个网站!

server.py

from http.server import HTTPServer, CGIHTTPRequestHandler

if __name__ == '__main__':
    try:
        CGIHTTPRequestHandler.cgi_directories = ['/cgi-bin']

        httpd = HTTPServer(('', 8000),             # localhost:8000
                           CGIHTTPRequestHandler)  # CGI support.

        print(f"Running server. Use [ctrl]-c to terminate.")

        httpd.serve_forever()

    except KeyboardInterrupt:
        print(f"\nReceived keyboard interrupt. Shutting down server.")
        httpd.socket.close()

cgi-bin/my_cgi_script.py

#!/usr/bin/env python
# The line above ^ is important. Don't leave it out. It should be at the
# top of the file.

import cgi, cgitb # Not used, but will be needed later.

print("Content-type: text/html\n\n")
print("hello world!")

如果你成功运行了,你可能会想“刚刚发生了什么?” server.py 设置并运行了一个网页服务器。它配置为使用 CGIHTTPRequestHandler 来运行脚本。这个请求处理器会把 cgi-bin 文件夹里的文件当作脚本来运行。它是通过命令行来完成这个的。

my_cgi_script.py 的顶部,#!/usr/bin/env python 这一行告诉命令行用Python解释器来执行这个文件里的代码。

你在浏览器中输入的URL,服务器会把它理解为一个文件的路径——在这个例子中是 cgi-bin 文件夹下的CGI脚本 my_cgi_script.pyhttp://localhost:8000/cgi-bin/my_cgi_script.py

如果你查看运行服务器的命令行,可以看到处理的网页流量的详细信息。每次你访问这个服务器进程,它都会输出更多信息——试着在浏览器中刷新一下,看看会发生什么。

现在你可以修改 my_cgi_script.py 来输出更多文本,或者让它输出HTML标签,生成一个更有趣的网页。

要创建一个包含CGI脚本的网页,创建一个名为 index.html 的文件,并把它放在与 server.py 同一个文件夹里——index.html 的内容在下面。

index.html

<!DOCTYPE html>
<html>
  <body>

    <h1>My First Heading</h1>
    <p>My first paragraph.</p>

    <!-- Simple example to include text from the CGI script in this web page. -->

    <object type="text/html" data="/cgi-bin/my_cgi_script.py"></object>

  </body>
</html>

现在文件夹结构应该像这样:

|
-- [simple_server]
      |
      -- server.py
      |
      -- index.html
      |
      -- [cgi-bin]
            |
            -- my_cgi_script.py

完成这些后,如果你停止了服务器进程,重新启动它,然后尝试访问 http://localhost:8000,确认你能看到“hello world!”在“My first paragraph.”下面。index.html 是一个特殊的文件名,网页服务器会把它作为默认页面来处理它的URL。现在你已经掌握了创建一个伟大网站的基本知识!

接下来,有很多关于学习或认真开发时最好的网页开发框架的意见。从这个例子中,你应该能感受到非常基础的配置、设置和浏览器与服务器的互动。

那么,接下来该怎么做呢?你可以继续追求上述模型,学习如何在基本网站中使用Python CGI脚本添加更多功能,并将它们绑定到HTML页面中的表单操作。这是一个完全有效的路径,你可能会学到很多。

有人向我推荐了一个使用生产级网页服务器Django的好网站。根据我的了解,它有非常好的教程和其他资源,可以帮助你入门网页开发。

这个网站是Django Girls Tutorial。别被网站的名字吓到,任何人都能从这个教程中受益,它提供了一个非常好的入门介绍,帮助你掌握在Django中进行网页开发所需的工具和技术。

Django Girls是一个活跃的女性开发者社区,举办全球范围的活动,并与其他人连接,帮助她们的进步。

Django Girls Tutorial: https://tutorial.djangogirls.org/en/

更深入的Python CGI示例:https://www.tutorialspoint.com/python/python_cgi_programming.htm

学习HTML,这个网站有很好的教程:https://www.w3schools.com/html/default.asp

关于CGI支持模块 cgi 的参考资料:https://docs.python.org/3/library/cgi.html

包含本示例中使用的类的文档可以在这里找到:https://docs.python.org/2/library/internet.html

撰写回答