为了理解 Flask框架是如何抽象出Web开发中的共同部分,我们先来看看Web应用程序的一般流程。对于Web应用来说,当客户端想要获取动态资源 时,就会发起一个HTTP请求(比如用浏览器访问一个 URL),Web应用程序会在后台进行相应的业务处理,(从数据库或者进行一些计算操作等)取出用户需要的数据,生成相应的HTTP响应(当然,如果访问静态资源,则直接返回资源即可,不需要进行业务处理)。整个处理过程如下图所示:
实际应用中, 不同的请求可能会调用相同的处理逻辑 。这里有着相同业务处理逻辑的 HTTP 请求可以用一类 URL 来标识。比如论坛站点中,对于所有的获取Topic内容的请求而言,可以用 topic// 这类URL来表示,这里的 topic_id 用以区分不同的topic。接着在后台定义一个 get_topic(topic_id) 的函数,用来获取topic相应的数据,此外还需要建立URL和函数之间的一一对应关系。这就是Web开发中所谓的 路由分发 ,如下图所示: Flask底层使用 werkzeug 来做路由分发,代码写起来十分简单,如下:
@app.route('/topic/<int:topic_id>/') defget_topic(topic_id):# Do some cal or read from database# Get the data we need.通过业务逻辑函数拿到数据后,接下来需要根据这些数据生成HTTP响应(对于Web应用来说,HTTP响应一般是一个HTML文件)。Web开发中的一般做法是提供一个HTML模板文件,然后将数据传入模板,经过渲染后得到最终需要的HTML响应文件。
一种比较常见的场景是, 请求虽然不同,但响应中数据的展示方式是相同的 。仍以论坛为例,对不同topic而言,其具体topic content虽然不同,但页面展示的方式是一样的,都有标题拦,内容栏等。也就是说,对于 topic 来说,我们只需提供一个HTML模板,然后传入不同topic数据,即得到不同的HTTP响应。这就是所谓的 模板渲染 ,如下图所示: Flask 使用 Jinja2 模板渲染引擎来做模板渲染,代码如下:
@app.route('/topic/<int:topic_id>/')defget_topic(topic_id):# Do some cal or read from database# Get the data we need.returnrender_template('path/to/template.html', data_needed)总结一下,Flask处理一个请求的流程就是,首先根据 URL 决定由那个函数来处理,然后在函数中进行操作,取得所需的数据。再将数据传给相应的模板文件中,由Jinja2 负责渲染得到 HTTP 响应内容,然后由Flask返回响应内容。
Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension。增加其他功能。
Flask没有默认使用的数据库、窗体验证工具。然而,Flask保留了扩增的弹性,可以用Flask-extension加入这些功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。最新版本为0.11。 Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。 flask默认端口是5000。 Flask简单易学,下面是Flask版的hello world(hello.py):
from flask import Flaskapp = Flask(__name__)@app.route("/")def hello(): return "Hello World!"if __name__ == "__main__": app.run()重定向和错误 你可以用 redirect() 函数把用户重定向到其它地方。放弃请求并返回错误代码,用 abort()函数。这里是一个它们如何使用的例子:from flask import abort, redirect, url_for@app.route('/')def index(): return redirect(url_for('login'))@app.route('/login')def login(): abort(401) this_is_never_executed()这是一个相当无意义的例子因为用户会从主页重定向到一个不能访问的页面 (401 意味着禁止访问),但是它展示了重定向是如何工作的。
默认情况下,错误代码会显示一个黑白的错误页面。如果你要定制错误页面, 可以使用 errorhandler() 装饰器:
from flask import render_template@app.errorhandler(404)def page_not_found(error): return render_template('page_not_found.html'), 404注意 render_template() 调用之后的 404 。这告诉 Flask,该页的错误代码是 404 ,即没有找到。默认为 200,也就是一切正常。
是JSON格式的数据,是经过Flask框架的 jsonify模块格式化过的数据。return jsonify(nodes=data[0], links=data[1])学习参考: 【1】快速入门:http://docs.jinkan.org/docs/flask/quickstart.html 【2】官网:http://flask.pocoo.org/ 【3】图文快速讲解: http://www.open-open.com/lib/view/open1477879623923.html
新闻热点
疑难解答