对于Python http.server.HTTPServer,是否有RewriteRule/.htaccess的替代方法?

fj1*_*23x 8 python .htaccess mod-rewrite http

我的服务器模块(使用http.server.HTTPServer)可以使用类似的 RewriteRule方法将所有流量重定向到单个cgi脚本吗?我希望能够做到这里显示的另一个问题,但对于我的python服务器.

可以使用类似的东西来完成.htaccess,还是有另一种方式?

此外,即使对于简单的localhost开发服务器,这可以做到吗?
我正在通过例如http:// localhost:8000/html/index.html提供开发文件,我想在开发过程中隐藏URL中的/ html子文件夹.
怎么能实现呢?

Joh*_*fis 6

您可以使用自定义脚本初始化服务器并在其中定义路由,例如本文中建议的:

Python 2:

server.py

import os
import posixpath
import urllib
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler

# modify this to add additional routes
ROUTES = (  <- this is the "good stuff", make aliases for your paths
    # [url_prefix ,  directory_path]
    ['/media', '/var/www/media'],
    ['',       '/var/www/site']  # empty string for the 'default' match
) 

class RequestHandler(SimpleHTTPRequestHandler):

    def translate_path(self, path):
        """translate path given routes"""

        # set default root to cwd
        root = os.getcwd()

        # look up routes and set root directory accordingly
        for pattern, rootdir in ROUTES:
            if path.startswith(pattern):
                # found match!
                path = path[len(pattern):]  # consume path up to pattern len
                root = rootdir
                break

        # normalize path and prepend root directory
        path = path.split('?',1)[0]
        path = path.split('#',1)[0]
        path = posixpath.normpath(urllib.unquote(path))
        words = path.split('/')
        words = filter(None, words)

        path = root
        for word in words:
            drive, word = os.path.splitdrive(word)
            head, word = os.path.split(word)
            if word in (os.curdir, os.pardir):
                continue
            path = os.path.join(path, word)

        return path

if __name__ == '__main__':
    BaseHTTPServer.test(RequestHandler, BaseHTTPServer.HTTPServer)
Run Code Online (Sandbox Code Playgroud)

然后运行你的脚本:

python server.py
Run Code Online (Sandbox Code Playgroud)

Python 3:

在Python 3中BaseHTTPServer,SimpleHTTPServer模块已经合并到http.server模块中.所以你必须修改上面的脚本如下:

改变

import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
Run Code Online (Sandbox Code Playgroud)

import http.server
Run Code Online (Sandbox Code Playgroud)

(如果你这样做,那么应该将调用修改为http.server.SimpleHTTPRequest等)

要么

from http.server import BaseHTTPServer, SimpleHTTPServer, SimpleHTTPRequestHandler
Run Code Online (Sandbox Code Playgroud)

(使用此选项调用保持与原始脚本相同)

然后运行服务器脚本: python server.py


在你的情况下:

您应该修改ROUTES变量以满足您的需求.
例如,您要隐藏/html网址中的文件夹:

ROUTES = (
    ['', '/exact/path/to/folder/html'],
    ['/another_url_path', '/exact/path/to/another/folder'],
    ...
)
Run Code Online (Sandbox Code Playgroud)

现在,如果你点击:http://localhost:8000/index.html你将进入你的主页.


注意:

默认情况下,此脚本将为域url中执行的文件夹中的包含文件提供服务(例如,我server.py在Documents文件夹中,然后当我运行它时,http:// localhost:8000 url将服务我的Documents文件夹).
您可以通过路由更改此行为(请参阅代码中的"默认"匹配注释)或将脚本放在项目根文件夹中并从那里开始.