Python CGIHTTPServer为动态页面和静态页面设置文件类型

Python CGIHTTPServer为动态页面和静态页面设置文件类型,python,cgihttpserver,Python,Cgihttpserver,这个问题()详细说明了如何为Python CGIHTTPServer的cgi bin文件的位置设置路径。通过测试,您似乎无法在同一个文件夹中混合使用.py和.html文件:在cgi bin中,它可以处理.py文件,但要求提供一个静态html文件 127.0.0.1 - - [08/Jan/2017 10:51:22] "GET /dev.html HTTP/1.1" 200 - Traceback (most recent call last): File "/usr/lib/python

这个问题()详细说明了如何为Python CGIHTTPServer的cgi bin文件的位置设置路径。通过测试,您似乎无法在同一个文件夹中混合使用.py和.html文件:在cgi bin中,它可以处理.py文件,但要求提供一个静态html文件

127.0.0.1 - - [08/Jan/2017 10:51:22] "GET /dev.html HTTP/1.1" 200 -
Traceback (most recent call last):
   File "/usr/lib/python2.7/CGIHTTPServer.py", line 248, in run_cgi
      os.execve(scriptfile, args, env)
OSError: [Errno 8] Exec format error
127.0.0.1 - - [08/Jan/2017 10:51:22] CGI script exit status 0x7f00
这是我真正想要的行为,还是我遗漏了什么?稀疏且不透明的文档中说:“但是,如果类猜测CGI脚本是CGI脚本,它将运行CGI脚本,而不是将其作为文件提供。只使用基于目录的CGI-另一种常见的服务器配置是将特殊扩展名视为表示CGI脚本。”

如何“将特殊扩展视为表示CGI脚本”。我使用什么方法或设置,或者说什么神奇的话?或者这只是一个措词不当的提示,我就是做不到


我只在快速测试中使用它,虽然我可以重新构造以分离.py和.html文件,但我还有其他限制,这会使这成为一个痛苦的练习

您需要检测请求的文件类型(py/cgi或静态文件)。也许会有帮助。 当请求静态文件时,您可以调用另一个cgi脚本来交付静态文件。 顺便说一句,你应该使用wsgi而不是过时的cgi

我修改了我得到的一些旧代码(py2.7)——这非常难看,我从未使用过它——但是当你把一个静态文件“dev.html”放在“handler.cgi_目录”中时,它应该由static.py提供服务

server.py:

#!/usr/bin/python2
import BaseHTTPServer
import CGIHTTPServer
from mimetypes import MimeTypes
import urllib 

class handler(CGIHTTPServer.CGIHTTPRequestHandler):  
    def is_cgi(self):
        mime = MimeTypes()
        request = self.path.split('?')
        if len(request) == 2:
            path, args = request
        else:
            path, args = request, None

        if isinstance(path, list):
            path = path[0]

        url = urllib.pathname2url(path)
        mime_type = mime.guess_type(url)

        if 'python' in mime_type[0]:
            self.cgi_info = '', self.path[1:]
            return True
        else:
            self.cgi_info = '', '/static.py?path=%s' % path[1:]
            print self.cgi_info
            return True

server = BaseHTTPServer.HTTPServer
server_address = ("", 8000)
handler.cgi_directories = ["/somedir/..."]

httpd = server(server_address, handler)
httpd.serve_forever()
static.py:

#!/usr/bin/python2

import cgi
import urllib
from mimetypes import MimeTypes

form = cgi.FieldStorage()
mime = MimeTypes()

path = form.getvalue('path')

url = urllib.pathname2url(path)
mime_type = mime.guess_type(url)

print """Content-type: %s""" % mime
print 
print open(path, 'r').read()

您需要检测请求的文件类型(py/cgi或静态文件)。也许会有帮助。 当请求静态文件时,您可以调用另一个cgi脚本来交付静态文件。 顺便说一句,你应该使用wsgi而不是过时的cgi

我修改了我得到的一些旧代码(py2.7)——这非常难看,我从未使用过它——但是当你把一个静态文件“dev.html”放在“handler.cgi_目录”中时,它应该由static.py提供服务

server.py:

#!/usr/bin/python2
import BaseHTTPServer
import CGIHTTPServer
from mimetypes import MimeTypes
import urllib 

class handler(CGIHTTPServer.CGIHTTPRequestHandler):  
    def is_cgi(self):
        mime = MimeTypes()
        request = self.path.split('?')
        if len(request) == 2:
            path, args = request
        else:
            path, args = request, None

        if isinstance(path, list):
            path = path[0]

        url = urllib.pathname2url(path)
        mime_type = mime.guess_type(url)

        if 'python' in mime_type[0]:
            self.cgi_info = '', self.path[1:]
            return True
        else:
            self.cgi_info = '', '/static.py?path=%s' % path[1:]
            print self.cgi_info
            return True

server = BaseHTTPServer.HTTPServer
server_address = ("", 8000)
handler.cgi_directories = ["/somedir/..."]

httpd = server(server_address, handler)
httpd.serve_forever()
static.py:

#!/usr/bin/python2

import cgi
import urllib
from mimetypes import MimeTypes

form = cgi.FieldStorage()
mime = MimeTypes()

path = form.getvalue('path')

url = urllib.pathname2url(path)
mime_type = mime.guess_type(url)

print """Content-type: %s""" % mime
print 
print open(path, 'r').read()

我从
CGIHTTPServer.py
中获取了oryginal
is\u cgi()
,并添加了两个元素

  • CGIHTTPServer.
    CGIHTTPServer.\u url\u collapse\u path(self.path)
    在文件
    CGIHTTPServer.py之外使用它
  • 更重要的是:检查扩展

    if not tail.endswith('.html'):
    
    但这可以做得更好

我没用

    if tail.endswith('.py'):
因为如果您需要,服务器可能会用其他语言执行脚本-例如
Perl
PHP
Bash
,等等

代码:

导入BaseHTTPServer
导入CGIHTTPServer
类MyHandler(CGIHTTPServer.cgihtprequestHandler):
#来自oryginal CGIHTTPServer.py的代码
def是_cgi(自身):
#v添加了“CGIHTTPServer”`
折叠路径=CGIHTTPServer.\u url\u折叠路径(self.path)
dir_sep=折叠的路径。查找('/',1)
头部、尾部=折叠的路径[:dir\u sep],折叠的路径[dir\u sep+1:]
如果head位于self.cgi_目录中:

如果不是tail.endswith('.html'):#我从
CGIHTTPServer.py
中获取了oryginal
is\u cgi()
,并添加了两个元素

  • CGIHTTPServer.
    CGIHTTPServer.\u url\u collapse\u path(self.path)
    在文件
    CGIHTTPServer.py之外使用它
  • 更重要的是:检查扩展

    if not tail.endswith('.html'):
    
    但这可以做得更好

我没用

    if tail.endswith('.py'):
因为如果您需要,服务器可能会用其他语言执行脚本-例如
Perl
PHP
Bash
,等等

代码:

导入BaseHTTPServer
导入CGIHTTPServer
类MyHandler(CGIHTTPServer.cgihtprequestHandler):
#来自oryginal CGIHTTPServer.py的代码
def是_cgi(自身):
#v添加了“CGIHTTPServer”`
折叠路径=CGIHTTPServer.\u url\u折叠路径(self.path)
dir_sep=折叠的路径。查找('/',1)
头部、尾部=折叠的路径[:dir\u sep],折叠的路径[dir\u sep+1:]
如果head位于self.cgi_目录中:

如果不是tail.endswith('.html'):#您可以使用
import CGIHTTPServer;打印CGIHTTPServer._文件_
以查找源代码并查看其工作原理。但是请查看您的链接-它们覆盖的方法
是_cgi()
-也许您也必须这样做。您可以使用
导入CGIHTTPServer;打印CGIHTTPServer._文件_
以查找源代码并查看其工作原理。但是请查看您的链接-它们覆盖的方法
是\u cgi()
-也许您也必须这样做。回答很好,谢谢。只将firas的答案标记为正确,而不是这一个,因为这是一个非常简单的答案,谢谢。只将firas的答案标记为正确,而不是这一个,因为它更简单