pip install flask
安装flask时还同时安装了5个依赖包: (1.) Jinja2(模板渲染引擎) (2.) MarkupSafe(HTML字符转义工具,escape) (3.) Werkzeug(WSGI工具集,处理请求与相应,内置WSGI开发服务器、调试器和重载器) (4.) click(命令行工具) (5.) itsdangerous(提供各种加密签名命令)
在项目根目录下创建app.py,名字可以随便取,但是非app.py需要设置环境变量FLASK_APP=文件名
flask通过依赖包Click内置了一个CLI(Command Line Interface, 命令行交互界面)系统。当安装flask后,会自动添加一个flask命令脚本。可以通过flask命令执行内置命令、扩展提供的命令或自定义的命令。
可以通过flask --help查看所有可用的命令
Usage: flask [OPTIONS] COMMAND [ARGS]...
命令:
flask assets 关于压缩css/js等文件的命令,还没用过,会列出如flask --help的命令介绍
flask db 执行数据库迁移
flask routes 显示路由命令
flask run 运行开发服务器(development),这个用的最多
flask shell 在虚拟环境下运行一个python shell。
flask run 命令运行的开发服务器默认会监听127.0.0.1:5000/,按Ctrl + C退出。并开启多线程支持。如果执行flask run命令后显示命令未找到提示(command not found)或其他错误,可以尝试使用python -m flask run命令。
自动发现程序实例
运行flask run命令之所以不需要提供程序实例(app=Flask(__name__)
)所在模块(app.py)的位置,是因为flask会自动探测程序实例,自动探测规则:
(1.) 从运行flask run的当前目录寻找app.py和wsgi.py模块,并从中寻找名为app或application的程序实例。 (2.) 从环境变量FLASK_APP对应的值寻找app或application的程序实例。 (3.) 程序主模块命名为app.py,flask run能自动在其寻找程序实例,如果不是app.py,则必须设置环境变量FLASK_APP,将包含程序实例的模块名赋值给这个变量。只有这样,flask run才能正确扎到这个模块。
Linux 或 macOS命令:
export FLASK_APP=hello #hello是包含程序实例的模块名hello.py
windows命令:
set FLASK_APP=hello
除了FLASK_APP
之外,后面还会有其他的环境变量要设置,在命令行设置的缺点就是关掉命令行后环境变量就消失了,再运行flask时还需要重新设置,所以人们为了不频繁设置环境变量,决定用配置文件来设置,这就涉及了一个依赖包python-dotenv
,用这个依赖来管理环境变量,安装后在项目跟目录下创建.env
和.flaskenv
两个文件。
.flaskenv
用来存储和flask相关的公开环境变量,比如FLASK_APP
、FLASK_ENV
等,.env
用来存储包含敏感信息的环境变量,比如用来配置email服务器的账户名密码。内容格式使用键值对形式如FLASK_APP=hello
,不需要引号,#
用作注释。.env
文件都是私有信息,不要上传到远程仓库,记得把它的名称添加到.gitignore文件中,会告诉git忽略这个文件。
优先级:手动在命令行设置的环境变量>.env中设置的环境变量>.flaskenv中设置的环境变量。
flask run命令后面可以带主机和端口
flask run --host=0.0.0.0 #这会让服务器监听所有外部请求
flask run --port=8000 #监听8000端口
主机和端口也可以用环境变量来设置FLASK_RUN_HOST=0.0.0.0和FLASK_RUN_PORT=8000。
环境变量FLASK_ENV
可以设置运行环境,development
为开发环境,production
为生产环境,flask run
运行的是开发环境,如果设置为production
会有警告,但是可以运行。一般这个环境变量在.flaskenv
文件中设置
在开发环境中,调试模式(Debug Mode)将开启,运行flask run程序会自动激活Werkzeug内置的调试器和重载器。
注意在生产环境绝对不能开启调试模式。
调试器:当程序出错时,会在网页上看到详细的错误追踪,有时候内容实在太多,把顶部的报错信息复制,通过Ctrl + F
查找,可以迅速确定到报错位置。
调试器允许在网页上运行python代码。单机错误信息右侧的命令行图标,会弹出窗口要求输入PIN码,也就是在启动服务器在命令行窗口打印出的调试器PIN码。输入PIN码后,可以单击错误堆栈的某个节点右侧的命令行节面图标,这回打开一个包含代码执行上下文信息的python shell,可以利用它来进行调试。
重载器:每次修改代码后,会自动重启服务器即可看到修改的变化。HTML文件修改不会重启服务器,直接刷新网页就可以了。
默认使用的是Werkzeug内置的stat重载器,缺点是耗电严重,准确性一般。改用python库中的Watchdog,因为只有开发环境使用,所以安装时在后面添加--dev.会在pipfile文件的dev-packages部分显示开发依赖包。
pipenv install watchdog --dev
在flask项目中可以使用flask shell命令打开python shell,退出可以执行exit()
或quit()
,windows中可以使用Ctrl+Z
并按Enter退出,Linux和macOS则按Ctrl+D
直接退回。
使用flask shell命令打开的python shell自动包含程序上下文,并且已经导入了app实例:
>>> app
<Flask 'hello'>
>>> app.name
'hello'
我试了下用python打开python shell,然后直接输入app会报错
(helloflask) D:\GitHub\flask\helloflask\demos\hello>python
Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 22:45:29) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> app
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'app' is not defined
需要提前导入app实例才行
>>> from hello import app
>>> app
<Flask 'hello'>
>>> app.name
'hello'
上下文(context)可以理解为环境。为了正常运行,一些相关操作的状态和数据需要被临时保存下来,这些状态和数据被统称为上下文,在flask中,上下文有两种,分为程序上下文和请求上下文。后面记得单独整一篇上下文的笔记。
来源https://zhuanlan.zhihu.com/p/159073021
11