Flask技术手册

警告
本文最后更新于 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. 程序代码修改后可以自动启动服务器
  2. 在服务器出现相关错误的时候可以直接将错误信息返回到前端进行展示

启动方式

在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. 创建一个蓝图对象
1
user_bp=Blueprint('user',__name__)
  1. 在这个蓝图对象上进行操作
1
2
3
@app.route('/')
def view_func():
    return 'hello world'
  1. 在应用对象上注册这个蓝图对象
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. 创建转换器类,保存匹配时的正则表达式
1
2
3
4
5
6
7
8
from werkzeug.routing import BaseConverter

class MobileConverter(BaseConverter):
   '''
   手机号格式
   '''
   # regex名字固定
   regex=r'1[3-9]\d{9}'
  1. 将自定义的转换器告知Flask应用
1
app.url_map_converters['mobile'] = MobileConverter
  1. 在使用转换器的地方定义使用
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

设置

通过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:简单而可扩展的管理接口框架
0%