【问题标题】:What is the best REST implemenation when using tornado RequestHandlers使用 tornado RequestHandler 时最好的 REST 实现是什么
【发布时间】:2023-04-01 23:30:01
【问题描述】:

我想定义一个具有以下一般模式的 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 和龙卷风的新手。

【问题讨论】:

    标签: python rest tornado requesthandler


    【解决方案1】:

    首先,为了防范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
    

    【讨论】:

      【解决方案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 方案对我来说更有意义。

      【讨论】:

        猜你喜欢
        • 2016-04-21
        • 2010-09-13
        • 2019-09-04
        • 1970-01-01
        • 2019-10-04
        • 2012-04-06
        • 2021-05-12
        • 2017-05-03
        • 1970-01-01
        相关资源
        最近更新 更多