序列化组件

创建一个序列化类,

视图四种方式

以下代码都需要创建一个serializers.py文件

  1. from rest_framework import serializers
  2.  
  3. from CBV_app.models import *
  4. from CBV_app.urls import *
  5.  
  6. class PublishSerializers(serializers.ModelSerializer):
  7. class Meta:
  8. model = Publish
  9. # 排除id不显示,其余全部显示
  10. exclude =("id", )
  11.  
  12. class AuthorSerializers(serializers.ModelSerializer):
  13. class Meta:
  14. model = Author
  15. fields = "__all__"
  16.  
  17. class BookSerializers(serializers.ModelSerializer):
  18. class Meta:
  19. model=Book
  20. fields="__all__"

urls除了方式四以外通用这种格式

  • 这里必须得使用pk关键字参数,因为源码部分取的是pk值,如果不使用pk则找不到

方式一

  • views.py
  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from CBV_app import models
  4. from CBV_app.serializers import PublishSerializers,AuthorSerializers,BookSerializers
  5. class PublishViews(APIView):
  6. # 查看所有数据
  7. def get(self, request):
  8. publish_all = models.Publish.objects.all()
  9. # 使用Django自带的序列化组件
  10. # 发送给前端的为json格式的数据,需要前端自己反序列化
  11. # from django.core.serializers import serialize
  12. #
  13. # res = serialize("json", publish_all)
  14. #
  15. # return HttpResponse(res)
  16.  
  17. # 使用rest序列化, many=True 返回的是QuerySet对象
  18. ps = PublishSerializers(publish_all, many=True)
  19.  
  20. # ps.data序列化数据
  21. return Response(ps.data)
  22.  
  23. # 添加数据
  24. def post(self, request):
  25. print(
  26. request.data
  27. )
  28. ps = PublishSerializers(data=request.data)
  29. # 检验数据有效性
  30. if ps.is_valid():
  31. ps.save()
  32. return Response(ps.data)
  33. else:
  34. # 如果数据有错误则将错误返回
  35. return Response(ps.errors)
  36.  
  37. class PublishDatailViews(APIView):
  38.  
  39. # 查看局部数据
  40. def get(self, request, pk):
  41. publish = models.Publish.objects.filter(pk=pk).first()
  42. ps = PublishSerializers(publish, many=False)
  43. return Response(ps.data)
  44.  
  45. # 修改数据
  46. def put(self, request, pk):
  47. publish = models.Publish.objects.filter(pk=pk).first()
  48. ps = PublishSerializers(data=request.data, instance=publish)
  49. if ps.is_valid():
  50. ps.save()
  51. return Response(ps.data)
  52. else:
  53. return Response(ps.errors)
  54.  
  55. def delete(self, request, pk):
  56. publish = models.Publish.objects.filter(pk=pk).delete()
  57. return Response("OK")

方式二 使用混合(mixins)

  • 首先需要导入五种请求方式

  1. ListModelMixin 获取所有数据 GETCreateModelMixin 添加一条数据 POST----------------------------------------RetrieveModelMixin 查看一条数据 GETUpdateModelMixin 更新一条数据 PUT/PATCHDestroyModelMixin 删除一条数据 delete
  • 接着导入专门处理数据的模块
  1. from rest_framework.generics import GenericAPIView
  1. # 导入五种请求方式
  2. from rest_framework.mixins import CreateModelMixin, ListModelMixin, \
  3. DestroyModelMixin, RetrieveModelMixin, UpdateModelMixin
  4.  
  5. # 导入处理数据
  6. from rest_framework.generics import GenericAPIView
  7.  
  8. class AuthorView(CreateModelMixin, ListModelMixin, GenericAPIView):
  9. # 必须得以queryset ,serializer_class命名接收这两个参数,覆盖父类
  10. queryset = models.Author.objects.all()
  11. serializer_class = AuthorSerializers
  12.  
  13. def get(self, request):
  14. # 调用ListModelMixin下的list方法
  15. return self.list(request)
  16.  
  17. def post(self, request):
  18. return self.create(request)
  19.  
  20. class AuthorDetailView(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):
  21. queryset = models.Author.objects.all()
  22. serializer_class = AuthorSerializers
  23.  
  24. def get(self, request, *args, **kwargs):
  25. return self.retrieve(request, *args, **kwargs)
  26.  
  27. def put(self, request, *args, **kwargs):
  28. return self.update(request, *args, **kwargs)
  29.  
  30. def delete(self, request, *args, **kwargs):
  31. return self.destroy(request, *args, **kwargs)

方式三 使用通用的基于类的视图

通过使用mixin类,我们使用更少的代码重写了这些视图,但我们还可以再进一步。REST框架提供了一组已经混合好(mixed-in)的通用视图,我们可以使用它来简化我们的views.py模块。

  1. from rest_framework import generics
  2.  
  3. class BookView(generics.ListCreateAPIView):
  4.  
  5. queryset = models.Book.objects.all()
  6. serializer_class = BookSerializers
  7.  
  8. class BookDetailView(generics.ListCreateAPIView):
  9.  
  10. queryset = models.Book.objects.all()
  11. serializer_class = BookSerializers

方式四

需要修改url并在url中传入参数修改请求方式调用的方法

  • urls.py
  1. url(r"^book/$", views.BookView.as_view({"get":"list", "post": "create"})),
  2. url(r"^book/(?P<pk>\d+)/$", views.BookDetailView.as_view({"get": "retrieve", "put": "update", "delete": "destroy"})),
  • views.py
  1. from rest_framework.viewsets import ModelViewSet
  2.  
  3. class BookView(ModelViewSet):
  4.  
  5. queryset = models.Book.objects.all()
  6. serializer_class = BookSerializers
  7.  
  8. class BookDetailView(ModelViewSet):
  9.  
  10. queryset = models.Book.objects.all()
  11. serializer_class = BookSerializers

认证组件

在app下新建一个包,在里面创建一个auth.py文件

  1. # 认证组件
  2. from rest_framework.authentication import BaseAuthentication
  3.  
  4. from rest_framework.exceptions import AuthenticationFailed # 返回报错页面
  5.  
  6. from CBV_app import models
  7.  
  8. class TokenAuth(BaseAuthentication):
  9. # 这里必须要使用authenticate定义一个函数,源码内部调用的就是这个名字
  10. def authenticate(self, request):
  11. # 获取用户传来的token参数
  12. token = request.GET.get("token", None)
  13. token_obj = models.UserToken.objects.filter(token=token).first()
  14. if token_obj:
  15. # 返回用户对象跟token_obj
  16. return token_obj.user, token_obj.token
  17. else:
  18. raise AuthenticationFailed("认证失败")

在views.py中创建一个登陆验证类

  • 如果在settings.py中设置了全局验证,则需要在登陆中添加: authentication_classes = []
  • 如果需要指定某一个需要登陆则在某一个类下添加authentication_classes = [TokenAuth,]
  1. # 获取随机字符串
  2. def get_random(user):
  3. import hashlib, time
  4. time_str = str(time.time())
  5.  
  6. md5 = hashlib.md5(bytes(user, encoding="utf8"))
  7. md5.update(bytes(time_str, encoding="utf8"))
  8.  
  9. return md5.hexdigest()
  10.  
  11. # 定义一个认证类
  12. from rest_framework.views import APIView
  13. from django.http.response import JsonResponse
  14. from CBV_app import models
  15. class LoginView(APIView):
  16. authentication_classes = []
  17. def post(self, request):
  18. res = {"code": 1000, "msg": None}
  19. try:
  20. user = request.data.get("user")
  21. pwd = request.data.get("pwd")
  22. user_obj = models.User.objects.filter(user=user, pwd=pwd).first()
  23. print(user, pwd, user_obj)
  24. if not user_obj:
  25. res["code"] = 1001
  26. res["msg"] = "用户名或密码错误"
  27. else:
  28. token = get_random(user)
  29. # 存在着更新,不存在则创建,需要使用defaults传如token否则会报约束失败
  30. models.UserToken.objects.update_or_create(user=user_obj, defaults={"token": token)
  31. res["token"] = token
  32. except Exception as e:
  33. res["code"] = 1002
  34. res["msg"] = str(e)
  35. return JsonResponse(res, json_dumps_params={"ensure_ascii": False})

settings.py中配置全局作用

  1. REST_FRAMEWORK = {
  2. "DEFAULT_AUTHENTICATION_CLASSES": [
  3. "CBV_app.utils.auth.TokenAuth"
  4. ],
  5. }

局部使用

  • 在需要验证的视图类中添加   authentication_classes = [TokenAuth, ]

  1.  

权限组件

在app下新建一个包,在里面创建一个Permissions.py文件

  1. class SvipPermissions(object):
  2. # 没有权限时返回的提示,必须以message命名
  3. message ="没有权限访问"
  4. # 必须定义has_permissio方法
  5.  
  6. def has_permission(self, request, view):
  7. print(request.auth.user)
  8. user_type = request.auth.user.type
  9. if user_type == 1:
  10. return True
  11. else:
  12. return False

局部引用权限

  • 在views.py中导入  from CBV_app.utils.permissions import SvipPermissions

全局引用权限

  • 在settings.py中添加
  1. REST_FRAMEWORK = {
  2. "DEFAULT_PERMISSION_CLASSES":[
  3. "app01.utils.permissions.SVIPPermission"]
  4. }

访问频率(throttle)组件

url分发

  1. from django.conf.urls import include
  2. from rest_framework import routers
  3.  
  4. routes = routers.DefaultRouter()
  5. routes.register("publishes",views.PublishViews)
  6.  
  7. urlpatterns = [
  8. url(r'^admin/', admin.site.urls),
  9. url(r'^',include(routes.urls)) # 直接将url改成这种匹配方式即可
  10.  
  11. ]

响应器

    1. JSONRenderer 返回的是json格式的数据页面.
    1. BrowsableAPIRenderer
  • 默认是两个都添加在里面,可以设置为全局也可设置为局部

全局设置

  • 在settings.py中添加下面字典,参数可选
  1. REST_FRAMEWORK = {
  2. 'DEFAULT_RENDERER_CLASSES': (
  3. 'rest_framework.renderers.JSONRenderer',
  4. 'rest_framework.renderers.BrowsableAPIRenderer',
  5. ),
  6. }

局部设置

  1. from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
  2.  
  3. class PublishViews(ModelViewSet):
  4.  
  5. renderer_classes = [BrowsableAPIRenderer]
  6.  
  7. queryset = models.Publish.objects.all()
  8. serializer_class = PublishSerializers

分页器

rest-framework框架组件的更多相关文章

  1. ASP.NET之.NET FrameWork框架

    .NET FrameWork框架 是一套应用程序开发框架,主要目的提供一个开发模型. 主要的两个组件: 公共语言运行时(Common Language Runtime)(CLR): 提供内存管理.线 ...

  2. Django_rest framework 框架介绍

    restful介绍  restful协议 一切皆是资源,操作只是请求方式 URL 设计 原先的URL设计方式 在url 中体现出操作行为 /books/ books /books/add/ addbo ...

  3. Django Rest framework 框架之认证使用和源码执行流程

    用这个框架需要先安装: pip3 install djangorestframework 如果写了一个CBV的东西,继承了View. # 继承Django里面View class APIView(Vi ...

  4. Django之Rest Framework框架

    一.什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度 ...

  5. Django----Rest Framework框架

    Django Rest Framework框架(10) - RESTful规范 1.API与用户的通信协议,总是使用HTTPs协议. 2.域名 https://api.example.com 尽量将A ...

  6. rest framework认证组件和django自带csrf组件区别详解

    使用 Django 中的 csrf 处理 Django中有一个django.middleware.csrf.CsrfViewMiddleware中间件提供了全局的csrf检查.它的原理是在<fo ...

  7. 小程序-文章:微信小程序常见的UI框架/组件库总结

    ylbtech-小程序-文章:微信小程序常见的UI框架/组件库总结 1.返回顶部 1. 想要开发出一套高质量的小程序,运用框架,组件库是省时省力省心必不可少一部分,随着小程序日渐火爆,各种不同类型的小 ...

  8. 微信小程序常见的UI框架/组件库总结

    想要开发出一套高质量的小程序,运用框架,组件库是省时省力省心必不可少一部分,随着小程序日渐火爆,各种不同类型的小程序也渐渐更新,其中不乏一些优秀好用的框架/组件库. 1:WeUI 小程序–使用教程 h ...

  9. .NET6 平台系列2 .NET Framework框架详解

    系列目录     [已更新最新开发文章,点击查看详细] 什么是 .NET Framework? .NET Framework 是 Windows 的托管执行环境,可为其运行的应用提供各种服务. 它包括 ...

  10. .Net 初步学习笔记之一——.Net 平台与.Net FrameWork框架的关系

    .Net 包含两部分 .Net平台 和.Net FrameWork 框架 1..Net FrameWork框架包含于.Net平台. .Net FrameWork提供环境和支撑保证.Net平台运行. 2 ...

随机推荐

  1. Python获取服务器的厂商和型号信息-乾颐堂

    Python获取服务器的厂商和型号信息,在RHEHL6下,需要系统预装python-dmidecode这个包(貌似默认就已经装过了) 脚本内容如下 [root@linuxidc tmp]# cat t ...

  2. Python正则表达式的七个使用范例-乾颐堂

    作为一个概念而言,正则表达式对于Python来说并不是独有的.但是,Python中的正则表达式在实际使用过程中还是有一些细小的差别. 本文是一系列关于Python正则表达式文章的其中一部分.在这个系列 ...

  3. VC6.0 中 添加/取消 块注释的Macro代码

    SAMPLE.DSM是微软提供的样例,使用的是vb语言.其中的 CommentOut 函数,是支持块注释的,可是这种/**/的注释方式,有时候用起来不是很方便,因为两个/会因为一个/而终止.对于大块代 ...

  4. [operator]ELK6 index pattern的问题

    完成了EL/FK的搭建之后,在kibana的主页只能看到默认的索引? 其实这个索引名字的设置是在logstash-smaple.conf(elk6.4)里的设置,比如我这样设置 input { bea ...

  5. [GO]方法集

    指针变量的方法集 package main import "fmt" type Person struct { name string sex byte age int } fun ...

  6. Centos6 hadoop2.6.0安装笔记

    系统环境: linux:Centos6-64bit hadoop:hadoop2.6.0 jdk:1.6.45 集群方式安装 一台master,3台slave master 192.168.111.1 ...

  7. 老司机带你玩Spring.Net -入门篇

    网上有 Spring.Net 的相关的很多介绍的文章还有实践例子,推荐个还不错的博客 Spring.Net 学习笔记 .以前对 Spring.Net 算是有过一面之缘,但却迟迟未真正相识.在网上有太多 ...

  8. List of HTTP header fields

    https://en.wikipedia.org/wiki/List_of_HTTP_header_fields Content-Type The MIME type of the body of t ...

  9. ubuntu eclipse 集成pyDev

    Eclipse help 选择安装新软件 添加一个pydev 名字随意.地址是 http://pydev.org/updates. 下面的列表会出现很多PyDev For Eclipse 选择版本最高 ...

  10. [Erlang10]为什么热更新时,Shell执行2次l(Module)后会把原来用到Module的进程 kill?

    0. 问题引入: -module(hot_code_server). -compile(export_all). start() –> erlang:register(?MODULE, erla ...