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', }
代码通过设置规则动态导入
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)
备注一下:列表给字符串赋值
Django返回序列化数据
通常通过ajax返回给前端的数据都是字典,需要序列化成json数据。正常请看下之前都是这样写
ret = { 'status': 400, 'message': '****' } import json return HttpResponse(json.dumps(ret))
这里有一个看起来高大上一点的写法:
from django.http import JsonResponse ret = { 'status': 400, 'message': '****' } return JsonResponse(ret)
另外还需提及的一点是,JsonResponse跟HttpResponse的导入位置不一样。
在django.shortcuts里面输入J提示,在django3.0这个导入会被移除,确实在http里面是有更多导入的,稍微记一下就好了。