我正在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文件夹中,我会得到页面,但代码不会被解释
我要做什么?感谢
答案 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)
对于制作第一台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