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 os
|
||||||
import random
|
|
||||||
from flask import Flask
|
from flask import Flask
|
||||||
from flask_sslify import SSLify
|
from flask_sslify import SSLify
|
||||||
from .main import main as main_blueprint
|
from .main import main as main_blueprint
|
||||||
from .api import api as api_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
|
||||||
|
|
||||||
|
logger = CreateLogger().get_logger()
|
||||||
def generate_random_string(length):
|
|
||||||
"""
|
|
||||||
生成随机密码
|
|
||||||
:param length:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|
||||||
return ''.join(random.choice(letters) for _ in range(length))
|
|
||||||
|
|
||||||
|
|
||||||
def create_app(config_name):
|
def create_app(config_name):
|
||||||
@@ -40,12 +33,15 @@ def create_app(config_name):
|
|||||||
app.register_blueprint(main_blueprint)
|
app.register_blueprint(main_blueprint)
|
||||||
app.register_blueprint(api_blueprint, url_prefix='/api/v1/')
|
app.register_blueprint(api_blueprint, url_prefix='/api/v1/')
|
||||||
|
|
||||||
|
CreateLogger.init_app(app)
|
||||||
|
|
||||||
if not os.getenv('ACCESS_KEY'):
|
if not os.getenv('ACCESS_KEY'):
|
||||||
access_key = generate_random_string(32)
|
access_key = generate_pwd(32)
|
||||||
os.environ['ACCESS_KEY'] = access_key
|
os.environ['ACCESS_KEY'] = access_key
|
||||||
else:
|
else:
|
||||||
access_key = os.getenv('ACCESS_KEY')
|
access_key = os.getenv('ACCESS_KEY')
|
||||||
print('==========Access Key: {}=========='.format(access_key))
|
|
||||||
|
logger.info('Access Key: {}'.format(access_key))
|
||||||
|
|
||||||
return app
|
return app
|
||||||
|
|
||||||
@@ -55,5 +51,6 @@ __all__ = [
|
|||||||
'main',
|
'main',
|
||||||
'tests',
|
'tests',
|
||||||
'utils',
|
'utils',
|
||||||
|
'logger',
|
||||||
'create_app'
|
'create_app'
|
||||||
]
|
]
|
||||||
+1
-13
@@ -6,26 +6,14 @@
|
|||||||
# @File Name: views.py
|
# @File Name: views.py
|
||||||
|
|
||||||
|
|
||||||
import os
|
|
||||||
from functools import wraps
|
|
||||||
from flask import abort
|
|
||||||
from flask import jsonify
|
from flask import jsonify
|
||||||
from flask import request
|
from flask import request
|
||||||
from flask import send_file
|
from flask import send_file
|
||||||
from ..db.db import SQLite as db
|
from ..db.db import SQLite as db
|
||||||
|
from ..decorators import permission_required
|
||||||
from . import api
|
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'])
|
@api.route('/overall/', methods=['GET', 'POST'])
|
||||||
@permission_required
|
@permission_required
|
||||||
def overall():
|
def overall():
|
||||||
|
|||||||
+1
-20
@@ -7,26 +7,10 @@
|
|||||||
|
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import time
|
|
||||||
import sys
|
import sys
|
||||||
import requests
|
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():
|
def download():
|
||||||
res = requests.get('https://filebase.vercel.app/download/data.db')
|
res = requests.get('https://filebase.vercel.app/download/data.db')
|
||||||
with open('./app/db/data.sqlite', 'wb') as fp:
|
with open('./app/db/data.sqlite', 'wb') as fp:
|
||||||
@@ -34,12 +18,9 @@ def download():
|
|||||||
|
|
||||||
|
|
||||||
if not os.path.exists('./app/db/data.sqlite'):
|
if not os.path.exists('./app/db/data.sqlite'):
|
||||||
print('C: 数据库文件未找到, 正在下载中')
|
|
||||||
try:
|
try:
|
||||||
download()
|
download()
|
||||||
except Exception as error:
|
except requests.exceptions as error:
|
||||||
print('C: 下载失败, 错误原因:', error)
|
|
||||||
print('I: 请手动下载数据库文件到 ./app/db/data.sqlite')
|
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
__all__ = [
|
__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')
|
app = create_app('default')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
from app import logger
|
||||||
from gevent import pywsgi
|
from gevent import pywsgi
|
||||||
|
|
||||||
print('I: 服务运行在 http://127.0.0.1:5000')
|
logger.info('服务运行在 http://127.0.0.1:5000')
|
||||||
try:
|
try:
|
||||||
server = pywsgi.WSGIServer(('0.0.0.0', 5000), app)
|
server = pywsgi.WSGIServer(('0.0.0.0', 5000), app)
|
||||||
server.serve_forever()
|
server.serve_forever()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
print('I: 已退出')
|
logger.info('已退出')
|
||||||
except OSError:
|
except OSError:
|
||||||
print('C: 5000 端口已被占用')
|
logger.critical('5000 端口已被占用')
|
||||||
|
exit(1)
|
||||||
Reference in New Issue
Block a user