专栏名称: 编程派
Python程序员都在看的公众号,跟着编程派一起学习Python,看最新国外教程和资源!
目录
相关文章推荐
Python中文社区  ·  三月股市风向大变,如何布局? ·  2 天前  
Python开发者  ·  DeepSeek 杀入全球榜单第 2 ... ·  昨天  
Python爱好者社区  ·  DeepSeek梁文锋实习往事曝光!月薪1. ... ·  2 天前  
小小的python学习社  ·  【2025版附安装包】超详细Python+P ... ·  2 天前  
小小的python学习社  ·  【2025版附安装包】超详细Python+P ... ·  2 天前  
Python爱好者社区  ·  团队准备解散了。 ·  3 天前  
51好读  ›  专栏  ›  编程派

Flask 源码解析:简介

编程派  · 公众号  · Python  · 2017-05-08 11:44

正文

原文: http://cizixs.com/2017/01/10/flask-insight-introduction

作者:cizixs

全文约 4792 字,读完可能需要 7 分钟。

flask 简介

Flask 官网上对它的定位是一个"微" python web 开发框架。

Flask is a micro web development framework for Python.

python 语言 web 框架很多:Django、Tornado、webpy、bottle……,flask 的特点是 简单可扩展 。简单有几个方面,比如它只实现 web 框架最核心的功能,保持功能的简洁;还有一个就是代码量少,核心代码 app . py

文件只有 2k+ 行。可扩展就是允许 第三方插件 来扩充功能,比如数据库可以使用 Flask - SQLAlchemy ,缓存可以使用 Flask - Cache 等等。

下面这段代码是 flask 官方文档给出的 hello world 版本的 flask 应用:

  1. from flask import Flask

  2. app = Flask(__name__)

  3. @app.route('/')

  4. def hello_world():

  5.    return 'Hello, World!'

  6. if __name__ == '__main__':

  7.    app.run()

要理解 flask 的源码,必须有一定的 python 基础(对 decorator、magic method、iterator、generator 概念比较熟悉),不然的话,会有些吃力。

另外一个必须理解的概念是 WSGI ,简单来说就是一套 web server 和 web 框架/web 应用之间的协议。可以阅读我之前写的 python wsgi 简介 和翻译的 什么是 web 框架 ,或者自行搜索相关资料,熟悉这部分的内容。

NOTE :本系列文章分析的 flask 版本号是 0.12 ,其他版本可能会有出入。

两个依赖

flask 有两个核心依赖库: werkzeug jinja ,而 werkzeug 又是两者中更核心的。

werkzeug 负责核心的逻辑模块,比如路由、请求和应答的封装、WSGI 相关的函数等; jinja 负责模板的渲染,主要用来渲染返回给用户的 html 文件内容。

模板(template)是和 web 框架相对独立的内容,比如 jinja 不是只能用在 web 应用中,而 web 应用也可以不处理模板(比如返回 raw text 或者 json/xml 结构数据,而不是 html 页面)。

flask 直接使用 jinja2 而不是把这部分也做成可扩展的看起来有悖它的设计原则,我个人的理解是:flask 是个写网页的 web 框架,不像 flask - restful 可以专门做 json / xml 数据接口,必须提供模板功能,不然用户就无法使用。

而如果不绑定一个模板库的话,有三种方法:自己写一个模板引擎、封装一个可扩展的模板层,用户可以自己选择具体的模板引擎、或者让用户自己处理模板。但是这些方法要么增加实现的复杂度,要么增加了使用的复杂度。

werkzeug

werkzeug 的定位并不是一个 web 框架,而是 HTTP 和 WSGI 相关的工具集,可以用来编写 web 框架,也可以直接使用它提供的一些帮助函数。

Werkzeug is an HTTP and WSGI utility library for Python.

werkzeug 提供了 python web WSGI 开发相关的功能:

  • 路由处理:怎么根据请求中的 url 找到它的处理函数

  • request 和 response 封装:可以更好地读取 request 的数据,也容易生成响应

  • 一个自带的 WSGI server,可以用来测试环境运行自己的应用

比如,我们可以使用 werkzeug 编写一个简单的 hello world 的 WSGI app:

  1. from werkzeug.wrappers import Request, Response

  2. def application(environ, start_response):

  3.    request = Request(environ)

  4.    text = 'Hello %s!' % request.args.get('name', 'World')

  5.    response = Response(text, mimetype='text/plain')

  6.    return response(environ, start_response)

除了和 web WSGI 相关的功能,werkzeug 还实现了很多非常有用的数据结构和函数。比如用来处理一个 key 对应多个值的 MultiDict







请到「今天看啥」查看全文