对于key = re.findall(etc)[0],我在第9行得到了“列表索引超出范围错误”,我不知道为什么。我正在尝试做的是......对于路由,如果我给出路径“/ user //”,那么我可以运行正则表达式re.findall(r“<([a-zA-Z _] [a -zA-Z0-9 _] *)>“,url”会返回列表['','']然后我可以放入我的路由表{'/ user':['name','page_num'如果在浏览器中输入了url'/ user / Kyle / 237',我可以看到/ user在路由表中,并且它可以提供2个以上的东西,因为在url请求之后/ user有2个事情'凯尔'和'237',所以在我的方法中,我会做出2个参数'name'和'page_num',我可以看到该名称是第一个在路线中所以name = Kyle和page_num是第二个所以page_num = 237和将这些传递给我将格式化并返回模板页面的方法。
框架:
from wsgiref.simple_server import make_server
from wsgiref.util import setup_testing_defaults
import re
routing_table = {}
def route(url, func):
params = re.findall(r"<([a-zA-Z_][0-9]*)>", url)
key = re.findall(r"(.+?)/<[a-zA-Z_][a-zA-Z0-9_]*>", url)[0]
routing_table[key] = [params, func]
def find_path(url):
if url in routing_table:
return routing_table[url]
else:
return None
# This function is called each time the web server receives a request.
def app(environ, start_response):
setup_testing_defaults(environ)
handler = find_path(environ['PATH_INFO'])
if handler is None:
status = '404 Not Found'
body = "<html><body><h1>Page Not Found</h1></body></html>"
else:
status = '200 OK'
body = handler() #<--- call handler
headers = [('Content-type', 'text/html; charset=utf-8')]
start_response(status, headers)
return [body.encode("utf-8")]
def run(ip, port):
myserver = make_server(ip, port, app)
print("Serving glasses of wsgi at http://%s:%s" % (ip, port))
myserver.serve_forever()
该应用:
import glass
def index():
return "This is the main page"
def hello():
return "hi, how are you?"
def page(page_id):
return "this is page %d" % page_id
def user(name, page_id):
return "Hello %d! This happens to be page %d" % name, page_id
if __name__ == '__main__':
glass.route("/", index)
glass.route("/hello", hello)
glass.route("/page/<page_id>", page)
glass.route("/user/<name>/<page_id>", user)
glass.run("127.0.0.1", 8000)
答案 0 :(得分:0)
问题是,这个正则表达式“(。+?)/&lt; [a-zA-Z _] [a-zA-Z0-9 _] *&gt;”只寻找具有以下格式的网址:
/路由/
如果你有这个:
/路由
会失败。因此,在两个第一,re.findall()将返回一个空列表。然后你无法从列表中获得索引[0]。
你能做的就是改变这个:
key = re.findall(r"(.+?)/<[a-zA-Z_][a-zA-Z0-9_]*>", url)[0]
为此:
key = url
for param in params:
key = key.replace("/{0}".format(param),'')
逻辑是:您将url(/)中的所有参数替换为空字符串。最后,您将只拥有您的密钥(/ route)。