Какова лучшая реализация REST при использовании торнадо RequestHandlers

Я хотел бы определить REST API с общим шаблоном:

mysite.com/OBJECT_ID/associations

Например:

  • mysite.com/USER_ID/vacations - управлять отпуском пользователей
  • mysite.com/USER_ID/music - управлять музыкой в ​​фонотеке пользователя
  • mysite.com/PLAYLIST_ID/music - управлять музыкой в ​​контексте данного плейлиста

Я использую торнадо на стороне сервера и ищу предложения о том, как определить RequestHandlers для этого API. Например, я хочу определить обработчик вроде: /([0-9,a-z,A-Z,-]+)/music",MusicHandler),, но я застрял на реализации MusicHandler, которому нужно знать, поддерживает ли объект, указанный в uri, музыку в первую очередь, т.е. как защититься от вызова вроде

mysite.com/LOCATION_ID/music

Где локации не имеют ассоциаций с музыкой.

Лучшее исправление для изменения API, чтобы включить тип, т.е.:

mysite.com/users/USER_ID/music or

mysite.com/playlists/PLAYLIST_ID/music

а затем отдельный обработчик для каждого:

/users/([0-9,a-z,A-Z,-]+)/music",UserMusicHandler),

/playlists/([0-9,a-z,A-Z,-]+)/music",PlaylistMusicHandler)

Это не кажется правильным, но я действительно не понимаю, как заставить это работать. Я уверен, что это простая проблема, я новичок в python и торнадо.


person eddie tromboni    schedule 06.04.2011    source источник


Ответы (2)


Прежде всего, чтобы защититься от mysite.com/LOCATION_ID/music, я бы создал различия между всеми вашими идентификаторами. Например, пусть LOCATION_ID будет строкой из 32 символов, а PLAYLIST_ID — 34 и т. д. Таким образом, вы сможете проверить длину строки сразу после вызова обработчика.


Кроме того, вы можете использовать группы регулярных выражений, чтобы перехватывать их прямо в URI, а затем определять разные обработчики для каждой из них. (Кроме того, ваш идентификатор, вероятно, должен быть после всего статического текста в URI, просто для хорошего соглашения). Например, если ваш PLAYLIST_ID — это UUID, а ваш LOCATION_ID — это строка:

(r"/music/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", PlaylistMusicHandler), #playlistID
(r"/music/([A-Za-z0-9]+)", LocationHandler), #locationID
person Hunter Lang    schedule 18.04.2011

if not self.db.get("SELECT 1 FROM objects WHERE music_id = %s", object_id):
    raise HTTPError(404, "Music object %s not found" % name)

FWIW схема mysite.com/music/MUSIC_ID имеет для меня больше смысла.

person Cole Maclean    schedule 26.05.2011