Flask框架的诞生:
Flask诞生于2010年,是Armin ronacher(人名)用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。
Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login),都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、窗体验证工具,文件上传、身份验证等。Flask没有默认使用的数据库,你可以选择MySQL,也可以用NoSQL。
其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是Flask框架的核心。
Python最出名的框架要数Django,此外还有Flask、Tornado等框架。虽然Flask不是最出名的框架,但是Flask应该算是最灵活的框架之一,这也是Flask受到广大开发者喜爱的原因。
Flask常用扩展包:
- Flask-SQLalchemy:操作数据库;
- Flask-migrate:管理迁移数据库;
- Flask-Mail:邮件;
- Flask-WTF:表单;
- Flask-Bable:提供国际化和本地化支持,翻译;
- Flask-script:插入脚本;
- Flask-Login:认证用户状态;
- Flask-OpenID:认证;
- Flask-RESTful:开发REST API的工具;
- Flask-Bootstrap:集成前端Twitter Bootstrap框架;
- Flask-Moment:本地化日期和时间;
- Flask-Admin:简单而可扩展的管理接口的框架
框架之间的差别
-
Django功能大而全,Flask只包含基本的配置 Django的一站式解决的思路,能让开发者不用在开发之前就在选择应用的基础设施上花费大量时间。Django有模板,表单,路由,认证,基本的数据库管理等等内建功能。与之相反,Flask只是一个内核,默认依赖于两个外部库: Jinja2 模板引擎和 Werkzeug WSGI 工具集,其他很多功能都是以扩展的形式进行嵌入使用。
-
Flask 比 Django 更灵活 用Flask来构建应用之前,选择组件的时候会给开发者带来更多的灵活性 ,可能有的应用场景不适合使用一个标准的ORM(Object-Relational Mapping 对象关联映射),或者需要与不同的工作流和模板系统交互。
-
Flask 在 Django 之后发布,现阶段有大量的插件和扩展满足不同需要 Django发布于2005年,Flask创始于2010年年中。
路由的各种定义方式
请求方式限定
使用 methods 参数指定可接受的请求方式,可以是多种
@app.route('/',methods=['GET', 'POST'])
def hello():
return 'hello world'
路由查找方式
同一路由指向两个不同的函数,在匹配过程中,至上而下依次匹配
@app.route('/')
def hello():
return 'hello world'
@app.route('/')
def hello_flask():
return 'hello flask'
所以上面路由 /
输出的结果为 hello 函数的结果
给路由传参示例
有时我们需要将同一类URL映射到同一个视图函数处理,比如:使用同一个视图函数 来显示不同用户的订单信息。
路由传递的参数默认当做string处理
@app.route('/orders/<order_id>')
def hello(order_id):
# 此处的逻辑: 去查询数据库改用户的订单信息, 并返回
print type(order_id) # 类型为unicode
return 'hello %d' % order_id
这里指定int, 会调用系统的路由转换器进行匹配和转换.
- 大致原理是将参数强转为int, 如果成功, 则可以进行路由匹配
- 如果参数无法转换成功, 就无法匹配该路由
@app.route('/orders/<int:order_id>')
def hello_itheima(order_id):
print type(order_id) # 类型为int
return 'hello %d' % order_id
重定向redirect示例
方式一: 使用redirect
from flask import redirect
@app.route('/redirect')
def redirect_demo():
return redirect('http://www.baidu.com')
方式二:使用redirect和url_for
from flask import url_for
@app.route('/redirect')
def redirect_demo():
# url_for: 根据传入的视图函数名, 找到对应的路由地址
# 两者通常结合使用
print url_for('index')
return redirect(url_for('index'))
返回JSON
方式一: 使用json.dumps()
- 仅仅是将字典转换为JSON格式的字符串.
- 返回的响应头Content-Type为text/html
from flask import Flask,json
@app.route('/json')
def do_json():
hello = {"name":"stranger", "say":"hello"}
return json.dumps(hello)
# 如果要实现和方式二一样的效果, 可以使用如下方式
# return 第一个参数: 返回的数据, 第二个参数: 状态码, 第三个参数: 设置响应头信息
# return json.dumps(json_info), 200, {'Content-Type': 'application/json'}
方式二: 使用jsonify()
- 除了将字典转换为JSON格式的字符串
- 同时会设置响应头Content-Type为application/json
- 建议使用jsonify, 前后端分离的项目中, 前后端都通过JSON进行数据交流
from flask import Flask,json
@app.route('/json')
def do_json():
hello = {"name":"stranger", "say":"hello"}
return jsonify(hello)
返回状态码示例
在 Python 中返回状态码有两种方式实现:
- 直接return
- 可以自定义返回状态码,可以实现不符合http协议的状态码,例如:error=666,errmsg='查询数据库异常',其作用是为了实现前后端数据交互的方便
- abort方法
- 只会抛出符合http协议的异常状态码,用于手动抛出异常
- 具体讲解详见<异常捕获>一节
@app.route('/')
def hello():
return 'hello',666