Python Django 实用小案例2

动态导入模块

Django返回序列化数据 

 

 

动态导入模块

在Django里面,经常会看到一些方法或者类是动态导入,尤其是以settings文件为代表,经常把一些类放在里面动态调配,比如随便拿Django的settings里面的中间件来作为案例。

在PyCharm里面随便改一下其中一条发现是可以导入的

那是如何做到实现这样可配置的动态导入呢?以在做的一个CMDB为例。

 

首先创建一个config文件(不写在settings里面是为了区分出来,也怕万一碰巧。。。)

PLUGINS_DICT = {
    'basic': 'api.service.asset.HandleBasic',
    'nic': 'api.service.asset.HandleNic',
    'memory': 'api.service.asset.HandleMemory',
    'disk': 'api.service.asset.HandleDisk',
}
config

代码通过设置规则动态导入

        for k, v in config.PLUGINS_DICT.items():
            # v = 'api.service.asset.HandleDisk'
            module_path, cls_name = v.rsplit('.', 1)
            # module_path = 'api.service.asset'
            # cls_name = 'HandleDisk'

            # 先动态导入api.service.asset
            # 再通过反射去获取对应的类, cls就是对应的类
            cls = getattr(importlib.import_module(module_path), cls_name)

            # 拿到类可以实例化,这里因为是静态方法,所以不需要实例化直接用
            response = cls.process(server_obj, server_info, None)
View Code

备注一下:列表给字符串赋值

 

 

 

Django返回序列化数据  

通常通过ajax返回给前端的数据都是字典,需要序列化成json数据。正常请看下之前都是这样写

        ret = {
            'status': 400,
            'message': '****'
        }
        import json
        return HttpResponse(json.dumps(ret))
View Code

这里有一个看起来高大上一点的写法:

        from django.http import JsonResponse
        ret = {
            'status': 400,
            'message': '****'
        }
        return JsonResponse(ret)
View Code

另外还需提及的一点是,JsonResponse跟HttpResponse的导入位置不一样。

在django.shortcuts里面输入J提示,在django3.0这个导入会被移除,确实在http里面是有更多导入的,稍微记一下就好了。

 

posted @ 2018-08-10 09:26  dandyzhang  阅读(238)  评论(0编辑  收藏  举报