如何在Python中实现动态路由?
我正在尝试让网址的输入格式是(某种网址)/page/(我们想要的模板页码)。我在这方面遇到了一些问题,不太确定是什么原因。我的代码的第一部分如下:
from wsgiref.simple_server import make_server
from wsgiref.util import setup_testing_defaults
routing_table = {}
def route(url, func):
routing_table[url] = func
def find_path(url):
if url in routing_table:
return routing_table[url]
else:
return None
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()
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 testings of wsgi at http://%s:%s" % (ip, port))
myserver.serve_forever()
接下来的代码部分是我认为主要问题发生的地方,关于page(page_id):
import test
import re
def index():
return "This is the main page"
def hello():
return "Hi, how are you?"
def page(page_id):
return "This is page number: %d" % page_id
if __name__ == '__main__':
test.route("/", index)
test.route("/Hello", hello)
test.route('/page/<page_id>', page)
test.run("127.0.0.1", 8000)
我的想法是我们需要导入模板,并在模板内部定义逻辑。然而,当我尝试这样做时,我无法使用“from python import Template”来利用模板(myTemplates.tpl)。我觉得我的语法可能不对,但到目前为止,python.org没有给出任何建议。
1 个回答
1
在 find_path
这个函数里,你只是把给定的字符串和路由表上的某个网址进行比较。
if url in routing_table:
所以,实际上你能访问的页面就是字面上的 '/page/<page_id>'
这个网址。
你需要做的是解析这个网址,看看它是否符合你传入的格式,而不是简单地比较一个固定的字符串。这样理解对吧?
在这种情况下,你可能需要了解一下正则表达式:https://docs.python.org/2/library/re.html