Django默认是前后端绑定的,提供了Template和Form,现在流行前后端分离项目,Python大佬坐不住了,于是便有了Django REST framework:https://github.com/tomchristie

官网:https://www.django-rest-framework.org/

Django REST framework(简称DRF)是个Python技术栈的后端框架,用来构建RESTful API。

RESTful API

REST,是指REpresentational State Transfer,有个精辟的解释什么是RESTful:

  • 看URL就知道要什么
  • 看Method就知道干什么
  • 看Status Code就知道结果如何

良好的RESTful API设计的基本原则是:

  • 返回JSON
  • 严禁乱用状态码
  • 处理好分页
  • 返回具体的实体数据而不是返回通用的JSON数据
  • 请求对象有默认值

创建项目

接下来我们使用DRF创建一个简单的API,允许管理员查看和编辑用户和组。

先创建名为tutorial的project和名为quickstart的app:

# 创建项目目录
mkdir tutorial
cd tutorial # 创建Python虚拟环境
python -m venv env
# 激活虚拟环境
env\Scripts\activate.bat
# Mac中使用`source env/bin/activate` # 在虚拟环境中安装Django和Django REST framework
pip install django
pip install djangorestframework # 创建project,注意最后有个“.”,表示在当前目录创建
django-admin startproject tutorial .
cd tutorial
# 创建app
django-admin startapp quickstart
cd ..

创建好的目录结构如下:

$ pwd
<some path>/tutorial
$ find .
.
./manage.py
./tutorial
./tutorial/__init__.py
./tutorial/quickstart
./tutorial/quickstart/__init__.py
./tutorial/quickstart/admin.py
./tutorial/quickstart/apps.py
./tutorial/quickstart/migrations
./tutorial/quickstart/migrations/__init__.py
./tutorial/quickstart/models.py
./tutorial/quickstart/tests.py
./tutorial/quickstart/views.py
./tutorial/settings.py
./tutorial/urls.py
./tutorial/wsgi.py

一般不会把app放到project里面,这里是为了避免命名冲突。

接着同步数据库:

python manage.py migrate

然后创建一个超级管理员,密码password123

python manage.py createsuperuser --email admin@example.com --username admin

Serializers

序列化是指把数据库模型转换为JSON。新建模块tutorial/quickstart/serializers.py

from django.contrib.auth.models import User, Group
from rest_framework import serializers class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ['url', 'username', 'email', 'groups'] class GroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Group
fields = ['url', 'name']

Views

视图用来接受Web请求并且返回Web响应。打开tutorial/quickstart/views.py,添加代码:

from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from rest_framework import permissions
from tutorial.quickstart.serializers import UserSerializer, GroupSerializer class UserViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
permission_classes = [permissions.IsAuthenticated] class GroupViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows groups to be viewed or edited.
"""
queryset = Group.objects.all()
serializer_class = GroupSerializer
permission_classes = [permissions.IsAuthenticated]

URLs

配置路由,打开tutorial/urls.py,添加代码:

from django.urls import include, path
from rest_framework import routers
from tutorial.quickstart import views router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet) # Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
path('', include(router.urls)),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

因为这里用的不是view而是viewsets,所以可以自动生成API的URLconf,只需要注册class即可。

也可以不用viewsets,用view,再自定义API URL。

Pagination

分页用来控制每页返回多少数据,在tutorial/settings.py中添加:

REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10
}

Settings

tutorial/settings.py中,把'rest_framework'添加到INSTALLED_APPS

INSTALLED_APPS = [
...
'rest_framework',
]

测试API

启动项目:

python manage.py runserver

访问http://127.0.0.1:8000/users/,点击右上角用超管登录,即可看到:

东方说

本文是Django REST framework系列的开篇,内容参考的是官网的Tutorial。学了Django再看DRF,思路清晰多了,虽然我代码能力不强,但总是在追求规范和标准,难道是因为做测试的职业病么?

终于修复了从博客园复制粘贴到公众号代码块自动换行没有滚动条的问题,F12看了才知道有个样式被覆盖了,加上这句就搞定了:

#topics .postBody pre {
white-space: pre !important;
}

参考资料:

https://www.django-rest-framework.org/tutorial/quickstart/

http://www.ruanyifeng.com/blog/2014/05/restful_api.html

快用Django REST framework写写API吧的更多相关文章

  1. Django Rest FrameWork 全部API

    Django Rest FrameWork .Requests 请求 客服端发送给服务器的请求 .Responses 响应 rest框架支持响应不同格式的内容 .Views 视图 base基础类视图 ...

  2. Django REST framework 之 API认证

    RESTful API 认证 和 Web 应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权 ...

  3. 15 Django REST Framework 给api添加自定义搜索条件

    一.ListModelMixin源码 # 源码 class ListModelMixin(object): """ List a queryset. "&quo ...

  4. Django REST framework 数据处理api

    一.url分发 以防有其他业务线的需要,导致url杂乱,将每个app用到的url都设置在自己的应用中. # 项目下的url url(r"^api/(?P<version>\w+) ...

  5. Django Rest Framework API指南

    Django Rest Framework API指南 Django Rest Framework 所有API如下: Request 请求 Response 响应 View 视图 Generic vi ...

  6. 用Django Rest Framework和AngularJS开始你的项目

    Reference: http://blog.csdn.net/seele52/article/details/14105445 译序:虽然本文号称是"hello world式的教程&quo ...

  7. Getting Started with Django Rest Framework and AngularJS

    转载自:http://blog.kevinastone.com/getting-started-with-django-rest-framework-and-angularjs.html A ReST ...

  8. 利用 Django REST framework 编写 RESTful API

    利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framewor ...

  9. Django REST Framework API Guide 06

    本节大纲 1.Validators 2.Authentication Validators 在REST框架中处理验证的大多数时间,您将仅仅依赖于缺省字段验证,或在序列化器或字段类上编写显式验证方法.但 ...

随机推荐

  1. 精尽 MyBatis 源码分析 - MyBatis 初始化(一)之加载 mybatis-config.xml

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  2. php 与 docker php-fpm 共存问题

    需求: 本地一个 php7 的 php-fpm,现在需要运行 php5.2版本的程序, 服务器安装的 nginx 解析域名,碰见 php 文件交给 php5的 php-fpm; 注意: fastcgi ...

  3. Guitar Pro教程之组织小节

    上一章节我们讲述了关于Guitar Pro 7的主界面的相关功能的介绍,对于初学作曲,又是吉他的初学者,刚刚接触{cms_selflink page='index' text='Guitar Pro' ...

  4. Elasticsearch实现搜索推荐词

    本篇介绍的是基于Elasticsearch实现搜索推荐词,其中需要用到Elasticsearch的pinyin插件以及ik分词插件,代码的实现这里提供了java跟C#的版本方便大家参考. 1.实现的结 ...

  5. 工作中使用RabbitMQ

    写一个基类 1 <?php 2 3 namespace BI\Service\RabbitMQJob; 4 5 use AMQPConnection; 6 use AMQPChannel; 7 ...

  6. OpenCV计算机视觉学习(12)——图像量化处理&图像采样处理(K-Means聚类量化,局部马赛克处理)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 准备 ...

  7. 给集合null,filter结果空集合

  8. Spring beanDefinition载入

    @Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.st ...

  9. 机场&代理商-关系图

    机场&代理商-关系图 思路 ①首先统计机场活跃度Top10的机场名称,以下是我的表结构,以及查询语句 表结构: 查询语句:SELECT * from 2020csale ORDER BY cn ...

  10. python 爬取喜马拉雅节目生成RSS Feed

    记录于:2020年12月03日用了N年的手机在经历N次掉落之后终于扛不住了,后背都张嘴了,估计再摔一次电池都能飞出来.换了手机,由于之前有听喜马拉雅的习惯,但是手机里自带有播客软件,强迫症逼着我不能下 ...