警告
本文最后更新于 2020-10-29,文中内容可能已过时。
FLask
本身“轻”的特点,让你的学习不会那么“重”,掌握核心知识就能进行开发 ,更容易获得成就感,学习也就会更有动力,另外,FLask
虽轻,但Flask 很强,内核+扩展的特点,让FLask
拥有“快速”开发各种类型应用的能力。
说明
本文所包含的内容仅仅是用于自我学习,可能有些内容晦涩难懂,如碰到问题,可以留言问我
基础
安装
pip3 install flask
基本使用
app初始化参数
Flask 程序实例在创建的时候,需要默认传入当前Flask程序所指定的包
import_name
Flask程序所在的包,传__name__
就可以,其可以决定Flask在静态文件时查找的路径
static_url_path
静态文件访问路径,可以不传,默认为:/+static_folder
static_folder
静态文件存储的文件,可以不传,默认为static
template_folder
模版文件存储的文件夹,可以不传,默认为templates
实例
1
2
3
4
5
6
7
8
9
10
|
from flask import Flask
app = Flask(__name__,static_url_path='/xxxx',static_folder='/my_static/')
# 定义视图
@app.route('/')
def index():
return 'yellow world'
if __name__ == '__main__':
app.run()
|
app.run参数
可以指定运行的主机IP地址,端口,是否开启调试模式
1
|
app.run(host='0.0.0.0', port=5000, debug=True)
|
DEBUG调试模式
- 程序代码修改后可以自动启动服务器
- 在服务器出现相关错误的时候可以直接将错误信息返回到前端进行展示
启动方式
在1.0版本之后,Flask调整开发服务器的启动方式,由代码编写app.run()
语句调整为命令flask shell
启动
注意:如果无法启用flask shell
命令,可能是pip版本过低,卸载flask之后升级pip版本,然后再安装
终端启动
1
2
3
|
export FLASK_APP=hellowrld
# 启动hellowrld程序
flask run
|
生产模式与开发模式的控制
通过FLASK_ENV环境变量知名
export FLASK_ENV=production
运行在生产模式,未指明则默认为此方式
export FLASK_ENV=development
运行在开发模式
配置文件
对象
app.config.from_object(配置对象)
1
2
3
4
5
6
7
8
9
10
11
|
class DefaultConfig():
'''默认配置'''
SECRET_KEY = 'XXXXXXXXX'
app = Flask(__name__)
app.config.from_object(DefaultConfig)
@app.route('/')
def index():
print(app.config['SECRET_KEY])
return 'hello world'
|
文件
app.config.from_pyfile(配置文件)
新建一个配置文件setting.py
1
|
SECRET_KEY = 'XXXXXXXXX'
|
程序中
1
2
3
4
5
6
7
|
app = Flask(__name__)
app.config.from_object(setting.py)
@app.route('/')
def index():
print(app.config['SECRET_KEY])
return 'hello world'
|
环境变量
app.config.from_envvar(环境变量名)
环境变量的值为配置文件的绝对路径
1
|
export PROJECT_SETTING='~/setting.py'
|
程序中
1
2
3
4
5
6
7
8
|
app = Flask(__name__)
# silent为True,表示安静的处理,即使没有值也让Flask正常的运行下去
app.config.from_envvar(PROJECT_SETTING, silent=True)
@app.route('/')
def index():
print(app.config['SECRET_KEY])
return 'hello world'
|
路由
1
2
3
|
@app.route('/')
def view_func():
return 'hello world'
|
查询路由信息
- 命令行方式
flask routes
- 程序中获取
app.url_map
,循环遍历(rule.endpoint,rule.rule) for rule in app.url_map.iter_rules()
请求方式
默认方式:GET,OPTION(自带),HEAD(自带)
利用methods
参数可以指定请求方式
1
2
3
|
@app.route('/',methods=['POST'])
def view_func():
return 'hello world'
|
蓝图
在Flask中,使用蓝图Blueprint来分模块组织管理
特点
- 一个应用可以具有多个Blueprint。
- 可以将一个个Blueprint注册到任何一个未使用的URL下,比如’/user’,’/goods’。
- Blueprint可以单独具有自己的模版,静态文件或者其他的通用操作方法,它并不是必须要实现应用的视图和函数。
- 在一个应用初始化时,就应该要注册需要使用的Blueprint。
- Blueprint并不是一个完整的应用,需要注册到某一应用中运行。
使用方法
- 创建一个蓝图对象
1
|
user_bp=Blueprint('user',__name__)
|
- 在这个蓝图对象上进行操作
1
2
3
|
@app.route('/')
def view_func():
return 'hello world'
|
- 在应用对象上注册这个蓝图对象
1
|
app.register_blueprint(user_bp,url_prefix='/user')
|
扩展用法
指定url前缀,url_prefix
内部静态文件,参数与flask对象一致
内部模版目录,参数与flask对象一致
请求相关
与request相关
URL路径参数(动态路由)
例如/users/123
,其中123实际上为具体的请求参数,表示用户信息
Flask不同与Django直接在定义路由是编写正则表达式,而是采用转换器语法
转换器语法
1
2
3
|
@app.route('/users/<user_id>')
def get_users_date(user_id):
return user_id
|
内置其他的转换器
1
2
3
4
5
6
7
8
|
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
|
自定义转换器
- 创建转换器类,保存匹配时的正则表达式
1
2
3
4
5
6
7
8
|
from werkzeug.routing import BaseConverter
class MobileConverter(BaseConverter):
'''
手机号格式
'''
# regex名字固定
regex=r'1[3-9]\d{9}'
|
- 将自定义的转换器告知Flask应用
1
|
app.url_map_converters['mobile'] = MobileConverter
|
- 在使用转换器的地方定义使用
1
2
3
|
@app.route('/sms_codes/<mobile:mob_num>')
def send_sms_code(mob_num):
return mob_num
|
其他参数
如果想要获取其他地方传递的参数,可以通过Flask提供的request对象来读取
属性 |
说明 |
类型 |
data |
请求的数据,并转换为字符串 |
* |
form |
请求中的表单数据 |
MultiDict |
args |
请求中的查询参数 |
MultiDict |
cookies |
请求中的cookie信息 |
Dict |
headers |
请求中的报文头 |
EnvironHeaders |
method |
请求使用的HTTP方法 |
GET/POST |
url |
请求的URL地址 |
string |
files |
请求中上传的文件 |
* |
上传文件
1
2
3
4
5
6
7
8
|
@app.route('/upload', method=['POST'])
def upload_file():
f = request.files['pic']
#with open('new_pic.png','wb')as new_pic:
# new_pic.write(f.read())
# 直接存入
f.save('./new_pic.png')
return 'OK'
|
响应相关
与response相关
返回模版
使用render_template
方法渲染模版并返回
传参
1
2
3
4
5
|
@app.route('/')
def home():
mint = 123
mstr = 'itcast'
return render_template('index.html', my_str=mstr, my_int=mint)
|
使用{{ my_str }}
,{{ my_str }}
重定向
使用redirect
方法
JSON数据
1
2
3
4
5
6
7
8
|
from flask import jsonify
@app.route('/demo')
def demo():
json_dict = {
'user_id':10,
'user_name':'laowang'
}
return jsonify(json_dict)
|
自定义状态码和相应头
元祖方式
可以返回一个元祖,格式必须为(response, status,headets)
的形式,且至少包含一个元素。status
值会覆盖状态代码,header
可以是一个列表或字典,作为额外的消息标头值。
1
2
3
|
@app.route('/demo')
def demo():
return 'ok',666,{'Itcast':'Python'}
|
make_response方式
1
2
3
4
5
6
7
|
from flask import Flask, make_response
@app.route('/demo')
def demo():
resp = make_response('make response 测试')
resp.headers['Itcast'] = 'Python'
resp.status = '404 not found'
return resp
|
Cookie
设置
通过make_response
来进行设置
1
2
3
4
5
6
7
|
from flask import Flask, make_response
@app.route('/cookie')
def set_cookie():
resp = make_response('set cookie ok')
# max_age设置秒数
resp.set_cookie('username','itcast', max_age=3600)
return resp
|
读取
1
2
3
4
5
|
from flask import request
@app.route('/cookie')
def set_cookie():
resp = request.cookies.get('username')
return resp
|
删除
1
2
3
4
5
6
|
from flask import request
@app.route('/delete_cookie')
def set_cookie():
resp = make_response('hello world')
resp.delete_cookie('username')
return resp
|
flask_sqlalchemy使用原生sql
1
2
3
4
5
6
7
8
|
# 执行sql
res = db.session.execute(table_name_sql)
# 查看多个执行结果,结果为可迭代对象
res.fetchall()
# 查看单个执行结果
res.fetchone()
# 查看field
res.keys()
|
扩展列表
- Flask-SQLalchemy:操作数据库
- Flask-script:插入脚本
- Flask-migrate:管理迁移数据库
- Flask-Session:Session存储方式指定
- Flask-WTF:表单
- Flask-Mail:邮件
- Flask-Bable:提供国际化的本地化支持,翻译
- Flask-Login:认证用户状态
- Flask-OpenID:认证
- Flask-RESTful:开发REST API的工具
- Flask-Bootstrap:继承前端的Twitter Bootstrap框架
- Flask-Moment:本地化日期和时间
- Flask-Admin:简单而可扩展的管理接口框架