Какова лучшая реализация REST при использовании торнадо RequestHandlers - PullRequest
5 голосов
/ 06 апреля 2011

Я хотел бы определить 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 для включения типа i.e.:

mysite.com/users/USER_ID/music или

mysite.com/playlists/PLAYLIST_ID/music

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 26 мая 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 схема имеет для меня больше смысла.

2 голосов
/ 18 апреля 2011

Прежде всего, для защиты от 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
...