vue组件和drf使用序列化定义

 

 

组件

'''
1.根组件:new Vue()创建的组件,一般不明确自身的模板,模板就采用挂载点
2.局部组件: local_component = {}
2.全局组件: Vue.component({})
'''
​
'''
1.一个组件就是一个vue实例
2.组件具有自身的template
3.组件的模板只能有一个根标签
4.子组件的data具有作用域,以达到组件的复用,每个组件的数据独有
'''

变量什么的关键字

'''
没有关键字:全局作用域
var:没有块级,有局部作用域
let:有块级,有局部作用域
const:有块级,有局部作用域,是常量
'''

 

局部组件

第三步
<div id="app">
    <!--html代码不区分大小写,该名字使用子组件是不合法的命名-->
    <!--<localTag></localTag>-->
    <!--<local></local>-->
​
    <!--组件的复用-->
    <local-tag></local-tag>
    <local-tag></local-tag>
</div>
​
​
<script>
    第一步
    var localTag = {
        template: '<div class="local" style="color: orange" @click="btnAction">{{ name }}组件</div>',
        // 子组件的数据与方法由子组件自身提供
        data: function () {
            return {
                name: '局部'
            }
        },
        methods: {
            btnAction: function () {
                alert('你丫点我了')
            }
        }
    };
    
    第二步
    new Vue({
        el: "#app",
        components: {
            // local: localTag
            // 'local-tag':localTag
            // localTag: localTag,
            // 1.js的驼峰命名(localTag)对应的是html的连接命名(local-tag)
            // 2.key与value的变量名一致,可以简写
            localTag
        }
    });
</script>

全局组件

<div id="app">
    <global-tag></global-tag>
    <global-tag></global-tag>
</div>
<script>
    Vue.component('global-tag', {
        template: '<div @click="btnClick">{{ name }}组件被点了{{ n }}下</div>',
        // 组件被复用一次,就会产生一个新的局部作用域,使用一套数据
        data: function(){
            return {
                n: 0,
                name: "全局"
            }
        },
        methods: {
            btnClick: function () {
                this.n += 1
            }
        }
    });
    new Vue({
        el: "#app"
    })
</script>

 

接口

# 接口:url链接,通过向链接发送不同的类型请求与参数得到相应的响应数据
​
# 1.在视图层书写处理请求的 视图函数
# 2.在路由层为视图函数配置 url链接 => 产生接口
# 3.前台通过ajax,爬虫,工具等对接口发送请求,提交相应的参数获得对应的响应数据
​
​
# https://api.map.baidu.com/place/v2/search
'''
ak: 6E823f587c95f0148c19993539b99295
region: 上海
query: 肯德基
output: json
'''

RESTful规范

# 定义接口的规范
# REST: 表征性状态转移(Representational State Transfer)
# RESTful规范:web数据请求接口设计规范
​
# 学习的目的:
# 1.如何设计url链接地址
# 2.如何设计响应的数据格式
​
'''
1)通常使用https请求
2)域名:有api关键字出现
    -- https://api.baidu.com (可能涉及跨越问题)
    -- https://baidu.com/api
3)版本:不同版本需要标注
    -- https://example.com/api/v1 | -- https://example.com/api/1
    -- https://example.com/api/v2 | -- https://example.com/api/2
4)资源:请求的目标数据称之为资源,资源一般都用名词复数表示
    -- https://example.com/api/v1/books  (之前不规范的案例: /get_books/)
5)操作方式:不从请求链接体现操作方式,从请求方式上决定操作方式
    -- get:https://example.com/api/v1/books  获取所有
    -- post:https://example.com/api/v1/books  新增一本
    -- put:https://example.com/api/v1/book/1  更新id=1的一本
    -- patch:https://example.com/api/v1/book/1  更新id=1的一本
    -- delete:https://example.com/api/v1/book/1  删除id=1的一本
6)资源过滤:通过接口传递参数来过滤资源
    -- https://example.com/api/v1/books?limit=10  限制10条
    
    
7)状态码:返回数据要标准状态码,通过在数据中 {"status": 0}
    -- SUCCESS("0", "查询成功")
    -- NODATA("1xx", "非正确,无数据,显示基本信息")
    -- FEAILED("2xx", "查询失败")
8)错误信息:请求失败需要标注错误信息  {"msg": "请求参数不合法"}
9)操作结果:请求操作成功的返回结果 {"results": []}
    -- get:返回资源列表 | 返回单一资源
    -- post:返回单一新增资源
    -- put:返回更新的资源
    -- patch:返回更新的资源
    -- delete:返回空文档
10)子资源返回资源接口:返回的资源如果有子资源,返回子资源的链接地址,如查找书,书的封面图片就可以url表示
'''

 

原生简易书写TESTful规范接口

# 路由层
from app import views
urlpatterns = [
    url(r'^books/', views.books),
]
​
# 视图层
from django.http import JsonResponse
book_list = [{'id': 1, 'name': '红楼梦'}, {'id': 2, 'name': '水浒传'}]
def books(request):
    if request.method == "GET":
        if 'ak' not in request.GET:
            return JsonResponse({
                'status': '101',
                'msg': 'ak不存在'
            }, json_dumps_params={'ensure_ascii': False})
        ak = request.GET.get('ak')
        if ak != '123abc':
            return JsonResponse({
                'status': '200',
                'msg': 'ak非法'
            }, json_dumps_params={'ensure_ascii': False})
        return JsonResponse({
                'status': '0',
                'msg': 'ok',
                'results': book_list
            }, json_dumps_params={'ensure_ascii': False})
    
    if request.method == 'POST':
        name = request.POST.get('name')
        if not name:
            return JsonResponse({
                'status': '101',
                'msg': '参数不合法',
            }, json_dumps_params={'ensure_ascii': False})
        
        id = len(book_list) + 1
        book = {'id': id, 'name': name}
        book_list.append(book)
        return JsonResponse({
            'status': '0',
            'msg': 'ok',
            'results': book
        }, json_dumps_params={'ensure_ascii': False})

 

cbv流程

"""
1) as_view()
    -- Users.as_view()本质拿到view(request, *args, **kwargs)函数对象
2)view(request, *args, **kwargs)
    -- return self.dispatch(request, *args, **kwargs)来完成请求的反射
3)dispatch(request, *args, **kwargs)
    -- 完成具体的请求响应的分发
# 注:重写dispatch是可以在分发响应时,加入其它逻辑限制
"""

 

# 路由层
from app import views
urlpatterns = [
    url(r'^users/', views.Users.as_view()),
]
​
# 视图层
from django.views import View
class Users(View):
    # 请求响应的分发
    def dispatch(self, request, *args, **kwargs):
        pass  # 可以对请求加以限制
        result = super(Users, self).dispatch(request, *args, **kwargs)
        pass # 可以对请求再进一步处理
        return result
​
​
    def get(self, request, *args, **kwargs):
        return JsonResponse({
            "msg": 'get msg'
        })
​
    def post(self, request, *args, **kwargs):
        name = request.POST.get('name')
        print(name)
        return JsonResponse({
            "msg": 'post msg'
        })

 

drf安装

# drf: djangorestframework => pip3 install djangorestframework
​
​
from rest_framework.views import APIView
from rest_framework.request import Request
from rest_framework.response import Response

 

drf的安装步骤

# 1)安装drf:pip3 install djangorestframework
# 2)settings.py注册app:INSTALLED_APPS = [..., 'rest_framework']
# 3)基于cbv完成满足RSSTful规范的接口

 

drf具体的使用

# 路由层
from app import views
urlpatterns = [
    url(r'^teachers/', views.Teachers.as_view()),
]
​
# 视图层
from rest_framework.views import APIView
from rest_framework.response import Response
class Teachers(APIView):
    def get(self, request, *args, **kwargs):
        salary = request.GET.get('salary')
        print(salary)
        return Response({
            'status': 2,
            'msg': 'get请求成功',
        })
​
    # 前台发送数据的方式:formdate | urlencoded | json
    # drf的request都对其二次封装解析到request.data中
    def post(self, request, *args, **kwargs):
        salary = request.data.get('salary')
        print(salary)
        return Response({
            'status': 2,
            'msg': 'post请求成功',
        })

 

drf 的 请求源码分析

# as_view()
    # 核心走了父类as_view
    view = super(APIView, cls).as_view(**initkwargs)
    # 返回的是局部禁用csrf认证的view视图函数
    return csrf_exempt(view)
    
# dispatch(self, request, *args, **kwargs)
    # 二次封装request对象
    request = self.initialize_request(request, *args, **kwargs)
    # 自定义request规则
    self.initial(request, *args, **kwargs)
    
# initialize_request(self, request, *args, **kwargs)
    # 原生request封装在request._request
    
# initial(self, request, *args, **kwargs)
    # 认证
    self.perform_authentication(request)
    # 权限
    self.check_permissions(request)
    # 频率
    self.check_throttles(request)
    
# 在drf的request.py的模块中,对django的request进行二次封装
    def __getattr__(self, attr):
        try:
            return getattr(self._request, attr)
        except AttributeError:
            return self.__getattribute__(attr)
    # 完成对django的request完全兼容

 

 

drf序列化

# models.py
class Students(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    gender = models.CharField(max_length=8)
    def __str__(self):
        return 'Student: %s' % self.name
    
​
# 自定义序列化类:为具体的类提供序列化
# my_serializer.py
from rest_framework import serializers
class StudentSerializer(serializers.Serializer):
    # 1.如果没有source引入models的字段名,序列化字段名必须同models的字段名
    # 2.如果有source引入models的字段名,序列化字段名必须不同于models的字段名,目的是对外隐藏数据库的字段名
    id = serializers.IntegerField()
    stu_name = serializers.CharField(source='name')
    age = serializers.IntegerField()
    gender = serializers.CharField()
    
​
# views.py
from app import models
from app.my_serializer import StudentSerializer
class Students(APIView):
    def get(self, request, *args, **kwargs):
        stus = models.Students.objects.all()
        # 需要序列化多个对象,需要明确many=True
        stu_ser = StudentSerializer(stus, many=True)
        print(stus)
        return Response({
            'status': 0,
            'msg': 'ok',
            'results': stu_ser.data
        })
    
    
# urls.py
from app import views
urlpatterns = [
    url(r'^students/', views.Students.as_view()),
]

 

序列化

# 数据的传输与文件存储均是采用字符串格式
​
# 序列化:将对象转换成字符串的过程,进而用来传输或存储
# 反序列化:将字符串转换为对象的过程,在程序中使用

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值