CGIHTTPRequestHandler在Python中运行PHP或Python脚本
我正在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 个回答
我觉得你想得有点复杂了。
#!/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()
你的第一个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.py:http://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