ZHGDG_HOA.9_Py的困惑和突破

 ZHGDG_HOA.9_Py的困惑和突破

6002ee051e03f0b762642ee7fafd111f?s=128

Zoom.Quiet

August 18, 2014
Tweet

Transcript

  1. Python  Web  Dev  的困惑与突破   http://laiyonghao.com   2014.8.16  

  2. who?  

  3. who?   赖勇浩  

  4. 9+年  

  5. geme->webgame->web  

  6. 彩票   电话、自助终端、互联网   创业者  

  7. 珠三角技术沙龙   创始人、组委  

  8. PyCon  China   2011、2012、2013  

  9. 库、框架、程序、插件  

  10. 库   重用、减量  

  11. 框架   制定规范  

  12. 程序   功能、服务  

  13. 插件   扩展   功能、服务  

  14. 插件的麻烦   机制、协议  

  15. 框架对插件机制的支持  

  16. None
  17. subapplications  

  18. blog.py   import  web   urls  =  (    

     "",  "reblog",      "/(.*)",  "blog"   )     class  reblog:          def  GET(self):  raise  web.seeother('/')     class  blog:          def  GET(self,  path):                  return  "blog  "  +  path     app_blog  =  web.application(urls,  locals())  
  19. main.py   import  web   import  blog   urls  =

     (      "/blog",  blog.app_blog,      "/(.*)",  "index"   )     class  index:          def  GET(self,  path):                  return  "hello  "  +  path     app  =  web.application(urls,  locals())   if  __name__  ==  "__main__":          app.run()  
  20. Blueprints  

  21. simple_page.py   from  flask  import  Blueprint,  render_template,  abort   from

     jinja2  import  TemplateNotFound     simple_page  =  Blueprint('simple_page',  __name__,                                                  template_folder='templates')     @simple_page.route('/',  defaults={'page':  'index'})   @simple_page.route('/<page>')   def  show(page):          try:                  return  render_template('pages/%s.html'  %  page)          except  TemplateNotFound:                  abort(404)  
  22. main.py   from  flask  import  Flask   from  yourapplication.simple_page  import

     simple_page     app  =  Flask(__name__)   app.register_blueprint(simple_page)  
  23. INSTALLED_APPS  

  24. settings.py   INSTALLED_APPS  =  [          'anthology.apps.GypsyJazzConfig',

             #  ...   ]  
  25. Extensible  applications  

  26. main.py   if  __name__  ==  '__main__':        

     config.scan('someotherpackage')          config.add_view('mypackage.views.myview',   name='myview')  
  27. Overriding  Views   def  configure_views(config):          config.add_view('theoriginalapp.views.theview',

      name='theview')     ---------------------------------------------------     from  pyramid.config  import  Configurator   from  originalapp  import  configure_views   if  __name  ==  '__main__':          config  =  Configurator()          config.include(configure_views)          config.add_view('theoverrideapp.views.theview',   name='theview')  
  28. 困惑   这么多优秀的框架,为什么 Python不像PHP那么流行?  

  29. 谁为Python代言?  

  30. 谁为Python代言?  

  31. 谁为PHP代言?  

  32. None
  33. wordpress的成功   解决方案、插件  

  34. 大胆的设想   Python缺的不是框架,是解决方 案。  

  35. 解决方案的特点  

  36. 解决方案的特点   是个方案   能解决问题(业务需求)  

  37. 那,来个业务需求?   建个站?  

  38. None
  39. None
  40. 每当世界陷入混乱……   新的英雄应运而生。  

  41. WA,天生哇哇哇!   但WA不是英雄,只是一个  

  42. WA   Flask  based   动态装卸的插件机制  

  43. 从业务中来   企业建站   微信公众号建设   电话、互联网销售彩票  

  44. setup.py    entry_points="""              #

     -*-  Entry  points:  -*-              [wa.plugin]              wa_admin=wa.plugins.admin.pluginimpl:PluginImpl              """,  
  45. plugin  interface   class  PluginInterface(object):          def

     __init__(self,  config):                  self._config  =  config          def  blueprints(self):                  '''                  Return  all  blueprints  this  plugin  contained.                  '''                  raise  NotImplemented()  
  46. get/scan  plugin(s)   import  pkg_resources   class  PluginFinder(object):    

         def  __init__(self,  group,  name=None):…          def  all_plugins(self,  filter=None):                  if  filter:                          for  i  in  pkg_resources.iter_entry_points(self._group,   self._name):                                  if  filter(i):                                          yield  i.load()                  else:  …   def  plugin(self,  prj,  name):                  return  pkg_resources.load_entry_point(prj,  self._group,  name)  
  47. plugin  impl   from  flask  import  Blueprint   from  wa.plugin

     import  PluginInterface   admin  =  Blueprint('admin',  __name__,                  static_folder='../static’,  template_folder='../templates')     class  PluginImpl(PluginInterface):          def  __init__(self,  config):                  PluginInterface.__init__(self,  config)            def  blueprints(self):                        return  [                                  (index,  {'url_prefix':'/index'}),                        ]    
  48. settings.py   WA_ENTRY_PLUGIN  =  'wa_admin'  

  49. 实例1  

  50. 实例2  

  51. 早期版本   https://github.com/laiyonghao/wa  

  52. 广告  

  53. 谢谢大家!   end.