Will Dx

人世一身霜雪, 归来仍是少年.

Django学习笔记09_Django中执行脚本

Posted April 07, 2017

1. 在项目根目录下

需要添加环境变量DJANGOSETTINGSMODULE, 以及django.setup()

1.1 一个简单例子

Python
# vim  test.py

# -*- coding: utf-8 -*-
import os
# 需要设定环境变量
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings") 
 
# Django 版本大于等于1.7的时候,需要加上下面两句
import django
if django.VERSION >= (1, 7):
    django.setup()
 
def main():
    from blog.models import Blog
    f = open('oldblog.txt')
    for line in f:
        title,content = line.split('****')
        Blog.objects.create(title=title, content=content)
    f.close()
 
if __name__ == "__main__":
    main()
    print('Done!')

1.2 执行

Python
python test.py

2. 扩展python manage.py 的功能

在$app/management/commands/目录下添加脚本文件

2.1 test.py

Python
# -*- coding: utf-8 -*-
import sys
import json
from extends.factory import Factory
from extends.react import re_act
from django.core.management.base import BaseCommand, CommandError

# 编码
reload(sys)
sys.setdefaultencoding('utf8')

class Command(BaseCommand):
    def handle(self, *args, **options):
        """
        勋章结算
        --参数
        file_name:  str | 存放结算逻辑的文件
        class_name: str | file_name中的类
        qn_name:    str | 队列名称
        start:      int | 源数据开始index
        end:        int | 源数据结束index
        work_mode:   str | product(生产)/consumer(消费)/product_consumer(生产并消费)
        exec_mode:   str | thread(多线程执行)/process(多进程执行)
        wc_user:     str | 关注了行者企业号的微信号
        
        --默认约定
        1.默认类文件存放在$file_dir目录

        --具体参数
        请参见$file_dir目录下对应类文件的__doc__说明
        例如: $file_dir/year_report_mns.py
        """

        data = eval(args[0])
        file_name = data.get("file_name", '') 
        class_name = data.get("class_name", '')
        qn_name = data.get("qn_name", '')
        start = data.get("start", '')
        end = data.get("end", '')
        work_mode = data.get("work_mode", "product")
        exec_mode = data.get("exec_mode", "thread")
        wc_user = data.get("wc_user", "dx1426409836")
        assert file_name and class_name and qn_name, '缺少必要参数'
        print("参数:{},类型:{}".format(data,type(data)))

        mf = Factory()
        file_dir = "web.management.commands.extends"
        cl = re_act(".".join([ file_dir, file_name]), class_name)
        obj = mf.get_instance(cl, **data)
        if work_mode=="product":
            obj.mns_product(start,end)
        elif  work_mode=="consumer":
            obj.mns_consumer(qn_name, exec_mode)
        elif  work_mode=="product_consumer":
            obj.mns_product(start,end)
            obj.mns_consumer(qn_name, exec_mode)
        else:
            print "不支持的work_mode:{}".format(exec_mode)

2.2 执行

Python
python manage.py test