• Django rest framwork-CMDB API实战


    一、序列化

    serializers.py
    from rest_framework import serializers
    from web_manage import models
    class AssetSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Server
            fields = '__all__'
            depth = 3
     
    二、展示层
    rest_views.py
    from web_api.serializers import AssetSerializer
    from web_manage import models
    from rest_framework.response import Response
    from rest_framework.decorators import api_view
    @api_view(['GET','POST'])
    def AssetViewSet(request):
        if request.method == 'GET':
            salt_name = request.GET.get('salt_name')
            queryset = models.Server.objects.all() if salt_name == 'None' else models.Server.objects.filter(salt_name=salt_name)
            serializer_class = AssetSerializer(queryset,many=True)  #many=True返回具体内容
            return Response(serializer_class.data)
    

    三、注册URL 

    四、测试
    原生json样式只需要加上 format参数即可


    四-2、因NIC,MEM,DISK这3个表是反向关联Server表,所以默认是没有反查询,需手动定义 

    from rest_framework import serializers
    from web_manage import models
    class MemorySerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Memory
            fields = '__all__'
    class NicSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.NIC
            fields = '__all__'
    class DiskSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Disk
            fields = '__all__'
    class AssetSerializer(serializers.ModelSerializer):
        memory_set = MemorySerializer(many=True)
        nic_set = NicSerializer(many=True)
        disk_set = DiskSerializer(many=True)
        class Meta:
            model = models.Server
            fields = '__all__'
            depth = 3
    

    五、客户端验证tocken后,才能获取API信息  

    客户端:

    #!/usr/bin/python
    #encoding:utf-8
    import hashlib,time
    import urllib,urllib2,json
    def get_token(username,token_id):
        timestamp = int(time.time())
        md5_format_str = "%s
    %s
    %s" %(username,timestamp,token_id)
        obj = hashlib.md5()
        obj.update(md5_format_str)
        return obj.hexdigest()[10:17], timestamp
    def __attach_token(url_str):
        '''把用户名和密码加密后拼接到POST的URL中'''
        user = 'reporter'
        token_id = '349095cc-1330-11e5-b06a-a45ef3bec39f'
        md5_token,timestamp = get_token(user,token_id)
        url_arg_str = "user=%s×tamp=%s&token=%s" %(user,timestamp,md5_token)
        if "?" in url_str:
            new_url = url_str + "&" + url_arg_str
        else:
            new_url = url_str + "?" + url_arg_str
        return  new_url
    if __name__ == '__main__':
        url = 'http://127.0.0.1:8000/api/get_assets_count/'
        url = __attach_token(url)
        data = {"idc":"aws_cn"}
        data_encode = urllib.urlencode(data)
        req = urllib2.Request(url=url,data=data_encode)
        res_data = urllib2.urlopen(req,timeout=30)
        callback = res_data.read()
        callback = json.loads(callback)
        print callback
    

      

    服务端:

    @api_auth
    @api_view(['GET','POST'])
    def AssetViewSet_count(request):
        if request.method == 'POST':
            idc = request.POST.get('idc')
            idc_info = {'aws_global':[8,10],'aws_cn':[5],'aliyun_global':[11],'aliyun_cn':[6]}
            idc_id = idc_info.get(idc)
            if idc_id:
                queryset = models.Asset.objects.filter(device_status_id=1,idc__id__in=idc_id).count()
            else:
                queryset = 'Error'
            return Response(queryset)
        else:
            return Response('Just POST')
    

    验证,执行客户端脚本:  

      

  • 相关阅读:
    人生苦短_我用Python_javascript_var_function_简单笔记_001
    人生苦短_我用Python_logging日志操作_011
    人生苦短_我用Python_configparser/yaml对配置文件读取/写入操作_010
    人生苦短_我用Python_pymysql库对Mysql数据库操作_009
    人生苦短_我用Python_openpyxl库读取Excel文件数据_008
    人生苦短_我用Python_Try_Exception异常捕捉_007
    命令行下编译打包安卓apk
    构建微服务实验环境
    Docker的安全问题以及一些预防方案
    Go 微服务实践
  • 原文地址:https://www.cnblogs.com/yangmv/p/8493105.html
Copyright © 2020-2023  润新知