最近我在写一个项目,叫做TsukiHikari的基于flask的一个更加高层的web框架,我想到了mod
首先是mod的调用方式,我这里选择的是类似下面的调用方法
https://***.preview.myide.io/index.html/mod/hello
https://xxx.xx/<访问的文件>/<Load_mod>/<mod名>
在这个项目里面有一个mod文件夹,在mod文件夹里面我使用__init__.py来引入本目录的所有文件,然后使用exec来运行mod里面的main函数,会给函数传入两个参数:catalogue,RC
catalogue:访问文件的目录(str),RC:访问文件的内容(list[<文件内容>,<MIME>])
返回值也要制定标准:->list[‘输出内容’,’MIME’]
这样子mod就可以访问到文件或者文件经过解释器运行之后返回的内容,我把它包装成了mod函数,方便调用,核心源码:
def mod(catalogue,modn): #加载mod
'''参数:
catalogue : str 文件路径<path:catalogue>
modn : str mod的名字
return:
Response对象,可以直接当作app.route装饰器下的函数返回值
mod开发标准:
app.py会自动调用mod的main函数,必须要main函数作为入口函数,函数传值:
catalogue:访问文件的目录(str),RC:访问文件的内容(list[<文件内容>,<MIME>])
返回值:->list['输出内容','MIME']
'''
RC = Return_content(catalogue,False) #获取访问文件内容
catalogue = WWWROOT+catalogue #拼接完整路径
mod = __import__(f'mod.{modn}',RC) #导入mod包
exec(f'mods = mod.{modn}.main(catalogue,RC)') #运行mod
mod = locals()['mods'] #获取mod返回值
return Response(mod[0], mimetype=mod[1])
于是我就写了个mod:hello.py
def main(catalogue,RC)->list: #->list['输出内容','MIME']
a = f'''欢迎使用mod!你的页面的内容是{RC[0].decode('utf-8')}'''
return [a,'text/html']
访问的文件是index.html,url:https://ouismy-hqsazd-8888.preview.myide.io/index.html/mod/hello
<!DOCTYPE html>
<!--index.html-->
<html>
<h2>hello world</h2>
</html>
返回的东西,可能经过web服务器自动整理了:
<html><head></head><body>欢迎使用mod!你的页面的内容是
<!--index.html-->
<h2>hello world</h2>
</body></html>