python 一键创建 tornado 项目

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37049050/article/details/82222088

闲来无事,写了个一键创建tornado 项目的小程序,以后创建项目直接一键搞定。

# coding:utf8
import sys
import os
import re

settings = """# -*- coding:utf-8 -*-
import os


base_path = os.path.dirname(__file__)
setting = {
    "debug": True,
    "static_path": os.path.join(base_path, "static"),
    "template_path": os.path.join(base_path, "templates")
}
"""

views = """# -*- coding:utf-8 -*-
import tornado.web
from tornado import gen
from concurrent.futures import ThreadPoolExecutor
from tornado.concurrent import run_on_executor


# create your views hear


class DemoHandler(tornado.web.RequestHandler):
    executor = ThreadPoolExecutor(32)

    @gen.coroutine
    def get(self, *args, **kwargs):
        result = yield self.demo()
        self.write(result)
        self.finish()

    @run_on_executor
    def demo(self):
        return "hello world!"
"""

urls = """# -*- coding:utf-8 -*-
from tornado.web import Application
from views import *
from settings import setting
from tornado.routing import ReversibleRuleRouter
from tornado.web import url


class Applications(Application, ReversibleRuleRouter):

    def __init__(self):
        handlers = [
            url(r'/', DemoHandler, name="demo"),
        ]
        super(Applications, self).__init__(handlers=handlers, **setting)
"""

runserver = """# -*- coding:utf-8 -*-
from tornado.options import define, options
from tornado.ioloop import IOLoop
from urls import Applications

define("port", default=8888, type=int)
define("address", default="127.0.0.1", type=str)

if __name__ == '__main__':
    options.parse_command_line()
    app = Applications()
    app.listen(port=options.port, address=options.address)
    IOLoop.current().start()
"""


class CreateProject(object):
    def __init__(self):
        self.base_dir = os.path.dirname(os.path.abspath(__file__))
        self.argument = "-h" if len(sys.argv) == 1 else sys.argv[1]
        self.__help__ = """操作:\n    -p=project_name: 在当前路径创建。\n    -f=/full_path/project_name: 在指定路径创建。"""
        self.project_name = ""
        self.project_dir = ""
        self.all_dir = []
        self.settings = "settings.py"
        self.urls = "urls.py"
        self.views = "views.py"
        self.statics = "statics"
        self.templates = "templates"

    def __create_file__(self, filename, content):
        file_path = os.path.join(self.project_dir, filename)
        write_file = open(file_path, 'w')
        write_file.write(content)
        write_file.close()

    def __set_up__(self):
        os.makedirs(self.project_dir)
        os.makedirs(os.path.join(self.project_dir, self.templates))
        os.makedirs(os.path.join(self.project_dir, self.statics))
        self.__create_file__('views.py', views)
        self.__create_file__('settings.py', settings)
        self.__create_file__('urls.py', urls)
        self.__create_file__('runserver.py', runserver)

    def __project_name__(self):
        project = self.argument.split("=")[1]
        if not project:
            print "输入不能为空!"
            exit()
        check = re.compile('\W+')
        if check.search(project):
            print "输入有误(项目名称不能包含中文或特殊字符)请重新输入!"
            exit()
        self.project_name = project
        for root, dir, file in os.walk(self.base_dir):
            self.all_dir = dir
            break
        if self.project_name in self.all_dir:
            print "文件名已存在,请重新输入!"
            exit()
        self.project_dir = os.path.join(self.base_dir, self.project_name)
        try:
            self.__set_up__()
        except Exception as e:
            print e
            exit()

    def __full_path__(self):
        self.project_dir = self.argument.split('=')[1]
        if os.path.exists(self.project_dir):
            print "项目路径已存在,请重新输入!"
            exit()
        try:
            self.__set_up__()
        except Exception as e:
            print e
            exit()

    def main(self):
        if len(self.argument.split('=')) == 2:
            if '-p' in self.argument:
                self.__project_name__()
            elif '-f' in self.argument:
                self.__full_path__()
        else:
            print self.__help__


if __name__ == "__main__":
    CreateProject().main()

猜你喜欢

转载自blog.csdn.net/qq_37049050/article/details/82222088