FPage 是一个传统的(即前后端分离之前)tornado项目生成器(CLI)。
能够自动创建基于 tornado mako/jinja2 peewee/sqlalchemy 的项目。
通过 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:9500 来查看效果
实例:
# 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:9500
-
基于 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('/') class Index(View): def get(self): self.render() def post(self): pass @route('/about', name='about') class About(View): def get(self): self.render()
-
简单 session 支持(基于 secure cookie)
@route('/') class Index(View): def get(self): self.session['test'] = 'session test 1' del self.session['test'] self.session['test'] = 'session test 2' self.render(s=self.session['test'])
-
可选择模板引擎 mako 或 jinjia2 或 tornado 默认,已做好配置
<body> ${self.body()} <%block name="script"/> </body>
<body> {% block body %}{% endblock %} {% block script %}{% endblock %} </body>
-
模板预定义模板变量:req static url_for csrf_token/xsrf_token
req -> request object${ req.current_user }
static -> static file
<script src="${ static('js/main.js') }"></script> <link rel="stylesheet" href="${ static('css/style.css') }">
url_for -> url reverse
<p><a href="${ url_for('jump') }">Jump Page</a></p> <p><a href="${ url_for('about') }">About Page</a></p>
csrf_token -> self.xsrf_form_html()
<form method="post" class="am-form"> ${csrf_token} </form>
-
集成 sqlalchemy/peewee 支持(二选一)
configDATABASE_URI = "sqlite:///database.db"
sqlalchemy
from model import BaseModel from sqlalchemy import Column, Integer, String, Float, ForeignKey, Boolean class Test(BaseModel): __tablename__ = 'test' id = Column(Integer, primary_key=True, autoincrement=True) test = Column(String)
peewee
from peewee import * from model import BaseModel class Test(BaseModel): test = TextField()
-
集成消息闪现功能(类似 django 中 messages 或 flask 中 flash)
view@route('/jump_test', name='jump') class Jump(View): def get(self): self.messages.error('Message Test: Error!!') self.redirect(url_for('about'))
template
% for msg in get_messages(): % if msg.tag == 'success': <div class="ui-green"> ${msg.txt} </div> % elif msg.tag == 'error': <div class="ui-red"> ${msg.txt} </div> % endif % endfor
-
自动生成页面标题
例如:config.TITLE = 'FPage'
渲染模板时写入参数 page_title
self.render(page_title=page_title('测试板块', '社区')
于是此页面网页标题就是:测试板块 » 社区 » FPage
-
内置分页工具
model.pagination_peewee / model.pagination_sqlalchemy
参数大致如此:
def pagination(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, } }
-
加入了分页工具
-
加入 pypi 软件源(早该如此……)
-
现在 config 也作为模板中的一个预定义变量
-
加入新的 View 基类: AjaxLoginView
-
新的辅助函数:page_title,用来自定义标题
-
peewee 的 BaseModel 加入了几个工具函数:to_dict(转为字典)、get_by_pk(根据主键取项,无则返回None)、exists_by_pk(根据主键判断是否存在)
-
修正了“记住密码”选项无效的问题
-
用户注册增加了“再次输入密码”的校验
-
登录和注册增加了参数 next,用来指定操作完成后跳转的url
-
加入了自动测试
-
加入了用户模块
-
加入了与用户相关的两个View基类:LoginView(登陆后可访问) 和 NoLoginView(非登陆可访问)
-
加入了一个不检查 xsrf 的基类 AjaxView
-
默认 ORM 切换为 peewee
-
一些小的修正
- 不再增加新功能,一个时代已经落幕