Archived
修改文件结构
This commit is contained in:
9 files changed
+105
-75
No files matched your search
+10
-13
@@ -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'
|
||||
]
|
||||
+1
-13
@@ -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():
|
||||
|
||||
+1
-20
@@ -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__ = [
|
||||
|
||||
@@ -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
|
||||
|
||||
Whitespace-only changes.
@@ -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-----
|
||||
@@ -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
|
||||
@@ -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))
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user