序列化组件

创建一个序列化类,

视图四种方式

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

from rest_framework import serializers

from CBV_app.models import *
from CBV_app.urls import  *

class PublishSerializers(serializers.ModelSerializer):
    class Meta:
        model = Publish
        # 排除id不显示,其余全部显示
        exclude =("id", )

class AuthorSerializers(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = "__all__"

class BookSerializers(serializers.ModelSerializer):
    class Meta:
        model=Book
        fields="__all__"

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

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

方式一

  • views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from CBV_app import models
from CBV_app.serializers import PublishSerializers,AuthorSerializers,BookSerializers
class PublishViews(APIView):
    # 查看所有数据
    def get(self, request):
        publish_all = models.Publish.objects.all()
        # 使用Django自带的序列化组件
        # 发送给前端的为json格式的数据,需要前端自己反序列化
        # from django.core.serializers import serialize
        #
        # res = serialize("json", publish_all)
        #
        # return HttpResponse(res)

        # 使用rest序列化, many=True 返回的是QuerySet对象
        ps = PublishSerializers(publish_all, many=True)

        # ps.data序列化数据
        return Response(ps.data)

    # 添加数据
    def post(self, request):
        print(
            request.data
        )
        ps = PublishSerializers(data=request.data)
        # 检验数据有效性
        if ps.is_valid():
            ps.save()
            return Response(ps.data)
        else:
            # 如果数据有错误则将错误返回
            return Response(ps.errors)

class PublishDatailViews(APIView):

    # 查看局部数据
    def get(self, request, pk):
        publish = models.Publish.objects.filter(pk=pk).first()
        ps = PublishSerializers(publish, many=False)
        return Response(ps.data)

    # 修改数据
    def put(self, request, pk):
        publish = models.Publish.objects.filter(pk=pk).first()
        ps = PublishSerializers(data=request.data, instance=publish)
        if ps.is_valid():
            ps.save()
            return Response(ps.data)
        else:
            return Response(ps.errors)

    def delete(self, request, pk):
        publish = models.Publish.objects.filter(pk=pk).delete()
        return Response("OK")

方式二 使用混合(mixins)

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

ListModelMixin          获取所有数据 GETCreateModelMixin        添加一条数据 POST----------------------------------------RetrieveModelMixin      查看一条数据 GETUpdateModelMixin        更新一条数据 PUT/PATCHDestroyModelMixin       删除一条数据 delete
  • 接着导入专门处理数据的模块
from rest_framework.generics import GenericAPIView
# 导入五种请求方式
from rest_framework.mixins import CreateModelMixin, ListModelMixin, \
    DestroyModelMixin, RetrieveModelMixin, UpdateModelMixin

# 导入处理数据
from rest_framework.generics import GenericAPIView

class AuthorView(CreateModelMixin, ListModelMixin, GenericAPIView):
    # 必须得以queryset ,serializer_class命名接收这两个参数,覆盖父类
    queryset = models.Author.objects.all()
    serializer_class = AuthorSerializers

    def get(self, request):
        # 调用ListModelMixin下的list方法
        return self.list(request)

    def post(self, request):
        return self.create(request)

class AuthorDetailView(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):
    queryset = models.Author.objects.all()
    serializer_class = AuthorSerializers

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

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

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

from rest_framework import generics

class BookView(generics.ListCreateAPIView):

    queryset = models.Book.objects.all()
    serializer_class = BookSerializers

class BookDetailView(generics.ListCreateAPIView):

    queryset = models.Book.objects.all()
    serializer_class = BookSerializers

方式四

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

  • urls.py
    url(r"^book/$", views.BookView.as_view({"get":"list", "post": "create"})),
    url(r"^book/(?P<pk>\d+)/$", views.BookDetailView.as_view({"get": "retrieve", "put": "update", "delete": "destroy"})),
  • views.py
from rest_framework.viewsets import ModelViewSet

class BookView(ModelViewSet):

    queryset = models.Book.objects.all()
    serializer_class = BookSerializers

class BookDetailView(ModelViewSet):

    queryset = models.Book.objects.all()
    serializer_class = BookSerializers

认证组件

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

# 认证组件
from rest_framework.authentication import BaseAuthentication

from rest_framework.exceptions import AuthenticationFailed  # 返回报错页面

from CBV_app import models

class TokenAuth(BaseAuthentication):
    # 这里必须要使用authenticate定义一个函数,源码内部调用的就是这个名字
    def authenticate(self, request):
        # 获取用户传来的token参数
        token = request.GET.get("token", None)
        token_obj = models.UserToken.objects.filter(token=token).first()
        if token_obj:
            # 返回用户对象跟token_obj
            return token_obj.user, token_obj.token
        else:
            raise AuthenticationFailed("认证失败")

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

  • 如果在settings.py中设置了全局验证,则需要在登陆中添加: authentication_classes = []
  • 如果需要指定某一个需要登陆则在某一个类下添加authentication_classes = [TokenAuth,]
# 获取随机字符串
def get_random(user):
    import hashlib, time
    time_str = str(time.time())

    md5 = hashlib.md5(bytes(user, encoding="utf8"))
    md5.update(bytes(time_str, encoding="utf8"))

    return md5.hexdigest()

# 定义一个认证类
from rest_framework.views import APIView
from django.http.response import JsonResponse
from CBV_app import models
class LoginView(APIView):
    authentication_classes = []
    def post(self, request):
        res = {"code": 1000, "msg": None}
        try:
            user = request.data.get("user")
            pwd = request.data.get("pwd")
            user_obj = models.User.objects.filter(user=user, pwd=pwd).first()
            print(user, pwd, user_obj)
            if not user_obj:
                res["code"] = 1001
                res["msg"] = "用户名或密码错误"
            else:
                token = get_random(user)
                # 存在着更新,不存在则创建,需要使用defaults传如token否则会报约束失败
                models.UserToken.objects.update_or_create(user=user_obj, defaults={"token": token)
                res["token"] = token
        except Exception as e:
            res["code"] = 1002
            res["msg"] = str(e)
        return JsonResponse(res, json_dumps_params={"ensure_ascii": False})

settings.py中配置全局作用

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": [
        "CBV_app.utils.auth.TokenAuth"
    ],
}

局部使用

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


权限组件

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

class SvipPermissions(object):
    # 没有权限时返回的提示,必须以message命名
    message ="没有权限访问"
    # 必须定义has_permissio方法

    def has_permission(self, request, view):
        print(request.auth.user)
        user_type = request.auth.user.type
        if user_type == 1:
            return True
        else:
            return False

局部引用权限

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

全局引用权限

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

访问频率(throttle)组件

url分发

from django.conf.urls import include
from rest_framework import routers

routes = routers.DefaultRouter()
routes.register("publishes",views.PublishViews)

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^',include(routes.urls))   # 直接将url改成这种匹配方式即可

]

响应器

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

全局设置

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

局部设置

from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer

class PublishViews(ModelViewSet):

    renderer_classes = [BrowsableAPIRenderer]

    queryset = models.Publish.objects.all()
    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. 原型设计工具Mockplus新年送福利,见者有份

    为感谢大家对Mockplus的喜爱与支持,给大家送福利了! 送送送,见者有份! 参与活动,三分钟时间,均可最高获赠专业版1个月使用时间.见者有份! 领福利步骤: 1. 扫码关注微信公众号:Mockpl ...

  2. servlet中如何发送ajax请求并动态拼接数据到html中

    废话不多说,直接上代码 1.servlet 2.js 3.jsp 有不懂得欢迎来扣我哦^_^ 详细介绍请查看全文:https://cnblogs.com/qianzf/ 原文博客的链接地址:https ...

  3. up7.1-asp.net-本地测试教程

    1.1. ASP.NET 框架:.NET Framework 4.5 依赖库:csredis,Newtonsoft.Json   安装redis 下载 redis-x64:http://pan.bai ...

  4. ZooKeeper-3.4.10分布式安装指南

    目录 目录 1 1. 前言 1 2. 约定 1 3. 安装步骤 2 3.1. 配置/etc/hosts 2 3.2. 设置myid 2 3.3. 修改conf/zoo.cfg 2 3.4. 修改/bi ...

  5. 分布式缓存系统Memcached简介与以及在.net下的实践(转)

    缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵 ...

  6. XJOI 3578 排列交换/AtCoder beginner contest 097D equal (并查集)

    题目描述: 你有一个1到N的排列P1,P2,P3...PN,还有M对数(x1,y1),(x2,y2),....,(xM,yM),现在你可以选取任意对数,每对数可以选取任意次,然后对选择的某对数(xi, ...

  7. Vue.js的库,包,资源的列表大全。

    官方资源 外部资源 社区 播客 官方示例 入门 开发工具 语法高亮 代码片段 自动补全 组件集合 库和插件 路由 ajax/数据 状态管理 校验 UI组件 i18n 示例 模板 脚手架 整合 插件/指 ...

  8. 新入门PGSQL数据库(尝试利用PGPOOL实现分布式),摘录笔记

    概念: PostgreSQL (pronounced "post-gress-Q-L") is an open source relational database managem ...

  9. How to:Aborting a long running task in TPL

    http://social.msdn.microsoft.com/Forums/vstudio/en-US/d0bcb415-fb1e-42e4-90f8-c43a088537fb/aborting- ...

  10. Android ActionBar使用方法

    对于这ActionBar我想很多人都想了解一下到底是怎么一个使用方法,以及它都存在哪些可操作的和使用的地方.如下图所示:<ignore_js_op> 这便是ActionBar的基本内容.获 ...