Uliweb框架思想与编程

1,640 views

Published on

1 Comment
1 Like
Statistics
Notes
  • 看到这个时间就感觉自己貌似穿越了^_^
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
1,640
On SlideShare
0
From Embeds
0
Number of Embeds
78
Actions
Shares
0
Downloads
26
Comments
1
Likes
1
Embeds 0
No embeds

No notes for slide

Uliweb框架思想与编程

  1. 1. Limodou@gmail.com 2011年11月27日
  2. 2.  Zope 2 2000.4 pyrecord.freezope.net,评论与翻译  PyBlosxom 2004.9 Blog程序,补丁未接受  Snakelets 2004.10 源码学习  Karrigell 2005.3年 源码学习  CherryPy 2005.3源码学习  Django 2005.7 贡献代码, db_dump  Web2py 2008.3 贡献代码  GAE 2008.4 制做网站,包括Uliwebproject网站  Uliweb 2008.5
  3. 3. 初识 Uliweb
  4. 4. Uliweb是 MVT型框架
  5. 5. WSGI
  6. 6. Web Server (Apache, Nginx) 请求 应答 静态文件 Dispatcher WSGI StaticFilesMiddleware WSGI DebugApplication WSGI 静态文件处理, 需加入staticfiles app 静态文件 调试界面 URL 处理 Middleware 处理 View 处理 模板处理 业务处理
  7. 7. Request & Response
  8. 8. View
  9. 9. Template
  10. 10. TestProject App1 App2 uliweb.contr ib.staticfiles uliweb.contr ib.orm static templates apps settings.ini views.py models.py settings.ini
  11. 11.  安装: >svn co http://uliweb.googlecode.com/svn/trunk/ uliweb >setup.py develop  Demo >uliweb makeproject TestProject >cd TestProject >uliweb makeapp Hello >uliweb runserver 访问 http://localhost:8000
  12. 12. 创建APP (makeapp name) 编辑views.py 设定URL 编写View代码 设计Template ORM处理 Form处理 功能性开发
  13. 13. 修改settings.ini 配置apps 其它的参数 dispatch处理 配置性开发
  14. 14. 开发服务器 uliweb runserver or uliweb develop
  15. 15. 进阶 Uliweb
  16. 16. 外部模块 Werkzeug SqlAlchemy SimpleJson(2.6自带)
  17. 17. Werkzeug 作者:Armin Ronacher 作品:Jinjia, Flask, pygments, Zine,Sphinx 在Uliweb中的应用:  Request, Response  Dispatcher  URL处理(expose, url_for)  DebugApplication  StaticFilesMiddleware  命令行处理结构  开发服务器,自动重启(我做了优化,可以识别象ini的变化)
  18. 18. SqlAlchemy (Michael Bayer: Mako) 在Uliweb中的应用  ORM  orm模块  uliweb.contrib.orm APP
  19. 19. 开始 Manage.py中执行make_application()传入apps_dir 和include_apps等参数 SimpleFrame.py初始化Dispatcher类 Dispatcher:根据settings.ini和include_apps获得 所有app的列表,保存为self.apps Dispatcher:根据self.apps,收集所有的 settings.ini和views*.py文件(views*.py并不导 入) Dispatcher:根据settings列表,依次导入 settings.ini到settings对象中。同时 apps/settings.ini最后导入 Dispatcher:导入所有app(即调用所有 app/__init__.py),激活app的初始化处理 Dispatcher:导入所有view*.py文件,收集expose中 定义的URL 结束
  20. 20. settings.ini
  21. 21. #coding=UTF-8 [GLOBAL] DEBUG = True INSTALLED_APPS = [ 'uliweb.contrib.staticfiles', ] MIDDLEWARE_CLASSES = [ 'uliweb.orm.middle_transaction.TransactionMiddle' ] TIME_ZONE = 'UTC'
  22. 22. Model
  23. 23. class Requirement(Model): req_id = Field(CHAR, verbose_name='编号', max_length=12, required=True, unique=True, index=True) year = Field(int, verbose_name='年度', required=True, choices=get_var('PARA/YEAR'), index=True, default=lambda :datetime.date.today().year) title = Field(str, verbose_name='标题', max_length=255, required=True) description = Field(TEXT, verbose_name='描述') begin_date = Field(datetime.date, verbose_name='阶段开始时间') creator = Reference('user', verbose_name='创建者', collection_name='creator_requirements') created_date = Field(datetime.date, verbose_name='创建时间', auto_now_add=True) systems = ManyToMany('system', verbose_name='执行系统', collection_name='sys_requirements')
  24. 24. class User(Model): username = Field(CHAR, max_length=20) year = Field(int) user = User(username='limodou', year=36) user.save() user = User.get(5) user = User.get(User.c.id==5) user.uesrname = 'user‘ user.save() user.delete()
  25. 25. User.all() User.filter(User.c.year > 18) User.all().filter(User.c.year>18).count() User.delete(User.c.year<18) User.count(User.c.year<18)
  26. 26. apps/settings.ini [ORM] CONNECTION = 'sqlite:///database.db' DEBUG_LOG = False uliweb/contrib/orm/settings.ini [ORM] DEBUG_LOG = False AUTO_CREATE = True CONNECTION = 'sqlite://'
  27. 27. Uliweb ORM 可以自动建表
  28. 28. 不喜欢Uliweb ORM? 发挥你的创造性吧!
  29. 29. View
  30. 30. #coding=utf-8 from uliweb import expose @expose('/') def index(): return '<h1>Hello, Uliweb</h1>'
  31. 31. @expose(‘/static/<path:filename>’) @expose(‘/archieve/<int:year>/<int:m on>’) @expose(‘/user/<username>’) @expose(‘/page’, default={‘pageno’:1}) @GET(‘/user/<username>’) @POST(‘/user/<username>/save’)
  32. 32.  参数与expose中定义的一致,如: @expose(‘/’) def index(): return {} @expose(‘/user/<username>’) def user_view(username): return {}
  33. 33. 字典,根据view函数名,自动 套动模板(来源于web2py) Response对象,直接返回 其它对象,使用str(obj)处理后, 转换为Response返回
  34. 34.  在直接View函数中有一些可以直接使用的全局变 量:  request, response, application, settings, error, redirect, json等  当在非直接View函数中想使用时,可以: import uliweb uliweb.request 或 from uliweb import request
  35. 35.  模板中 {{=url_for(‘Hello.views.index’)}} == ‘/index’  View函数中 url_for(‘Hello.views.index’) url_for(index)  参数传递 url_for(‘index’, pageno=0)
  36. 36. Template
  37. 37. {{=var}} {{python code}} {{<< htmlcode}} {{if user=='admin':}} <p>Welcome</p> {{else:}} <a href="/login">Login</a> {{pass}} {{block content}}<div>default content</div>{{end}} {{embed var}} {{include “template.html”}}
  38. 38. 高阶 Uliweb
  39. 39.  config.ini [DEFAULT] REQUIRED_APPS = ['uliweb.contrib.staticfiles', 'uliweb.contrib.template']
  40. 40.  sql 显示建表时的sql语句  reset 重建表  dump 卸出数据  load 装入数据  syncdb 自动创建表  dbinit 执行初始化脚本
  41. 41.  配置:settings.ini [MODELS] system = 'systems.models.System‘  导入: from uliweb.orm import get_model system = get_model(‘system’)
  42. 42. 可以将view方法拆分为: views_xx.py, views_yy.py 或放在views目录下的xx.py, yy.py
  43. 43. __begin__ & __end__
  44. 44.  模块:uliweb.core.dispatch  方法: bind, call, get  示例 dispatch.call(self.__class__, 'post_save', instance=self, created=created, data=old, old_data=self._old_values) @dispatch.bind(‘post_save’) def post_save(sender, instance, created, data, old_data): print sender, instance, created, data, old_data
  45. 45.  配置(settings.ini INSTALLED_APPS) ‘uliweb.contrib.template’  模板语法 {{use “jquery”}} {{link “jquery.1.4.4.js”}}
  46. 46. @expose(‘/index’, name=‘index’) url_for(‘index’)
  47. 47. 静态文件处理 uliweb exportstitic
  48. 48. i18n处理
  49. 49.  代码中: from uliweb.i18n import ugettext_lazy as _ _('Save')  模板中: {{=_(‘Save’)}}  命令行 i18n: extract i18n message catalog form app or all apps -a, --appname string --project --apps --core -l, --locale string en
  50. 50.  Settings.ini [I18N] LANGUAGE_CODE = 'en‘  其它 支持LazyTranslate 支持从浏览器的HTTP头判断需要的语言种类
  51. 51. 总结
  52. 52. 目标
  53. 53. 最大可能的提高复用性 分布式结构,集中使用 编写尽可能简单 创建易于使用的app 鼓励把Uliweb作为二次开发平台
  54. 54. 特点
  55. 55.  分布式结构,集中视图,工具辅助  App方式的项目组织方式  每个app相对完整,可以包括:静态资源,模板,配置  使用上,静态资源,模板,配置是一个整体  App有依赖功能  功能完整:MVT, i18n, auth, cache, session等  提供功能相对完整的ORM,并且orm可配置化  View方法可以自动套用模板  request, response,application, settings等可以直接在view方 法中使用,也可能导入使用  模板可以嵌入python代码,不用关心缩近,只要处理好 pass  Use,link Tag  url采用类正则式方式,更容易写。并提供命名方式和反向 url功能
  56. 56. 我做了什么?
  57. 57.  SimpleFrame  Dispatch  Template(修改)  Weto(cache, session)  I18n  ORM  Form  Generic  pyini
  58. 58. 相关资源
  59. 59.  项目主页: http://code.google.com/p/uliweb  参考项目: http://code.google.com/p/weflow  宣传网站: http://uliwebproject.appspot.com  入门文档: 《Learning Uliweb》
  60. 60. FAQ

×