✅【Flask笔记】第一节:初识

img

旧的笔记,以前存放的笔记软件停止运营了,重新迁移到博客上,删除和修改一些过时的内容。

0x00 搭建开发环境

1. 安装pip

主流的Linux系统中已经集成Python3,目前最新版的Python是3.12,Ubuntu22.04内置的是3.10。

1
sudo apt install python3-pip # Ubuntu

2. 创建虚拟环境

1
2
sudo apt install python3.10-venv #Ubuntu 需要安全venv的依赖 当前使用版本是3.10
python3 -m venv env

激活环境:

1
source env/bin/activate

3. 管理依赖

或者在虚拟环境下使用下面的命令

1
pip list

4. 退出虚拟环境

1
deactivate

5. 安装Flask

1
pip install flask

0x01 Hello,Flask

1. 创建程序实例

app.py

1
2
3
4
5
6
7
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
return 'Welcome to Flask!'

0x02 注册路由

1. 为视图绑定多个URL

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

2. 动态URL

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

设置访问的默认值

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

等同于

1
2
3
4
@app.route('/greet')
@app.route('/greet/<name>')
def greet(name='Programmer'):
return '<h1>Hello,%s!</h1>' %name

0x03 启动开发服务器

1. Run,Flask,Run

1
2
flask run
flask run --host=0.0.0.0 --port=8080

2. 自发现程序实例

  1. 从当前目录寻找app.py和wsgi.py模块,并从中寻找名为app或application的程序实例。
  2. 从环境变量FLASK_APP对应的模块名/导入路径寻找名为app或application的程序实例。

3. 管理环境变量

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

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

1
pip install python-dotenv

创建环境变量文件:

1
2
touch .env
touch .flaskenv

.flaskenv用来存储和Flask相关的公开环境变量,而.env用来存储包含敏感信息的环境变量。

可以添加.flaskenv.env.gitignore文件中,防止提交。

4. 运行参数

1
2
flask run --debug #开启调试模式
flask --app hello run #当文件名不是app时候,是hellp.py时候可以使用--app指定程序实例

5. 重载器

自动监测文件改动:

1
pip install watchdog

0x04 Python Shell

在开发Flask程序时候,我们并不直接使用python命令启动Python Shell,而是使用flask shell命令:

1
flask shell

0x05 配置

一个项目中会用到很多配置:Flask提供的配置,扩展提供的配置,还有程序特定的配置。这些配置通过Flask对象的app.config属性做统一设置和获取。可以像在字典中添加一个键值方式设置一个配置:

1
app.config['ADMIN_NAME'] = 'Peter'

使用upload()方法一次加载多个配置:

1
2
3
4
app.config.update(
TESTING=True,
SECRET_KEY='_5#yF4Q8z\n\xec/'
)

0x06 URL与端点

调用url_for(endpoint)获取URL,endpoint一般为视图函数的函数名,如果URL包含动态部分,那么我们需要在url_for()函数中传入相应的参数。

1
2
3
@app.route('hello/<name>')
def greet(name):
return 'Hello %s!' %name

这时使用url_for('greet',name = 'Jack')得到的URL为/hello/Jack

在使用ulr_for()函数时,将_external参数设置为True,这会产生完整的URL,url_for('greet', _external = True)

0x07 Flask命令

通过创建任意一个函数,并为其添加app.cli.command()装饰器,我们就可以注册一个flask命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
from flask import Flask
import click

app = Flask(__name__)

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

@app.route('/')
def hello():
return 'Welcome to Flask!'

函数的名称即为命令名称。

1
flask hello

也可以在@app.cli.command()装饰器中传入参数来设置命令,比如@app.cli.command(say-hello)

1
flask say-hello

0x08 Flask与MVC架构

最基本结构:

1
2
3
4
hello/
- templates/
- static/
- app.py

处理请求并生成响应的函数被成为“视图函数”(View function)其实并不合理,这个命名的约定来自Werkzeug,而Werkzeug的URL匹配主要参考了Routes,再往前追溯,Routes的实现又参考了Ruby on Rails。在Ruby on Rails中,术语views用来表示MVC架构中的View。在MVC架构中,程序被分为三个组件:数据处理(Model)、用户界面(View)、交互逻辑(Controller)。如果套用MVC架构的内容,那么Flask中视图函数名称其实不严谨,使用控制器函数(Controller function)更合适些。如果硬要套用MVC架构,那么视图函数可以作看控制器(Controller),而视图则是Jinja2渲染的HTML模版,模型则是SQLAlchemy来实现。