This article was last updated on <span id="expire-date"></span> days ago, the information described in the article may be outdated.
Flask Web 框架学习笔记
1. Flask 初始化参数
Flask 程序实例在创建的时候,需要默认传入当前 Flask 程序所指定的包(模块).
- import name
- Flask 程序所在的包 (模块),传
__name__
就可以 - 其可以决定 Flask 在访问静态文件时查找的路径
- Flask 程序所在的包 (模块),传
- staticurlpath
- 静态文件访问路径,可以不传,默认为: /+ 静态文件目录名
- static_ folder
- 静态文件存储的文件夹,可以不传,默认为 static
- template_ folder
- 模板文件存储的文件夹,可以不传,默认为 templates
Flask 基本编写
# 导入Flask类
from flask import Flask
#Flask类接收一个参数 __name__
app = Flask(__name__)
# 装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index() :
return 'Hello World'
# Flask应用程序实例的run方法启动WEB服务器
if __name__ == '__main__':
app.run()
2. Flask 工程配置加载的方式
使用方式
Flask 将配置信息保存到了 app.config
属性中,该属性可以按照字典类型进行操作。
app.config.get(name) # 读取
app.config[name] # 修改
设置
从配置对象中加载
from flask import Flask class DefaultConfig(oject): # 密钥 SECRET_KET = 'lovehyy2021209classpzezprem' app = Flask(__name__) app.config.from_object(DefaultConfig) # 从配置对象中加载 @app.route('/') # 装饰器->路由 def index(): # 视图函数 print(app.config['SECRET_KEY']) return 'hello world'
从配置文件中加载
在项目目录下新建
setting.py
文件,存放大写常量SECRET_KET = 'lovehyy2021209classpzezprem'
在 Flask 程序文件中
app = Flask(__name__) app.config.from_pyfile('setting.py') # 从配置文件加载
从环境变量中加载
环境变量 (environment variables) 一般是指在操作系统中用来指定操作系统运行环境的一些参数,如: 临时文件夹位置和系统文件夹位置等。环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。
通俗的理解,环境变量就是我们设置在操作系统中,由操作系统代为保存的变量值:
在 Linux 系统中设置和读取环境变量的方式如下:
export 变量名=变量值 # 设置 echo $变量名 # 读取
Flask 使用环境变量加载配置的本质是通过环境变量值找到配置文件,再读取配置文件的信息,其使用方式为:
app.config.from_ envvar('环境变量名')
环境变量的值为配置文件的绝对路径先在终端中执行如下命令:
export PROJECT_ _SETTING= '~/ setting. py'
再运行如下代码
app = Flask(__ name__) app.config.from_envvar('PROJECT_ SETTING', silent=True)
各配置方式优缺点
- app.config.from _object(配置对象)
- 继承 - ->优点复用
- 敏感数据暴露缺点
- app.config.from_pyfile(配置文件)
- 优点 –> 独立文件保护敏感数据
- 缺点 –> 不能继承文件路径固定不灵活
- app.config.from_envvar(" 环境变量名")
- 优点 –> 独立文件保护敏感数据文件路径不固定灵活
- 缺点 –> 不方便要记得设置环境量
- 设置环境变量
- 终端 export
- pycharm 设置
- app.config.from _object(配置对象)
利用工厂函数设置
from flask import Flask
class DefaultConfig(object):
DEBUG = True
SECRET_KEY = 'lovehyy2021pzez209class'
def create_flask_app(config):
'''构建flask对象的工厂函数,传入配置对象,返回配置后的app对象'''
app = Flask(__name__, static_url_path='/static', static_folder='static')
app.config.from_object(config)
return app
app = create_flask_app(DefaultConfig)
@app.route('/', methods=["GET"])
def index():
return "Hello Flask"
if __name__ == '__mian__':
app.run()
3. Flask 运行方式
直接运行 Py 文件启动
可以指定运行的主机 IP 地址,端口,是否开启调试模式
app.run(host="0.0.0.0", port=5000, debug=True)
关于DEBUG 调试模式:
- 程序代码修改后可以自动重启服务器
- 在服务器出现相关错误的时候可以直接将错误信息返回到前端进行展示
新版启动方式
开发服务器启动方式:
在 1.0 版本之后,Flask 调整了开发服务器的启动方式,由代码编写 app. run() 语句调整为命令启动 flask
终端启动:
export FLASK_APP=main # 设置启动的python文件
flask run # 在项目文件下执行
说明
环境变量 FLASK_APP 指明 flask 的启动实例:
flask run -h 0.0.0.0 -p 8000
绑定地址端口flask run --help
获取帮助- 生产模式与开发模式的控制
通过FLASK_ENV
环境变量指明export FLASK_ ENV=production
运行在生产模式,未指明则默认为此方式export FLASK_ ENV=development
运行在开发模式
4. Flask 路由
查询路由信息
命令行方式
flask routes
在应用中的
url_ map
属性中保存着整个 Flask 应用的路由映射信息,可以通过读取这个属性获取路由信息。print(app.url_map)
如果想在程序中遍历路由信息,可以采用如下方式:for rule in app.url_map.iter_rules(): # endpoint 视图函数的名字 # rule 路由的路径 print( 'name={} path={}'. format(rule.endpoint, rule.rule))
搭建一个返回所有路由信息的 json 接口
@app.route('/', methods=["GET"]) def index(): # for rule in app.url_map.iter_rules(): # print(f"name={rule.endpoint};path={rule.rule}") rules_iterator = app.url_map.iter_rules() # 字典推导式 dic = { rule.endpoint: rule.rule for rule in rules_iterator } # 利用jsonify返回json数据 return jsonify(dic)
5. 路由 Options 限定请求方式 Methods
请求方式
GET(自带)
OPTIONS(自带) -> 简化版的 GET 请求用于询问服务器接口信息的
比如接口允许的请求方式允许的CORS 跨域:
<www.meiduo.site> -> api.meiduo.site/users/1
options api.meiduo.site/uses/1HEAD(自带) -> 简化版的 GET 请求
只返回 GET 请求处理时的响应头,不返回响应体。
指定接口请求方式
# 利用修饰器中的methods返回设定请求接口方式
# 定义视图
@app.route('/', methods=["POST"])
def index():
return 'POST API'
6. 蓝图
引入
在一个Flask 应用项目中,如果业务视图过多,可以用某种方式划分出的业务单元单独维护,将每个单元用到的视图、静态文件、模板文件等独立分开。
例如从业务角度上,可将整个应用划分为用户模块单元、商品模块单元、订单模块单元,分别开发这些不同单元,并最终整合到一个项目应用中。
蓝图
在 Flask 中,使用蓝图 Blueprint来分模块组织管理。
蓝图实际可以理解为是一个存储一组视图方法的容器对象,其具有如下特点:
- 一个应用可以具有多个 Blueprint
- 可以将一个Blueprint 注册到任何一个未使用的URL下,比如“/user”、 “/godds”。
- Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法,它并不是必须要实现应用的视图和函数的
- 在一个应用初始化时,就应该要注册需要使用的 Blueprint。★
- 但是一个Blueprint并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中。★
定义蓝图
定义
user_bp = Blueprint('user', __name__)
在这个蓝图对象上进行操作,注册路由,指定静态文件夹,注册模版过滤器
@user_bp.route('/') def user_profile(): return 'user_profile'
在应用对象中注册这个蓝图对象
app.register_blueprint(user_bp)
单文件蓝图
可以将创建蓝图对象与定义视图函数放在一个文件中。
目录(包)蓝图
对于一个打算包含多个文件的蓝图,通常将创建蓝图对象放到 Python 包的 __init__.py
文件中
--------- project # 工程目录
|---- main.py # 启动文件
|---- user # 用户蓝图
| |---- __init__.py # 此处创建蓝图对象
| |---- views.py
循环引用问题
所以导入视图函数要放在
__init__.py
文件的最后
蓝图内部静态文件
和应用对象不同,蓝图对象创建时不会默认注册静态目录的路由。需要我们在创建时指定 static_folder
参数。
下面的示例将蓝图所在目录下的 static_admin
目录设置为静态目录
admin = Blueprint ("admin",__ name__ , static_folder='static_admin')
app.register_blueprint (admin, url_prefix='/admin' )
现在就可以使用 /admin/static_admin/<filename>
访问 static_ admin
目录下的静态文件了。
也可通过 static_url_path
改变访问路径
admin = Blueprint("admin",__name__, static_folder='static_admin' ,static_url_path='/lib')
app.register_blueprint(admin, url_prefix='/admin')
7. 处理请求
在视图编写中需要读取客户端请求携带的数据时,如何才能正确的取出数据呢?
请求携带的数据可能出现在 HTTP 报文中的不同位置,需要使用不同的方法来获取参数。
Author: WhaleFall
Permalink: https://www.whaleluo.top/python/flask-web-note/
文章默认使用 CC BY-NC-SA 4.0 协议进行许可,使用时请注意遵守协议。
Comments