5

我想定义一个具有以下一般模式的 REST API:

mysite.com/OBJECT_ID/associations

例如:

  • mysite.com/USER_ID/vacations- 管理用户假期
  • mysite.com/USER_ID/music- 管理用户音乐库中的音乐
  • mysite.com/PLAYLIST_ID/music- 在给定播放列表的上下文中管理音乐

我在服务器端使用 tornado 并寻找有关如何为此 API 定义 RequestHandlers 的建议。例如,我想定义一个像这样的处理程序: /([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)

这似乎不对,但我真的不明白如何使这项工作。我确定这是一个简单的问题,我是 python 和龙卷风的新手。

4

2 回答 2

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计划对我来说更有意义。

于 2011-05-26T14:05:12.083 回答
2

首先,为了防止mysite.com/LOCATION_ID/music我会在您的所有身份之间产生差异。例如,让 LOCATION_ID 为 32 个字符的字符串,而 PLAYLIST_ID 为 34 等。这样您可以在调用处理程序时立即检查字符串长度。


或者,您可以使用正则表达式组在 URI 中直接捕获它,然后为每个组定义不同的处理程序。(此外,您的 ID 可能应该在 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
于 2011-04-18T18:17:23.480 回答