Flask框架介绍与环境搭建
Flask诞生于2010年, 使用python语言基于Werkzeug工具箱编写的轻量级Web开发框架
Flask本身相当于一个内核, 其他几乎所有的功能都要用到扩展(邮件:Flask-Mail, 用户认证:Flask-Login, 数据库:Flask-SQLAlchemy).
Flask的核心在于Werkzeug(路由模块), Jinja2模板引擎.
# Flask的"轻"
Flask的"轻", 不代表其功能不够强大, Flask拥有丰富的扩展, 其依赖于扩展来给应用添加功能, 众多的插件提供了数据库集成, 表单验证, 上传处理,各种各样的开放认证技术等, Flask的这些特性使得它在web开发方面变得非常流行
# 注意: 如果构建大型项目, 使用很多扩展, Flask也会变的跟Django一样的重.
Flask框架环境搭建
# 安装虚拟环境管理包: virtualenvwrapper
pip install virtualenvwrapper
# 虚拟环境命令
创建虚拟环境: mkvirtualenv envname
激活虚拟环境: workon envname
查看虚拟环境: lsvirtualenv
移除虚拟环境: rmvirtualenv envname
退出虚拟环境: deactivate
# 环境依赖技巧
生成依赖清单: pip freeze > requirements.txt
自动安装依赖: pip install -r requirements.txt
# Flask框架的安装
pip install flask
# 注意:
flask的核心是Werkzeug和Jinja2, 所以在安装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()
实例化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=8080, debug=True)
从配置对象中加载配置
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'
从配置文件加载
1).创建配置文件settings.py, 并编写配置信息:
MYSQL_HOST = '127.0.0.1'
MYSQL_PORT = 3306
2).Flask实例代码:
import toml as toml
from flask import Flask
app = Flask(__name__)
# 从文件加载配置
app.config.from_pyfile('settings.py',load=load=toml.load)
@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()
从环境变量中加载。。。。略
三种配置方式对比:
1.从对象加载配置: 配置方式灵活, 可复用性强, 但不安全
2.从文件加载配置: 复用性不好, 也不安全, 但是官方推荐用法
3.从环境变量加载: 相对安全, 利于配置敏感信息, 推荐使用
工厂模式与APP封装与Flask路由
工厂模式
工厂模式, 在于提供一个"工厂", 负责创建其他类型对象, 客户端使用某些参数调用此方法之后, 工厂会据此创建所需类型的对象, 然后将它们返回给客户端.
简单工厂模式, 允许接口创建对象, 但不会暴露对象的创建逻辑.
# 工厂模式实例:
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)
APP封装
首先导入flask模块
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'
settings配置类文件
class DefaultConfig(object):
SECRET_KEY = 'SJFDSjkhsfk#$%^&kdfjiw683942'
pass
class DevelopmentConfig(DefaultConfig):
DEBUG = True
pass
Flask路由定义
Flask的路由为装饰器实现的, 语法及参数如下:
@app.route(url, methods=[....], endpoint="...")
def index():
pass
参数:
- URL: 路由路径
- methods: 视图允许的请求方法, 如不指定method, 则默认只允许GET请求访问视图
- endpoint: 端点, 可以视为路由别名, 如果endpoint不指定, 则默认endpoint的值为视图函数名