Какова лучшая реализация 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 или же

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 ответа

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

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