Flask01 初识Flask框架
1.Flask框架介绍与环境搭建
1.1Flask介绍
Flask诞生于2010年, 使用python语言基于Werkzeug工具箱编写的轻量级Web开发框架
Flask本身相当于一个内核, 其他几乎所有的功能都要用到扩展(邮件:Flask-Mail, 用户认证:Flask-Login, 数据库:Flask-SQLAlchemy).
Flask的核心在于Werkzeug(路由模块), Jinja2模板引擎.
# Flask的"轻"
Flask的"轻", 不代表其功能不够强大, Flask拥有丰富的扩展, 其依赖于扩展来给应用添加功能, 众多的插件提供了数据库集成, 表单验证, 上传处理,各种各样的开放认证技术等, Flask的这些特性使得它在web开发方面变得非常流行
# 注意: 如果构建大型项目, 使用很多扩展, Flask也会变的跟Django一样的重.
1.2.Flask框架环境搭建
# 安装虚拟环境管理包: virtualenvwrapper
pip install virtualenvwrapper-win
# 虚拟环境命令
创建虚拟环境: mkvirtualenv envname
激活虚拟环境: workon envname
查看虚拟环境: lsvirtualenv
移除虚拟环境: rmvirtualenv envname
退出虚拟环境: deactivate
# 环境依赖技巧
生成依赖清单: pip freeze > requirements.txt
自动安装依赖: pip install -r requirements.txt
# Flask框架的安装
pip install flask==1.0.2
# 注意:
flask的核心是Werkzeug和Jinja2, 所以在安装Flask的同时, 会自动安装上面的两个依赖.
3.完美邂逅: Hello Flask
# 实现Flask入门应用
# 实现步骤:
# 1.导入Flask类
# 2.实例化Flask对象
# 3.编写路由与视图
# 4.启动服务
# 实现Flask入门应用
# 实现步骤:
# 1.导入Flask类
from flask import Flask
# 2.实例化Flask对象
app = Flask(__name__)
# 3.编写路由与视图
@app.route('/')
def index():
return 'Hello Flask'
# 4.启动服务
if __name__ == '__main__':
app.run()
# 知识点抽取:
1.实例化Flask对象:
app = Flask(__name__)
1).__name__参数用于确定启动程序的位置
2).__name__参数可以传递除了标准模块名的任意字符串, 但不推荐
3).__name__参数如果传递标准模块名, 不影响路由的匹配, 但会影响静态文件的加载
2.@app.route('/'): 路由配置
@app.route('路由')是一装饰器的形式构建路由的, 其第一个参数为路由路径
3.app.run(): Flask实例的方法, 用于启动web服务, 可选参数如下:
- host: 服务启动的IP地址
- port: 服务启动的端口
- debug: 是否以调试模式启动
示例: app.run(host='127.0.0.1', port=8899, debug=True)
2.Flask配置
# Flask项目配置文件加载方式:
1.从配置对象中加载
2.从配置文件中加载
3.从环境变量中加载
2.1从配置对象中加载
# 1.从配置对象中加载
# (1).实现步骤:
- 创建配置类(建议单独文件中创建)
- 加载配置对象
- 使用配置
# (2).示例:
1).settings.py代码:
class DefaultConfig(object):
MYSQL_HOST = '127.0.0.1'
MYSQL_PORT = 3306
2).Flask实例文件代码:
from flask import Flask
# 导入配置类
from settings import DefaultConfig
app = Flask(__name__)
# 从配置对象中加载配置
app.config.from_object(DefaultConfig)
@app.route('/')
def index():
# get方式调用配置
mysql_port = app.config.get('MYSQL_PORT')
print(mysql_port)
# 字典键值方式调用配置
mysql_host = app.config['MYSQL_HOST']
print(mysql_host)
return 'load config from object'
2.2从配置文件加载
# 2.从配置文件加载
# (1).实现步骤:
- 创建配置文件(py文件或其他格式文件均可)
- 加载配置文件
- 使用配置
# (2).示例:
1).创建配置文件settings.py, 并编写配置信息:
MYSQL_HOST = '127.0.0.1'
MYSQL_PORT = 3306
2).Flask实例代码:
from flask import Flask
app = Flask(__name__)
# 从文件加载配置
app.config.from_pyfile('settings.py')
@app.route('/')
def index():
# 获取配置信息
mysql_port = app.config.get('MYSQL_PORT')
print(mysql_port)
mysql_host = app.config['MYSQL_HOST']
print(mysql_host)
return 'Hello Flask'
if __name__ == '__main__':
app.run()
2.3从环境变量中加载
# 3.从环境变量中加载
# (1).实现步骤:
- 创建配置文件(存放敏感信息, 不与项目同目录)
- 添加配置文件环境变量
- 获取配置
# (2).添加配置文件环境变量
1).创建配置文件, 并拷贝配置文件路径: 步骤略
2).加载配置文件:
app.config.from_envvar('settings')
注意: 如果配置文件加载不到则会抛出异常, 禁止抛出异常可以添加silent参数为TRUE, 即app.config.from_envvar('settings', silent=True)
3).设置配置文件的环境变量, 如下图:
4).获取配置与上面两种方式一致
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B7WgkoPx-1669171169413)(images/1-1.gif)]
三种配置方式对比:
1.从对象加载配置: 配置方式灵活, 可复用性强, 但不安全
2.从文件加载配置: 复用性不好, 也不安全, 但是官方推荐用法
3.从环境变量加载: 相对安全, 利于配置敏感信息, 推荐使用
3.工厂模式与APP封装与Flask路由
3.1工厂模式与APP封装
# 1.设计模式
设计模式是由GoF(Gang of Four)首先提出的, 设计模式就是解决特定问题的解决方案. 它本身是一种发现, 而不是一种发明.
GoF在设计模式的书中给出了23中涉及模式, 共分为三大类:
- 创建型模式
- 结构型模式
- 行为型模式
(23种设计模式自己科普, 课后拓展作业)
# 2.工厂模式
工厂模式, 在于提供一个"工厂", 负责创建其他类型对象, 客户端使用某些参数调用此方法之后, 工厂会据此创建所需类型的对象, 然后将它们返回给客户端.
简单工厂模式, 允许接口创建对象, 但不会暴露对象的创建逻辑.
# 工厂模式实例:
from abc import ABCMeta, abstractmethod
# 接口类
class Animal(metaclass=ABCMeta):
@abstractmethod
def do_say(self):
pass
# 狗类
class Dog(Animal):
def do_say(self):
print('wang wang!')
# 猫类
class Cat(Animal):
def do_say(self):
print('miao miao!')
# 工厂类
class ForestFactory(object):
def make_sound(self, object_type):
return eval(object_type)().do_say()
# 程序入口
if __name__ == '__main__':
ff = ForestFactory()
animal = input("which animal should make_sound Dog or Cat?")
ff.make_sound(animal)
# 3.APP封装
# 实现过程
from flask import Flask
# 配置类封装在settings文件中
from settings import DefaultConfig, DevelopmentConfig
# 封装app的工厂函数
def create_flask_app(config):
app = Flask(__name__)
# 从对象加载配置
app.config.from_object(config)
# 从环境变量加载配置
app.config.from_envvar('settings', silent=True)
return app
app = create_flask_app(DevelopmentConfig)
@app.route('/')
def index():
return 'Hello Flask'
# 4.settings配置类文件
class DefaultConfig(object):
SECRET_KEY = 'SJFDSjkhsfk#$%^&kdfjiw683942'
pass
class DevelopmentConfig(DefaultConfig):
DEBUG = True
pass
3.2.Flask路由定义
# 路由定义
Flask的路由为装饰器实现的, 语法及参数如下:
@app.route(url, method=[....], endpoint="...")
def index():
pass
# 参数:
- URL: 路由路径
- method: 视图允许的请求方法, 如不指定method, 则默认只允许GET请求访问视图
- endpoint: 端点, 可以视为路由别名, 如果endpoint不指定, 则默认endpoint的值为视图函数名
3.3路由映射的查看
# 路由映射的查看
在flask项目中有两种方式查看路由, 一种命令行直接查看, 一种通过app的路由映射属性进行查看
- flask routes: 命令行查看项目路由
- app.url_map: app路由属性查看
# 1.命令行查看方式:
服务器运行启动方式下, 直接在命令行运行: flask routes即可看到项目的路由表:
Endpoint Methods Rule
-------- ------- -----------------------
index GET /
static GET /static/<path:filename>
# 说明:
- endpoint: 路由别名, 不设置则默认为视图名称
- methods: 路由支持的请求方法
- rule: 路由规则
- static: 项目默认添加的静态文件路由
# 2.app路由属性查看方式
无论何种启动方式下, 在视图中 `print(app.url_map)` 即可在触发路由时打印路由映射关系.
Map(
[
<Rule '/' (GET, HEAD, OPTIONS) -> index>,
<Rule '/static/<filename>' (GET, HEAD, OPTIONS) -> static>
]
)
# 说明:
- Map: 表示路由映射
- Rule: 路由映射对象, 其后依次是: 路由规则, 请求方法, 路由别名
4.服务器启动方式
在Flask1.0版本之后, Flask调整为开发服务器启动方式, 将app.run()调整为 flask run命令启动Flask项目.
# 终端启动步骤:
(1).指定启动实例: export FLASK_APP = '脚本名'
(2).指定启动模式: export FLASK_ENV = 'development'
注: development为开发模式, production为生产模式, 默认启动为生产模式
(3).启动命令详解: flask run -h ipaddress -p port
- flask run默认启动在127.0.0.1:5000上
- 指定启动的盘IP使用-h参数, -p指定启动的端口