【Django】Django REST Framework简单教程

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进行项目的编写的确很方便,值得一试。

    更多的功能可以参考文章最上方给出的链接,官方文档里面的宝藏有很多,除了日常用到的外,也值得一看,指不定就发现自己辛辛苦苦写了好几天的功能其实人家早就封装好了。应用开发更多的是用轮子,而不是造轮子,造轮子可以练练手,但尽量不要用到项目中。

原文地址:https://www.cnblogs.com/axiangcoding/p/12095954.html

时间: 2024-07-30 08:28:00

【Django】Django REST Framework简单教程的相关文章

Django学习笔记 官网教程纠正 代码

原文: Django学习笔记 官网教程纠正 代码 Django学习笔记 4.模板初学中,照书例django book 出现以下异常 raise ImportError("Settings cannot be imported, because environment variable %s is undefined." % ENVIRONMENT_VARIABLE) ImportError: Settings cannot be imported, because environmen

ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程

原文:ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 Entity Framework Core 上一章节学习完了视图,其实我们应该立即着手讲解模型的,但 ASP.NET Core MVC 中的模型和 Entity Framework 有相当大的关系,所以,在此之前,我们先来讲讲 Entity Framework Core 和如何配置它 本章中,我们将设置和配置我们的应用程

Django创建App并简单实现登录模块

Django创建App并简单实现登录模块 什么是Django的APP? 此APP非andriodAPP.Django的APP可以理解为一个网站中的一个模块,我们可以将每个模块都单独写成一个APP,这样可以让项目变得相对整洁且更加好维护起来. 如何创建App? 1.创建Django工程 - BlogPorject django-admin startproject BlogPorject 2.创建App django-admin startapp application App目录介绍: appl

[Django]Django的orm中get和filter的不同

Django的orm中get和filter的不同 Django的orm框架对于业务复杂度不是很高的应用来说还是不错的,写起来很方面,用起来也简单.对于新手来说查询操作中最长用的两个方法get和filter有时候一不注意就会犯下一些小错误.那么今天就来小节下这两个方法使用上的不同. 我常用的是1.5版本的django,就以此为例来说说吧. 文档 首先对比下两个函数文档上的解释. get Returns the object matching the given lookup parameters,

Django - Django框架 简介

Django框架 简介 本文地址: http://blog.csdn.net/caroline_wendy/article/details/29172271 1. 介绍 Django是一个开放源代码的Web应用框架, 由Python写成. 采用了MVC的软件设计模式, 即模型M, 视图V和控制器C. 它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的, 并于2005年7月在BSD许可证下发布. 这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的. D

ASP.NET Core 设置和初始化数据库 - ASP.NET Core 基础教程 - 简单教程,简单编程

原文:ASP.NET Core 设置和初始化数据库 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 设置和初始化数据库 上一章节中我们已经设置和配置好了 EF 框架服务,本章节我们就来学习如何使用 EF 框架设置和初始化数据库 初始化数据库 初始化数据库的方法之一是使用 EF 框架来创建数据库,仅仅需要两步就能完成 第一步,给我们的 HelloWorld 项目添加迁移 ( migration ) 代码 迁移代码是 C# 代码,用来在数据库系统中创建数据库

ASP.NET Core 配置 EF 框架服务 - ASP.NET Core 基础教程 - 简单教程,简单编程

原文:ASP.NET Core 配置 EF 框架服务 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 EF 框架服务 上一章节中我们了解了 Entity Framework 的基本工作原理和 DbContext ,我们也创建了一个自己的 HelloWorldDBContext. 本章节我们就来讲讲如何设置我们的 EF 框架来链接到 SQLite 数据库 配置 EF 框架服务 要让我们的 EF 框架的 DBContext 能够运行起来,我们需要更改一

ASP.NET Core 数据库上下文 - ASP.NET Core 基础教程 - 简单教程,简单编程

原文:ASP.NET Core 数据库上下文 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 数据库上下文 上一章节中我们了解了 Entity Framework 并讲述了如何配置它.本章节我们就来学习如何使用它 EF 框架 ( Entity Framework ) 使我们能够使用称为实体 ( Entity) 的公共语言运行时 ( CLR ) 对象查询,插入,更新和删除数据 EF 框架将模型中定义的实体和关系映射到数据库.除此之外,它还具有以下能力: 将

ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程

原文:ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 EF SQLite 支持 上一章节我有提到 macOS 版的 Visual Studio Community 没有携带 LocalDB,也就是说 LocalDB 暂时不支持 macOS 系统 虽然我可以在 Windows 上继续完成接下来的教程,但我觉得还是感觉不妥,如果其它使用苹果笔记本的人要去哪里找 Windows 的电脑 我临时改变