创建一个新环境
|
|
创建一个 Model
|
|
创建一个序列化类(serializers.py)
|
|
用序列化(Serializers)工作
|
|
使用模型序列化ModelSerializers
|
|
用我们的序列化来写常规的Django视图
|
|
我们需要用线将这些视图连起来。 创建 snippets/urls.py 文件:
|
|
请求与响应
REST框架介绍了一个 请求(Request) 对象, 它扩展了常规的 HttpResquest ,并且提供更灵活的请求解析。
|
|
REST 框架也介绍了 Response 对象, 它是一类用未渲染内容和内容协商来决定正确的内容类型并把它返回给客户端的 模板响应
|
|
REST框架为每个状态码(status code)提供更明确的标识符, 例如在 状态(status) 模型中的 HTTP_400_BAD_REQUEST 。 用这些标识符代替纯数字的HTTP状态码是很好的注意。
装饰API视图
- @api_view 装饰器用在基于视图的方法上。
- APIView 类用在基于视图的类上。 这些装饰器提供一些功能
例如去报在你的视图中接收 Request 对象, 例如在你的 Response 对象中添加上下文,这样我们就能实现内容通信。 这里装饰器也提供了一些行为, 例如在合适的时候返回 405 Method Not Allowed 响应, 例如处理任何在访问错误输入的 request.data 时出现的 解析错误(ParseError) 异常。
结合在一起
|
|
我们不再明确打印我们的对指定内容类型的请求或响应。 request.data 能够处理 json 请求, 但是它也能处理其他格式。 相似地, 虽然我们可以在响应对象中带数据, 但允许REST框架渲染响应成正确的内容类型。
在我们的链接(URLs)后添加可选格式后缀
为了利用我们的响应内容不再是单一格式的事实, 我们应该为我们的API尾部添加格式后缀。 用格式后缀给我们明确参考指定格式的URL, 这意味着我们的API能够处理像 http://example.com/api/items/4/.json 一样的链接。 在视图函数中添加一个 format 参数, 像这样:
|
|
因为API是基于客户端请求来选择响应内容的类型, 所以默认情况下, 在Web浏览器访问资源时, API返回HTML格式的资源。 这语序API返回完全可以网页浏览的HTML。 有可以网页浏览API是很好的, 这使开发和使用你的API更简单, 这也为其他想要查看和使用你的API的开发者大大降低了门槛。
基于视图的类
|
|
使用混合
|
|
授权与权限
我们打算对我们的 Snippet 模型类做些改变。 首先, 让我们添加几个字段。 其中一个字段将显示出哪个用户创建里snippet数据。 另一个字段将用于HTML代码高亮。
|
|
既然我们已经创建了多个用户, 那么我们最好将用户添加到我们的API。 很容易创建一个新的序列。 在 serializers.py 中添加
|
|
我们需要添加在 views.py 中添加一些视图。 我们想要为用户添加只读视图, 所以我们会使用基于视图的一般类 ListAPIView 和 RetrieveAPIView 。
|
|
如果我们创建snippet数据, 我们没办法将用户和snippet实例联系起来。 虽然用户不是序列表示的部分, 但是它是请求的一个属性。 我们通过重写snippet视图的 .perform_create() 方法来做到, 这个方法允许我们修改如何保存实例, 修改任何请求对象或者请求连接里的信息。 在 SnippetList 视图类中添加以下方法;
|
|
我们序列的 create() 方法将会另外传入一个来自有效的请求数据的 ‘owner’ 字段。
更新snippet序列
既然已经将snippets和创建它们的用户联系在一起了, 那么我们需要更新对应的 SnippetSerializer 。 在 serializers.py 的序列定义(serializer definition)中添加以下字段:
|
|
去报你也添加 ‘owner’, 到内部类 Meta 的字段列表里。 这个字段很有趣。 source 参数控制哪个属性被用于构成一个字段, 并且能够指出序列实例的任何属性。 它也能想上面一样使用点标记(.), 这中情况下他会横贯给定的属性, 就是我们使用Django模板语言一样。 *
为视图添加权限
snippets数据已经和用户联系在一起, 我们想确保只有授权的用户可以创建、 更新和删除snippet数据。 REST框架包括许多权限类(permission classes), 我们可以使用这些权限类来现在视图的访问权限。 这种情况下, 其中我们需要 IsAuthenticatedOrReadOnly , 这个类确保授权请求有读写权限, 而没有授权的用户只有只读权限。 首先, 在视图模块中引入以下代码
|
|
如果你现在用浏览器打开API, 你会发现你已经不能创建新的snippets数据。 为此,我们需要以用户身份登录。 为了使用浏览器打开API, 我们需要添加一个登录视图, 编辑URL配置(URLconf)文件 urls.py 文件。 在 urls.py 顶部添加下面import。
|
|
现在如果你刷新浏览器页面, 你会看到右上角的’Login’链接。 如果你用之前创建的用户登录, 你就可以再次写snippets数据了。一旦你创建snippets数据, 浏览’/users/‘, 然后你会发现在每个用户的’snippets’字段, 显示的内容包括与每个用户相关的snippets主键。
视图集和路由
视图集重写当前视图。 首先, 我们要把我们的 UserList 和 UserDetail 视图重写成单个 UserViewSet 。 我们可以 UserViewSet 代替 UserList 和 UserDetail 。
|
|
这次我们使用 ModelViewSet 类是为了获得完整的默认读写操作的集合。 注意:我们也用了 @detail_route 装饰器来创建自定义动作, 命名为 highlight 。 这
个装饰器用于添加任何自定义的端点, 这些端点不符合标准的 create/update/delete 方式。 使用 @detail_route 装饰器的自定义动作会响应 GET 请求。 如果我们让动作响应 POST 请求, 我们可以使用 methods 参数。 自定义动作的URL在默认情况下是依赖于方法本身。 如果你想改变url本来创建的方式, 你可以将url_path包含在装饰器关键参数中。
明确绑定viewset到URL
我们定义URLConf的时候, 处理方法只绑定了动作。 为了看看发生了什么, 我们必须从我们的视图集(ViewSets)创建一个视图集合。 在 urls.py 文件中, 我们将 ViewSet 类绑定到具体视图的集合。
|
|
注意我们如何通过绑定http方法到每个视图需要的动作来从 ViewSet 类创建多视图。 既然我们已经绑定了我们的资源和具体视图, 我们就可以和以前一样将我们的视图注册到URL配置中。
|
|
使用路由
因为我们使用 ViewSet 类而不是 View 类, 所以实际上我们不需要自己设计URL配置。 按惯例, 使用 Router 类就可以自动将资源与视图(views)、 链接(urls)联系起来。 我们需要做的只是用一个路由注册合适的视图集合。 现在, 我们把剩下的做完。 我们重写了 urls.py 文件。
|
|
用路由注册视图和提供一个urlpattern是相似的, 包括两个参数–视图的URL前缀和视图本身。 我们使用的 默认路由(DefaultRouter) 类会自动为我们创建API根视图, 所以我们就可以从我们的 views 模块删除 api_root 方法。