Django之restframework
启动流程:引入rest_framework APP
在restframework中,GET数据可以通过request.query_params.get(xxx)获取,post数据可以通过request.data.get(xxx)获取。
一、序列化
(1)Serializers
from rest_framework import serializers
class PublishSerializers(serializers.Serializer):
name = serializers.CharField(max_length=32)
email = serializers.CharField()
publish_list = models.Publish.objects.all()
ret = PublishSerializers(publish_list,many=True) #这里many=True用来序列化QureySet对象,默认是False,用来处理model对象
class BookSerializers(serializers.Serializer):
title = serializers.CharField()
price = serializers.IntegerField()
publish = serializers.CharField(source="publish.name") #一对多字段
authors = serializers.SerializerMethodField() #多对多字段
def get_authors(self,obj):
temp=[]
for author in obj.authors.all():
temp.append(author.name)
return temp
class BookView(APIView):
def get(self,request):
book_list = models.Book.objects.all()
ret = BookSerializers(book_list,many=True)
return Response(ret.data)
def post(self,reqeust):
pass
(2)ModelSerializers
表结构:
from django.db import models
# Create your models here.
class Course(models.Model):
"""
课程信息表
"""
title = models.CharField(max_length=32,verbose_name="课程名")
img = models.CharField(max_length=255,verbose_name="课程图片") #课程图片
level_choices = (
(1,"初级"),
(2,"中级"),
(3,"高级")
)
level = models.IntegerField(choices=level_choices,verbose_name="难易程度")
def __str__(self):
return self.title
class CourseDetail(models.Model):
"""
课程详细表
"""
course = models.OneToOneField(to="Course",on_delete=models.CASCADE)
slogon = models.CharField(max_length=64,verbose_name="课程标语")
reason = models.CharField(max_length=255,verbose_name="学习理由") #学习理由
recommand_course = models.ManyToManyField(to="course",verbose_name="推荐课程",related_name="rc")
def __str__(self):
return "课程详细" + self.course.title
class Chapter(models.Model):
"""
章节
"""
num = models.IntegerField(verbose_name="章节")
name = models.CharField(max_length=32,verbose_name="章节名称")
course = models.ForeignKey(to="course",on_delete=models.CASCADE)
def __str__(self):
return self.num + self.name
ModelSerializers
from rest_framework.serializers import ModelSerializer
from rest_framework import serializers
from api import models
class CourseSerializers(ModelSerializer):
class Meta:
model = models.Course
fields = "__all__"
class CourseDetailSerializers(ModelSerializer):
#一对一/一对多字段
title = serializers.CharField(source='course.title')
img = serializers.CharField(source='course.img')
level = serializers.CharField(source='course.get_level_display')
#多对多字段
recommand = serializers.SerializerMethodField()
chapter = serializers.SerializerMethodField()
class Meta:
model = models.CourseDetail
fields = ["title","img","level","recommand","slogon","reason","chapter"] #depth = 0/1/2 可以根据深度把关联的表的信息也提取出来
def get_recommand(self,obj):
queryset = obj.recommand_course.all()
return [{"id":item.id,"title":item.title} for item in queryset]
def get_chapter(self,obj):
queryset = obj.course.chapter_set.all()
return [{"id":item.id,"name":item.name} for item in queryset]
添加数据:
class BookModelSerializers(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = "__all__"
publish = serializers.CharField(source="publish.name") #一对多字段
def create(self,validated_data): #重写create方法
book = models.Book.objects.create(title=validated_data["title"],price=validated_data["price"],pub_date=validated_data["pub_date"],publish_id=validated_data["publish"]["pk"])
book.authors.add(*validated_data["authors"])
return book
class BookView(APIView):
def get(self,request):
book_list = models.Book.objects.all()
ret = BookModelSerializers(book_list,many=True)
return Response(ret.data)
def post(self,request):
book_obj = BookModelSerializers(data=request.data)
if book_obj.is_valid():
book_obj.save()
return Response(book_obj.data)
else:
return HttpResponse(book_obj.errors)
二、视图
(1)
from rest_framework import mixins
from rest_framework import generics
class AuthorView(mixins.ListModelMixins, mixins.CreateModelMixins, generics.GenericAPIView):
queryset = models.Author.objects.all() #固定名称
serializers_class = AuthorModelSerializers #固定名称
def get(self,reqeust,*args,**kwargs): #查看所有数据
return self.list(reqeust,*args,**kwargs)
def post(self,reqeust,*args,**kwargs): #添加数据
return self.create(reqeust,*args,**kwargs)
class AuthorDetailView(mixins.RetrieveModelMixins,mixins.DestroyModelMixins,mixins.UpdateModelMixins,generics.GenericAPIView):
queryset = models.Author.objects.all()
serializers_class = AuthorModelSerializers
def get(self,reqeust,id,*args,**kwargs):
return self.retrieve(reqeust,id,*args,**kwargs)
def delete(self,reqeust,id,*args,**kwargs):
return self.destroy(reqeust,id,*args,**kwargs)
def put(self,reqeust,id,*args,**kwargs):
return self.update(reqeust,id,*args,**kwargs)
(2)
re_path(r'authors/(?P<pk>\d+)/$', views.AuthorModelView.as_view({"get":"list","post":"create"})),
re_path(r'author/(?P<pk>\d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}))
class AuthorModelView(viewsets.ModelViewSet):
queryset = models.Author.objects.all()
serializers_class = AuthorModelSerializers
三、登录验证
def get_random_str(user):
import hashlib,time
ctime=str(time.time())
md5=hashlib.md5(bytes(user,encoding="utf8"))
md5.update(bytes(ctime,encoding="utf8"))
return md5.hexdigest()
class LoginView(APIView):
def post(self,request):
name = request.data.get("name")
pwd = request.data.get("pwd")
user = models.User.objects.filter(name=name,pwd=pwd).first()
res = {"status_code":1000, "msg":None}
if user:
random_str = get_random_str(user.name)
token=models.Token.objects.update_or_create(user=user,defaults={"token":random_str})
res["token"] = random_str
else:
res["status_code"] = 1001
res["msg"] = "用户名或者密码错误"
import json
return Response(json.dumps(res,ensure_ascii=False))
三。认证组件
from rest_framework.authentication import BaseAuthentication
from rest_framework import exceptions
class TokenAuth(BaseAuthentication):
def authenticate(self,request):
token = request.GET.get("token")
token_obj = models.Token.objects.filter(token=token).first()
if token_obj:
return token_obj.user.name,token_obj.token //一个赋值给request.user,一个赋值给request.auth
else:
return exceptions.AuthenticationsFailed("验证失败")
class AuthorModelView(viewsets.ModelViewSet):
authentications_class = [TokenAuth,]
queryset = models.Author.objects.all()
serializers_class = AuthorModelSerializers
全局认证:
rest_framework = {
"DEFAULT_AUTHENTICATION_CLASSES": ["app01.views.TokenAuth"]
}
四、权限组件
class SVIPPermission(object):
message="只有超级用户才能访问"
def has_permission(self,request,view):
username=request.user
user_type=User.objects.filter(name=username).first().user_type
:
return True # 通过权限认证
else:
return False
class AuthorModelView(viewsets.ModelViewSet):
permission_classes=[SVIPPermission,]
全局权限:
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.TokenAuth",],
"DEFAULT_PERMISSION_CLASSES": ["app01.utils.SVIPPermission",],
}
五、频率组件
class VisitRateThrottle(object):
def allow_request(self,request):
# 要求访问站点的频率不能超过每分钟20次
if 1:
return True
else:
return False
class AuthorModelView(viewsets.ModelViewSet):
throttle_class = [VisitRateThrottle,]
六、解析器
七、url控制
八、响应器
九、渲染器
规定了页面的显示效果。
from rest_framework.renderer import JSONRenderer
from rest_framework.views import APIView
class Show(APIView):
renderer_classes = [JSONRenderer,] #只返回json字符串
十、版本
(1)在settings中配置
REST_FRAMEWORK = {
....
'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',
'ALLOWED_VERSIONS':['v1','v2'], # 允许的版本
'VERSION_PARAM':'version', # 参数
'DEFAULT_VERSION':'v1', # 默认版本
....
}
(2)设置路由
urlpatterns = [
#url(r'^admin/', admin.site.urls),
url(r'^api/(?P<version>\w+)/', include('api.urls')),
]
api/urls.py
urlpatterns = [
url(r'^course/$', course.CourseView.as_view()),
]
(3)获取
request.version
Django之restframework的更多相关文章
- Django 之 restframework 频率组件的使用
Django 之 restframework 频率组件的使用以及源码分析 频率组件的使用 第一步,先写一个频率类,继承SimpleRateThrottle 一定要在这个类里面配置一个scop='字符串 ...
- 【Django】 rest-framework和RestfulAPI的设计
[rest-framework] 这是一个基于django才能发挥作用的组件,专门用于构造API的. 说到API,之前在其他项目中我也做过一些小API,不过那些都是玩票性质,结构十分简单而且要求的设计 ...
- 通过django的rest-framework……(CBV)
为什么不使用FBV,因为CBV重用性很高 先看一个例子: from django.views.generic.base import View from django.http import Http ...
- django使用restframework实现安全的api
参考地址:https://github.com/tomchristie/django-rest-framework/ 一般如果在批量修改多的时候,不建议使用,一般在get请求,或者修改单条数据的时候使 ...
- django基于restframework的CBV封装
一.models数据库映射 from django.db import models # Create your models here. class Book(models.Model): titl ...
- django使用RestFramework的Token认证
今天实现的想法有点不正规: Django Rest framework的框架的认证,API都运行良好. 现在是要自己写一个function来实现用户的功能. 而不是用Rest 框架里的APIVIEW这 ...
- Django 之 restframework 版本控制的使用以及源码分析
Django rest_framework 之 版本控制 一.何为版本控制: 用于版本的控制 二.内置的版本控制类: from rest_framework.versioning import Q ...
- django使用restframework序列化查询集合(querryset)
第一: pip install djangorestframework 第二: 在setting.py文件中的app添加名为: 'rest_framework', 第三:再项目的APP下面新建名为(可 ...
- django的RestFramework模块的源码分析
一.APIView源码分析 查看源码的前提要知道,找函数方法必须先在自己的类中找,没有再往父类找,一层一层网上找,不能直接按ctrl点击 在我们自己定义的类中没有as_view方法的函数,所以肯定是继 ...
随机推荐
- 小程序第三方框架对比 ( wepy / mpvue / taro )(转)
文章转自 https://www.cnblogs.com/Smiled/p/9806781.html 众所周知如今市面上端的形态多种多样,手机Web.ReactNative.微信小程序, 支付宝小程 ...
- python小白——进阶之路——day3天-———容器类型数据+Number类型强制类型转换
-->Number 部分 int : 整型 浮点型 布尔类型 纯数字字符串 float: 整型 浮点型 布尔类型 纯数字字符串 complex: 整型 浮点型 布 ...
- adb.exe 已停止工作 解决
netstat -aon|findstr 5037tasklist /fi "PID eq 10388"TASKKILL /F /IM PPAdbServer.exe
- js 实现各浏览器全屏
现代浏览器包括ie11,可以直接用h5的全屏api实现 低版本的IE需要通过ActiveX插件实现: 代码实现 <!DOCTYPE html> <html> <head& ...
- Spring 简单使用IoC与DI——XML配置
目录 Spring简介 导入jar包 Spring配置文件 Spring的IoC IoC简介 快速使用IoC Spring创建对象的三种方式 使用构造方法 使用实例工厂 使用静态静态工厂 Spring ...
- Mac之日常操作
1.创建root用户使用最高权限 sudo passwd root 一般情况下,使用临时获取最高权限 sudo vim /etc/shells 2. apache操作 #启动Apache sudo a ...
- react 报错的堆栈处理
react报错 Warning: You cannot PUSH the same path using hash history 在Link上使用replace 原文地址https://reactt ...
- idea的一些好用的第三方插件
用了Idea真的回不去Eclipse了,安利一波. 这里记录一些好用的插件. GenerateAllSetter 这个插件是用在写代码的时候调用Setter的时候能一次性把实体类中的所有Setter方 ...
- MySQL之InnoDB数据页结构(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)
InnoDB为了不同的目的而设计了不同类型的页,我们把用于存放记录的页叫做数据页. 一个数据页可以被大致划分为7个部分,分别是 File Header,表示页的一些通用信息,占固定的38字节. Pag ...
- MySQL之 InnoDB记录结构(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)
以下内容来自掘金小册 MySQL 是怎样运行的:从根儿上理解 MySQL 版权归原作者所有! 页是MySQL中磁盘和内存交互的基本单位,也是MySQL是管理存储空间的基本单位. 指定和修改行格式的语法 ...