django/DRF(Django REST framework)快速入门,如何在5分钟内创建后端API接口应用、自动生成CURD

小熊 2022年1月3日Python1 1,094 views4616字阅读15分23秒阅读模式

最近有个比较紧急的需求,要做一个web网站应用,内部应用、并发量也不会大,希望在最短的时间写最少的代码来实现,团队的兄弟现在用python的比较多,为了快速完成工作,学了django 在此总结,便于后人上手。

python3.9
Django 3.2
djangorestframework 3.12.4

django

django/DRF(Django REST framework)快速入门,如何在5分钟内创建后端API接口应用、自动生成CURD

go语言的兄弟肯定知道beego,属于是那种大而全的api开发框架,结合 beego/admin 自动生成一个后台管理界面。pydjango已经属于是一个相当老的框架了,它将数据库的东西通过ORM的映射取出来,通过view文件,按照template文件排出的模板渲染成HTML。当用户请求相应的url时,返回相应的结果。

在没有做mvc的时间这东西很方便,就类似于jsp或者go template

django/DRF(Django REST framework)快速入门,如何在5分钟内创建后端API接口应用、自动生成CURD
图片引用自知乎@丁果

创建项目

django-admin startproject mysite

运行(后面的ip:端口指定可省略)

python manage.py runserver [0:8000]

目录结构

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

创建一个应用(polls是应用名,只是一个示例,可以取任意名字)

python manage.py startapp polls

目录结构

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
    polls/
        __init__.py
        admin.py
        apps.py
        migrations/
            __init__.py
        models.py
        tests.py
        urls.py
        views.py

具体各个文件什么作用我实在懒得解释了,建议先看看 tutorial01 ,可以切换相应的django版本,有问题直接问我就好。

创建orm, polls/models.py 解释见tutorial02

from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

接下来还得在setting.py里配置app和数据库链接配置,都看tutorial02

构造数据库 DDL 语句,polls是可选的,不写默认构建所有modelDDL,存储为python格式。

python manage.py makemigrations [polls]

查看将执行的sql命令

python manage.py sqlmigrate polls 0001

执行sql变更

python manage.py migrate

管理员账号创建,创建完访问 /admin 就可以了,自带了权限管理

python manage.py createsuperuser

因为还是打算前后端分离写能返回jsonapi出来,所以关于怎么弄页面并集成在里面的就不用关心了

django官网里的以下教程还是有用的,可以自由了解,属于是锦上添花的内容。

DRF(Django REST framework)

将数据库的东西通过ORM的映射取出来,通过view和serializers文件绑定REST接口,当前端请求时,返回序列化好的json

DRF是Django的超集,去掉了模板的部分,提供了一个REST的接口,同时也提供了满足该接口的代码工作流。同时,在REST的规范下,升级了权限和分页等功能,增加了限流和过滤搜索等功能。

Django的tutorial讲的是Django的ORM、template、url、admin以及Django怎么run起来等基础知识。

而DRF的tutorial讲的是serializers怎么写,view怎么写,在drf中view这一层既可以一个个get、post、从头开始写起,也可以采用抽象程度比较高的viewset去按配置生成。另外还讲了一些drf升级和新增的功能。

django/DRF(Django REST framework)快速入门,如何在5分钟内创建后端API接口应用、自动生成CURD
图片引用自知乎@丁果

也就是说我们只要完成上一节的model,套一下代码就能自动生成CURD

django-filter==21.1
django-log-request-id==1.6.0
django-mysql==4.3.0

使用与接入

1.安装

pip install pymysql djangorestframework django-filter
#settings.py的INSTALLED_APPS中添加:

NSTALLED_APPS = [
    ...
    'django_filters',
    'rest_framework',
    'rest_framework.authtoken',
    'rest_framework_filters',
    'app',
]

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
        'rest_framework.permissions.DjangoModelPermissions',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': (
        rest_framework.authentication.BasicAuthentication
        #'app.common.auth.YoozooTokenAuthentication' 自定义认证,
    ),

    'PAGE_SIZE': 15,
    'DEFAULT_PAGINATION_CLASS': 'app.common.page.YoozooPage',
    'PAGINATE_BY_PARAM': 'limit',
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',
                                'rest_framework.filters.SearchFilter',
                                'rest_framework.filters.OrderingFilter'
                                ),
}

_init_.py添加如下代码
( MySQLdb不支持python3,所以在python3下使用pymysql替代。)

import pymysql
pymysql.install_as_MySQLdb()

2.数据库models

from django.db import models

class Test(models.Model):
    name = models.CharField(max_length=20)

3.序列化

from rest_framework import serializers

class TestSerializer(serializers.ModelSerializer):
    class Meta: 
        #与test表对应
        model = Test 
        #取全部字段
        fields = '__all__'

4.过滤filter

from django_filters.rest_framework import FilterSet

class TestFilter(FilterSet):
    class Meta:
        model = Test
        fields = '__all__'

5.视图viewset

from rest_framework import viewsets

class TestViewSet(viewsets.ModelViewSet):
    filter_class = TestFilter
    queryset = Test.objects.all()
    serializer_class = TestSerializer

6.修改url

from django.conf.urls import url, include
from django.contrib import admin
from django.urls import path
from rest_framework import routers
import app.ormrest as orm
import app.views as views

router = routers.DefaultRouter()
router.register(r'test', orm.resapply.ResapplyViewSet)
urlpatterns = [
    #url(r'^admin/', admin.site.urls),
    url(r'^api/', include(router.urls)),
]

成了,这样子就完成了一套CURD,访问 /api/test 就能调用了

内建接口文档自动生成

setting.py里追加如下配置

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

urls.py里追加如下配置

from rest_framework.documentation import include_docs_urls

urlpatterns = [
    url(r'^api/v1/docs/', include_docs_urls(title="文档标题", description="描述",permission_classes=[], authentication_classes=[])),
]

这样就可以自动生成文档了。详见Built-in API documentation

依赖或可选的 Package:

  • coreapi Package 是本特性的依赖项,确保安装最新版本哦(2.3.0 或更高版本)
  • pygments Package 编程代码高亮(可选)
  • markdown Package markdown 语法高亮(可选)

命令小结

创建项目

django-admin startproject mysite

运行(后面的ip:端口指定可省略)

python manage.py runserver [0:8000]

创建一个应用(polls是应用名,只是一个示例,可以取任意名字)

python manage.py startapp polls

构造数据库 DDL 语句,polls是可选的,不写默认构建所有modelDDL,存储为python格式。

python manage.py makemigrations [polls]

查看将执行的sql命令

python manage.py sqlmigrate polls 0001

执行sql变更

python manage.py migrate

管理员账号创建,创建完访问 /admin 就可以了,自带了权限管理

python manage.py createsuperuser

引用

weinxin
公众号
在号内与我交流,回复【资源】获取技术大礼包
Python最后更新:2022-1-4