[英]How do I correctly utilize python lists in dynamic routing for a web framework?
我在第9行收到key = re.findall(etc)[0]的“列表索引超出范围错误”,但我不确定为什么。 我正在尝试做的是...对于路由,如果给出的路由为“ / user //”,则可以运行正则表达式re.findall(r“ <([[a-zA-Z _] [a- zA-Z0-9 _] *)>“,url),它将返回列表['',''],因此我可以将其放在路由表{'/ user'中:['name','page_num']}并且如果在浏览器中输入url'/ user / Kyle / 237',我可以看到/ user在路由表中,并且可以提供2件事,因为在/ user请求的url之后有2件事' Kyle'和'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)
问题是,此正则表达式“(。+?)/ <[a-zA-Z _] [a-zA-Z0-9 _] *>”仅查找具有以下格式的网址:
/路线/
如果您有这个:
/路线
将失败。 因此,在两个第一个中,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(/)内的所有参数替换为空字符串。 最后,您只有钥匙(/路线)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.