如何在python中实现动态路由?

时间:2014-03-31 19:49:34

标签: python dynamic routing wsgi

我试图让url输入为(某种url)/ 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_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)

我的想法是我们需要导入模板,并在模板中定义逻辑。但是,当我尝试这样做时,我无法从python导入模板&#34;并利用模板(myTemplates.tpl)。我相信我的语法可能不正确,但到目前为止,python.org没有显示任何建议。

1 个答案:

答案 0 :(得分:1)

find_path中,您只是将给定字符串与路由表中的一个URL进行比较

if url in routing_table:

因此,'/page/<page_id>'路线实际可以覆盖的唯一页面是文字'/page/<page_id>'

您需要做的是解析URL以查看它是否与您传入的格式匹配,而不是比较静态字符串。有道理吗?

在这种情况下,您可能需要查看正则表达式:https://docs.python.org/2/library/re.html