基本了解
Flask是使用Python编写的Web微框架。Web框架可以让我们不用关心底层的请求响应处理,更方便高效地编写Web程序。因为Flask核心简单且易于扩展,所以被称作微框架(micro framework)。
Flask有两个主要依赖:
- 一个是**WSGI(**Web Server Gateway Interface,Web服务器网关接口)工具集------Werkzeug(http://werkzeug.pocoo.org/)
- 另一个是Jinja2模板引擎 (http://jinja.pocoo.org/)。
Flask只保留了Web开发的核心功能,其他的功能都由外部扩展来实现,比如数据库集成、表单认证、文件上传等。如果没有合适的扩展,你甚至可以自己动手开发。Flask不会替你做决定,也不会限制你的选择。总之,Flask可以变成任何你想要的东西,一切都由你做主。
WSGI(Web Server Gateway Interface)是Python中用来规定Web服务器如何与Python Web程序进行沟通的标准
开发环境搭建
推荐Pipenv进行虚拟环境管理,Pipenv是基于pip的Python包管理工具,它和pip的用法非常相似,可以看作pip的加强版,它的出现解决了旧的pip+virtualenv+requirements.txt的工作方式的弊端。
默认情况下,Pipenv会统一管理所有虚拟环境。在Windows系统中,虚拟环境文件夹会在C:\Users\Administrator.virtualenvs\目录下创建。
安装pipenv:
Bash
pip install pipenv
创建虚拟环境:
Bash
pipenv install
这会为当前项目创建一个文件夹,其中包含隔离的Python解释器环境,并且安装pip、wheel、setuptools等基本的包。因为示例程序仓库里包含Pipfile文件,所以这个文件中列出的依赖包也会一并被安装。默认情况下,Pipenv会统一管理所有虚拟环境。在Windows系统中,虚拟环境文件夹会在C:\Users\Administrator.virtualenvs\目录下创建。
激活虚拟环境
在单独使用Virtualenv时,我们通常会显式地激活虚拟环境。在Pipenv中,可以使用pipenv shell命令显式地激活虚拟环境:
Bash
pipenv shell
当执行pipenv shell或pipenv run命令时,Pipenv会自动从项目目录下的.env文件中加载环境变量。
除了显式地激活虚拟环境,Pipenv还提供了一个pipenv run命令,这个命令允许你不显式激活虚拟环境即可在当前项目的虚拟环境中执行命令:
Bash
pipenv run python hello.py
管理依赖
如果你打算开源的话,就可能会有更多的人需要在他们的电脑上运行。为了能顺利运行程序,他们不得不记下所有依赖包,然后使用pip或Pipenv安装,这些重复无用的工作当然应该避免。在以前我们通常使用pip搭配一个requirements.txt文件来记录依赖。但requirements.txt需要手动维护,在使用上不够灵活。Pipfile的出现就是为了替代难于管理的requirements.txt。
在创建虚拟环境时,如果项目根目录下没有Pipfile文件,pipenv install命令还会在项目文件夹根目录下创建Pipfile和Pipfile.lock文件,前者用来记录项目依赖包列表,而后者记录了固定版本的详细依赖包列表。当我们使用Pipenv安装/删除/更新依赖包时,Pipfile以及Pipfile.lock会自动更新。
你可以使用pipenv graph命令查看当前环境下的依赖情况,或是在虚拟环境中使用pip list命令查看依赖列表。
当需要在一个新的环境运行程序时,只需要执行pipenv install命令。Pipenv就会创建一个新的虚拟环境,然后自动从Pipfile中读取依赖并安装到新创建的虚拟环境中。
安装Flask
Bash
pipenv install flask
使用IDE

在Pycharm中配置好前面创建的虚拟环境路径之后,以后每次打开项目,PyCharm都会自动帮你激活虚拟环境,并且把工作目录定位到项目根目录。
Hello Flask
最小Flask程序
Python
from flask import Flask
app = Flask(__name__) #
# the minimal Flask application
@app.route('/')
def index():
return '<h1>Hello, World!</h1>'
- 创建Flask类的实例:先从flask包导入Flask类,这个类表示一个Flask程序。实例化这个类,就得到我们的程序实例app。
- 注册路由:为函数附加app.route()装饰器,并传入URL规则作为参数,我们就可以让URL与函数建立关联。这个过程我们称为注册路由(route),路由负责管理URL和函数之间的映射,而这个函数则被称为视图函数(view function)。
- URL为相对地址
例如绝对路径为 http://127.0.0.1:5000,那么'/'即表示网址' http://127.0.0.1:5000/'。
上述代码的意思就是,当你输入网址 http://127.0.0.1:5000/时,会调用index这个函数。这个函数会返回一些内容,从而显示为页面。

在一个Web应用里,客户端和服务器上的Flask程序的交互可以简单概括为以下几步:
1)用户在浏览器输入URL访问某个资源。
2)Flask接收用户请求并分析请求的URL。
3)为这个URL找到对应的处理函数。
4)执行函数并生成响应,返回给浏览器。
5)浏览器接收并解析响应,将信息显示在页面中。
为一个视图函数绑定多个URL
Python
@app.route('/hi')
@app.route('/hello')
def say_hello():
return '<h1>Hello, Flask!</h1>'
动态URL
Python
@app.route('/greet/<name>')
def greet(name):
return '<h1>Hello, %s!</h1>' % name
启动开发服务器(查看Web网页)
flask run
Bash
$ flask run
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
flask run命令运行的开发服务器默认会监听http://127.0.0.1:5000/地址(按Ctrl+C退出),并开启多线程支持。
打开网址http://127.0.0.1:5000/,会发现显示内容:

自动发现web程序实例
一般来说,在执行flask run命令运行程序前,我们需要提供程序实例所在模块的位置。我们在上面可以直接运行程序,是因为Flask会自动探测程序实例,自动探测存在下面这些规则:
• 从当前目录寻找app.py和wsgi.py模块,并从中寻找名为app或application的程序实例。
• 从环境变量FLASK_APP 对应的模块名/导入路径寻找名为app或application的程序实例。
在Windows系统中使用set命令设置环境变量:
Bash
>set FLASK_APP=hello
使用Pycharm直接运行服务器
配置过程如下:


配置之后,可以直接在Pycharm中点运行就可以实现服务器启动。
设置运行环境
开发环境(development environment)和生产环境(productionenvironment)是我们后面会频繁接触到的概念。开发环境是指我们在本地编写和测试程序时的计算机环境,而生产环境与开发环境相对,它指的是网站部署上线供用户访问时的服务器环境。
为了区分程序运行环境,Flask提供了一个FLASK_ENV环境变量用来设置环境,默认为production(生产)。
Bash
FLASK_ENV=development
在开发环境下,调试模式(Debug Mode)将被开启,这时执行flask run启动程序会自动激活Werkzeug 内置的调试器(debugger)和重载器(reloader),它们会为开发带来很大的帮助。
调试器允许你在错误页面上执行Python代码 。单击错误信息右侧的命令行图标,会弹出窗口要求输入PIN码,也就是在启动服务器时命令行窗口打印出的调试器PIN码(Debugger PIN)。输入PIN码后,我们可以单击错误堆栈的某个节点右侧的命令行界面图标,这会打开一个包含代码执行上下文信息的Python Shell,我们可以利用它来进行调试。
如果项目中使用了单独的CSS或JavaScript文件时,那么浏览器可能会缓存这些文件,从而导致对文件做出的修改不能立刻生效。在浏览器中,我们可以按下Ctrl+F5或Shift+F5执行硬重载(hard reload),即忽略缓存并重载(刷新)页面。
Python Shell
在开发Flask程序时,我们并不会直接使用python命令启动PythonShell,而是使用flask shell命令:
Flask扩展
我们将会接触到很多Flask扩展。扩展(extension)即使用Flask提供的API接口编写的Python库,可以为Flask程序添加各种各样的功能。
项目配置
在很多情况下,你需要设置程序的某些行为,这时你就需要使用配置变量。在Flask中,配置变量就是一些大写形式的Python变量,你也可以称之为配置参数或配置键。使用统一的配置变量可以避免在程序中以硬编码(hard coded)的形式设置程序。
这些配置变量都通过Flask对象的app.config属性作为统一的接口来设置和获取。
Python
# 像添加字典键值一样添加
app.config['ADMIN_NAME']='Peter'
# 一次加载多个值
app.config.update(
TESTING=True,
SECRET_KEY='_5#yF4Q8z\n\xec]'
)
URL与端点
当你修改了某个路由的URL规则,那么程序里对应的URL都要一个一个进行修改。更好的解决办法是使用Flask提供的url_for()函数获取URL ,当路由中定义的URL规则被修改时,这个函数总会返回正确的URL。
这时使用url_for('greet',name='Jack')得到的URL为"/hello/Jack"。