为什么不使用FBV,因为CBV重用性很高

先看一个例子:

from django.views.generic.base import View
from django.http import HttpResponse, JsonResponse
from goods.models import Goods
import json
# from django.views.generic import ListView class GoodsListView(View):
def get(self, request):
"""
通过django的view实现商品列表页
:param request:
:return:
"""
json_list = []
goods = Goods.objects.all()[:10]
for good in goods:
json_dict = {}
json_dict["name"] = good.name
json_dict["category"] = good.category.name
json_dict["market_price"] = good.market_price
json_dict["add_time"] = good.add_time
json_list.append(json_dict)
return HttpResponse(json.dumps(json_list), content_type='application/json') # 使用HTTPResponse返回json数据,必须指定content_type

通过上面我们可以看到的是先从django中引入View类,之后通过json的方式返回。这似乎没有问题,只要去掉add_time

如果json序列化中有时间类型的话,JSON就会失败,运行就会报错:

去掉之后返回也必须指定content_type=‘application/json’。而且不好的地方还有比如写那么多字段容易写错等

那如何解决呢?

        from django.forms.models import model_to_dict  # django提供的方法将所有字段变成一个dict
for good in goods:
json_dict = model_to_dict(good)
json_list.append(json_dict)

但是图片啊时间类型都没办法序列化?那该如何?

from django.core import serializers

django提供的这个模块是专门用来实现序列化的

        import json
from django.core import serializers
json_data = serializers.serialize('json', goods) # 这个直接传入questset
json_data = json.loads(json_data)
from django.http import HttpResponse, JsonResponse
return JsonResponse(json_data, safe=False)

通过这个代码可以完成上面所有的工作。①取到所有字段②可以序列化所有③不用一个一个写

整体如下:

from django.views.generic.base import View

from goods.models import Goods
# from django.views.generic import ListView class GoodsListView(View):
def get(self, request):
"""
通过django的view实现商品列表页
:param request:
:return:
"""
json_list = []
goods = Goods.objects.all()[:10]
# for good in goods:
# json_dict = {}
# json_dict["name"] = good.name
# json_dict["category"] = good.category.name
# json_dict["market_price"] = good.market_price
# json_dict["add_time"] = good.add_time
# json_list.append(json_dict) from django.forms.models import model_to_dict # django提供的方法将所有字段变成一个dict
for good in goods:
json_dict = model_to_dict(good)
json_list.append(json_dict) import json
from django.core import serializers
json_data = serializers.serialize('json', goods) # 这个直接传入questset
json_data = json.loads(json_data)
from django.http import HttpResponse, JsonResponse
return JsonResponse(json_data, safe=False)

django-rest-framework名称太长了,下面检查drf

首先是安装官方文档中的安装

值得注意的是要想drf生成文档,必须在django的url配置

from rest_framework.documentation import include_docs_urls
urlpatterns = [
url(r'docs/', include_docs_urls(title="文档")),]

注意,千万不要在docs后面加上$,名称可以随意命名!

然后将rest-framework配置到settings中

INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users.apps.UsersConfig',
'DjangoUeditor',
'goods.apps.GoodsConfig',
'trade.apps.TradeConfig',
'user_operation.apps.UserOperationConfig',
'crispy_forms',
'django_filters',
'xadmin',
'rest_framework', # 一定要配置,不然会报错
'corsheaders',
'rest_framework.authtoken'
]

在一步一步跟着官方文档进行

这个在后期调试API的时候会用到的

url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),

在这边给他加了一个命名空间,方便反向查询。

看一个例子:

1,首先像Form组件一样新建一个py文件

# -*- coding:UTF-8 -*-
__autor__ = 'zhouli'
__date__ = '2018/12/6 23:19' from rest_framework import serializers class GoodsSerializer(serializers.Serializer): # 针对Goods的字段,类似Form组件,类名规则为models表名+Serializer
name = serializers.CharField(required=True, max_length=100) # 是否必须
click_num = serializers.IntegerField(default=0)

因为Goods表中字段过多,因此只去两个做示范

是不是和Form组件非常像!

但需要注意的是:

1,类的命名必须是models中写的表名+Serializer

2,对于字段的调用可以随意安排,不必要全部写入(当然展示的也仅仅是这两个字段)

第二步:

from .serializers import GoodsSerializer
from .models import Goods
from rest_framework.views import APIView
from rest_framework.response import Response
class GoodsViews(APIView):
def get(self, request, format=None):
goods = Goods.objects.all()[:10]
goods_json = GoodsSerializer(goods, many=True) # 如果goods只是单个queryset的话,便可不必加many=True
return Response(goods_json.data) # 参数data就是完成之后的存储地方

在django的视图函数中写入判断逻辑,注意点:

1,如果从数据库中取到只是单个queryset的话,便可不必加many=True

2,通过Serializer中的data可以获取到处理之后的Json内容

然后自己配置url便可实现简单的访问

通过django的rest-framework……(CBV)的更多相关文章

  1. Django之REST framework源码分析

    前言: Django REST framework,是1个基于Django搭建 REST风格API的框架: 1.什么是API呢? API就是访问即可获取数据的url地址,下面是一个最简单的 Djang ...

  2. django的rest framework框架——安装及基本使用

    一.django的FBV 和 CBV 1.FBV(基于函数的视图): urlpatterns = [ url(r'^users/', views.users), ] def users(request ...

  3. Django’s cache framework

    小结: 1.缓存存储位置:数据库.文件系统.内存 2.通过缓存前缀实现跨服务器缓存 Django’s cache framework | Django documentation | Django h ...

  4. Python学习---django知识补充之CBV

    Django知识补充之CBV Django: url    -->  def函数      FBV[function based view]  用函数和URL进行匹配 url    --> ...

  5. Django 反向解析 request CBV

    正则路径中的分组 无名分组 分组的概念:就是给某一段正则表达式用小括号括起来 无名分组按位置传参数,一一对应. view中除去request,其他形参数量要与urls中分组数量一致. 无名分组就是将括 ...

  6. Django基础七之CBV装饰器和中间件

    Django基础七之CBV装饰器和中间件 目录 Django基础七之CBV装饰器和中间件 1. CBV加装饰器 2. Django中间件 2.1 Django中间件介绍 2.2 自定义中间件 2.2. ...

  7. Django之Rest Framework框架

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

  8. django的FBV和CBV

    title: python djano CBV FBV tags: python, djano, CBV, FBV grammar_cjkRuby: true --- python django的fu ...

  9. Django生命周期 URL ----> CBV 源码解析-------------- 及rest_framework APIView 源码流程解析

    一.一个请求来到Django 的生命周期   FBV 不讨论 CBV: 请求被代理转发到uwsgi: 开始Django的流程: 首先经过中间件process_request (session等) 然后 ...

  10. django基于restframework的CBV封装

    一.models数据库映射 from django.db import models # Create your models here. class Book(models.Model): titl ...

随机推荐

  1. python------Socket网络编程(二)粘包问题

    一.socket网络编程 粘包:服务端两次发送指令在一起,它会把两次发送内容合在一起发送,称为粘包,从而出现错误. 解决方法:(比较low的方法) 有些需要实时更新的,用sleep有延迟,不能这样解决 ...

  2. python __name__ 和__main__的使用领悟

    __name__和__main__的使用 #hello.pydef sayHello(): str="hello" print(str); if __name__ == " ...

  3. SharpDevelope 在 Windows 7 SP1 with .net framework4.0 下编译时找不到resgen.exe 解决办法

    如果在vs下编译正常,在SharpDevelope下编译报这个错误,可以更改编译时的.netframework版本和C#版本.在 Tool->Project Upgrade 进行项目转换后,一般 ...

  4. 策略模式(Strategy )

    为实现一个目的采用不同的方式都可实现,具体看要采取哪种方式. //接口 public interface Strategy {    public void algorithmInterface(); ...

  5. Hi3516EV100烧录出厂固件

    1.Hitool烧录uboot 2.uboot下烧录固件 setenv serverip 192.168.1.138 mw.b ff ;tftp ;sf probe ;sf erase ;sf wri ...

  6. nodeppt:网页版 PPT

    资料 网址 github https://github.com/ksky521/nodeppt 网页版PPT(nodeppt 的介绍) http://deliazhi.com/2017/03/31/W ...

  7. react-native 获取组件的宽度和高度

    react-native 获取组件的尺寸有两种方式,第一种方式使用元素自身的onLayout属性去获取,但是这种方式有一个局限性,就是只有在初次渲染的时候才会触发这个函数,而且此种方法获取的是组件相对 ...

  8. Windows下,python pip安装时ReadTimeoutError解决办法

    一般情况下PIP出现ReadTimeoutError都是因为被GFW给墙了,所以一般遇到这种问题,我们可以选择国内的镜像来解决问题. 在Windows下: C:\Users\Administrator ...

  9. 4、Zookeeper简单介绍

    一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术 主要用来解决分布式环境当中多个进程之间的 ...

  10. 使用睿云智合开源 Breeze 工具部署 Kubernetes v1.12.3 高可用集群

    一.Breeze简介 Breeze 项目是深圳睿云智合所开源的Kubernetes 图形化部署工具,大大简化了Kubernetes 部署的步骤,其最大亮点在于支持全离线环境的部署,且不需要FQ获取 G ...