4 from tornado.web import RequestHandler, HTTPError
5 from tornado_swagger_ui.tornado_swagger import swagger
7 DEFAULT_REPRESENTATION = "application/json"
16 class PropertySubclass:
17 def __init__(self, sub_property=None):
18 self.sub_property = sub_property
25 This is an example of a model class that has parameters in its constructor
26 and the fields in the swagger spec are derived from the parameters to __init__.
28 In this case we would have property1, name as required parameters and property3 as optional parameter.
29 @property property3: Item description
30 @ptype property3: L{PropertySubclass}
31 @ptype property4: C{list} of L{PropertySubclass}
33 def __init__(self, property1, property2=None, property3=None, property4=None):
34 self.property1 = property1
35 self.property2 = property2
36 self.property3 = property3
37 self.property4 = property4
39 def format_http(self):
41 "property1": self.property1,
42 "property2": self.property2,
43 "property3": self.property3,
44 "property4": self.property4,
48 def item_from_dict(item_dict):
54 t.property1 = item_dict.get('property1')
55 t.property2 = item_dict.get('property2')
56 t.property3 = item_dict.get('property3')
57 t.property4 = item_dict.get('property4')
62 def test_classmethod(cls):
69 class GenericApiHandler(RequestHandler):
71 The purpose of this class is to take benefit of inheritance and prepare
72 a set of common functions for
77 """ Prepares the database for the entire class """
81 if not (self.request.method == "GET" or self.request.method == "DELETE"):
82 if self.request.headers.get("Content-Type") is not None:
83 if self.request.headers["Content-Type"].startswith(DEFAULT_REPRESENTATION):
85 self.json_args = json.loads(self.request.body)
86 except (ValueError, KeyError, TypeError) as error:
87 raise HTTPError(HTTP_BAD_REQUEST,
88 "Bad Json format [{}]".
93 def finish_request(self, json_object):
94 self.write(json.dumps(json_object))
95 self.set_header("Content-Type", DEFAULT_REPRESENTATION)
99 class ItemNoParamHandler(GenericApiHandler):
100 @swagger.operation(nickname='create')
103 @param body: create a item.
106 @return 200: item is created.
107 @raise 400: invalid input
109 property1 = self.json_args.get('property1')
110 item = Item.item_from_dict(self.json_args)
111 items[property1] = item
112 Item.test_classmethod()
113 self.finish_request(item.format_http())
115 @swagger.operation(nickname='list')
121 for key, value in items.iteritems():
122 res.append(value.format_http())
123 self.finish_request(res)
127 I'm not visible in the swagger docs
129 self.finish_request("I'm invisible in the swagger docs")
132 class ItemHandler(GenericApiHandler):
133 @swagger.operation(nickname='get')
137 @description: get information of a item
141 This will be added to the Implementation Notes.It lets you put very long text in your api.
143 self.finish_request(items[arg].format_http())
145 @swagger.operation(nickname='delete')
146 def delete(self, arg):
148 @description: delete a item
150 delete a item in items
152 This will be added to the Implementation Notes.It lets you put very long text in your api.
155 self.finish_request("success")
158 class ItemOptionParamHandler(GenericApiHandler):
159 @swagger.operation(nickname='create')
160 def post(self, arg1, arg2=''):
162 @return 200: case is created
164 print("ProjectHandler.post: %s -- %s -- %s" % (arg1, arg2, self.request.full_url()))
165 fs = open("/home/swagger/tornado-rest-swagger/%s/%s" % (arg1, arg2), "wb")
166 fs.write(self.request.body)
167 self.write("success")
170 class ItemQueryHandler(GenericApiHandler):
171 @swagger.operation(nickname='query')
175 @type property1: L{string}
177 @required property1: False
180 @type property2: L{string}
182 @required property2: True
184 @notes: GET /item?property1=1&property2=1
186 property1 = self.get_query_argument("property1", None)
187 property2 = self.get_query_argument("property2", None)
190 if property1 is None:
191 for key, value in items.iteritems():
192 if property2 is None:
193 res.append(value.format_http())
194 elif value.property2 == property2:
195 res.append(value.format_http())
196 elif items.has_key(property1):
197 if items.get(property1).property2 == property2:
198 res.append(items.get(property1).format_http())
200 self.finish_request(res)
204 return swagger.Application([
205 (r"/item", ItemQueryHandler),
206 (r"/items", ItemNoParamHandler),
207 (r"/items/([^/]+)", ItemHandler),
208 (r"/items/([^/]+)/cases/([^/]+)", ItemOptionParamHandler),
212 if __name__ == "__main__":
215 tornado.ioloop.IOLoop.current().start()