Uliweb更多话题介绍
• wsgi
• middleware
• session
• cache
• 事务处理
• i18n
• MVVM集成
• 批处理
• use机制的实现
• app依赖
• 邮件发送
• 守护
• redis
• 文件上传
• rbac
• 信号机制
• 静态文件导出
• 部署
• generic代码框架生成
• 其它常用命令
WSGI
Uliweb应用结构
uliweb应用
DebugApplication
Dispatcher
Middleware
Middleware
View
middleware
class Middleware(object):
ORDER = 500
def __init__(self, application, settings):
self.application = application
self.settings = settings
def process_request(self, request):
def process_response(self, request, response):
def process_exception(self, request, e):
[MIDDLEWARES]
auth = ('uliweb.contrib.auth.middle_auth.AuthMiddle', 100)
transaction = 'uliweb.contrib.orm.middle_transaction.TransactionMiddle'
i18n = ('uliweb.contrib.i18n.middle_i18n.I18nMiddle', 500)
session = ('uliweb.contrib.session.middle_session.SessionMiddle', 50)
traceback =
('traceback_middleware.middle_traceback.TracebackMiddle', 40)
uliwebrecorder =
'uliweb.contrib.recorder.middle_recorder.RecorderrMiddle'
#transaction = 'uliweb.orm.middle_transaction.TransactionMiddle'
#orm_notfound = 'uliweb.orm.middle_notfound.ORMNotfoundMiddle'
urlfilter = 'rbac_man.middle_urlfilter.URLFilterMiddle'
sqlmonitor = 'uliweb.contrib.orm.middle_sqlmonitor.SQLMonitorMiddle'
session
• 使用时需要添加 uliweb.contrib.session
• 支持多种后端:数据库,文件,redis, memcache
• 通过middleware向request绑定一个session的对象,
可以象dict一样使用
cache
• 使用和session一样的后端处理
• 可以通过 functions.get_cache()来获得一个cache对
象
• cache.set(key, value, expire=60)
事务处理
• 通过TransactionMiddle对请求进行封装,调用前启动
事务,调用后关闭事务
• 如果要手工执行事务,可以:
from uliweb.orm import Begin, Commit, Rollback
I18N
• 需要配置uliweb.contrib.i18n
• 在程序中定义翻译函数
from uliweb.i18n import ugettext_lazy as _
_(‘save’)
• 使用uliweb i18n命令抽取翻译串
• 使用poEdit工具将po翻译为mo文件
• 语言识别顺序,看文档
• 模板中使用 {{=_(‘save’)}}
MVVM集成
• angularjs
• avalonjs(推荐国产)
• 配置 plugs.ui.avalon
• 在模板中使用 {{use “avalon”}}
批处理
• 可以在项目的某个app下直接编写,如:
• def main(args, options, global_options):
#处理
• 调用时使用 uliweb call <文件名>
• 可以自动启动uliweb项目的实例
定义1
app/template_plugins/xxxx.py
def call(version=None):
from uliweb import settings
a = []
version = version or
settings.UI_CONFIG.angularjs_version
a.append('angularjs/%s/angular-%s.min.js' %
(version, version))
a.append('jsutils/json2.js')
return {'toplinks':a}
定义2
settings.ini
[TEMPLATE_USE]
zeroclipboard =
{'toplinks':['zeroclipboard/ZeroClipboard.m
in.js'],
'depends':['jquery']
}
use 也可以实现依赖
使用
use, link
{{use “avalon”}}
{{link “test.js”}}
‘uliweb.contrib.template’
<script type="text/javascript"
src="/static/avalon/avalon.js?ver=18"></script>
<script type="text/javascript"
src="/static/avalon/avalon_init.js?ver=18"></script>
模板继承的处理
#layout.html
<html>
<head>
{{use "bootstrap"}}
</head>
<body>{{block content}}{{end}}</body>
</html>
#layout.html
{{extend “layout.html”}}
{{block content}}
{{use “avalon”}}
{{end}}
处理结果
#layout.html
<html>
<head>
{{use "bootstrap"}}
{{use “avalon”}}
</head>
<body>{{block content}}{{end}}</body>
</html>
config.ini
----------------------------------
[DEPENDS]
REQUIRED_APPS = [
'uliweb.contrib.template',
'uliweb.contrib.staticfiles',
'uliweb.contrib.generic',
'uliweb.contrib.upload',
'uliweb.contrib.flashmessage',
'uliweb.contrib.i18n',
'uliweb.contrib.orm',
'uliweb.contrib.auth',
]
APP依赖
邮件发送
• 配置 uliweb.contrib.mail
• 添加mail服务相关的配置
• 支持:sendmail, smtp, gmail后端
def mail():
from uliweb.mail import Mail
Mail().send_mail('limodou@gmail.com', 'limodou@gmail.com',
u'中文标题', u'中文内容')
return 'ok'
python -m smtpd -n -c DebuggingServer localhost:1025
程序方式启动项目实例
• from uliweb.manage import
make_simple_application
• app = make_simple_application(project_dir=‘.’)
• 然后可以调用apps中内容
守护
• 就是一个死循环
• 使用supervisord模块来管理守护
• 在循环中要注意Reset(),请数据库重连
redis
• 是一个k/v的NOSQL数据库
• 支持缓存功能
• 支持持久化功能
• 性能高,单线程工作
• 有pub/sub功能
• 列表可以阻塞实现队列
• 支持丰富的数据结构
redis_cli
• 配置uliweb.contrib.redis_cli
• 可以自动连接一个缺省的redis服务器
• functions.get_redis()
文件上传
• 配置uliweb.contrib.upload
• 提供FileServing类,提供:上传后文件名转换,指定
文件存储路径,获取文件下载URL,支持X-SendFile
机制
X-SendFile
rbac
• 其于角色的用户管理
• 有角色表,权限表
• 提供对角色和权限的判断
• 提供缺省的角色
• 角色,权限以及角色与权限的关系可以定义在settings.ini
中,并可以使用 uliweb dbinit uliweb.contrib.rbac来导入
• 支持简单角色和动态角色
信号机制
• 有些象pub/sub
• 为了实现解耦
• 目前是同步调用
• dispatch.call()发出信号
• @bind(topic)
def function()
ORM的信号
• post_save
• pre_save
• post_delete
• pre_delete
静态文件导出
• uliweb exportstatic ../static
部署
• nginx 反向代理
• uwsgi python容器
• supervisor 进程管理工具
• redis 缓存
• mysql 数据库
• 使用uliweb config快速生成部署文件模板
generic代码框架生成
• 配置uliweb.contrib.generic
• 执行uliweb generic
generic_app_blog>uliweb generic
Appname:blog
Table Name:blog
Creation Theme([a]ngularjs, [h]tml), [e]sayui)[a]:h
View Class Name [BlogView]:
Save views to [views_blog.py]:
Class View URL prefix [/blog]:
Enable pagination(Y/n/q)[Y]:
Enable query(Y/n/q)[Y]:n
Enable download(Y/n/q)[Y]:n
Add View using popup(Y/n/q)[Y]:n
Add View using ajax(Y/n/q)[Y]:n
Edit View using popup(Y/n/q)[Y]:n
Edit View using ajax(Y/n/q)[Y]:n
Delete View using ajax(Y/n/q)[Y]:
其它常用命令
uliweb find
• 查找模板
• 查找URL
• 查找静态文件
• 查找Model
• 查找配置项
ORM常用命令
• syncdb 新建表
• sqlshell 进入数据库命令行
• sql 显示create语句
• sqldot 生成dot文件
• sqlhtml 生成文档
• load, reset, dump
makecmd
• 创建app下的命令
• 支持子命令
recorder
• 记录操作
• 可以回放
Q&A

04.uliweb更多话题介绍

Editor's Notes

  • #4 Python WEB Service Gateway Interface
  • #13 注意:文件名不带.py
  • #18 实际的处理是:先编译成.py文件,use, link都将转为对应的函数,然后进行模板的渲染,在最后和动态插入到</head>之前。因此use, link可以在渲染前来保证调用的顺序。
  • #27 动态角色就是通过程序方式来判断角色