自由灵活,可扩展性强,透明可控,第三方库选择面广。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'hello world'
if __name__ == '__main__':
app.run('127.0.0.1', 5000)
jinja2:模板引擎。
werkzurg:WSGI工具包(web服务网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为python语言定义的web服务器和web应用程序或框架之间的一种简单而通用的借口,其他语言也有类似的接口)。
蓝图实现模块化的应用,使用蓝图可以极大简化大型应用的开发难度,也为Flask扩展提供了一种在应用中注册服务的集中式机制。以URL前缀和/或子域名,在应用上注册一个蓝图。URL前缀/子域名中的参数即成为这个蓝图下的所有视图函数的共同的视图参数(默认情况下)在一个应用中用不同的URL规则多次注册一个蓝图。
from flask import Blueprint, Flask
app = Flask(__name__)
blue = Blueprint("blue",__name__)
@blue.route('/')
def blue_index():
return "Hello Blueprint!"
app.register_blueprint(blue, url_prefix="/blue")
if __name__ == '__main__':
app.run('127.0.0.1', 5000)
flask-session:可以让session持久化存储,session放在redis,使用redis数据库,先要开启redis数据库。
flask-SQLAlchemy:数据库操作相关。如django里的ORM操作。
flask-restful:主要用于管理api接口相关。
flask-migrate:数据库迁移。
a、简单来说,flask上下文管理可以分为三个阶段:
1、请求进来时:将请求相关的数据放入上下文管理中;
2、在视图函数中:要去上下文管理中取值;
3、请求响应:要将上下文管理中的数据清除;
b、详细点来说:
1、请求刚进来:将request,session封装在RequestContext类中,app,g封装在AppContext类中,并通过LocalStack将requestcontext和appcontext放入Local类中;
2、视图函数中:通过localproxy--->偏函数--->localstack--->local取值;
3、请求响应时:先执行save.session()再各自执行pop(),将local中的数据清除;
_request_ctx_stack:LocalStack #LocalStack对象
_app_ctx_stack:LocalStack #LocalStack对象
current_app: LocalProxy(_find_app)
request:LocalProxy #LocalStack对象
session:LocalProxy #LocalStack对象
g:LocalProxy #LocalStack对象
g是贯穿于一次请求的全局变量,当请求进来将g和current_app封装为一个APPContext类;
再通过LocalStack将Appcontext放入Local中,取值时通过偏函数在LocalStack、local中取值;
响应时将local中的g数据删除;
RequestContext :封装进来的请求(赋值给ctx)
AppContext : 封装app_ctx
LocalStack: 将local对象中的数据维护成一个栈(先进后出)
Local: 保存请求上下文对象和app上下文对象
因为通过维护成列表,可以实现一个栈的数据结构,进栈出栈时只取一个数据,巧妙的简化了问题。还有,在多app应用时,可以实现数据隔离;列表里不会加数据,而是会生成一个新的列表。local是一个字典,字典里key(stack)是唯一标识,value是一个列表。
请求进来时,可以根据URL的不同,交给不同的APP处理。蓝图也可以实现。
from flask import session
创建:session的实现是依赖与flask的上下文管理,session是一个LocalProxy()对象,session的默认值为None,当请求进来时,会生成一个ctx,其本质是一个RequestContext对象。当接收到用户请求之后,会调用Flask度下行的session_interface对象的open_session()方法,以此来获取一个session对象,并保存在ctx中。执行时,调用save_session()方法将session取出来进行序列化,写到cookie。
销毁:从栈ctx中pop掉session。
Flask-wtf是一个用于表单处理、校验并提供csrf验证的功能的扩展库。Flask-WTF将表单数据解析、CSRF保护、文件上传等功能与Flask集成。flask-wtf默认为每个表单启用CSRF保护,它为我们自动生成和验证CSRF令牌。
flask中的信号blinker,信号主要是让开发者可是在flask请求过程中定制一些行为。或者说flask在列表里面预留了几个空列表,在里面存东西。简言之,信号允许某个'发送者'通知'接收者'有事情发生了 @before_request有返回值,blinker没有返回值。
# 10个信号
request_started = _signals.signal('request-started') #请求到来前执行
request_finished = _signals.signal('request-finished') #请求结束后执行
before_render_template = _signals.signal('before-render-template') #模板渲染前执行
template_rendered = _signals.signal('template-rendered') #模板渲染后执行
got_request_exception = _signals.signal('got-request-exception') #请求执行出现异常时执行
request_tearing_down = _signals.signal('request-tearing-down') #请求执行完毕后自动执行(无论成功与否)
appcontext_tearing_down = _signals.signal('appcontext-tearing-down') #请求上下文执行完毕后自动执行(无论成功与否)
appcontext_pushed = _signals.signal('appcontext-pushed') #请求app上下文push时执行
appcontext_popped = _signals.signal('appcontext-popped') #请求上下文pop时执行
message_flashed = _signals.signal('message-flashed')#调用flask在其中添加数据时,自动触发
在Django中,路由是浏览器访问服务器时,先访问的项目中的url,再由项目中的url找到应用中url,这些url是放在一个列表里,遵从从前往后匹配的规则。
在flask中,路由是通过装饰器给每个视图函数提供的,而且根据请求方式的不同可以一个url用于不同的作用。