我喜欢用Python的SimpleHTTPServer各类Web应用程序需要加载资源通过Ajax调用等地方发展
当我在网址中使用查询字符串,服务器将始终重定向到标有斜线相同的URL。
例如/folder/?id=1
重定向到/folder/?id=1/
使用HTTP 301响应。
我只是开始使用服务器python -m SimpleHTTPServer
。
任何想法我怎么能摆脱重定向行为? 这是Python的2.7.2。
我喜欢用Python的SimpleHTTPServer各类Web应用程序需要加载资源通过Ajax调用等地方发展
当我在网址中使用查询字符串,服务器将始终重定向到标有斜线相同的URL。
例如/folder/?id=1
重定向到/folder/?id=1/
使用HTTP 301响应。
我只是开始使用服务器python -m SimpleHTTPServer
。
任何想法我怎么能摆脱重定向行为? 这是Python的2.7.2。
要做到这一点,以确保查询参数保持他们应该正确的做法,是确保你做文件名的请求,而不是直接让的SimpleHTTPServer
重定向到您index.html
例如http://localhost:8000/?param1=1
确实重定向(301)和改变的URL http://localhost:8000/?param=1/
,其与查询参数弄乱。
然而http://localhost:8000/index.html?param1=1
使索引文件明确)加载正确。
因此,只要不让SimpleHTTPServer
做一个URL重定向解决了这个问题。
好的。 随着莫滕的帮助下,我想出了这一点,这似乎是我所需要的:简单地忽略查询字符串,如果他们在那里,服务于静态文件。
import SimpleHTTPServer
import SocketServer
PORT = 8000
class CustomHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def __init__(self, req, client_addr, server):
SimpleHTTPServer.SimpleHTTPRequestHandler.__init__(self, req, client_addr, server)
def do_GET(self):
# cut off a query string
if '?' in self.path:
self.path = self.path.split('?')[0]
SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
class MyTCPServer(SocketServer.ThreadingTCPServer):
allow_reuse_address = True
if __name__ == '__main__':
httpd = MyTCPServer(('localhost', PORT), CustomHandler)
httpd.allow_reuse_address = True
print "Serving at port", PORT
httpd.serve_forever()
我不知道如何生成重定向...我已经试过实现一个非常基本的SimpleHTTPServer,并使用查询字符串PARAMS时,我没有得到任何重定向。
只是这样做self.path.split("/")
并在处理请求之前处理的路径? 此代码,你想要做什么,我认为:
import SocketServer
import SimpleHTTPServer
import os
class CustomHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def folder(self):
fid = self.uri[-1].split("?id=")[-1].rstrip()
return "FOLDER ID: %s" % fid
def get_static_content(self):
# 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
def do_GET(self):
path = self.path
self.uri = path.split("/")[1:]
actions = {
"folder": self.folder,
}
resource = self.uri[0]
if not resource:
return self.get_static_content()
action = actions.get(resource)
if action:
print "action from looking up '%s' is:" % resource, action
return self.wfile.write(action())
SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
class MyTCPServer(SocketServer.ThreadingTCPServer):
allow_reuse_address = True
httpd = MyTCPServer(('localhost', 8080), CustomHandler)
httpd.allow_reuse_address = True
print "serving at port", 8080
httpd.serve_forever()
试试看:
HTTP GET /folder/?id=500x
- > "FOLDER ID: 500x"
编辑:
好了,如果你还没有使用过的SimpleHTTPServer-东西,你基本上实现基本请求处理程序,实现do_GET(),do_PUT(),do_POST()等。
我通常做的就是解析请求字符串(重新使用),模式匹配,看看我能找到一个请求处理程序,如果没有,处理请求为静态内容如果可能的请求。
你说你要提供静态内容,如果可能的话,那么你应该翻转这种模式匹配周围,并先看看请求的文件的存储相匹配,并且如果没有,那么对阵处理:)