CGIHTTPRequestHandler在python中运行php或python脚本

时间:2011-03-17 00:58:38

标签: python cgi webserver cgihttprequesthandler

我正在Windows上编写一个简单的python web服务器..

它有效,但现在我想运行动态脚本(php或py)而不仅仅是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 个答案:

答案 0 :(得分: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()

答案 1 :(得分:1)

你让php文件可执行吗? chmod + x spam.php(对于Linux,我不知道如何在Windows上使文件可执行)

您还需要在PC上安装PHP解释器

来自回复HERE

的来源

您还应该考虑使用THIS作为间接替代方案。

答案 2 :(得分:1)

您的第一个Python CGI网站

对于制作第一台Web服务器的人来说,我将这个简单的示例与所有必要的步骤放在一起,以使其正常运行。有两个文件需要创建。第一个 server.py 是运行Web服务器的脚本。第二个是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 上设置权限以使其可执行-否则Web服务器无法运行它来生成网页输出。如果您使用的是Linux或MacOS,请在命令外壳中输入:

$ chmod +x cgi-bin/my_cgi_script.py

在Windows上,使用文件浏览器找到该文件,然后右键单击该文件,并确保其权限允许执行。

打开命令外壳,然后cd进入 simple_server 文件夹并执行 server.py 脚本:

$ cd simple_server
$ python server.py

它应该静默运行,到目前为止没有任何输出。然后在您喜欢的浏览器的新标签中,浏览到以下URL:

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

“你好,世界!”应该会在浏览器中显示为带有大量空白的网页(如果您没有立即看到,请在左上角查找)。在那里,您已经完成了!您已经使用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 已设置并正在运行Web服务器。它配置为使用CGIHTTPRequestHandler运行脚本。该请求处理程序将运行 cgi-bin 文件夹中的文件作为脚本。它使用命令外壳执行此操作。

my_cgi_script.py 的顶部,#!/usr/bin/env python行告诉命令外壳程序使用Python解释器执行文件中的代码。

您在浏览器中输入的URL被服务器理解为文件的路径-在这种情况下,CGI脚本 my_cgi_script.py cgi-bin 下em>文件夹:http://localhost:8000/cgi-bin/my_cgi_script.py

如果查看服务器运行所在的命令外壳,则会看到详细说明处理该Web流量的消息。每次访问此服务器进程时,它将输出更多消息-继续尝试在浏览器中刷新并观看它。

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

要创建包含CGI脚本的网页,请创建一个名为 index.html 的文件,并将其放置在 server.py 文件夹中-< em> 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!”。在“我的第一段”下面。 index.html 是一个特殊的文件名,Web服务器用作其URL的默认页面。现在,您已经具备了创建出色网站的所有基础知识!

展望未来,对于学习或认真开发最好的Web开发框架应该有什么样的意见。从此示例中,您应该了解非常基本的配置,设置以及浏览器/服务器交互。

那么,现在的问题是从这里去哪里?您可以继续追求上述模型,并学习如何使用Python CGI脚本将更多功能添加到基本站点中,并将其绑定为HTML页面中的动作。那将是一条完全有效的路径,您可能会学到很多东西。

有人向我推荐了一个很好的网站,该网站使用了生产质量良好的Web服务器Django。据我收集,它具有非常好的教程和其他资源,可帮助您开始进行Web开发。

该站点是Django Girls Tutorial。不要被站点的名称所困扰,任何人都可以从该教程中受益,并且该教程很好地介绍了使用Django进行Web开发所需的工具和技术。

Django Girls是一个活跃的女性开发人员社区,它在世界各地举办活动,并将其与可以帮助她们进步的其他人联系起来。

Django Girls教程: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

答案 3 :(得分:0)

问题在于CGIHTTPServer类。它没有设置CGI env变量。 这已在此修复:
https://github.com/gabrielgrant/tonto/blob/master/tonto.py