为什么不使用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. 浏览器执行代码 是jsp 服务端执行的是<%%>

    接着上一个视频,想使得注销页面有一个很好的效果,那到底能不能再首页页面的<head>标签里写如下代码呢? 答案是肯定不行的.看执行以后的效果,执行之后,看到的网页源代码,如下图所示,造成这 ...

  2. python3中的编码

    python2字符串编码存在的问题: 使用 ASCII 码作为默认编码方式,对中文处理不友好 把字符串分为 unicode 和 str 两种类型,将unicode作为唯一内码,误导开发者 python ...

  3. 【算法和数据结构】_14_小算法_Blank字符替换

    /* 本程序用来将输入的制表符替换为\t, 而将退格替换为\b, 将反斜杠替换为\\ */ #include <stdio.h> #include <stdlib.h> typ ...

  4. python3学习笔记五(列表2)

    参考http://www.runoob.com/python3/python3-list.html 嵌套列表 a = ['a','b','c']b = [1,2,3]x = [a, b]print(x ...

  5. 《企业IT架构转型之道》读书笔记

    1 出发点:企业IT系统建设普遍面临的问题和处境 很多企业面临的问题和处境: 『烟囱式』系统建设模式. 当业务部门提出业务需求,信息中心部门进行系统集成商的招投标,再进入到需求收集.需求分析.开发.测 ...

  6. Python的Django

    1   第一部分目录详解 修改django的项目当中的url中的配置: from django.contrib import admin from django.conf.urls import ur ...

  7. C++Primer第五版——习题答案详解(二)

    习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第3章 字符串.向量和数组 练习3.2 一次读入一整行 #include<iost ...

  8. [UE4]Retainer Box

    把子元素的内容渲染到一个Render Target上去,然后放把它放置到到屏幕上去. Retainer Box的作用: 1.控制UI更新频率 2.把渲染后的UI当成Texture,放入材质中,加工后, ...

  9. JavaWeb——XML转义符字

    被<![CDATA[]]>这个标记所包含的内容将表示为纯文本,比如<![CDATA[<]]>表示文本内容“<”.  此标记用于xml文档中,我们先来看看使用转义符的 ...

  10. python常见循环练习

    第一题:求5的阶乘 # 方法1,递归 def jc(num): if num == 1: return 1 else: return num*jc(num-1) print(jc(5)) # 方法2, ...