Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Tornado URL query parameters

Tags:

python

tornado

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.

like image 410
colinjwebb Avatar asked May 23 '12 19:05

colinjwebb


1 Answers

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 
like image 195
mfussenegger Avatar answered Oct 01 '22 00:10

mfussenegger