[Django REST FrameWork][7]:模式和客户端库

模式是一种机器可读文档,用于描述可用的API端点,其URLS以及它们支持的操作。

模式可以是自动生成的文档的有用工具,也可以用于驱动可以与API进行交互的动态客户端库。

核心API

为了提供模式支持REST框架使用Core API

Core API是用于描述API的文档规范。它用于提供可用端点的内部表示格式以及API暴露的可能交互。它可以用于服务器端或客户端。

当使用服务器端时,Core API允许API支持各种模式或超媒体格式的渲染。

当客户端使用时,Core API允许动态驱动的客户端库可以与暴露支持的模式或超媒体格式的任何API进行交互。

添加模式

REST框架支持明确定义的模式视图或自动生成的模式。由于我们使用的是视图和路由器,我们可以简单地使用自动模式生成。

您需要安装coreapipython包才能包含API模式。

$ pip install coreapi

现在我们可以通过在URL配置中包含一个自动生成的模式视图来为API添加模式。

from rest_framework.schemas import get_schema_view

schema_view = get_schema_view(title='Pastebin API')

urlpatterns = [

    url(r'^schema/$', schema_view),

    ...

]

如果您在浏览器中访问API根端点,则现在应该可以看到corejson 表示形式作为选项可用。

我们还可以通过在Accept标题中指定所需的内容类型从命令行请求模式。

$ http http://127.0.0.1:8000/schema/ Accept:application/coreapi+json

HTTP/1.0 200 OK

Allow: GET, HEAD, OPTIONS

Content-Type: application/coreapi+json

{

    "_meta": {

        "title": "Pastebin API"

    },

    "_type": "document",

    ...

默认输出样式是使用Core JSON编码。

还支持其他架构格式,如Open API(以前称为Swagger)。

使用命令行客户端

现在我们的API暴露了架构端点,我们可以使用动态客户端库来与API进行交互。为了证明这一点,我们来使用Core API命令行客户端。

命令行客户端可用作coreapi-cli包:

$ pip install coreapi-cli

现在检查它在命令行上可用...

$ coreapi

Usage: coreapi [OPTIONS] COMMAND [ARGS]...

  Command line client for interacting with CoreAPI services.

  Visit http://www.coreapi.org for more information.

Options:

  --version  Display the package version number.

  --help     Show this message and exit.

Commands:

...

首先,我们将使用命令行客户机加载API模式。

$ coreapi get http://127.0.0.1:8000/schema/

    snippets: {

        highlight(id)

        list()

        read(id)

    }

    users: {

        list()

        read(id)

    }

我们还没有认证,所以现在我们只能看到只读端点,这与我们如何设置API的权限一致。

我们尝试列出现有的片段,使用命令行客户端:

$ coreapi action snippets list

[

    {

        "url": "http://127.0.0.1:8000/snippets/1/",

        "id": 1,

        "highlight": "http://127.0.0.1:8000/snippets/1/highlight/",

        "owner": "lucy",

        "title": "Example",

        "code": "print('hello, world!')",

        "linenos": true,

        "language": "python",

        "style": "friendly"

    },

    ...

一些API端点需要命名参数。例如,要获取特定代码段的高亮度HTML,我们需要提供一个id。

$ coreapi action snippets highlight --param id=1

  Example

  ...

认证我们的客户

如果我们想要创建,编辑和删除片段,我们需要作为有效用户进行身份验证。在这种情况下,我们只需使用基本的auth。

确保更换,并与您的实际用户名和密码下面。

$ coreapi credentials add 127.0.0.1 : --auth basic

Added credentials

127.0.0.1 "Basic <...>"

现在,如果我们再次获取架构,我们应该能够看到一整套可用的交互。

$ coreapi reload

Pastebin API "http://127.0.0.1:8000/schema/">

    snippets: {

        create(code, [title], [linenos], [language], [style])

        delete(id)

        highlight(id)

        list()

        partial_update(id, [title], [code], [linenos], [language], [style])

        read(id)

        update(id, code, [title], [linenos], [language], [style])

    }

    users: {

        list()

        read(id)

    }

我们现在可以与这些端点进行交互。例如,要创建新的代码段:

$ coreapi action snippets create --param title="Example" --param code="print('hello, world')"

{

    "url": "http://127.0.0.1:8000/snippets/7/",

    "id": 7,

    "highlight": "http://127.0.0.1:8000/snippets/7/highlight/",

    "owner": "lucy",

    "title": "Example",

    "code": "print('hello, world')",

    "linenos": false,

    "language": "python",

    "style": "friendly"

}

并删除片段:

$ coreapi action snippets delete --param id=7

除了命令行客户端,开发人员还可以使用客户端库与您的API进行交互。Python客户端库是第一个可用的,并且计划很快发布一个Javascript客户端库。

有关定制模式生成和使用Core API客户端库的更多详细信息,您需要参考完整的文档。

回顾我们的工作

我们拥有非常少量的代码,现在拥有一个完整的可以浏览网页的完整的pastebin Web API,它包含一个模式驱动的客户端库,并且具有身份验证,每个对象权限和多个渲染器格式。

我们已经走过了设计过程的每一步,并且看到了如何自定义任何我们可以逐渐工作的方式来简单地使用常规的Django视图。

您可以查看GitHub上的最终教程代码,或者尝试沙盒中的实例。

向上和向上

我们已经完成了我们的教程。如果您想要更多地参与到REST框架项目中,以下是您可以开始的几个地方:

通过审查和提交问题,提出请求,为GitHub做出贡献。

加入REST框架讨论组,并帮助构建社区。

跟随Twitter上的作者,并说你好。

现在去构建真棒的东西。

Django REST FrameWork中文文档目录:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容