如何学习框架
结合需求,问题去探究并理解问题的内在本质,及解决问题的思想和思路。
Flask
简介
最新版本1.1.0
诞生于2012年,Armin ronacher创始人
核心:(WSGI工具箱)Werkzueg、(模板引擎)Jinja2
与Django的区别
flask不直接具备:
django-admin、manage.py管理项目工程、orm模型、admin操作站点、认证系统、缓存机制、文件储存
需要拓展包去实现:
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 # 简单和可扩展的管理接口的框架
官方文档
中文:http://docs.jinkan.org/docs/flask/
英文:http://flask.pocoo.org/docs/1.0/
两者的特点
Django:快速实现业务功能, 工具组件丰富, 但有框架约束
flask:只提供Web核心功能, 便于调整业务结构技术选型, 自由度高
工程搭建
环境配置
# 创建虚拟环境
mkvirtualenv flask-env -p python3
# 安装flask包
pip install flask
简单项目编写
from flask import Flask
app = Flask(__name__) # __name__ --> def __init__
'''工程配置加载'''
# app.config.from_object()
# app.config.from_pyfile()
# app.config.from_envvar('', slient= )
# 视图
@app.route('/')
def index():
return 'hello world'
if __name__ == '__main__':
app.run()
# 启动
python 文件名.py
常用参数说明
Flask(__name__) # BASE_DIR-->flask项目的所在, 查询静态文件的起始位置
def __init__(
self,
import_name,
static_url_path=None, # 静态访问路径, 默认 / + static_folder
static_folder="static", # 静态文件夹
static_host=None,
host_matching=False,
subdomain_matching=False,
template_folder="templates", # 模板文件夹
instance_path=None,
instance_relative_config=False,
root_path=None,
):
工程配置加载
配置信息保存在 app.config 属性中, 可以当做字典类型操作。
app.config.get( )
app.config[ ]
# 方式一(从对象中加载):
class DefaultConfig(object):
SECRET_KEY = 'ST UDJYU E56Y5E'
app.config.from_object(DefaultConfig)
优点:继承复用
缺点:暴露敏感代码
# 方式二(从py文件导入):
app.config.from_pyfile('settings.py')
优点:独立存放, 保护敏感数据
缺点:无继承, 路径写死不灵活
# 方式三(配置环境变量):
cmd --> export SETTINGS='~/settings.py' # 设置一组 KEY:VALUE 保存在系统内
app = Flask(__name__)
app.config.from_envvar('SETTINGS', silent='错误忽略') # 默认False, True就不报错
优点:保护数据, 路径灵活
缺点:不方便, 需要设置path
项目常用方式
# 将flask生成对象的方法, 改造为一个工厂函数
class DefaultConfig(object): # 配置类型
SECRET_KEY = 'ST UDJYU E56Y5E'
DEBUG = True # 开启调试模式
def create_flask_app(config): # 工厂函数
app = Flask(__name__)
app.config.from_object(config)
app.config.from_envvar('PROJECT_SETTING')
return app # 要将app传出
app = create_flask_app(DefaultConfig) # 调用, 生成flask实例
启动参数
if __name__ == '__main__':
app.run(host=" ", port= , debug= ) # 可以自定义 IP 端口 调试模式
'''1.0版后, 启动main不用书写, 可以添加环境变量, 通过 flask run 在终端启动'''
export FLASK_APP = 项目加载文件名 # FLASK_APP不能变更
flask run
flask run -h IP -p 端口 # 可以自定义地址和端口
# 环境控制
export FLASK_ENV = production # 生产模式, 默认值
export FLASK_ENV = development # 开发模式
Pycharm中快速设置启动
# 添加局部环境变量
# 运行按钮左侧-->对应文件——>edit——>Environment variables——>添加键值对
PROJECT_SETTING ...py
FLASK_APP ...py
# 添加执行命令, 二选一
(低版本)
Script path [空白]
Parameters --> -m flask run
(高版本)
Module name(下拉菜单) --> flask
Parameters --> run
其他扩展知识
# format = % 占位输出
"{}{}".format(1,2)
>>12
一般项目代码示例
from flask import Flask
class DefaultConfig(object):
DEBUG = True
SECRET_KEY = 'ST UDJYU E56Y5E'
def create_flask_app(config):
app = Flask(__name__)
app.config.from_object(config)
app.config.from_envvar('PROJECT_SETTING')
return app
app = create_flask_app(DefaultConfig)
@app.route("/", methods=["POST"])
def index():
return "hello world"
if __name__ == "__main__":
app.run()
路由
路由
# 查看所有路由
flask routes
app.url_map
# 遍历app.url_map的值, 并用format输出内容格式
for rule in app.url_map.iter_rules():
print('name={} path={}'.format(rule.endpoint, rule.rule))
# 还可以定义视图完成路由查询业务, 对app.url_map进行操作
@app.route('/'):
def route_map():
rules_iterator = app.url_map.iter_rules()
return json.dumps({rule.endpoint: rule.rule for rule in rules_iterator})
指定请求方式
# 默认请求方式有:
GET
OPTIONS ---> "简化版GET,用于询问服务器接口信息","cors跨域请求时, 中间件会验证OPTIONS"
HEAD ---> "简化版GET,只返回响应头,不返回响应体"
# 通过methods参数可以对请求方式进行限制
@app.route("/itcast1", methods=["POST"])
@app.route("/itcast2", methods=["GET", "POST"])