Skip to content

Commit d66bad0

Browse files
committed
Merge branch 'release/0.3.6'
2 parents 3da0e8e + 4083070 commit d66bad0

File tree

26 files changed

+492
-159
lines changed

26 files changed

+492
-159
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
[![codebeat badge](https://codebeat.co/badges/da82dbdb-eceb-4166-b9e9-2d290c5f608f)](https://codebeat.co/projects/github-com-systemlight-madtornado-master)
66
[![Build Status](https://travis-ci.org/SystemLight/madtornado.svg?branch=master)](https://travis-ci.org/SystemLight/madtornado)
77
[![Documentation Status](https://readthedocs.org/projects/madtornado/badge/?version=stable)](https://madtornado.readthedocs.io/zh/latest/?badge=latest)
8+
[![Gitter](https://badges.gitter.im/systemlight-madtornado/community.svg)](https://gitter.im/systemlight-madtornado/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
89

910
Madtornado is a project templates for Tornado framework and quickly generate the Tornado project.
1011
PyPI page: https://pypi.python.org/pypi/madtornado

README.zh.md

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
[![codebeat badge](https://codebeat.co/badges/da82dbdb-eceb-4166-b9e9-2d290c5f608f)](https://codebeat.co/projects/github-com-systemlight-madtornado-master)
66
[![Build Status](https://travis-ci.org/SystemLight/madtornado.svg?branch=master)](https://travis-ci.org/SystemLight/madtornado)
77
[![Documentation Status](https://readthedocs.org/projects/madtornado/badge/?version=latest)](https://madtornado.readthedocs.io/zh/latest/?badge=latest)
8+
[![Gitter](https://badges.gitter.im/systemlight-madtornado/community.svg)](https://gitter.im/systemlight-madtornado/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
89

910
madtornado是一个tornado框架的快速构建工具
10-
PyPI page: https://pypi.python.org/pypi/madtornado
11+
PyPI page: https://pypi.python.org/pypi/madtornado
12+
[原生tornado文档参考](https://www.osgeo.cn/tornado/index.html)
1113

1214
# 拥有的特性
1315

@@ -21,9 +23,10 @@ PyPI page: https://pypi.python.org/pypi/madtornado
2123
- 拓展了tornado handler的方法,如果你想使用原生的tornado handler请继承RequestHandler,否则请继承handler.inheritHandler里面的Base
2224
- 开箱即用,通过在ancient下的view中编写模块,内置两个前台和后台模块,可以自行增加或删除,也可以通过(注意需要在madtornado根目录下运行)sea -np快速创建
2325
- 内置sea命令行工具,不仅能快速创建madtornado项目,还同时包含一些快捷操作和madtornado进行交互便于开发
26+
- 手机端测试查找地址,通过扫控制台打印的二维码快速定位,需要配置network_index指定打印的网卡,0代表不打印二维码
2427

2528
# 未来计划添加特性
26-
- 优化手机端测试查找地址,通过扫控制台打印的二维码快速定位
29+
2730
- 强化虚拟主机配置能力
2831
- 增强sql模块处理能力,采用链式查找方式,更加灵活
2932
- 增加注册路由描述功能,帮助生成网站地图时添加描述信息
@@ -104,6 +107,8 @@ class IndexHandler(BaseHandler):
104107

105108
```
106109
sea --new_recp %madtornado_project%\ancient\view\reception.py
110+
或者使用下面的简化版,但是要在madtornado根目录下执行且reception是指定要添加路由的模块的名称
111+
sea -nr reception
107112
```
108113

109114
## 目录说明
@@ -124,22 +129,22 @@ sea --new_recp %madtornado_project%\ancient\view\reception.py
124129
server.py 程序主入口,通过运行该文件来启动madtornado提供web服务吧
125130
```
126131

127-
#### ancient
132+
#### ancient下包说明
128133

129134
```
130-
custom
135+
custom 自定义模板引擎方法的模块存放位置
131136
132-
handlers
137+
handlers 路由核心模块,view中的路由一般会继承该包下inheritHandler中的Base类,且你可以在这里更换Base变量指向来让全局的路由更换基类
133138
134-
model
139+
model 存放模型的位置
135140
136-
module
141+
module 存放模块的位置,包含拓展的sql,file等操作模块
137142
138-
rig
143+
rig 存放一些额外工具的地方,其中register是路由注册模块,通过引入该模块,让路由可以被注册到路由表中
139144
140-
user
145+
user 使用者独立的空间,你可以根据喜好放置任何内容
141146
142-
view
147+
view 核心工作区域,你可以把所有路由写入一个模块中也可以把不同路由按照模块进行区分,内置三个模块示例均可删除,其中upload.py是大文件分块上传示例,可以直接把注册代码的注释取消掉即可使用
143148
```
144149

145150
# 通过配置文件配置madtornado

madtornado/ancient/custom/uiMethod.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ def hello_method(self):
22
return 'hello uiMethod'
33

44

5+
def hello_func(self, content):
6+
return "<div>{}</h1>".format(content)
7+
8+
59
def static_url(self, path):
610
"""
711
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from .asyncMysql import Component as AsyncMysql
2+
from .syncFile import Component as SyncFile
3+
from .syncJwt import Component as SyncJwt
4+
from .syncMemcached import Component as SyncMemcached
5+
from .syncMysql import Component as SyncMysql
6+
from .syncSqlite import Component as SyncSqlite
7+
8+
__all__ = [
9+
AsyncMysql,
10+
SyncFile,
11+
SyncJwt,
12+
SyncMemcached,
13+
SyncMysql,
14+
SyncSqlite,
15+
]

madtornado/ancient/module/asyncMysql.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
SQL_CONTENT = TypeVar("SQL_CONTENT", int, float, str, bool)
99

1010
option = parser.options("db")
11-
print("[asyncMysql] is imported.\n")
11+
print("[asyncMysql] is imported.")
1212

1313

1414
class Component:
@@ -49,6 +49,13 @@ def __init__(self):
4949
self.is_return_dict = False
5050
self.switch = False
5151

52+
async def __aenter__(self):
53+
await self.on()
54+
return self
55+
56+
async def __aexit__(self, exc_type, exc_val, exc_tb):
57+
await self.off()
58+
5259
def set_return_dict(self, is_return_dict: bool = True) -> None:
5360
"""
5461
@@ -70,9 +77,13 @@ async def on(self) -> None:
7077
7178
db=Component()
7279
db.on()
73-
db.select_tw("table")
80+
result = await db.select_tw("table")
7481
db.off()
7582
83+
# 与上述使用方法一致
84+
async with Component() as com:
85+
result = await com.select_tcw("table")
86+
7687
快捷使用方法::
7788
7889
with Component() as db:

madtornado/ancient/module/syncFile.py

Lines changed: 75 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import shutil
55
import uuid
66
import hashlib
7-
from typing import Iterable, Tuple, Optional
7+
from typing import Iterable, Tuple, Optional, Union
88

99
option = parser.options("file")
1010
print("[syncFile] is imported.\n")
@@ -25,10 +25,11 @@ class Component:
2525
"""
2626

2727
def __init__(self, path="", top_path=None):
28-
if top_path:
29-
self.root_path = self.ajoin(top_path, path)
30-
else:
31-
self.root_path = self.ajoin(option["path"], path)
28+
if not top_path:
29+
top_path = option["path"]
30+
31+
self.root_path = self.ajoin(top_path, path)
32+
self.rel_root_path = self.join(top_path, path)
3233

3334
self.write_chunk = self.read_chunk = 65536
3435
self.write_fp = self.read_fp = None
@@ -59,7 +60,18 @@ def join(*args) -> str:
5960
return os.path.normpath(os.path.join(*args))
6061

6162
@staticmethod
62-
def ensure_dir(path: str) -> bool:
63+
def touch(path: str) -> None:
64+
"""
65+
66+
快速创建一个空文件
67+
68+
:param path: 文件路径
69+
:return: None
70+
71+
"""
72+
open(path, "wb").close()
73+
74+
def ensure_dir(self, path: Union[str] = None) -> bool:
6375
"""
6476
6577
确保文件夹存在,不存在则创建它
@@ -68,24 +80,15 @@ def ensure_dir(path: str) -> bool:
6880
:return: 返回判断之前是否存在该文件
6981
7082
"""
83+
if path is None:
84+
path = self.root_path
85+
7186
if os.path.exists(path):
7287
return True
7388
else:
7489
os.makedirs(path)
7590
return False
7691

77-
@staticmethod
78-
def touch(path: str) -> None:
79-
"""
80-
81-
快速创建一个空文件
82-
83-
:param path: 文件路径
84-
:return: None
85-
86-
"""
87-
open(path, "wb").close()
88-
8992
def get_safe_path(self, *args) -> str:
9093
"""
9194
@@ -246,7 +249,7 @@ def receive_file(self, files, arg_name="image", is_only=True, file_name=None) ->
246249
:param arg_name: 参数名称
247250
:param is_only: 是否生成唯一ID文件名
248251
:param file_name: 当is_only=False时,提供的自定义文件名称,如果不提供则来自上传的文件名,拓展名以上传文件为准无需附加
249-
:return: (文件名称[不携带拓展名],文件保存本地地址,文件拓展名)
252+
:return: (文件名称[不携带拓展名],文件拓展名,文件相对服务器保存路径)
250253
251254
"""
252255
file_list = files.get(arg_name, None)
@@ -273,4 +276,56 @@ def receive_file(self, files, arg_name="image", is_only=True, file_name=None) ->
273276
save_path = self.get_safe_path(name + source_ext)
274277
self.write(save_path, source_file.body)
275278

276-
return name, source_ext, save_path
279+
return name, source_ext, self.join(self.rel_root_path, name + source_ext)
280+
281+
@staticmethod
282+
def rollback_receive_file(path: str) -> None:
283+
"""
284+
285+
有时接收文件后将接收的文件名传入到数据库中,如果这时数据库错误需要回退操作,那么你可以使用该方法删除接收的文件,实现回退
286+
287+
:param path: 文件路径
288+
:return: None
289+
290+
"""
291+
try:
292+
os.remove(path)
293+
except FileNotFoundError:
294+
pass
295+
296+
297+
def insert2fp(file_path, offset, content, per_size=2048):
298+
"""
299+
300+
允许你在文件指定位置进行内容插入
301+
302+
:param file_path: 文件路径
303+
:param offset: 文件偏移位置
304+
:param content: 插入的内容
305+
:param per_size: 每片读取大小限制
306+
:return: None
307+
308+
"""
309+
copies = offset // per_size
310+
311+
f_dir, f_name = os.path.split(file_path)
312+
temp_path = os.path.join(f_dir, f_name + ".temp")
313+
314+
with open(temp_path, "w") as w_fp:
315+
with open(file_path, "r") as fp:
316+
fp.seek(0)
317+
318+
for c in range(1, copies + 1 + int(offset % per_size > 0)):
319+
if c * per_size >= offset:
320+
result = fp.read(offset - fp.tell())
321+
else:
322+
result = fp.read(per_size)
323+
w_fp.write(result)
324+
325+
w_fp.write(content)
326+
327+
for c in fp:
328+
w_fp.write(c)
329+
330+
os.remove(file_path)
331+
os.rename(temp_path, file_path)

madtornado/ancient/module/syncJwt.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from typing import Optional, Dict
77

88
option = parser.options("token")
9-
print("[syncJwt] is imported.\n")
9+
print("[syncJwt] is imported.")
1010

1111

1212
class Component:
@@ -16,9 +16,6 @@ def __init__(self):
1616
self.secret = option["secret"]
1717
self.algorithm = option["algorithm"]
1818

19-
def __enter__(self):
20-
return self
21-
2219
def decode(self, payload: str or bytes) -> Dict:
2320
"""
2421

madtornado/ancient/module/syncMemcached.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import json
66

77
option = parser.options("cache")
8-
print("[syncMemcached] is imported.\n")
8+
print("[syncMemcached] is imported.")
99

1010

1111
class Component:

madtornado/ancient/module/syncMysql.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
SQL_CONTENT = TypeVar("SQL_CONTENT", int, float, str, bool)
99

1010
option = parser.options("db")
11-
print("[syncMysql] is imported.\n")
11+
print("[syncMysql] is imported.")
1212

1313

1414
class Component:

madtornado/ancient/module/syncSqlite.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
SQL_CONTENT = TypeVar("SQL_CONTENT", int, float, str, bool)
99

1010
option = parser.options("db")
11-
print("[syncSqlite] is imported.\n")
11+
print("[syncSqlite] is imported.")
1212

1313

1414
def dict_factory(cursor, row):

0 commit comments

Comments
 (0)