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
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
Update:
Yes it does.