Django 中 REST API 的设计

最近学习了REST方面的知识,了解了REST 的基础、API 的设计规则等等。

在Django中,不需要自己去设计每一个API,因为djangorestframwork帮我们做了一些工作。其实设计Django REST API的框架不少,但是djangorestframwork风格更像Django,与django的集成度更高,更易上手。该框架分为model, serializer, views三层,支持权限许可等功能。

现在就边做边学习这方面的知识。 首先是准备工作: 1、安装djangorestframwork pip install djangorestframework;
2、安装django-filter;

配置:

  1. 在INSTALLED_APPS中添加: ‘rest_framwork’
  2. 设置 REST_FRAMEWORK

在上面设置了权限,设置了结果分页,设置了过滤器。

上面配置完成,开始写代码。

一、Model就是数据库定义的模型本身 Model有article,user,category三个

User Model是Django自带的Model。

二、序列化Serializer

摘自官网: Serializers allow complex data such as querysets and model instances to be converted to native Python datatypes that can then be easily rendered into JSON, XML or other content types. Serializers also provide deserialization, allowing parsed data to be converted back into complex types, after first validating the incoming data.
The serializers in REST framework work very similarly to Django’s Form and ModelForm classes. We provide a Serializer class which gives you a powerful, generic way to control the output of your responses, as well as a ModelSerializer class which provides a useful shortcut for creating serializers that deal with model instances and querysets.

从以上文字可以看出,serializer的目的是将查询集或模型实例转化为Python数据类型,从而很方便得转变为Json,XML等多种格式。

我的项目中的Serializer设计:

在上面每个序列器都指定了Model,这样会自动生成序列化字段,这样比较方便。 在ArticleSerializer中,加入了author和category的序列化,这样做是因为当我们浏览article的信息时。会直接显示author和category的具体信息,否则就只是author和category的id。

三、View:
主要使用viewset。和route ViewSet为我们提供了默认的URL结构, 使得我们能更专注于API本身。而Route能够轻松的帮我们实现URL和ViewSet之间的关联。 源代码:

上面使用了ModelSet是有原因的,因为它自动提供delete,create,update,list等操作,即增删该查等操作。

其次说下filter,一般都用默认的DjangoFilterBackend,此外rest-framework 提供了几个原生的 filter:

SearchFilter

filter_backends = (filters.SearchFilter,) search_fields = (‘username’, ’email’) # 指定搜索的域

请求 http://example.com/api/users?search=russell。

OrderingFilter

filter_backends = (filters.OrderingFilter,) ordering_fields = (‘username’, ’email’)

请求 http://example.com/api/users?ordering=account,-username。

再说下权限。

rest_framework 中提供了七种权限

把源码拿出来:

其实还是比较理解的,首先判断用户,如果满足就返回True。要注意我们在Viewset中设置的权限必须是一个元祖,否则会出现错误。正确写法:permission_classes = (IsAdminUser,)。元祖里可以写多个permission,但注意,元祖里的属于与的关系,即任何一个不满足都不行,而不是或的关系,具体可见如下源代码:

当然,除了默认的权限我们也可以自定义权限:

这里要注意,对于一个request,会优先检查permission的has_permission方法,它是对每一个request进行检查。然后才检查has_object_permission,这是对每一个object进行检查。两者的区别是前者是对每一个request请求设置的权限,后者是对数据库条目进行权限设置的,但我理解她也包含了对request的控制。

如果不满足权限要求,则返回403或者401等错误代码。

然后定义路由:

有几点说明:
1、如果在viewset设置了权限,那么必须得带上登录用户名,密码等信息;
2、如果没有设置权限,那不带用户名可以使用GET方法,但是其他操作如POST,PUT,DELETE等,也要带上登录用户名,密码等信息;

测试:
curl http://localhost:8080/api/categoriese/10/?format=json(默认为get)
curl http://localhost:8080/api/categorieses/
curl -u username:password -X PUT -d “name=dwd&alias=dw” http://localhost:8080/api/categories/10/
curl -u username:password -X delete http://localhost:8080/api/categoriese/10/
curl -u username:password -X POST -d “name=dwd&alias=dw” http://localhost:8080/api/categories/10/

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

2 1 收藏 评论

关于作者:王海波

热爱Python,希望能一直做自己热爱的事! 个人主页 · 我的文章 · 13 ·    

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部