Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中实现动态路由?_Python_Dynamic_Routing_Wsgi - Fatal编程技术网

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

如何在python中实现动态路由?,python,dynamic,routing,wsgi,Python,Dynamic,Routing,Wsgi,我正在尝试将url输入为(某种url)/页面/(我们想要的模板的任何页码)。我在这方面遇到了麻烦,不知道问题出在哪里。我的代码的第一部分如下所示: 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输入为(某种url)/页面/(我们想要的模板的任何页码)。我在这方面遇到了麻烦,不知道问题出在哪里。我的代码的第一部分如下所示:

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()
从wsgiref.simple\u服务器导入make\u服务器
从wsgiref.util导入设置\u测试\u默认值
路由_表={}
def路由(url,func):
路由表[url]=func
def查找路径(url):
如果路由表中的url为:
返回路由表[url]
其他:
一无所获
def应用程序(环境、启动和响应):
设置\测试\默认值(环境)
handler=find_path(环境['path_INFO'])
如果处理程序为“无”:
状态='404未找到'
body=“未找到页面”
其他:
状态='200正常'
body=handler()
headers=[('Content-type','text/html:charset=utf-8')]
启动\u响应(状态、标题)
返回[正文编码(“utf-8”)]
def运行(ip,端口):
myserver=make_服务器(ip、端口、应用程序)
打印(“在http://%s:%s%%(ip,端口)为wsgi的测试提供服务”)
myserver.serve_ever()
代码的下一部分是我认为主要问题发生在第页(第页id):

导入测试
进口稀土
def index():
return“这是主页”
def hello():
返回“嗨,你好吗?”
def页面(页面id):
return“这是页码:%d”%page\u id
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
测试路线(“/”,索引)
test.route(“/Hello”,Hello)
test.route(“/page/”,第页)
测试运行(“127.0.0.1”,8000)

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

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

if url in routing_table:
因此,对于
'/page/'
路径,您实际上可以到达的唯一页面是文本
'/page/'

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


在这种情况下,您可能需要研究正则表达式:

为什么您要自己尝试这样做?有数百个Python微框架为您负责路由:Flask、webapp2、Valk等@DanielRoseman也许这是一个学习练习。我会看一下这些微框架的代码来回答这个问题。这是一个创建我们自己的web框架的项目。我们不是在寻找一个明目张胆的答案,而只是朝着正确的方向轻推。我觉得我们一直在尝试导入模板。我觉得答案是一行导入语句,但可能是错误的。我将深入研究瓶子.py代码,看看他们都做了些什么。@kcmallard最后你找到了一个好方法吗?我可能做得非常非常错误。。。。def find_path(url):如果路由_表中的url&url==[0-9]:返回路由_表[url+“”]否则:返回无
&
是位运算符。您需要的是模块中定义的函数。本文介绍了regex。
if url in routing_table: