- 人比较懒。啥事都想少做。都懂得( ̄ェ ̄;)
- 用flask_restful 开发api接口。接口比较多的那种。
- 想想。每个对象都得添加一个对应的route。
- 像杂家这种懒人。
- 怎么可能会去乖乖的写。
- 查了半天资料终于解决了(比写route还费时间。不知道图啥)
上resource代码
from utils.tools import create_route
class Base(Resource):
def __init__(self):
pass
class FrontShop(Base):
def get(self):
parse = reqparse.RequestParser()
parse.add_argument('id', type=int)
return {'a': 'b'}
class FrontText(Base):
def get(self):
return {'a': 'db'}
#这个就是创建路由的函数,下面会详细展示。
ROUTES = create_route(__name__, __file__)
- 上面的代码都是比较简单。懒得写注释了
上tools代码
import os, re, importlib
def create_route(source_name, fsource_ile):
#获取文件目录
filename_source = os.path.dirname(fsource_ile)
#获取文件名称
name = source_name.split('.')[-1]
#拼接文件路径
filename = '%s\%s.py' % (filename_source, name)
#打开文件
with open(filename, 'r') as file:
#定义一个返会列表
return_data = []
#遍历文件
while True:
text = file.readline()
#正则匹配对象文件获取对象的名称
regex = re.search(r'^class\s([a-zA-Z]*?)\(Base\):', text, re.M | re.I)
#判断是否匹配
if regex:
#获取对象名称
cls = regex.group(1)
#添加对象到返回参数
return_data.append(
{
'url': '/%s/' % cls,
'func': getattr(importlib.import_module(source_name), cls),
'endpoint': cls.lower()
}
)
#判断退出
if not text:
break
return return_data
- 上面的代码主要就是
- getattr(importlib.import_module(source_name), cls)
- 利用getattr获取文件内的对象, 遍历出来的是字符串。
- 是无法绑定route的。
- importlib.import_module(source_name) 是根据文件名称获取到当前的包名称。
- python 一切皆对象。所以事业getattr是成立的。
- 后期需要对url等参数进行处理才行。上面只是测试。
最后进行遍历生成route
from .resources import ROUTES
from exts import api
print(ROUTES)
for v in ROUTES:
api.add_resource(v['func'], v['url'], endpoint=v['endpoint'])
此方法可能不完美。有好的方法麻烦分享一下。共同进步!
完结。
网友评论