From 8625fd8c50092b97a3b6a24ecd74782502be9eea Mon Sep 17 00:00:00 2001 From: MarkusJoe Date: Mon, 11 Apr 2022 21:49:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E4=BB=B6=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/__init__.py | 23 +++++++++----------- app/api/views.py | 14 +----------- app/db/__init__.py | 21 +----------------- app/decorators.py | 23 ++++++++++++++++++++ app/logs/.gitkeep | 0 app/static/127.0.0.1.pem | 26 ---------------------- app/utils/logger.py | 47 ++++++++++++++++++++++++++++++++++++++++ app/utils/password.py | 18 +++++++++++++++ manage.py | 8 ++++--- 9 files changed, 105 insertions(+), 75 deletions(-) create mode 100644 app/decorators.py create mode 100644 app/logs/.gitkeep delete mode 100644 app/static/127.0.0.1.pem create mode 100644 app/utils/logger.py create mode 100644 app/utils/password.py diff --git a/app/__init__.py b/app/__init__.py index eb56ab5..dc50eb5 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -7,22 +7,15 @@ import os -import random from flask import Flask from flask_sslify import SSLify from .main import main as main_blueprint from .api import api as api_blueprint -from app.config import config +from .config import config +from .utils.password import generate_pwd +from .utils.logger import CreateLogger - -def generate_random_string(length): - """ - 生成随机密码 - :param length: - :return: - """ - letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' - return ''.join(random.choice(letters) for _ in range(length)) +logger = CreateLogger().get_logger() def create_app(config_name): @@ -40,12 +33,15 @@ def create_app(config_name): app.register_blueprint(main_blueprint) app.register_blueprint(api_blueprint, url_prefix='/api/v1/') + CreateLogger.init_app(app) + if not os.getenv('ACCESS_KEY'): - access_key = generate_random_string(32) + access_key = generate_pwd(32) os.environ['ACCESS_KEY'] = access_key else: access_key = os.getenv('ACCESS_KEY') - print('==========Access Key: {}=========='.format(access_key)) + + logger.info('Access Key: {}'.format(access_key)) return app @@ -55,5 +51,6 @@ __all__ = [ 'main', 'tests', 'utils', + 'logger', 'create_app' ] diff --git a/app/api/views.py b/app/api/views.py index be39388..7baf257 100644 --- a/app/api/views.py +++ b/app/api/views.py @@ -6,26 +6,14 @@ # @File Name: views.py -import os -from functools import wraps -from flask import abort from flask import jsonify from flask import request from flask import send_file from ..db.db import SQLite as db +from ..decorators import permission_required from . import api -def permission_required(func): - @wraps(func) - def decorated_func(*args, **kwargs): - if request.args.get('key') != os.getenv('ACCESS_KEY'): - abort(403) - return func(*args, **kwargs) - - return decorated_func - - @api.route('/overall/', methods=['GET', 'POST']) @permission_required def overall(): diff --git a/app/db/__init__.py b/app/db/__init__.py index b68926f..f4773cc 100644 --- a/app/db/__init__.py +++ b/app/db/__init__.py @@ -7,26 +7,10 @@ import os -import time import sys import requests -from functools import wraps -def time_it(func): - @wraps(func) - def wrapper(*args, **kwargs): - print('I: 数据库文件开始下载') - start = time.time() - result = func(*args, **kwargs) - end = time.time() - print('I: 下载结束, 耗时 {} 秒'.format(round(end - start, 2))) - return result - - return wrapper - - -@time_it def download(): res = requests.get('https://filebase.vercel.app/download/data.db') with open('./app/db/data.sqlite', 'wb') as fp: @@ -34,12 +18,9 @@ def download(): if not os.path.exists('./app/db/data.sqlite'): - print('C: 数据库文件未找到, 正在下载中') try: download() - except Exception as error: - print('C: 下载失败, 错误原因:', error) - print('I: 请手动下载数据库文件到 ./app/db/data.sqlite') + except requests.exceptions as error: sys.exit(1) __all__ = [ diff --git a/app/decorators.py b/app/decorators.py new file mode 100644 index 0000000..5272ace --- /dev/null +++ b/app/decorators.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +# -- coding:utf-8 -- +# @Author: markushammered@gmail.com +# @Development Tool: PyCharm +# @Create Time: 2022/4/11 +# @File Name: decorators.py + + +import os +from flask import request +from flask import abort +from functools import wraps + + +def permission_required(func): + @wraps(func) + def decorated_func(*args, **kwargs): + if request.args.get('key') != os.getenv('ACCESS_KEY'): + abort(403) + return func(*args, **kwargs) + + return decorated_func + diff --git a/app/logs/.gitkeep b/app/logs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/static/127.0.0.1.pem b/app/static/127.0.0.1.pem deleted file mode 100644 index 9fd5723..0000000 --- a/app/static/127.0.0.1.pem +++ /dev/null @@ -1,26 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEcTCCAtmgAwIBAgIQHnbxwo1i8x5+Py9QyZkLwDANBgkqhkiG9w0BAQsFADCB -pTEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMT0wOwYDVQQLDDRERVNL -VE9QLTRQU0xDNk9cVGFwc29AREVTS1RPUC00UFNMQzZPIChKb2hhbiBNYXJrdXMp -MUQwQgYDVQQDDDtta2NlcnQgREVTS1RPUC00UFNMQzZPXFRhcHNvQERFU0tUT1At -NFBTTEM2TyAoSm9oYW4gTWFya3VzKTAeFw0yMjA0MDcxMjU5NTFaFw0yNDA3MDcx -MjU5NTFaMGgxJzAlBgNVBAoTHm1rY2VydCBkZXZlbG9wbWVudCBjZXJ0aWZpY2F0 -ZTE9MDsGA1UECww0REVTS1RPUC00UFNMQzZPXFRhcHNvQERFU0tUT1AtNFBTTEM2 -TyAoSm9oYW4gTWFya3VzKTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AMbxeD2N5xzBADMQfS5HYWJWu8rpkTFdMjcpQSoeBkSQHY6BQ53sFqFVcp/CHwlK -Dz5eC1hRVVaAD4q3rwnS6aPzlm6bJDNEzUJAKwtTYEN7+ZwjSsE5aZ6QkiCOyM86 -+tNygwTqnXfPZY7X1XVHuE0GBA517c1LNgX529YOTqPRnITajP1lU2m6Qudlhs+Q -+mQLPsCGL4vT2+Oq1AaKntXnWw0duzJkIFFS1islbQ4wBxOvKUwYeZl26cADVXyp -UjfuOt0T5Ax9O79CaMWjW9yzIlRx70F4tQrpA619oyFH3u2Tm9oA28DVXuYz3835 -KEvLDxLmZ57WWkeIT7T8pfsCAwEAAaNZMFcwDgYDVR0PAQH/BAQDAgWgMBMGA1Ud -JQQMMAoGCCsGAQUFBwMBMB8GA1UdIwQYMBaAFARJoO7s5EvePiqav8sT5dB98ay5 -MA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQELBQADggGBAFVqF3D4KZxkHsUu -IzwflPCbbvk74xbEtM6Su3eKj2ArwTs4K9ofsWrw5jADCFJPwRC2r06jAnRPiwxB -+i+e3YaAWrTcWVr8qpOoSp1drNqzMPlN7kktqrb9DOFzMGMfXsPjvtmOJr7JQK9W -v8r41L7t9gV9A+rV72ujjz1kC6SIF+8axqghsJ5SbuV6sQ02CxHTCLVOZqkT7DXj -pLsy9+AJjbHllKyAEnrX2GNLCPrlIFpAuO7EYL3yeO2l6mzyvzJDj8gv8IBuy9LC -RTQsesd3iWdxKavhgzvj8bDQjsZefODTgvlsVaL3yMt/q5lFGqpVFSx/7yiAL+OH -T3JcZHxHnizOIghqhalR2WbZ8RWasMV0Pc+DIUvrXIrxs1TeKkXgl4S6X0WWaXXw -ztAvae2j9gngli4Sdw3TZyILO6pwCQqmn6x3vhCZVnX5o6TvrlV/p8gmNRas750Z -5jKgNz5h0TIJ6hJ1xxiyP/StWSWvAnqkmIxHpweY1ZnTuFqv4g== ------END CERTIFICATE----- diff --git a/app/utils/logger.py b/app/utils/logger.py new file mode 100644 index 0000000..e105346 --- /dev/null +++ b/app/utils/logger.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 +# -- coding:utf-8 -- +# @Author: markushammered@gmail.com +# @Development Tool: PyCharm +# @Create Time: 2022/4/11 +# @File Name: logger.py + + +import time +import logging.handlers +from colorlog import ColoredFormatter + + +class CreateLogger: + def __init__(self) -> None: + self.date_format = '%H:%M:%S' + self.info_format_console = '%(log_color)s[%(asctime)s] |%(filename)-12s[%(lineno)s] |%(levelname)-8s |%(message)s' + self.info_format_file = '[%(asctime)s] |%(filename)s[%(funcName)sline:%(lineno)d] |%(levelname)-8s |%(message)s' + self.formatter = ColoredFormatter(fmt=self.info_format_console, + datefmt=self.date_format, + reset=True, + log_colors={ + 'DEBUG': 'light_purple', + 'INFO': 'light_cyan', + 'WARNING': 'yellow', + 'ERROR': 'red', + 'CRITICAL': 'red,bold_red'}) + self.formatter_file = logging.Formatter(fmt=self.info_format_file, + datefmt=self.date_format) + + def get_logger(self) -> logging.Logger: + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + console_logger = logging.StreamHandler() # 输出到终端 + console_logger.setFormatter(self.formatter) + log_name = time.strftime('%Y-%m-%d#%H') # 一小时内使用的日志文件都是同一个 + file_logger = logging.handlers.RotatingFileHandler(filename=f'./app/logs/{log_name}.log', + maxBytes=102400, + backupCount=5) # 每个日志文件最大102400字节(100Kb) + file_logger.setFormatter(self.formatter_file) + logger.addHandler(console_logger) + logger.addHandler(file_logger) + return logger + + @staticmethod + def init_app(app): + pass diff --git a/app/utils/password.py b/app/utils/password.py new file mode 100644 index 0000000..fc858b4 --- /dev/null +++ b/app/utils/password.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 +# -- coding:utf-8 -- +# @Author: markushammered@gmail.com +# @Development Tool: PyCharm +# @Create Time: 2022/4/11 +# @File Name: password.py + +import random + + +def generate_pwd(length): + """ + 生成随机密码 + :param length: + :return: + """ + letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + return ''.join(random.choice(letters) for _ in range(length)) diff --git a/manage.py b/manage.py index 3667298..aa51357 100644 --- a/manage.py +++ b/manage.py @@ -11,13 +11,15 @@ from app import create_app app = create_app('default') if __name__ == '__main__': + from app import logger from gevent import pywsgi - print('I: 服务运行在 http://127.0.0.1:5000') + logger.info('服务运行在 http://127.0.0.1:5000') try: server = pywsgi.WSGIServer(('0.0.0.0', 5000), app) server.serve_forever() except KeyboardInterrupt: - print('I: 已退出') + logger.info('已退出') except OSError: - print('C: 5000 端口已被占用') + logger.critical('5000 端口已被占用') + exit(1)