django-rest-framework的使用

本文介绍如何使用Django REST framework快速搭建RESTful风格的API,包括安装配置、序列化器编写、视图集定义及路由设置,并演示文档生成。

同步更新于个人博客系统:django-rest-framework的使用

同步更新于个人博客系统:django-rest-framework的使用

同步更新于个人博客系统:django-rest-framework的使用

RESTFUL

在学习这个第三方库之前,我们需要了解什么是restful!度娘给的解释如下:

RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。

所以一句话总结就是:restful是一种设计风格,而不是一种新技术。

具体来说,就是把所请求的实体当作资源,通过http自带的方法(get,post,put,delete)来进行对应的增删改查等操作。比如,get请求就是获取资源。get  /user/可以获取用户列表;get /user/1可以获取id=1的用户,其他的方法以此类推。

django-rest-framework

官方简介如下: 

简单来说,django-rest-framework的作用等同于django中的view+form,我们既可以基于model来直接生成接口,也可以自定义serializers(跟form的用法很像)的字段来生成接口。

快速上手

根据需求来学习可能更容易理解一些!

假设需求如下:需要一套博客接口,接口能够实现如下功能:博客列表,博客详情,新建博客,删除博客

知道需求后,就好对症下药了!

1.安装:

pip install djangorestframework

并且将rest_framework添加到installed_app中

//同时需要安装另外一个依赖包:pip install coreapi

2.编写serializer

在blog app下新建serializers文件,并在其中编写如下代码:

# 博客列表的序列化类
class PostSerializer(serializers.ModelSerializer):
    category = serializers.SlugRelatedField(
        read_only=True,
        slug_field='name',
    )

    tag = serializers.SlugRelatedField(
        many=True,
        read_only=True,
        slug_field='name',
    )

    owner = serializers.SlugRelatedField(
        read_only=True,
        slug_field='username',
    )

    created_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')

    class Meta:
        model = Post
        fields = ['id', 'title', 'category', 'tag', 'owner', 'created_time']


# 博客详情的序列化类
class PostDetailSerializer(PostSerializer):
    class Meta:
        model = Post
        fields = ['id', 'title', 'category', 'tag', 'owner', 'content_html', 'created_time']
z

这个写法和modelform的写法是一致的,djangorestframework和django中deform是等同的,它页提供了类似forms.Form和forms.ModelForm的类(serializers.Serializer和serializers.ModelSerializer)。基于同样的逻辑,我们定义的PostSerializer中可以继续实现自定义字段,自定义检查逻辑,自定义数据处理逻辑等方法。

有了serializers之后,新建view层的逻辑,在blog app下新建一个文件apis.py,编写如下代码:

class PostViewSet(viewsets.ModelViewSet):
    serializer_class = PostSerializer
    queryset = Post.objects.filter(status=Post.STATUS_NORMAL)

    def retrieve(self, request, *args, **kwargs):
        self.serializer_class=PostDetailSerializer
        return super().retrieve(request,*args,**kwargs)

这样就完成了CRUD(c:create新增,r:retrieve查询,u:update更新,d:delete删除)操作的定义。

上面的逻辑代码编写完成后就可以配置urls了!因为是一套接口,所以django-rest-framework还提供了router的组件来帮我们更好的生成url。在urls.py中增加如下代码:

from rest_framework.routers import DefaultRouter
router=DefaultRouter()
router.register(r'post',PostViewSet,basename='api-post')

urlpatterns = [
url(r'^api/',include((router.urls,'api'),namespace='api')),

]

完成以上操作后就有了多个接口。

例:博客列表接口:/api/post/

博客详情接口: /api/post//  blog_id=1的样例如下:

配置API DOCS

在需要提供接口给其他团队的情况下,接口文档是整个项目开发流程中必备的产出品之一。编写接口文档是一个相对繁琐且枯燥的工作,并且页需要很细心才行,但大部分情况下需要做的就是把定义好的接口格式抄写到文档中。

同django的第三方插件sumpleui一样,定义好model,完成一些相关配置之后,然后得到界面。那么,是否可以通过简单配置就得到文档呢,甚至得到一套接口的测试工具?

答案是:可以!

那就是djangorestframework提供的docs工具!

配置非常简单,在urls中增加一行代码即可。

配置前先安装另一个依赖库:pip install coreapi

需要新增如下代码:

from rest_framework.documentation import include_docs_urls

urlpatterns=[
url(r'^api/docs/', include_docs_urls(title='typeidea apis'))

]

以上配置完成后重启项目,访问/api/docs/ 可能会报如下错误:

解决方法也非常简单,参照博客:使用coreapi时提示AttributeError: 'AutoSchema' object has no attribute 'get_link' 错误的解决办法

即在settings中增加如下代码即可:

REST_FRAMEWORK = {
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}

以上配置完成后,重启项目再次访问/api/docs/应该就可以得到如下界面了!其内容就由你自己去慢慢体验摸索啦!

总结:djangorestframework是我今天刚刚学习的一个django第三方插件,一开始学的时候还是有点难理解感觉,经过这一天的这么折腾之后,加上这篇博客对其的一个总结,感觉似乎还是慢慢地开始理解消化了,总之,亲身体验,这确实是一个非常好用的第三方插件,风格真的和django很像,从学习djago开始,到对django有了一个大概的了解以后,再学习这个插件,它们给我的相同感受就是:考虑的周到!让开发者能够使用更少的代码实现更多的功能!简直就是开发者的福音!但是这也许会让开发者走另一个极端,毕竟人总是喜欢偷懒的,也许心里会默默想:大佬们都把现成的架子都给我搭好了,直接用,真香!干嘛还自己写?是的,这种想法没错,但是我们在使用一些优秀的框架或者插件的时候,更应该去以学习的心态去使用,不仅要知其然那个,更要知其所以然,所以,不能忘本,写代码的本领不能因此就退化了,多看看源码,多照着敲敲还是有好处滴~

加油!每天一小步,未来一大步!

   

### 如何在 Django REST framework使用分页 为了实现在 Django REST framework (DRF) 中的分页功能,可以按照如下方法进行设置: #### 配置全局分页选项 可以在项目的 `settings.py` 文件中指定默认的分页类以及每页显示的最大项数。这使得在整个应用程序范围内统一处理分页逻辑变得简单。 ```python # settings.py REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', 'PAGE_SIZE': 10, } ``` 上述配置选择了 `LimitOffsetPagination` 类作为默认分页机制,并设定了页面大小为 10 条记录[^3]。 对于更灵活的需求,还可以考虑其他类型的内置分页器如 `PageNumberPagination` 或者创建自定义分页器来满足特定场景下的要求[^5]。 #### 使用标准视图中的分页支持 当采用 DRF 提供的标准视图(例如基于类的通用视图或视图集)时,默认情况下会自动应用所设定好的分页行为;然而如果是通过普通的 APIView 实现,则需手动调用分页 API 才能获得相同效果。 下面是一个简单的例子展示了如何在一个列表视图里启用分页特性: ```python from rest_framework import generics from myapp.models import MyModel from myapp.serializers import MyModelSerializer class MyModelListView(generics.ListAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer ``` 在这个案例中,由于继承了 `generics.ListAPIView` ,因此无需额外编码即可享受已配置好分页带来的便利。 如果想要进一步定制化分页的表现形式,比如改变链接结构或是调整响应体的内容布局等,可以通过重写现有的分页器或者新建子类来自定义所需的功能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值