Open shownb opened 7 years ago
*分析基于0.4.10 一般python框架应该按照一下原则来处理
框架基本是对第3步进行处理。
用run来建立,如果不指定用什么方式,默认是WSGIRefServer(第539行),即是用wsgiref。
WSGIHandler函数,根据environ里面的path和method等,从ROUTES_SIMPLE或者ROUTES_REGEXP列表中,提取出当前path情况下,由那些函数来处理。
ROUTES_SIMPLE和ROUTES_REGEXP列表数据来自哪里? 由装饰器route生成
def route(url, **kargs): def wrapper(handler): add_route(url, handler, **kargs) return handler return wrapper
bottle 源码解析 http://liaoph.com/python-bottle/
bottle 源码分析 https://hexiangyu.me/posts/18/
Bottle 总结 http://roseou.github.io/2016/03/27/bottle/
全栈python http://fullstackpython.atjiang.com/bottle.html
Bottle-0.13 文档中文 https://my.oschina.net/zzir/blog/683569
bottle笔记 https://www.kancloud.cn/yubang/bottle
bottle开发的一个样板 https://help.zendesk.com/hc/en-us/articles/229488948-Building-a-custom-ticket-form-with-the-Zendesk-API
如果没有特别指定的话,第一次运行调用route函数的时候,会全局创建一个全局的“默认应用”里面(即Bottle 类的实例),所有操作都归于这个实例里面。 对于小应用来说,这样非常方便,可节约你的工作量。但这同时意味着,在你的模块导入的时候,你定义的 route 就被安装到全局的默认应用中了。为了避免这种模块导入的副作用,Bottle 提供了另外一种方法 app = Bottle() 分离应用对象,大大提高了可重用性。其他开发者可安全地从你的应用中导入 app 对象,然后通过 Bottle.mount() 方法来合并到其它应用中。
app = Bottle()
可通过全局的request对象来访问Cookies,HTTP头,HTML的
cookie可以通过request.cookies.get访问
HTTP头可以通过request.headers.get访问 request.headers.get('X-Requested-With')
request.headers.get('X-Requested-With')
表单可以用下面的方式获取
只要在 {{...}} 中的 Python 语句返回一个字符串或有一个字符串的表达形式,它就是一个有效的语句。 代码行以 % 开头,代码块包含在 <% 和 %> 之间,代码块嵌入通常以end关键字显式结束
% name = "Bob" # a line of python code <p>Some plain text in between</p> <% # A block of python code name = name.title().strip() %> <p>More plain text</p>
在模板中访问未定义的变量会引起 NameError 并停止渲染。解决方法: defined(name) 如果变量已定义则返回True,反之返回False。 get(name, default=None) 返回该变量,或一个默认值 setdefault(name, default) 如果该变量未定义,则定义它,赋一个默认值,返回该变量
% setdefault('text', 'No Text') <h1>{{get('title', 'No Title')}}</h1> <p> {{ text }} </p> % if defined('author'): <p>By {{ author }}</p> % end
应用mount index.py
# coding:UTF-8
from bottle import Bottle from two import two_app
app = Bottle() app.mount("/two", two_app)
@app.get("/") def index(): return "主模块"
if name == "main": app.run(host="127.0.0.1", port=8000, reloader=True, debug=True)
two.py ```python # coding:UTF-8 from bottle import Bottle two_app = Bottle() @two_app.get("/") def index(): return "第二个模块"
python -m pip install gunicorn python -m pip install supervisor gunicorn -b 0.0.0.0:8080 -w 1 go:App
项目结构参考 https://github.com/inkenkun/bottle_mvc https://github.com/vladimirprieto/bottle-mvc-mongodb https://github.com/salimane/bottle-mvc
flask的一些装饰器 http://flask.pocoo.org/docs/0.12/patterns/viewdecorators/
自己动手写orm https://yanxurui.cc/posts/python/write-my-own-orm/ 廖雪峰的orm https://github.com/michaelliao/awesome-python-webapp/blob/day-03/www/transwarp/orm.py 廖雪纺的orm py3 https://github.com/michaelliao/awesome-python3-webapp/blob/day-03/www/orm.py
理解 Python 装饰器看这一篇就够了 https://foofish.net/python-decorator.html
Effective Python https://guoruibiao.gitbooks.io/effective-python/content/
深入理解元类 http://blog.jobbole.com/21351/
怎么理解阻塞非阻塞与同步异步的区别 https://www.zhihui.com/question/19732473
A Web Crawler with asyncio Coroutines http://drafts.damnever.com/2015/A-Web-Crawler-With-asyncio-Coroutines.html
最新python异步编程详解 http://www.jianshu.com/p/b036e6e97c18
python中的生成器和协程 https://www.bwangel.me/2016/08/05/python中的生成器和协程/
用 Python 实现生成 QR 二维码 https://juejin.im/entry/577cca197db2a20054f008e4
简化markdown写作中的贴图流程 http://weishu.me/2015/10/16/simplify-the-img-upload-in-markdown/
从 asyncio 简单实现看异步是如何工作的 https://ipfans.github.io/2016/02/simple-implement-asyncio-to-understand-how-async-works/
bottle的基本运行原理
*分析基于0.4.10 一般python框架应该按照一下原则来处理
框架基本是对第3步进行处理。
首先建立起wsgi服务器
用run来建立,如果不指定用什么方式,默认是WSGIRefServer(第539行),即是用wsgiref。
然后wsgi服务器将environ, start_response扔进WSGIHandler处理(第564行)
WSGIHandler函数,根据environ里面的path和method等,从ROUTES_SIMPLE或者ROUTES_REGEXP列表中,提取出当前path情况下,由那些函数来处理。
ROUTES_SIMPLE和ROUTES_REGEXP列表数据来自哪里? 由装饰器route生成
bottle 源码解析 http://liaoph.com/python-bottle/
bottle 源码分析 https://hexiangyu.me/posts/18/
Bottle 总结 http://roseou.github.io/2016/03/27/bottle/
全栈python http://fullstackpython.atjiang.com/bottle.html
Bottle-0.13 文档中文 https://my.oschina.net/zzir/blog/683569
bottle笔记 https://www.kancloud.cn/yubang/bottle
bottle开发的一个样板 https://help.zendesk.com/hc/en-us/articles/229488948-Building-a-custom-ticket-form-with-the-Zendesk-API
bottle快速入门总结
总体运行
如果没有特别指定的话,第一次运行调用route函数的时候,会全局创建一个全局的“默认应用”里面(即Bottle 类的实例),所有操作都归于这个实例里面。 对于小应用来说,这样非常方便,可节约你的工作量。但这同时意味着,在你的模块导入的时候,你定义的 route 就被安装到全局的默认应用中了。为了避免这种模块导入的副作用,Bottle 提供了另外一种方法
app = Bottle()
分离应用对象,大大提高了可重用性。其他开发者可安全地从你的应用中导入 app 对象,然后通过 Bottle.mount() 方法来合并到其它应用中。请求数据
可通过全局的request对象来访问Cookies,HTTP头,HTML的
cookie可以通过request.cookies.get访问
HTTP头可以通过request.headers.get访问
request.headers.get('X-Requested-With')
表单可以用下面的方式获取
模版
只要在 {{...}} 中的 Python 语句返回一个字符串或有一个字符串的表达形式,它就是一个有效的语句。 代码行以 % 开头,代码块包含在 <% 和 %> 之间,代码块嵌入通常以end关键字显式结束
在模板中访问未定义的变量会引起 NameError 并停止渲染。解决方法: defined(name) 如果变量已定义则返回True,反之返回False。 get(name, default=None) 返回该变量,或一个默认值 setdefault(name, default) 如果该变量未定义,则定义它,赋一个默认值,返回该变量
Blueprint 一样的功能
应用mount index.py
from bottle import Bottle from two import two_app
app = Bottle() app.mount("/two", two_app)
@app.get("/") def index(): return "主模块"
if name == "main": app.run(host="127.0.0.1", port=8000, reloader=True, debug=True)
部署
项目结构参考 https://github.com/inkenkun/bottle_mvc https://github.com/vladimirprieto/bottle-mvc-mongodb https://github.com/salimane/bottle-mvc
flask的一些装饰器 http://flask.pocoo.org/docs/0.12/patterns/viewdecorators/
自己动手写orm https://yanxurui.cc/posts/python/write-my-own-orm/ 廖雪峰的orm https://github.com/michaelliao/awesome-python-webapp/blob/day-03/www/transwarp/orm.py 廖雪纺的orm py3 https://github.com/michaelliao/awesome-python3-webapp/blob/day-03/www/orm.py
理解 Python 装饰器看这一篇就够了 https://foofish.net/python-decorator.html
Effective Python https://guoruibiao.gitbooks.io/effective-python/content/
深入理解元类 http://blog.jobbole.com/21351/
怎么理解阻塞非阻塞与同步异步的区别 https://www.zhihui.com/question/19732473
A Web Crawler with asyncio Coroutines http://drafts.damnever.com/2015/A-Web-Crawler-With-asyncio-Coroutines.html
最新python异步编程详解 http://www.jianshu.com/p/b036e6e97c18
python中的生成器和协程 https://www.bwangel.me/2016/08/05/python中的生成器和协程/
用 Python 实现生成 QR 二维码 https://juejin.im/entry/577cca197db2a20054f008e4
简化markdown写作中的贴图流程 http://weishu.me/2015/10/16/simplify-the-img-upload-in-markdown/
从 asyncio 简单实现看异步是如何工作的 https://ipfans.github.io/2016/02/simple-implement-asyncio-to-understand-how-async-works/