目录
Django Rest Framework
以下特点:
drf框架,是一套基于django的rest风格框架。
- 功能强大、灵活、能快速开发web API
- 支持认证策略,包括OAuth 1a 和 OAuth 2
- 支持ORM和非ORM数据源的序列化
创建简单的API
目录结构:
- 安装:pip install djangorestframework
- 创建django project项目和app,这边省略。。。django-admin startproject demo,cd demo, django-admin startapp drf_pro
- 配置demo/demo/settings.py文件
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'drf_pro',#配置app 'rest_framework',#配置drf应用 ] #权限策略设置为全局范围内 REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES':( 'rest_framework.permissions.IsAuthenticated', ) }
- 进入demo根目录,创建超级用户,python manage.py createsuperuser 输入用户名、邮箱、密码
- 配置demo/drf_pro/models.py数据库模型
from django.db import models class DrfUser(models.Model): #id可以不写,如果要设置,需申明AutoField(primary_key=True) username = models.CharField(max_length=20,blank=True,null=False,verbose_name='姓名') age = models.IntegerField() birthday = models.DateTimeField(auto_now_add=True,blank=True, null=True,verbose_name='出生年月') is_marry = models.BooleanField(default=True,blank=False, null=False,verbose_name='是否已婚') address = models.TextField(max_length=999,blank=True,null=False,verbose_name='住址') class Meta: db_table = 'drf_user' verbose_name = "用户模块" verbose_name_plural = verbose_name def __str__(self): # 重写直接输出类的方法 return "<MkUniqlo:{id=%s,username=%s}>"%(self.id,self.username) if __name__ =='__main__': pass
- 进行数据模型迁移和数据库创建:python manage.py makemigrations迁移/python manage.py migrate创建,如果后面加api就只迁移该应用,不加则迁移所有项目
- 创建数据序列化,在drf_pro应用下创建serializers.py文件
from .models import DrfUser from rest_framework import serializers class DrfUserSerializer(serializers.HyperlinkedModelSerializer): ''' serializers用于定义API的表现形式,如返回哪些字段,返回怎样的格式等,这边序列化,models创建的DrfUser表 ''' class Meta: model = DrfUser fields = ['id','username','age','birthday','is_marry','address']
- 编写视图层文件,demo/drf_pro/views.py文件
from .models import DrfUser from rest_framework import viewsets from .serializers import DrfUserSerializer #ViewSets视图的展现形式,例如返回哪些内容,需要做哪些权限处理 class DrfUserViewSet(viewsets.ModelViewSet): ''' 允许用户查看或编辑 ''' queryset = DrfUser.objects.all() serializer_class = DrfUserSerializer
- demo/demo/urls.py,在url中定义相应规则到ViewSet,ViewSets通过serializer_class找到对应的Serializers。这边将DrfUser的所有对象赋予给queryset,并返回这些值。在DrfUserSerializer中定义要返回的字段。开始添加路由
from django.contrib import admin from django.urls import path,include from drf_pro import views as drf_v from rest_framework import routers #roters可以自己匹配url router = routers.DefaultRouter() router.register(r'drf_user',drf_v.DrfUserViewSet) #使用自动url路由连接我们的api #此外,我们还包括登录后浏览api urlpatterns = [ path('admin/', admin.site.urls), path('',include(router.urls)), path('api-auth/',include('rest_framework.urls',namespace='rest_framework')) ]
-
启动服务:python manage.py runserver 0.0.0.0:8000,通过127.0.0.1:8000访问
-
通过右上角Log in登录
-
进入http://127.0.0.1:8000/drf_user/,添加用户数据
-
demo/drf_pro/tests.py测试接口数据,这边演示一个get和post
import pytest,requests class TestDemo: def setup(self): self.url = 'http://127.0.0.1:8000/drf_user/' self.auth = ('admin','admin') def test01(self): res = requests.get(url=self.url,auth=self.auth).json() for i in res: print(i.get('username')) def test02(self): data= {"username": "gggg", "age": 1, "is_marry": True, "address": "gggg"} res = requests.post(url=self.url,json=data,auth=self.auth) print(res) if __name__ =='__main__': pytest.main(['tests.py','-sq'])