Tornado project generator. Start a project with tornado, mako/jinjia2 and sqlalchemy/peewee in a minute.
FPage 是一个传统的(即前后端分离之前)tornado项目生成器(CLI)。
能够自动创建基于 tornado + mako/jinja2 + peewee/sqlalchemy 的项目。
实例可参考 StoryNoteMyCTF等项目。
English
使用
通过 pip:pip install fpage
fpage new [项目名]
clone后直接使用:
python fpage.py new [项目名]
然后选择一个模板引擎(Mako/Jinja2/Tornado)
其次是ORM选择(Peewee/SQLChemy)
最后输入 y 确认
生成的目录就是你需要的,你可以试一下 python app.py 来运行他,然后访问 http://127.0.0.1:9000来查看效果
实例:
# fpage new test_project
Project Name (test_project):
Template Engine [M/J/T]:
Database ORM [P/S]:
Project Name: test_project
Template Engine: mako
Database ORM: peewee
Sure (Y/n)?
Complete.
To get started:
cd test_project
python app.py
Served at http://localhost:9000
特性
- 基于 tornado
- MVT 架构(Model, View, Template)
- 兼容 python 3 & python 2
- 合理的安全性支持 (secure cookie, xsrf)
- 支持 flask 风格的 url 路由装饰器 @route
- 简单 session 支持(基于 secure cookie)
- 可选择模板引擎 mako 或 jinjia2 或 tornado 默认,已做好配置
- 模板预定义模板变量:req static url_for csrf_token/xsrf_token config
- 集成 sqlalchemy/peewee 支持(二选一)
- 集成消息闪现功能(类似 django 中 messages 或 flask 中 flash)
- 集成简单的用户系统
- 自动生成页面标题
- 可选的 Peewee 序列化扩展组件
- 内置分页工具
目录结构
- model 数据库交互
- view 逻辑
- templates 模板目录
- lib 存放一些全局使用的工具类
特性说明
- 支持 flask 风格的 url 装饰器 @route
from view import route, url_for, View
@route('/')
classIndex(View):
defget(self):
self.render()
defpost(self):
pass
@route('/about', name='about')
classAbout(View):
defget(self):
self.render() - 简单 session 支持(基于 secure cookie)
@route('/')
classIndex(View):
defget(self):
self.session['test'] ='session test 1'
delself.session['test']
self.session['test'] ='session test 2'
self.render(s=self.session['test']) - 可选择模板引擎 mako 或 jinjia2 或 tornado 默认,已做好配置
<body>
${self.body()}
<%blockname="script"/>
</body><body>
{%blockbody%}{%endblock%}
{%blockscript%}{%endblock%}
</body> - 模板预定义模板变量:req static url_for csrf_token/xsrf_token
req -> request objectstatic -> static file${ req.current_user }
url_for -> url reverse<scriptsrc="${ static('js/main.js') }"></script>
<linkrel="stylesheet"href="${ static('css/style.css') }">csrf_token -> self.xsrf_form_html()<p><ahref="${ url_for('jump') }">Jump Page</a></p>
<p><ahref="${ url_for('about') }">About Page</a></p><formmethod="post"class="am-form">
${csrf_token}
</form> - 集成 sqlalchemy/peewee 支持(二选一)
configsqlalchemyDATABASE_URI="sqlite:///database.db"
peeweefrom model import BaseModel
from sqlalchemy import Column, Integer, String, Float, ForeignKey, Boolean
classTest(BaseModel):
__tablename__ ='test'
id= Column(Integer, primary_key=True, autoincrement=True)
test = Column(String)from peewee import*
from model import BaseModel
classTest(BaseModel):
test = TextField() - 集成消息闪现功能(类似 django 中 messages 或 flask 中 flash)
viewtemplate@route('/jump_test', name='jump')
classJump(View):
defget(self):
self.messages.error('Message Test: Error!!')
self.redirect(url_for('about'))%for msg in get_messages():
%if msg.tag =='success':
<divclass="ui-green">
${msg.txt}
</div>
%elif msg.tag =='error':
<divclass="ui-red">
${msg.txt}
</div>
% endif
% endfor - 自动生成页面标题
例如:config.TITLE = 'FPage'
渲染模板时写入参数 page_title于是此页面网页标题就是:测试板块 » 社区 » FPageself.render(page_title=page_title('测试板块', '社区')
- 内置分页工具
model.pagination_peewee / model.pagination_sqlalchemy
参数大致如此:输出大致如此:defpagination(count_all, query, page_size, cur_page=1, nearby=2):
pass{
'cur_page': cur_page,
'prev_page': prev_page,
'next_page': next_page,
'first_page': first_page,
'last_page': last_page,
'page_numbers': list(items),
'page_count': page_count,
'items': [...],
'info': {
'page_size': page_size,
'count_all': count_all,
}
}FROM https://github.com/fy0/fpage