mirror of
https://github.com/WhaleFell/SMSBoom.git
synced 2026-04-09 13:39:10 +08:00
🐞 fix: flask_app 重构
This commit is contained in:
1
api.json
1
api.json
@@ -5,7 +5,6 @@
|
||||
"method": "POST",
|
||||
"header": {
|
||||
"Referer": "https://fanyi.caiyunapp.com/",
|
||||
"Cookie": "UM_distinctid=17fd5c7a9ba69a-0200a7005bf45a-56171958-146d15-17fd5c7a9bb749; _gid=GA1.2.2046680529.1648971157; _gat_gtag_UA_185151443_2=1; _ga=GA1.2.44459633.1648559084; _ga_65TZCJSDBD=GS1.1.1648971156.4.1.1648971164.0; _ga_R9YPR75N68=GS1.1.1648971156.4.1.1648971164.52",
|
||||
"Cy-Token": "token 9876032166"
|
||||
},
|
||||
"data": {
|
||||
|
||||
40
flask_app/__init__.py
Normal file
40
flask_app/__init__.py
Normal file
@@ -0,0 +1,40 @@
|
||||
# encoding=utf8
|
||||
# app 工厂函数
|
||||
from flask import Flask
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
import sys,os
|
||||
from loguru import logger
|
||||
|
||||
|
||||
# 判断系统
|
||||
WIN = sys.platform.startswith('win')
|
||||
if WIN: # 如果是 Windows 系统,使用三个斜线
|
||||
prefix = 'sqlite:///'
|
||||
else: # 否则使用四个斜线
|
||||
prefix = 'sqlite:////'
|
||||
|
||||
# 日志处理
|
||||
logger.remove()
|
||||
logger.add(
|
||||
sink=sys.stdout,
|
||||
format="<green>{time:YYYY-MM-DD at HH:mm:ss}</green> - <level>{level}</level> - <level>{message}</level>",
|
||||
colorize=True,
|
||||
backtrace=True
|
||||
)
|
||||
|
||||
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = prefix + \
|
||||
os.path.join(app.root_path, 'data.db')
|
||||
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 关闭对模型修改的监控
|
||||
db = SQLAlchemy(app)
|
||||
|
||||
# buleprint
|
||||
from .views import main as main_blueprint
|
||||
app.register_blueprint(main_blueprint)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
122
flask_app/app.py
122
flask_app/app.py
@@ -1,122 +0,0 @@
|
||||
# encoding=utf8
|
||||
import json
|
||||
import time
|
||||
from flask import Flask, make_response, request, jsonify, render_template
|
||||
from flask_cors import CORS
|
||||
from urllib3 import disable_warnings
|
||||
|
||||
from utils import *
|
||||
|
||||
disable_warnings()
|
||||
|
||||
app = Flask(__name__)
|
||||
CORS(app, supports_credentials=True, resources="/*") # 跨域
|
||||
|
||||
# 解决与 vue 冲突
|
||||
app.jinja_env.variable_start_string = '[['
|
||||
app.jinja_env.variable_end_string = ']]'
|
||||
|
||||
def request_parse(req_data: request) -> dict:
|
||||
'''解析请求数据并以字典的形式返回'''
|
||||
if req_data.method == 'POST':
|
||||
data = req_data.form
|
||||
|
||||
elif req_data.method == 'GET':
|
||||
data = req_data.args
|
||||
|
||||
return dict(data)
|
||||
|
||||
|
||||
class BaseResponse(BaseModel):
|
||||
"""返回的响应"""
|
||||
status: int = 0 # 状态码 0-->成功 1-->失败
|
||||
msg: str = "前端显示的简短信息"
|
||||
data: Optional[str]
|
||||
|
||||
@property
|
||||
def resp(self):
|
||||
'''BaseModel类型返回json'''
|
||||
response = make_response(
|
||||
json.dumps(
|
||||
self.dict(),
|
||||
ensure_ascii=False,
|
||||
sort_keys=False
|
||||
),
|
||||
)
|
||||
response.mimetype = 'application/json'
|
||||
# 跨域设置
|
||||
response.headers['Access-Control-Allow-Origin'] = '*'
|
||||
response.headers['Access-Control-Allow-Methods'] = 'OPTIONS,HEAD,GET,POST'
|
||||
response.headers['Access-Control-Allow-Headers'] = 'x-requested-with'
|
||||
return response
|
||||
|
||||
|
||||
@app.route("/", methods=['GET'])
|
||||
def index():
|
||||
return render_template('admin.html')
|
||||
|
||||
@app.route("/testapi/", methods=['POST'])
|
||||
@logger.catch
|
||||
def testapi():
|
||||
brs = BaseResponse()
|
||||
# 需要传入 json 数据
|
||||
try:
|
||||
jsonData = request.get_json()
|
||||
api = API(**jsonData)
|
||||
phone = jsonData.get('phone')
|
||||
if not phone:
|
||||
raise ValueError("参数 phone 没有!")
|
||||
try:
|
||||
resp = test_resq(api, phone)
|
||||
brs.status = 0
|
||||
brs.msg = f"请求成功!{resp}"
|
||||
brs.data = resp.text
|
||||
except Exception as why:
|
||||
brs.status = 1
|
||||
brs.msg = f"请求失败:{why}"
|
||||
except Exception as why:
|
||||
brs.status = 1
|
||||
brs.msg = f"参数有误:{why}"
|
||||
return brs.resp
|
||||
|
||||
|
||||
@app.route("/submitapi/", methods=['POST'])
|
||||
def submitapi():
|
||||
"""提交API到json文件"""
|
||||
# 需要传入 json 数据
|
||||
jsonData = request.get_json()
|
||||
api = API(**jsonData).handle_API()
|
||||
data = json.loads(json_path.read_text(encoding='utf8'))
|
||||
with open(json_path, mode="w", encoding="utf8") as j:
|
||||
try:
|
||||
data.append(api.dict())
|
||||
json.dump(data, j, ensure_ascii=False, sort_keys=False)
|
||||
return BaseResponse(status=0, msg="写入成功!").resp
|
||||
except Exception as why:
|
||||
return BaseResponse(status=1, msg=f"写入失败!{why}").resp
|
||||
|
||||
|
||||
@app.route("/backapi/", methods=['GET', 'POST'])
|
||||
def backjson():
|
||||
"""备份json文件"""
|
||||
try:
|
||||
timeStruct = time.localtime(int(time.time()))
|
||||
strTime = time.strftime("%Y_%m_%d_%H_%M_%S", timeStruct)
|
||||
Path(json_path.parent, 'apiback').mkdir(exist_ok=True)
|
||||
json_back_path = Path(json_path.parent, 'apiback',
|
||||
f"api_back_{strTime}.json")
|
||||
with open(json_back_path, mode="w") as j:
|
||||
j_data = json.loads(json_path.read_text(encoding='utf8'))
|
||||
json.dump(j_data, j, ensure_ascii=False, sort_keys=False)
|
||||
return BaseResponse(status=0, msg="备份成功!").resp
|
||||
except Exception as why:
|
||||
return BaseResponse(status=1, msg=f"备份失败{why}").resp
|
||||
|
||||
|
||||
@app.route("/downloadapi/", methods=['GET'])
|
||||
def downloadapi():
|
||||
"""下载接口文件"""
|
||||
return json_path.read_text(encoding='utf8')
|
||||
|
||||
|
||||
app.run(host="0.0.0.0", port=10981, debug=True)
|
||||
BIN
flask_app/data.db
Normal file
BIN
flask_app/data.db
Normal file
Binary file not shown.
13
flask_app/model.py
Normal file
13
flask_app/model.py
Normal file
@@ -0,0 +1,13 @@
|
||||
# encoding=utf8
|
||||
# 储存数据库模型
|
||||
from . import db
|
||||
from datetime import datetime
|
||||
|
||||
class Apis(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True) # 主键
|
||||
desc = db.Column(db.String(100)) # 描述
|
||||
url = db.Column(db.String(100)) # 链接
|
||||
method = db.Column(db.String(10)) # 请求方法
|
||||
header = db.Column(db.String(9999)) # 请求头
|
||||
data = db.Column(db.String(9999)) # 请求数据
|
||||
add_time = db.Column(db.DateTime(), default=datetime.now()) # 添加时间
|
||||
6
flask_app/views/__init__.py
Normal file
6
flask_app/views/__init__.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from flask import Blueprint
|
||||
|
||||
main = Blueprint("main",__name__)
|
||||
|
||||
from . import views
|
||||
from .. import db
|
||||
9
flask_app/views/views.py
Normal file
9
flask_app/views/views.py
Normal file
@@ -0,0 +1,9 @@
|
||||
# encoding=utf8
|
||||
# flask app views
|
||||
from . import main
|
||||
from .. import db
|
||||
|
||||
@main.route("/",methods=['GET','POST'])
|
||||
def index():
|
||||
return "index"
|
||||
|
||||
62
run.py
Normal file
62
run.py
Normal file
@@ -0,0 +1,62 @@
|
||||
# encoding=utf8
|
||||
# flask app 主文件
|
||||
import click
|
||||
from loguru import logger
|
||||
from pathlib import Path
|
||||
import json
|
||||
from flask_app import db, app
|
||||
from flask_app.model import Apis
|
||||
|
||||
|
||||
@click.command()
|
||||
@click.option('--drop', is_flag=True, help='重建数据库') # 设置选项
|
||||
def init(drop):
|
||||
"""初始化数据库"""
|
||||
if drop:
|
||||
db.drop_all()
|
||||
logger.info("删除数据库...准备重建..")
|
||||
db.create_all()
|
||||
logger.success("数据库创建成功")
|
||||
|
||||
|
||||
@click.command()
|
||||
@logger.catch()
|
||||
def json2sqlite():
|
||||
"""将json数据转为sqlite数据库"""
|
||||
j = Path(app.root_path).parent.joinpath(
|
||||
"api.json").read_text(encoding="utf8")
|
||||
|
||||
jss = json.loads(j)
|
||||
for js in jss:
|
||||
api = Apis(
|
||||
desc=str(js['desc']),
|
||||
url=str(js['url']),
|
||||
method=str(js['method']),
|
||||
data=str(js['data']),
|
||||
header=str(js['header'])
|
||||
)
|
||||
# print(api.desc)
|
||||
db.session.add(api)
|
||||
db.session.commit()
|
||||
logger.success("json To sqlite 成功!")
|
||||
|
||||
|
||||
@click.command()
|
||||
@click.option('--host', '-h', help='监听地址', default="0.0.0.0")
|
||||
@click.option('--port', '-p', help='监听端口', default=9090)
|
||||
def start(host, port):
|
||||
"""启动 flask app"""
|
||||
app.run(host=host, port=port, debug=True)
|
||||
|
||||
|
||||
@click.group()
|
||||
def cli():
|
||||
pass
|
||||
|
||||
|
||||
cli.add_command(init)
|
||||
cli.add_command(start)
|
||||
cli.add_command(json2sqlite)
|
||||
|
||||
if __name__ == "__main__":
|
||||
cli()
|
||||
Reference in New Issue
Block a user