初始化项目,整理基础目录结构
This commit is contained in:
commit
0d771bf0cb
|
@ -0,0 +1,12 @@
|
|||
.idea
|
||||
.vscode
|
||||
|
||||
venv
|
||||
__pycache__
|
||||
*.pyc
|
||||
*.pyi
|
||||
|
||||
*.log
|
||||
logs/
|
||||
|
||||
*.swap
|
|
@ -0,0 +1,21 @@
|
|||
import sys
|
||||
import os.path
|
||||
from flask import Flask
|
||||
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src'))
|
||||
from database.mongodb import initialize_db
|
||||
from routes import blueprint_api
|
||||
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config.from_pyfile("settings/dev.py")
|
||||
|
||||
initialize_db(app)
|
||||
|
||||
# 注册蓝图
|
||||
app.register_blueprint(blueprint_api)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(host='0.0.0.0', port=5001, debug=True)
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
# mongodb 地址
|
||||
MONGODB_SETTINGS = {
|
||||
'host': 'mongodb://admin:111111@10.2.2.10:27017/ops_api?authSource=admin',
|
||||
}
|
|
@ -0,0 +1,113 @@
|
|||
from flask_restful import abort, Resource, marshal, fields
|
||||
|
||||
|
||||
class ModelViewBase(Resource):
|
||||
model = None
|
||||
fields = {}
|
||||
request_parse = None
|
||||
|
||||
def get_object(self, pk):
|
||||
try:
|
||||
return self.model.objects.get_or_404(id=pk)
|
||||
except:
|
||||
abort(404, msg=f"resource '{pk}' not found")
|
||||
|
||||
def get_queryset(self):
|
||||
return self.model.objects
|
||||
|
||||
|
||||
class ListMixin(ModelViewBase):
|
||||
|
||||
def get(self):
|
||||
"""获取列表数据"""
|
||||
# 过滤后的数据,
|
||||
# TODO 匹配过滤参数
|
||||
queryset = self.get_queryset()
|
||||
|
||||
# TODO 还要匹配分页,分页参数
|
||||
res = queryset.all()
|
||||
ret_format = {
|
||||
"count": fields.Integer,
|
||||
"data": fields.List(fields.Nested(self.fields))
|
||||
}
|
||||
return marshal({"data": res, "count": queryset.count()}, ret_format)
|
||||
|
||||
|
||||
class CreateMixin(ModelViewBase):
|
||||
|
||||
def pre_create(self, args):
|
||||
"""创建前钩子,接收参数,可以对参数进行处理,最后保存此方法返回的数据"""
|
||||
return args
|
||||
|
||||
def post(self):
|
||||
"""创建对象"""
|
||||
# 解析参数
|
||||
args = self.request_parse.parse_args()
|
||||
|
||||
# 创建前钩子,
|
||||
validated_data = self.pre_create(args)
|
||||
|
||||
# 保存对象
|
||||
obj = self.model(**validated_data)
|
||||
obj.save()
|
||||
|
||||
# 返回创建信息
|
||||
return marshal(obj, self.fields)
|
||||
|
||||
|
||||
class RetrieveMixin(ModelViewBase):
|
||||
|
||||
def get(self, pk):
|
||||
obj = self.get_object(pk)
|
||||
return marshal(obj, self.fields)
|
||||
|
||||
|
||||
class UpdateMixin(ModelViewBase):
|
||||
|
||||
def pre_update(self, obj, args):
|
||||
"""更新前钩子"""
|
||||
data = {}
|
||||
for k, v in args.items():
|
||||
# 为 None 的不设置
|
||||
if v is not None:
|
||||
data[k] = v
|
||||
return data
|
||||
|
||||
def put(self, pk):
|
||||
# 获取对象
|
||||
|
||||
obj = self.get_object(pk)
|
||||
# 解析参数
|
||||
args = self.request_parse.parse_args()
|
||||
validated_data = self.pre_update(obj, args)
|
||||
|
||||
# 更新对象、保存
|
||||
obj.update(**validated_data)
|
||||
obj.save()
|
||||
# 重新读取数据
|
||||
obj.reload()
|
||||
|
||||
return marshal(obj, self.fields)
|
||||
|
||||
|
||||
class DestroyMixin(ModelViewBase):
|
||||
|
||||
def pre_destroy(self, obj):
|
||||
"""删除对象前的方法,可以在这拦截做些操作"""
|
||||
pass
|
||||
|
||||
def delete(self, pk):
|
||||
"""删除对象方法"""
|
||||
obj = self.get_object(pk)
|
||||
# 删除前钩子
|
||||
self.pre_destroy(obj)
|
||||
obj.delete()
|
||||
return {"id": pk}
|
||||
|
||||
|
||||
class ListCreateViewSet(ListMixin, CreateMixin):
|
||||
"""不带 `pk` 参数的视图集合"""
|
||||
|
||||
|
||||
class DetailViewSet(RetrieveMixin, UpdateMixin, DestroyMixin):
|
||||
"""带 `pk` 参数的视图集合"""
|
|
@ -0,0 +1,7 @@
|
|||
from flask_mongoengine import MongoEngine
|
||||
|
||||
db = MongoEngine()
|
||||
|
||||
|
||||
def initialize_db(app):
|
||||
db.init_app(app)
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
from game.views import Server
|
||||
from flask import Blueprint
|
||||
from flask_restful import Api
|
||||
|
||||
# 当前app的蓝图,以app名为前缀
|
||||
game = Blueprint('game', __name__, url_prefix="/game")
|
||||
|
||||
# 增加路由
|
||||
api = Api(game)
|
||||
api.add_resource(Server, '/server/', endpoint="server")
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
from flask_restful import Resource
|
||||
|
||||
|
||||
class Server(Resource):
|
||||
""""""
|
||||
def get(self):
|
||||
return {"msg": "ok", "method": "get"}
|
||||
|
||||
def post(self):
|
||||
return {"msg": "ok", "method": "post"}
|
||||
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
from flask import Blueprint
|
||||
from game.routes import game
|
||||
|
||||
|
||||
blueprint_api = Blueprint('api-main', __name__, url_prefix='/api')
|
||||
|
||||
# 注册子蓝图,嵌套
|
||||
blueprint_api.register_blueprint(game)
|
||||
|
Loading…
Reference in New Issue