base.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import hashlib
  5. import inspect
  6. import itertools
  7. import logging.config
  8. import os
  9. import re
  10. import sys
  11. from functools import wraps
  12. from os.path import abspath, join
  13. import click
  14. import daiquiri
  15. import daiquiri.formatter
  16. PROJECT_ROOT = abspath(os.path.split(os.path.realpath(__file__))[0] + "/..")
  17. sys.path.insert(0, PROJECT_ROOT)
  18. sys.path.insert(0, join(PROJECT_ROOT, "apps"))
  19. CONFIG_DIR = os.path.join(PROJECT_ROOT, 'configs')
  20. RESERVED = ('__init__.py', 'base.py', 'local.py')
  21. files = itertools.chain.from_iterable(files for root, dirs, files in os.walk(CONFIG_DIR))
  22. configs = [_.replace('.py', '') for _ in files if _.endswith('.py') and _ not in RESERVED]
  23. md5 = lambda raw_pwd: hashlib.md5(raw_pwd).hexdigest()
  24. get_current_file = lambda: inspect.getfile(inspect.currentframe())
  25. def setup_logger(filename, namespace):
  26. filename = filename.replace('.', '-')
  27. everything_log_filename = '%s-errors.log' % (filename,)
  28. error_log_filename = '%s-everything.log' % (filename,)
  29. formatter = daiquiri.formatter.ColorFormatter(
  30. fmt = "[%(asctime)s] %(levelname)s[%(thread)d] %(module)s [%(name)s:%(lineno)d]: %(message)s"
  31. )
  32. daiquiri.setup(
  33. level = logging.DEBUG,
  34. outputs = (
  35. daiquiri.output.File(error_log_filename, level = logging.ERROR, formatter = formatter),
  36. daiquiri.output.TimedRotatingFile(
  37. everything_log_filename,
  38. level = logging.DEBUG,
  39. interval = datetime.timedelta(days = 1),
  40. formatter = formatter
  41. )
  42. )
  43. )
  44. return daiquiri.getLogger(namespace)
  45. def regex_split(source, *delimiters):
  46. regexPattern = '|'.join(map(re.escape, delimiters))
  47. return re.split(regexPattern, source.encode('utf-8'))
  48. # def init_environment_vars():
  49. # dotenv_path = join(PROJECT_ROOT, '.env.%s' % os.environ.get('MY_ENV'))
  50. # load_dotenv(dotenv_path)
  51. def init_django_env(interactive):
  52. """
  53. 初始化django的环境
  54. :param interactive: 是否为交互模式,大部分需要人参与的命令脚本此项应为True
  55. :return:
  56. """
  57. try:
  58. if interactive:
  59. which_setting = click.prompt(
  60. u"请输入设置文件名,可选项, %s" % (configs,))
  61. if which_setting not in configs:
  62. click.secho(u"输入不在可选项内!", blink = True, bold = True, bg = 'red')
  63. sys.exit(1)
  64. else:
  65. which_setting = os.environ.get('DJANGO_SETTINGS_MODULE').split('.')[1]
  66. click.echo(u"[注意]你正在使用%s配置" % which_setting)
  67. os.environ.update({"DJANGO_SETTINGS_MODULE": "configs.%s" % which_setting})
  68. import django
  69. django.setup()
  70. except KeyError:
  71. click.secho(u"请首先在工程根目录文件夹内设置.env环境变量选项, 可参考.envexample文件", blink = True, bold = True, bg = 'red')
  72. raise
  73. def init_env(interactive = True):
  74. init_django_env(interactive)
  75. from patch import patch_requests
  76. patch_requests()
  77. # init_environment_vars()
  78. def get_logger(name):
  79. return logging.getLogger(name)
  80. def measure_time(logger):
  81. def decorate(func):
  82. @wraps(func)
  83. def wrapper(*args, **kwargs):
  84. start = datetime.datetime.now()
  85. result = func(*args, **kwargs)
  86. end = datetime.datetime.now()
  87. logger.info('function(%s) time cost:%s' % (func.__name__, end - start))
  88. return result
  89. return wrapper
  90. return decorate