如何在Web框架的动态路由中正确使用python列表?

时间:2014-04-18 23:56:30

标签: python list dynamic frameworks routing

对于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)

1 个答案:

答案 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)。