首先考虑,成立了处理程序,在一个宁静的风格URI算一个例子。我们使用正则表达式的2块找一个ID和一个潜在的请求格式(即HTML,XML,JSON等)现在
class TaskServer(tornado.web.Application):
def __init__(self, newHandlers = [], debug = None):
request_format = "(\.[a-zA-Z]+$)?"
baseHandlers = [
(r"/jobs" + request_format, JobsHandler),
(r"/jobs/", JobsHandler),
(r"/jobs/new" + request_format, NewJobsHandler),
(r"/jobs/([0-9]+)/edit" + request_format, EditJobsHandler)
]
for handler in newHandlers:
baseHandlers.append(handler)
tornado.web.Application.__init__(self, baseHandlers, debug = debug)
,在处理程序定义一个可重复使用的功能parseRestArgs(我把我的一个BaseHandler但粘贴它在这里为了便于理解/节省空间)将ID和请求格式分开。既然你应该以特定的顺序期待id,我会把它们放在一个列表中。
get函数可以抽象以上,但它显示出分裂的逻辑放到不同的请求格式的基本思想......
class JobsHandler(BaseHandler):
def parseRestArgs(self, args):
idList = []
extension = None
if len(args) and not args[0] is None:
for arg in range(len(args)):
match = re.match("[0-9]+", args[arg])
if match:
slave_id = int(match.groups()[0])
match = re.match("(\.[a-zA-Z]+$)", args[-1])
if match:
extension = match.groups()[0][1:]
return idList, extension
def get(self, *args):
### Read
job_id, extension = self.parseRestArgs(args)
if len(job_id):
if extension == None or "html":
#self.render(html) # Show with some ID voodoo
pass
elif extension == 'json':
#self.render(json) # Show with some ID voodoo
pass
else:
raise tornado.web.HTTPError(404) #We don't do that sort of thing here...
else:
if extension == None or "html":
pass
# self.render(html) # Index- No ID given, show an index
elif extension == "json":
pass
# self.render(json) # Index- No ID given, show an index
else:
raise tornado.web.HTTPError(404) #We don't do that sort of thing here...
编辑后以相同的,但我真的打算一个面向用户的像[rails](http://api.rubyonrails.org/classes/Mime/Type.html)中所见的RESTful api的实现 – odgrim