将两个网址路由到一个处理器
我正在尝试在Tornado上实现某种API,遇到了一个问题:是否可以将两个网址路由到同一个处理程序,并通过请求方法来区分。
class Handler():
def get(self):
#only for the first url
def post(self):
#only for the secornd url
handlers = [
(r"/url1",Handler), #only GET are allowed
(r"/url2",Handler), #only POST are allowed
]
也就是说,如果有人试图向第一个网址发送POST请求,他应该看到一个错误信息。
2 个回答
6
你可以参考@ee_vin的回答来解决这个问题。不过在这种情况下,为什么不创建两个处理程序呢?这样会简单很多:
class OneHandler():
def get(self):
#only for the first url
class TwoHandler():
def post(self):
#only for the second url
handlers = [
(r"/url1",OneHandler), #only GET are allowed
(r"/url2",TwoHandler), #only POST are allowed
]
任何访问第一个网址或者请求第二个网址的人都会收到一个“方法不支持”的错误提示。
3
实现你想做的事情的一种方法是使用正则表达式(regex)在你的网址中,并在你的方法处理器中检查这个属性。
下面是一些要映射的网址示例
url_patterns = [
# here we want to map url1 url2 and url
(r"/url([1|2])/", OneAndTwoHandler),
]
还有一个对应的处理器示例
class OneAndTwoHandler(CustomRequestHandler):
def get(self, my_param, *args, **kwargs):
if my_param == '2':
raise HTTPError(405)
# code for only the first url here...
def post(self, entry, *args, **kwargs):
if my_param == '1':
raise HTTPError(405)
# code for only the first url here...
我会把'my_param'的选项映射到一个字典里,这样可以让事情更清晰,也避免我在需要更改这些值或者想添加新网址时,必须深入到处理器里去。
my_dict_urls = {
'get': (1,2,3,4),
'post': (3,5)
}
if int(my_param) not in my_dict_urls.get('get'):
# ...