Django REST Framework使用案例和教程
什么是Django REST Framework?简单说就是一款快速构建REST风格API的框架。能够以很少的代码和很简单的方式在Django项目中构建符合REST风格的API。十分适合Django框架的后端的编写
本文参考 https://blog.csdn.net/weixin_40193776/article/details/81210215,教程原文非常详细,还带图片。本文做了顺序上的修改以符合从无到有建立REST Framework项目的顺序
REST Framework 官方主页 https://www.django-rest-framework.org/
-
初始化配置
-
创建Django项目
- 创建项目,项目名为 mysite
django-admin.py startproject mysite
- 在项目内创建应用,应用名为 api
python manage.py startapp api
- 在项目内注册应用
在 项目根目录/mysite/ 下的setting.py 里的 INSTALLED_APPS 列表下添加应用
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'api', #这行添加你的应用 ]
- 创建管理员用户
django的模板里带有用户表,所以可以不用自己写用户权限相关的内容了。这里创建一个管理员
python manage.py createsuperuser
按照提示输入用户名和密码,这个账号密码作为进入django后台的凭证
- 创建测试的模型
模型对应表结构,django提供了一套api来非常方便对接数据库,这里建立一个Student模型。注意Python代码复制粘贴后的格式问题。
# 底下的代码是在干什么?应该可以猜到吧?就是用python代码建立了一个数据库表 class Student(models.Model): name = models.CharField(u'姓名', max_length=100, default='no_name') sex = models.CharField(u'性别',max_length=50,default='male') sid = models.CharField(u'学号',max_length=100,default='0') def __unicode__(self): return '%d: %s' % (self.pk, self.name)
搞定了代码,配置好数据库就可以了。Django自带的数据库为sqlite,如果要转换成其他数据库请看django官方文档或者我的其他教程。
接下来我们执行两行命令将代码转换为数据库表,进行迁移
python manage.py makemigrations python manage.py migrate
- 配置管理员后台的路由
我们需要路由将我们的代码配置到对应的url路径上。在mysite文件夹下的urls.py文件,添加代码:
from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), ]
- 测试Django项目是否搭建正常
在admin后台注册这个Student模型,或者说是数据库表。找到api文件夹下的admin.py,填入以下代码:
from .models import Student # 导入模型包里的Student模型 @admin.register(Student) class BlogTypeAdmin(admin.ModelAdmin): list_display = ('pk', 'name') #在后台列表下显示的字段
然后我们运行项目,如果使用Pycharm直接按绿色的run就可以了,本质上还是执行了以下的命令:
python manage.py runserver
如果显示以下信息,代表成功
System check identified no issues (0 silenced). December 25, 2019 - 09:59:46 Django version 2.2.5, using settings 'mysite.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK.
打开浏览器进入 http://127.0.0.1:8000/admin 或者 http://localhost:8000/admin 访问
-
引入REST Framework依赖
- pip 安装 REST Framework
pip install djangorestframework
- 在项目中引入依赖应用
在 项目根目录/mysite/ 下的setting.py 里的 INSTALLED_APPS 列表下添加应用
INSTALLED_APPS = [ .... 'rest_framework', #加上这句,加在api的前面 'api', ]
- 编写序列化器实例化模型为json
在api文件夹下创建一个serializers.py文件,代码为:
from rest_framework import serializers from .models import Student class StudentSerializers(serializers.ModelSerializer): class Meta: model = Student #指定的模型类 fields = ('pk', 'name', 'sex', 'sid',) #需要序列化的属性
- 编写视图测试一下
在api文件夹下的views.py文件内编辑视图:
from rest_framework import viewsets from .models import Student from .serializers import StudentSerializers # Create your views here. class StudentViewSet(viewsets.ModelViewSet): # 指定结果集并设置排序 queryset = Student.objects.all().order_by('-pk') # 指定序列化的类 serializer_class = StudentSerializers
- 配置应用在项目上的路由
在api文件夹下建立一个urls.py文件,添加以下代码:
from django.conf.urls import include,url from rest_framework import routers from api import views # 定义路由地址 route = routers.DefaultRouter() # 注册新的路由地址 route.register(r'student' , views.StudentViewSet) # 注册上一级的路由地址并添加 urlpatterns = [ url('api/', include(route.urls)), ]
在项目路由上注册这个应用路由。在mysite的urls.py下添加代码:
from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('', include('api.urls')), #添加的应用路由地址 ]
- 打开地址 http://127.0.0.1:8000/api/ 看到api视图
所有api遵循restful风格,这里就不展开了。可以查看百度。
-
-
JWT权限认证
-
pip安装 REST Framework JWT
使用pip安装
pip install djangorestframework-jwt
-
全局配置
在根目录的setting.py下配置以下代码:
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( # 设置访问权限为只读 'rest_framework.permissions.IsAuthenticatedOrReadOnly', # 设置访问权限为必须是登录用户 # 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionAuthentication', ), }
-
配置路由
在mysite的urls.py内添加如下代码:
urlpatterns += [ path('auth/', obtain_jwt_token), path('auth/', include('rest_framework.urls', namespace='rest_framework')), ]
-
测试API
回到 http://127.0.0.1/api/ 下进行访问,发现有了权限的控制了。
-
如何调用登录功能?
访问 http://127.0.0.1/auth/ ,带用户名和密码(之前创建的管理员用户在这里做测试)参数,post一下即可,返回一个token
{ "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InR1bm0iLCJleHAiOjE1MzI1NDM5MjUsImVtYWlsIjoidEBxcS5jb20ifQ.DtY2u-z8DP8HvL3_dv7vq5i_ix36MyIOHTJv423yFVk" }
-
-
搜索,分页,排序
-
配置全局分页 【不推荐】
教程原文给出了这个方法,但这里不推荐这样使用,故略去
-
自定义分页 【推荐】
- 配置分页
在 views.py下定义一下分页的属性。可以做简单的分页也可以做定义分页
简单分页:
# 记得要导包啊 from rest_framework import viewsets,filters,pagination class PageSet(pagination.PageNumberPagination): #每页显示多少个 page_size = 3 #默认每页显示3个 page_size_query_param = "size" #最大页数 max_page_size = 10 #获取页码数的 page_query_param = "page"
自定义分页:
class LimitSet(pagination.LimitOffsetPagination): # 每页默认几条 default_limit = 3 # 设置传入页码数参数名 page_query_param = "page" # 设置传入条数参数名 limit_query_param = 'limit' # 设置传入位置参数名 offset_query_param = 'offset' # 最大每页显示条数 max_limit = None
- 启用分页
在之前定义的ViewSets类下调用:
class StudentViewSet(viewsets.ModelViewSet): # 指定结果集并设置排序 queryset = Student.objects.all().order_by('-pk') # 指定序列化的类 serializer_class = StudentSerializers #指定分页配置,两种都可以 pagination_class = PageSet # pagination_class = LimitSet
-
搜索
- 配置filter进行搜索
同样在views.py下修改
# 记得要导包啊 from rest_framework import viewsets,filters,pagination class StudentViewSet(viewsets.ModelViewSet): # 指定结果集并设置排序 queryset = Student.objects.all().order_by('-pk') # 指定序列化的类 serializer_class = StudentSerializers # 指定分页配置 pagination_class = LimitSet # 配置搜索功能 filter_backends = (filters.SearchFilter,) # 设置搜索的关键字 search_fields = ('=name','sid')
搜索关键字的修饰符有以下几种:
^ :搜索关键字开头的数据 = :完全匹配搜索 @ :全文搜索(目前只支持MySQL) $ :正则表达式搜索
-
排序功能
- 添加排序功能即可
同样在views.py下修改:
class StudentViewSet(viewsets.ModelViewSet): # 指定结果集并设置排序 queryset = Student.objects.all().order_by('-pk') # 指定序列化的类 serializer_class = StudentSerializers # 指定分页配置 pagination_class = PageSet # 配置搜索功能和排序功能 filter_backends = (filters.SearchFilter,filters.OrderingFilter,) # 设置搜索的关键字 search_fields = ('=name','sid') # 设置需要被排序的字段 ordering_fields = ('name', 'sid'
- 如何调用排序功能?
在api的界面里尝试一下,看url的变化就知道了
-
-
结语
不得不说Django这个框架结合REST Framework这个应用包还是非常方便的,什么功能都封装好了,作为Spring Boot转过来的开发者确实有点目瞪口呆,发现之前写了一大堆的代码其实都是低价值的重复性工作。当然,在重复性工作里才能掌握更多的知识,才能加深对业务的了解。总的来说,使用django进行项目的编写的确很方便,值得一试。
更多的功能可以参考文章最上方给出的链接,官方文档里面的宝藏有很多,除了日常用到的外,也值得一看,指不定就发现自己辛辛苦苦写了好几天的功能其实人家早就封装好了。应用开发更多的是用轮子,而不是造轮子,造轮子可以练练手,但尽量不要用到项目中。