Rest_framework 和路由配置(一)
简介
Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用。
Rest_framework 核心思想: 缩减代码。
中文文档:https://q1mi.github.io/Django-REST-framework-documentation/#django-rest-framework
github: https://github.com/encode/django-rest-framework/tree/master
特点
提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
提供了丰富的类视图、Mixin扩展类,简化视图的编写;
丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
多种身份认证和权限认证方式的支持;[jwt]
内置了限流系统;
直观的 API web 界面;
可扩展性,插件丰富
非drf 实现简单接口
1.创建django 项目
django-admin startproject drf 2. 创建子应用目录booktest,在项目根目录下执行以下命令
python manage.py startapp booktest 创建一个数据库,drf
create database drf charset=utf8;
grant all privileges on book.* to root@localhost identified by '';
flush privileges; 3. 配置数据库信息
3.1 在主应用drf目录下的drf/__init__.py添加以下代码:
import pymysql
pymysql.install_as_MySQLdb() 3.2 在项目配置文件中,settings中修改数据链接信息。 DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'drf',
'USER': 'root',
'PASSWORD': '',
'HOST': '127.0.0.1',
'PORT': '',
},
}
路由配置:
1. 视图 booktest 应用中的views.py
from django.shortcuts import render
from django.http import JsonResponse
from django.views import View
# Create your views here.
class BookAPI(View):
def get(self,request):
return JsonResponse({"name":"deng"})
2.分路由 booktest 应用中的urls.py
from django.urls import path
from .views import BookAPI
urlpatterns = [
path(r'books/',BookAPI.as_view())
]
3. 主路由 主应用drf 中的url.py
from django.contrib import admin
from django.urls import path,re_path,include urlpatterns = {
path('admin/', admin.site.urls),
path('api/',include('booktest.urls') ) }

访问接口结果:

drf 实现简单接口
1.环境安装与配置
DRF需要以下依赖:
Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6)
Django (1.10, 1.11, 2.0)
DRF是以Django扩展应用的方式提供的,所以我们可以直接利用已有的Django环境而无需从新创建。
(若没有Django环境,需要先创建环境安装Django)
1.安装
pip install djangorestframework
2. 终端创建创建django 项目
在终端执行以下命令创建django项目,比较纯净, 建议用此方法创建项目,而不是用pycharm 创建。
django-admin startproject drf


3. 添加rest_framework应用
在settings.py的INSTALLED_APPS中添加'rest_framework'。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework'
]
接下来就可以使用DRF进行开发了。在项目中如果使用rest_framework框架实现API接口,主要有以下三个步骤:
将请求的数据(如JSON格式)转换为模型类对象
操作数据库
将模型类对象转换为响应的数据(如JSON格式)
在booktest应用目录中新建serializers.py用于保存该应用的序列化器。
创建一个BookInfoSerializer用于序列化与反序列化。
创建序列化器
1.底层的方式实现的序列化:
serializers.py :
from rest_framework import serializers # 序列化器 序列化
class BookSerializer(serializers.Serializer):
# 自定义序列化的字段
id = serializers.IntegerField(label='主键ID',read_only=True)#read_only=True只给用户看不让输入和修改
title= serializers.CharField(label='书名',max_length=32) pub_date = serializers.DateField() bread = serializers.IntegerField(min_value=0)
bcomment = serializers.IntegerField(min_value=0)
2. 编写视图
book 应用下的视图 view.py :
# 序列化器 序列化阶段 from django.http import JsonResponse
from django.views import View from book.models import Book # 导入模型类
from book.serializers import BookSerializer # 导入序列化器类 class BookView(View): # 展示所有数据
def get(self,request): # 1 操作数据库 books = Book.objects.all() # 2 .序列化
'''
创建序列化器对象
参数1:instance 要序列化的模型数据 (数据库中的数据)
参数2: data 要反序列化器的字典数据 (前端传来的数据)
参数3:many 是否要序列化多个模型数据,多条数据many=True 默认False 一条
参数4: context 序列化器使用的上下文,字典类型数据,可以通过context把视图中的数据传递给序列化器内部使用
'''
serializer = BookSerializer(instance=books,many=True) # 此处需要many=True 不然会报错
# 通过 serializer.data 获取序列化完成以后的数据
# print(serializer.data)
#3. 返回响应
return JsonResponse(serializer.data,safe=False)
3. 配置路由
3.1在booktest应用的urls.py中定义路由信息。
from django.urls import path from .views import BookView urlpatterns=[
path('book/',BookView.as_view())
]
3.2 总路由中 drf主应用中 url.py :
from django.contrib import admin
from django.urls import path,re_path,include urlpatterns = {
path('admin/', admin.site.urls),
path('api/', include('book.urls')), }
2.底层的方式实现的反序列化:
serializers.py :
# 序列化器 的反序列化阶段
# 全局自定义验证方法
def check_title(data):
if data=='金梅':
raise serializers.ValidationError('金梅是禁书!') return data #自定义验证方法一定要返回数据 class Book2Serializer(serializers.Serializer):
#自定义要反序列化的字段
id = serializers.IntegerField(label='主键ID', read_only=True) # read_only=True只给用户看不让输入和修改
title = serializers.CharField(label='书名', max_length=32,required=True,min_length=1,validators=[check_title]) # validators 参数用来装全局自定义验证方法
pub_date = serializers.DateField()
bread = serializers.IntegerField(min_value=0)
bcomment = serializers.IntegerField(min_value=0)
# required = False 反序列化时,当前字段可以不填
# 自定义验证方法 ,验证单个字段可以多个方法
# 格式: def validate_字段名(self,data): # data当前字段对应的值 def validate_title(self, data):
if data=='金梅':
raise serializers.ValidationError('金梅是禁书!')
return data # 一定要返回数据 # 自定义验证对个方法 ,验证多个或所有字段,只能出现一次
def validate(self, data):# data 这个是所有字段内容 ,字典类型 bread = data.get('bread')
bcomment = data.get('bcomment')
if bcomment>bread:
raise serializers.ValidationError('数据不真实!') return data def create(self, validated_data):
# 保存数据,把字典转化成模型
# validated_data 客户端提交过来的数据,并经过验证的数据
instance = Book.objects.create(
title=validated_data.get('title'),
pub_date=validated_data.get('pub_date'),
bread = validated_data.get('bread'),
bcomment=validated_data.get('bcomment')
)
return instance def update(self, instance, validated_data): # 更新一条数据
instance.title = validated_data.get('title')
instance.pub_date = validated_data.get('pub_date')
instance.bread = validated_data.get('bread')
instance.bcomment = validated_data.get('bcomment') # 调用orm 进行保存
instance.save()
# 返回模型对象
return instance
2. 编写视图
book 应用下的视图 view.py :
from django.http import JsonResponse
from django.views import View from book.models import Book # 导入模型类
from book.serializers import BookSerializer # 导入序列化器类 from book.serializers import Book2Serializer
class BookView(View):# 反序列化 def post(self,request): # 添加一本书
#1 接收数据
data = request.POST
# 反序列化
from book.serializers import Book2Serializer
serializer = Book2Serializer(data=data)
# 2 验证数据
serializer.is_valid(raise_exception=True)
## raise_exception=True 把验证的错误信息返回给客户端,同时阻止程序继续往下执行
# # is_valid调用验证方式: 字段选项validators->自定义验证方法[单字段]->自定义验证方法[多字段]
# 验证成功后的数据
# print(serializer.validated_data)
# 3. 转换数据成模型,同步到数据库中
serializer.save()
## save会自动调用序列化器类里面声明的create/update方法,返回值是当前新增/更新的模型对象 # 4 响应数据
return JsonResponse(serializer.data) def put(self,request,pk):
# 更新一条数据
# 1 根据主键获取指定图书信息
instance = Book.objects.get(pk=pk)
# 2. 获取put 数据
from django.http import QueryDict
data = QueryDict(request.body) # 3.使用序列化器 反序列化
# partial=True 接下里在反序列化中允许部分数据更新
serializer = Book2Serializer(instance=instance,data=data,partial=True) # 4 验证数据
serializer.is_valid(raise_exception=True)
# save之所以可以自动识别,什么时候执行create ,什么时候执行update
# 主要是看创建序列化器对象时,是否有传入instance参数,
# 有instance参数,则save会调用序列化器内部的update方法
# 没有instance参数,则save会调用序列化器内部的create方法 #5 保存数据
serializer.save() return JsonResponse(serializer.data)
3. 配置路由
3.1在booktest应用的urls.py中定义路由信息。
from django.urls import path,re_path from book.views import BookView
urlpatterns=[
#path("book/",BookView.as_view()),
re_path("book/(?P<pk>\d+)/",BookView.as_view()), ]
3.2 总路由中 drf主应用中 url.py :
from django.contrib import admin
from django.urls import path,include urlpatterns = [
path('admin/', admin.site.urls),
path('api/',include('book.urls'))
]
模型序列化器
1. serializers.py :
3 模型序列化器
# 1. 可以帮我们自动完成字段的声明[主要是从模型中的字段声明里面提取过来]
# 2. 模型序列化器也可以帮我们声明了create和update方法的代码
from rest_framework import serializers
from book.models import Book
class BookModelSerializer(serializers.ModelSerializer):
# 模型序列化器也可以自定义验证字段[当某些数据不存在于数据库时,但是需要前端提交过来的,可以进行自定义,
# 例如,验证码,确认密码] class Meta:
model=Book
fields = ["id","title"]
# 可以给模型序列化器里面指定的字段设置限制选项
extra_kwargs = {
"bread":{"min_length":0,"required":True},
} # 自定义验证方法[验证单个字段,可以有多个方法]
# def validate_<字段名>(self,data): # data当前字段对应的值
def validate_btitle(self,data):
# 例如,图书名不能是红楼梦
if data=="红楼梦":
# 抛出错误
raise serializers.ValidationError("红楼梦是禁书~")
# 验证方法中,把数据值必须返回给字段,否则字段值为空
return data # 自定义验证方法[验证多个或者所有字段,只能出现一次]
def validate(self,data): # data 这个是所有字段的内容,字典类型
bread = data.get("bread")
bcomment = data.get("bcomment") if bread>=bcomment:
return data
raise serializers.ValidationError("阅读量小于评论量,数据太假了")
2. 视图编写
3 模型序列化器
# 1. 可以帮我们自动完成字段的声明[主要是从模型中的字段声明里面提取过来]
# 2. 模型序列化器也可以帮我们声明了create和update方法的代码
######################################################
from django.views import View
from django.http import JsonResponse
from .serializers import BookModelSerializer
class Book3View(View):
def post(self,request):
"""添加一本图书"""
# 接受数据
data = request.POST
# 反序列化
serializer = BookModelSerializer(data=data)
serializer.is_valid(raise_exception=True)
result = serializer.save()
# 响应数据
return JsonResponse(serializer.data) def put(self,request,pk):
"""更新一个图书"""
book = Book.objects.get(pk=pk) # 获取put提交的数据
data = QueryDict(request.body) serializer = BookModelSerializer(instance=book,data=data,partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
# 响应数据
return JsonResponse(serializer.data)
3. 路由
from django.urls import path, re_path
from . import views
urlpatterns = [ path("books3/",views.Book3View.as_view()),
]
使用序列化器的简单版
1.创建序列化器 ,在app 1下 新建一个serializer.py 文件
from rest_framework import serializers
from booktest.models import BookInfo
class BookInfoSerializer(serializers.ModelSerializer):
# 当前序列化器在序列化和反序列的类 序列化器类
class Meta:
model = BookInfo
fields='__all__'
model 指明该序列化器处理的数据字段从模型类BookInfo参考生成
fields 指明该序列化器包含模型类中的哪些字段,'all'指明包含所有字段
2. 编写视图 app1 view.py
from django.shortcuts import render from booktest.models import BookInfo
from .serializers import BookInfoSerializer
from rest_framework.viewsets import ModelViewSet class BookInfoAPIView(ModelViewSet): queryset = BookInfo.objects.all() # 当前视图类使用序列化器类是谁
serializer_class = BookInfoSerializer
queryset 指明该视图集在查询数据时使用的查询集
serializer_class 指明该视图在进行序列化或反序列化时使用的序列化器。
3. 定义路由
在app1 应用的urls.py中定义路由信息。
from rest_framework.routers import DefaultRouter from .views import BookInfoAPIView urlpatterns=[ ] # 创建路由对象
routers = DefaultRouter() # 通过路由对象对视图进行路由生成
routers.register('books',BookInfoAPIView)# books为路径 urlpatterns += routers.urls
把上面的urls 添加到总路由中去:
from django.contrib import admin
from django.urls import path, re_path, include urlpatterns = [
path('admin/', admin.site.urls), path('api/',include('app1.urls') ) ]
Rest_framework 和路由配置(一)的更多相关文章
- Django drf:视图层封装、ViewSetMixin、路由配置、解析器、响应器
一.视图层封装 二.ViewSetMixin 三.路由配置 四.解析器 五.响应器 一.视图层封装 1.基本视图 写一个出版社的增删改查resfull接口 路由: url(r'^publish/$', ...
- .NetCore MVC中的路由(1)路由配置基础
.NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...
- ASP.NET WebForms MapPageRoute 路由配置
MapPageRoute 应该是 ASP.NET 4.0 中的东西,但现在我是第一次使用它,使用场景是:MVC 混合使用 WebForm,然后对 WebForm 进行路由配置,当然也可以使用 ISAP ...
- MVC路由配置
目录 URL Routing 的定义方式 示例准备 给片段变量定义默认值 定义静态片段 自定义片段变量 自定义片段变量的定义和取值 将自定义片段变量作为Action方法的参数 指定自定义片段变量为可选 ...
- ui-router带参数的路由配置
ui-router带参数的路由配置 使用ng-route的时候带参数的连接这样配置: $routeProvider.when('item/itemid/:itemid', { templateUrl: ...
- [水煮 ASP.NET Web API2 方法论](3-8)怎样给指定路由配置处理器
阅读导航 问题 解决方案 工作原理 代码演示 问题 如果仅仅针对指定的路由进行某些特定的消息处理,而不是应用于所有路由,我们应该怎么做呢? 解决方案 ASP.NET WEB API 的很多功能都内建了 ...
- Linux和Windows路由配置
Linux和Windows路由配置 一.配置路由 1- 原则上一台主机只能有一条缺省路由.如果一台主机上有多个网段的话,请配置能够上网的那个网段的网关为缺省路由 Linux配置缺省路由: ...
- WebForm MapPageRoute 路由配置(转载)
使用场景是:MVC 混合使用 WebForm,然后对 WebForm 进行路由配置 http://www.cnblogs.com/xishuai/archive/2015/02/26/web-form ...
- cisco 路由配置
Cisco路由配置基础 刚刚接触cisco路由配置,下面是学习的笔记,感觉命令还是多敲才能熟悉 一. 所处状态各类 router> 用户处于用户命令状态,可以查看网络和主机 router# 用户 ...
随机推荐
- upc组队赛1 闪闪发光 【优先队列】
闪闪发光 题目描述 一所位于云南昆明的中医药本科院校--云南中医学院. 因为报考某专业的人数骤减,正面临着停招的危机. 其中有九名少女想到一条妙计--成为偶像, 只要她们成为偶像,学校的名气便会增加, ...
- 如何在gvim中安装autoproto自动显示函数原型
cankao: http://www.vim.org/scripts/script.php?script_id=1553 注意, 在gvim中执行的命令, :foo和:!foo 的区别, 跟vim一样 ...
- SpringBoot 注解调用Redis缓存
注解代码: import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.l ...
- C# 控件线程匿名委托定义
当你在子线程中要修改主线程某个控件的值时,有不想再去定义一个线程变量时,就可以直接使用线程匿名委托来实现. 主要是方便快捷 控件.BeginInvoke(new ThreadStart(delegat ...
- OpenCV学习一《Linux下安装OpenCV》
第一步:安装源码前先安装好需要的第三⽅方环境 需要的编译环境■ [compiler] sudo apt-get install build-essential # 注释说明 64位ubuntu在安装 ...
- Latex: 设置 threeparttable footnote 行宽度
参考: Table width with threeparttable smaller than notes and caption? Latex: 设置 threeparttable footnot ...
- 如何让浏览器不解析html?
原问题: 在页面中,除了xmp,textarea以及js转义外,还有什么办法可以让html标签在不被浏览器解析而正常显示呢? 答: 要符合“内部的html标签不被解析”,我们根据HTML5的标准,分元 ...
- 阿里巴巴数据库连接池 druid配置详解
一.背景 java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色 ...
- 每日质量NPM包模态框_react-modal
一.react-modal 官方定义: Accessible modal dialog component for React.JS 理解: 一个容易使用的React模态框组件 二.用法 有时候我们不 ...
- 【BZOJ】4013: [HNOI2015]实验比较
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4013 中第i 条涉及的图片对为(KXi, Xi),判断要么是KXi < Xi ,要么 ...