Ywc's blog

Python flask框架学习记录

Word count: 1.8kReading time: 7 min
2019/11/18

Python flask框架学习记录

一篇很详细的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. 初始化参数说明

1
import_name
  • Flask程序所在的包(模块),传__name__就可以
  • 其可以决定Flask在访问静态文件时查找的路径
1
static_url_path
  • 静态文件访问路径,可以不传,默认为/+static_folder
1
static_folder
  • 静态文件存储的文件夹,可以不传,默认为static
1
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. Python flask框架学习记录
    1. 1.1. Flask框架
    2. 1.2. 工程的创建
      1. 1.2.1. 1. 创建独立的工作环境
      2. 1.2.2. 2. 创建文件并写入代码:
      3. 1.2.3. 3. 初始化参数说明
      4. 1.2.4. 4. 应用程序配置参数
      5. 1.2.5. 5.启动方式
    3. 1.3. 路由与蓝图
    4. 1.4. 路由
      1. 1.4.0.1. 1.查询路由信息
      2. 1.4.0.2. 2.指定请求方式
  2. 1.5. 蓝图
    1. 1.5.1. 使用方式
  3. 1.6. 装饰器
    1. 1.6.1. 1、为什么要用装饰器?
    2. 1.6.2. 2、带参数的装饰器
  4. 1.7. 面向对象
    1. 1.7.1. 1、谈谈对面向对象的认识