4

我正在windows上写一个简单的python web-server ..

它可以工作,但现在我想运行动态脚本(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

4 回答 4

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()
于 2011-03-19T22:28:53.467 回答
4

你的第一个 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,请在命令 shell 中输入:

$ 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 创建了你的第一个网站!

服务器.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行告诉命令 shell 使用 Python 解释器执行文件中的代码。

服务器将您在浏览器中输入的 URL 理解为文件的路径 - 在本例中是cgi-bin文件夹下的 CGI 脚本my_cgi_script.pyhttp://localhost:8000/cgi-bin/my_cgi_script.py

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

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

要创建一个包含 CGI 脚本的网页,请创建一个名为index.html的文件并将其放在server.py文件夹中- index.html的内容如下。

索引.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 页面中的表单动作。那将是一条完全有效的路径,您可能会学到很多东西。

有人向我推荐了一个使用名为 Django 的生产级 Web 服务器的好站点。据我所知,它有非常好的教程和其他资源来帮助您开始 Web 开发。

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

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

Django 女孩教程: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 支持模块的参考,cgihttps ://docs.python.org/3/library/cgi.html

包含此示例中使用的类的文档可在以下位置找到:https ://docs.python.org/2/library/internet.html

于 2020-04-11T08:14:51.737 回答
1

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

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

来自这里的回复

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

于 2011-03-19T06:56:37.560 回答
0

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

于 2016-10-10T03:36:37.917 回答