5

次の一般的なパターンで REST API を定義したいと思います。

mysite.com/OBJECT_ID/associations

例えば:

  • mysite.com/USER_ID/vacations- ユーザーの休暇を管理する
  • mysite.com/USER_ID/music- ユーザーの音楽ライブラリ内の音楽を管理する
  • mysite.com/PLAYLIST_ID/music- 指定されたプレイリストのコンテキストで音楽を管理する

サーバー側でトルネードを使用しており、この API の RequestHandlers を定義する方法についての提案を探しています。たとえば、次のようなハンドラを定義したいの /([0-9,a-z,A-Z,-]+)/music",MusicHandler),ですが、URI で指定されたオブジェクトが最初に音楽をサポートしているかどうかを知る必要がある MusicHandler の実装に行き詰まっています。

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とtornadoが初めてです。

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)

FWIWmysite.com/music/MUSIC_IDスキームは私にとってより理にかなっています。

于 2011-05-26T14:05:12.083 に答える
2

mysite.com/LOCATION_ID/musicまず第一に、私があなたのすべてのIDに違いを作ることを防ぐために。たとえば、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 に答える