初识Flask

搭建开发环境

Pipenv工作流

它是pip、Pipfile和Virtualenv的结合体,它让包安装、包依赖管理和虚拟环境管理更加方便,使用它可以实现高效的Python项目开发工作流。

安装pip和Pipenv

pip --version

使用pip安装Pipenv:
pip install pipenv -i https://pypi.douban.com/simple

使用下面的命令检查Pipenv是否已经安装:

pipenv --version
pipenv, version 2020.8.13

创建虚拟环境

创建虚拟环境,你可以拥有一个独立的Python解释器环境。

使用虚拟环境可以保持全局Python解释器环境的干净,避免包和版本的混乱,并且可以方便地区分和记录每个项目的依赖,以便在新环境下复现依赖环境。

在示例程序项目的根目录,即helloflask文件夹中,然后使用pipenv install命令为当前的项目创建虚拟环境:

pipenv install

为当前项目创建一个文件夹,其中包含隔离的Python解释器环境,并且安装pip、wheel、setuptools等基本的包。

示例程序仓库里包含Pipfile文件,所以这个文件中列出的依赖包也会一并被安装。

在Windows系统中,虚拟环境文件夹会在C:\Users\Administrator\.virtualenvs\目录下创建,而Linux或mac OS会在~/.local/share/virtualenvs/目录下创建。如果你想在项目目录内创建虚拟环境文件夹,可以设置环境变量PIPENV_VENV_IN_PROJECT,这时名为.venv的虚拟环境文件夹将在项目根目录被创建。

虚拟环境文件夹的目录名称的形式为“当前项目目录名+一串随机字符”,比如helloflask-5Pa0Zf Zw

在Pipenv中,可以使用pipenv shell命令显式地激活虚拟环境:pipenv shell

Pipenv会启动一个激活虚拟环境的子shell,现在你会发现命令行提示符前添加了虚拟环境名“(虚拟环境名称)$”,比如:(helloflask-_0QoCoug) C:\Users\yjw55\Desktop\flask_study\helloflask>

退出虚拟环境时,使用exit命令。

管理依赖

Pipfile的出现就是为了替代难于管理的requirements.txt。

在创建虚拟环境时,如果项目根目录下没有Pipfile文件,pipenv install命令还会在项目文件夹根目录下创建PipfilePipfile.lock文件,前者用来记录项目依赖包列表,而后者记录了固定版本的详细依赖包列表。

当我们使用Pipenv安装/删除/更新依赖包时,Pipfile以及Pipfile. lock会自动更新。

可以使用pipenv graph命令查看当前环境下的依赖情况,或是在虚拟环境中使用pip list命令查看依赖列表。

需要在一个新的环境运行程序时,只需要执行pipenv install命令。Pipenv就会创建一个新的虚拟环境,然后自动从Pipfile中读取依赖并安装到新创建的虚拟环境中。

安装Flask

使用pipenv install命令在我们刚刚创建的虚拟环境里安装Flask:pipenv install flask

集成开发环境

  • 下载并安装Py Charm
  • 创建项目
  • 设置Python解释器

Hello, Flask!

创建程序实例

# app.py
# 导入flask包的Flask类
from flask import Flask

# __name__变量对于我们程序来说(app.py),该值为app
app = Flask(__name__)


@app.route('/')
def index():
    return '<h1>Hello, World!</h1>'

注册路由

  • 用户在浏览器输入URL访问某个资源。
  • Flask接收用户请求并分析请求的URL。
  • 为这个URL找到对应的处理函数。
  • 执行函数并生成响应,返回给浏览器。
  • 浏览器接收并解析响应,将信息显示在页面中。

称为注册路由(route),路由负责管理URL和函数之间的映射,而这个函数则被称为视图函数(view function)。

在这个程序里,app.route()装饰器把根地址/index()函数绑定起来,当用户访问这个URL时就会触发index()函数。


@app.route('/')
def index():
    return '<h1>Hello, World!</h1>'

为视图绑定多个URL

@app.route('/hi')
@app.route('/hello')
def say_hello():
    return '<h1>Hello, Flask!</h1>'

动态URL

我们为greet视图新添加了一个app.route()装饰器,为/greet设置了默认的name值:

@app.route('/greet', defaults={'name': 'Leona'})
@app.route('/greet/<name>')
def greet(name):
    return '<h1>Hello, %s!</h1>' % name

启动开发服务器

Flask通过依赖包Click内置了一个CLI(Command Line Interface,命令行交互界面)系统。可以在虚拟环境下使用flask run启动内置的开发服务器。

flask run
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

旧的启动开发服务器的方式是使用app.run()方法,目前已不推荐使用(deprecated)。

自动发现程序实例

在执行flask run命令运行程序前,Flask会自动探测程序实例,自动探测存在下面这些规则:

  • 从当前目录寻找app.pywsgi.py模块,并从中寻找名为appapplication的程序实例。
  • 从环境变量FLASK_APP对应的值寻找名为appapplication的程序实例。

我们的程序主模块命名为app.py,所以flask run命令会自动在其中寻找程序实例。如果程序主模块是其他名称,比如hello.py,就需要到环境变量设置FLASK_APP

Linux或mac OS系统使用export命令:

export FLASK_APP = hello

在Windows系统中使用set命令:

set FLASK_APP = hello

管理环境变量

如果安装了python-dotenv,那么在使用flask run或其他命令时会使用它自动从.flaskenv文件和.env文件中加载环境变量。

当安装了python-dotenv时,Flask在加载环境变量的优先级是:手动设置的环境变量>.env中设置的环境变量>.flaskenv设置的环境变量。

为了避免频繁设置环境变量,我们可以使用python-dotenv管理项目的环境变量,首先使用Pipenv将它安装到虚拟环境:pipenv install python-dotenv

在项目根目录下分别创建两个文件:.env.flaskenv.flaskenv用来存储和Flask相关的公开环境变量,比如FLASK_APP;而.env用来存储包含敏感信息的环境变量,比如后面我们会用来配置Email服务器的账户名与密码。在.flaskenv.env文件中,环境变量使用键值对的形式定义,每行一个,以#开头的为注释,如下所示:

SOME_VAR = 1
# 这是注释
FOO = "BAR"

使用Py Charm运行服务器

在Py Charm中,单击菜单栏中的RunEdit Configurations打开运行配置窗口

打开新建配置窗口后,具体的步骤如下所示:

  • 步骤1 单击左侧的“+”符号打开下拉列表。
  • 步骤2 新建一个Python类型的运行配置(如果你使用的是专业版,则可以直接选择(Flask server),并在右侧的Name字段输入一个合适的名称,比如“Runhello”。
  • 步骤3 勾选“Single instance only”。
  • 步骤4 将第一项配置字段通过下列选项选为“Module Name”。
  • 步骤5 填入模块名称flask。
  • 步骤6 第二栏的“Parameters”填入要执行的命令run,你也可以附加其他启动选项。
  • 步骤7 在“Working directory”字段中选择程序所在的目录作为工作目录。

更多的启动选项

使服务器外部可见

run命令后添加--host选项将主机地址设为0.0.0.0使其对外可见:

flask run --host=0.0.0.0

比如你的内网IP为192.168.191.1。当局域网内的其他用户访问http://192.168.191.1:5000,也可以正常显示。

改变默认端口

Flask提供的Web服务器默认监听5000端口,你可以在启动时传入参数来改变它:

flask run --port=8000

设置运行环境

Flask提供了一个FLASK_ENV环境变量用来设置环境,默认为production(生产)。在开发时,我们可以将其设为development(开发)。

把环境变量FLASK_ENV的值写入.flaskenv文件中:

FLASK_ENV = development

在开发环境下,调试模式(Debug Mode)将被开启,执行flask run启动程序会自动激活Werkzeug内置的调试器(debugger)和重载器(reloader)。

调试器

允许你在错误页面上执行Python代码,单击错误信息右侧的命令行图标。输入PIP码可以调试信息。

Python Shell

flask shell
App: app [development]
Instance: C:\Users\yjw55\PycharmProjects\untitled1\hello\instance

使用flask shell命令打开的Python Shell自动包含程序上下文,并且已经导入了app实例:

>>> app.name
'app'

提示:Python Shell可以执行exit()quit()退出,在Windows系统上可以使用Crtl+Z并按Enter退出;在Linux和mac OS则可以使用Crtl+D退出。

Flask扩展

Flask-Foo扩展的示例如下所示:

from flask import Flask
from flask_foo import Foo
app = Flask(__name__)
foo = Foo(app)

项目配置

像在字典中添加一个键值对一样来设置一个配置:

app.config['ADMIN_NAME'] = 'Kevin'

配置的名称必须是全大写形式,小写的变量将不会被读取。

使用update()方法则可以一次加载多个值:

app.config.update(
    TESTING=True,
    SECRET_KEY = 'KEVINKEVIN'
)

URL与端点

@app.route('/greet/<name>')
def greet(name):
    return '<h1>Hello, %s!</h1>' % name

使用url_for('greet',name='Jack')得到的URL为“/hello/Jack”。

Flask命令

hello/app.py:创建自定义命令

@app.cli.command()
def hello():
    """Just say hello."""
    click.echo('Hello, Kevin!')

使用flask hello命令来触发函数。也可以在app.cli.command()装饰器中传入参数来设置命令名称,比如app.cli.command('say-hello')会把命令名称设置为say-hello,完整的命令即flask say-hello

模板与静态文件

hello/
- templates/
- static/
- app.py

Flask与MVC架构

在MVC架构中,程序被分为三个组件:数据处理(Model)、用户界面(View)、交互逻辑(Controller)。


本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!