I've been playing around with Tornado, and I've written some code that doesn't seem very nice.
I'm writing an app to store recipes as an example. These are my handlers:
handlers = [     (r"/recipes/", RecipeHandler),     (r"/recipes", RecipeSearchHandler), #so query params can be used to search ]   This lead me to writing this:
class RecipeHandler(RequestHandler):           def get(self):         self.render('recipes/index.html')  class RecipeSearchHandler(RequestHandler):         def get(self):         try:             name = self.get_argument('name', True)             self.write(name)         # will do some searching         except AssertionError:             self.write("no params")             # will probably redirect to /recipes/   Is there a better way to approach these URLs without a try/except? I'd like /recipes and /recipes/ to show the same thing, whereas /recipes?name=something would do a search, and ideally be a different handler.
There is a better way for GET requests. There is a demo in the tornado source on github here
# url handler handlers = [(r"/entry/([^/]+)", EntryHandler),]  class EntryHandler(BaseHandler):     def get(self, slug):         entry = self.db.get("SELECT * FROM entries WHERE slug = %s", slug)         if not entry: raise tornado.web.HTTPError(404)         self.render("entry.html", entry=entry)   Any "text" that matches the regular expression will be passed to the EntryHandler's get method as slug argument. If the url doesn't match any handler, the user will receive a 404 error.
If you wanted to provide another fallback, you could make the parameter optional
(r"/entry/([^/]*)", EntryHandler),  class EntryHandler(BaseHandler):     def get(self, slug=None):         pass   Update:
+1 for the link. However does this URL pattern extend to include more parameters if I wanted to search like this... /recipes?ingredient=chicken&style=indian – colinjameswebb
Yes it does.
handlers = [      (r'/(\d{4})/(\d{2})/(\d{2})/([a-zA-Z\-0-9\.:,_]+)/?', DetailHandler) ]  class DetailHandler(BaseHandler):     def get(self, year, month, day, slug):         pass 
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With