Ywc's blog

Python flask框架学习记录

Word count: 1.6k / Reading time: 6 min
2019/11/18 Share

一篇很详细的Flask框架介绍:https://www.cnblogs.com/sss4/p/8097653.html

Flask框架

核心 Werkzerug路由模块+Jinja2模板引擎规则
轻量–>只提供核心
最新版本 1.0.2

框架的选择上:

  • 自由、灵活、高度定制———>flask
  • 快速实现业务、不考虑技术选型,越简单越好–>Django

工程的创建

1. 创建独立的工作环境

1
mkvirtualenv flask -p python3

jupyter、pyenv、virtualenv、virtualenvwrapper简要区别

2. 创建文件并写入代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 导入Flask类
from flask import Flask

# Flask类接收一个参数__name__
app=Flask(__name__)

# 定义视图
# 装饰器作用是将路由映射到视图函数index
@app.route('/') # 路由信息可以自定义
def index():
return 'TestOK'

# Flask应用程序实例的run方法启动Web服务器
if __name__=='__main__':
app.run()

启动即可,在http://127.0.0.1:5000 web界面上即可显示TestOK
端口默认为5000
django的端口默认为8000

3. 初始化参数说明

import_name

  • Flask程序所在的包(模块),传__name__就可以
  • 其可以决定Flask在访问静态文件时查找的路径

static_url_path

  • 静态文件访问路径,可以不传,默认为/+static_folder

static_folder

  • 静态文件存储的文件夹,可以不传,默认为static

template_folder

  • 模板文件存储的文件夹,可与不传,默认为templates
1
app=Flask(__name__,static_url_path='/s',static_folder='static_files')

在路径/s下即可访问static_ywc里的静态文件
eg:http://127.0.0.1/s/1.png 存放在static_files目录下的1.png就可以访问到,该目录可以自定义

4. 应用程序配置参数

  • app.config.from_object(配置对象)
    • 继承–>优点 复用
    • 敏感数据暴露 缺点
  • app.config.from_pyfile(配置文件)
    • 优点:独立文件 保护敏感数据
    • 缺点:不能继承,文件路径固定,不灵活
  • app.config.from_envvar(‘环境变量名’)
    • 优点:独立文件,保护敏感数据,灵活
    • 缺点:不方便,记得设置环境变量

从配置文件中读取配置信息会覆盖掉从配置对象中加载的同名参数

Django将所有的配置信息都放在了settings.py文件中,而Flask则不同
Flask将配置信息存放在了app.config属性中,该属性可以按照字典类型进行操作

主要使用以下三种方式:

  • 从配置对象中加载
    app.config.from_object(配置对象)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    # 导入Flask类
    from flask import Flask

    # 配置对象方式加载配置信息
    class DefaultConfig(object):
    """
    默认配置
    """
    SECRET_KEY='scasdsdasasdasd'

    # Flask类接收一个参数__name__
    app=Flask(__name__)

    # 设置
    app.config.from_object(DefaultConfig)

    # 装饰器作用是将路由映射到视图函数index
    @app.route('/')
    def index():
    # 读取配置信息
    print(app.config['SECRET_KEY'])
    return 'TestOK'

    # Flask应用程序实例的run方法启动Web服务器
    if __name__=='__main__':
    app.run()
  • 从配置文件中加载
    app.config.from_pyfile

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    # 导入Flask类
    from flask import Flask

    # 配置对象方式加载配置信息
    # class DefaultConfig(object):
    # """
    # 默认配置
    # """
    # SECRET_KEY='scasdsdasasdasd'

    # Flask类接收一个参数__name__
    app=Flask(__name__)

    # 设置
    # app.config.from_object(DefaultConfig)
    app.config.from_pyfile('setting.py')

    # 装饰器作用是将路由映射到视图函数index
    @app.route('/')
    def index():
    # 读取配置信息
    print(app.config['SECRET_KEY'])
    return 'TestOK'

    # Flask应用程序实例的run方法启动Web服务器
    if __name__=='__main__':
    app.run()
  • 从环境变量中加载
    app.config.from_envvar('环境变量名')
    Flask从环境变量加载配置的本质是从通过环境变量找到配置文件,再读取配置文件的信息
    环境变量的值为配置文件的绝对路径
    先在终端中执行如下命令
    export PROJECT_SETTING='~/setting.py'

    1
    2
    3
    4
    5
    6
    7
    8
    app = Flask(__name__)

    app.config.from_envvar('PROJECT_SETTING', silent=True)

    @app.route("/")
    def index():
    print(app.config['SECRET_KEY'])
    return "hello world"

    关于silent的说明:

    • 表示系统环境变量中没有设置相应值时是否抛出异常
    • False 表示不安静的处理,没有值时报错通知,默认为False
    • True 表示安静的处理,即时没有值也让Flask正常的运行下去

5.启动方式

代码启动

  • app.run(host=’0.0.0.0’,port=8000)

终端启动
代码中不用使用app.run

1
2
export FLASK_APP=helloword
flask run
  • 环境变量FLASK_APP指明flask的启动实例

  • flask run -h 0.0.0.0 -p 8000 绑定地址 端口

  • flask run –help 获取帮助

  • 生产模式与开发模式的控制
    通过FLASK_ENV环境变量指明

    • export FLASK_ENV=production 运行在生产模式,未指明则默认认为此方式
    • export FLAKS_ENV=development 运行在开发模式

    在pycharm需要进行在Environment Variables中配置

路由与蓝图

路由

1.查询路由信息

  • 命令行中:flask routes

  • 在程序中:app.url_map

    url_map属性包含Flask应用的所有路由映射信息

构造获取全部路由信息的接口:

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

@app.route('/')
def index():
# # 读取配置信息
# print(app.config['SECRET_KEY'])
# return 'TestOK'
"""
主视图,返回所有视图地址
"""
rules_iterator=app.url_map.iter_rules()
return json.dumps({rule.endpoint:rule.rule for rule in rules_iterator})

2.指定请求方式

Flask中,定义的路由,默认请求方式有下列三种:

  • GET
  • OPTIONS(自带)
  • HEAD(自带)

代码示例:

1
@app.route("/",methods=["GET","POST"])

利用methods限制请求方式

蓝图

在Flask中,使用蓝图Blueprint来分模块组织管理

  • 一个应用可以有多个Blueprint
  • 在一个应用初始化时,就应该要注册需要使用的Blueprint

使用方式

1、创建一个蓝图对象

1
user_bp=Blueprint('user',__name__)

2、在这个蓝图对象上进行操作,注册路由、指定静态文件夹,注册模版过滤器

1
2
@user_bp.route('/')
def user_profile():

装饰器

1、为什么要用装饰器?

在不改变原函数的基础上,对函数执行前后进行自定义操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def wapper(func):
def inner(*args,**kwargs):
#执行原来的代码
return func(*args,**kwargs):
return inner
'''
@wapper的作用
1、执行wapper函数,并将装饰的函数当作参数。wapper(index)
2、将第一步的返回值,重新赋值给index。 新index=wapper(老index)
'''
@wapper
def index(a1):
return a1+1000
v=index(999)
print(v)
print(index.__name__)
'''
输出:
1999
inner
'''

@functools.wraps(func)获取原函数的信息

2、带参数的装饰器

1
2
3
4
5
6
7
8
9
"""
@xx(666)的工作流程:
1.v1=xx(666)
2.@v1
3.新index=v1(老index)
"""
@xx(666)
def index(request):
return 123

面向对象

1、谈谈对面向对象的认识

  • 封装:
    • 将同一类方法分为一类:方法封装到类中
    • 将方法中共同的参数封装到对象中:把共同值封装到对象中
CATALOG
  1. 1. Flask框架
  2. 2. 工程的创建
    1. 2.1. 1. 创建独立的工作环境
    2. 2.2. 2. 创建文件并写入代码:
    3. 2.3. 3. 初始化参数说明
    4. 2.4. 4. 应用程序配置参数
    5. 2.5. 5.启动方式
  3. 3. 路由与蓝图
  4. 4. 路由
    1. 4.0.1. 1.查询路由信息
    2. 4.0.2. 2.指定请求方式
  • 5. 蓝图
    1. 5.1. 使用方式
  • 6. 装饰器
    1. 6.1. 1、为什么要用装饰器?
    2. 6.2. 2、带参数的装饰器
  • 7. 面向对象
    1. 7.1. 1、谈谈对面向对象的认识