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