持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
7. 路由
路由: flask对外暴露的接口,可以通过此接口跳转页面或者获取数据
7.1 获取全部路由
7.1.1 命令方式获取
flask routes
可以看到有两个路由信息 其中包含了路由路径/请求方式
注: flask routes默认是通过FLASK_APP这个环境变量来获取指定应用的路由信息的
7.1.2 程序中获取
print(app.url_map)
app.url_map提供了路由信息的存储
7.1.3 将/请求转化为返回所有路由信息的接口
from flask import Flask
import json
app = Flask(__name__, static_url_path='/s')
app.config.from_envvar('FLASK_CONFIG_FILE', silent=True)
class DefaultConfig:
SECRET_KEY = "DEFAULT"
class DevelopmentConfig(DefaultConfig):
SECRET_KEY = "DEVELOPMENT"
def create_flask_app(config):
"""
生成flask配置信息
:param config: 通过配置类的方式
:return: app对象
"""
app.config.from_object(config)
app.config.from_envvar("FLASK_PROJECT_CONFIG_FILE", silent=True)
return app
create_flask_app(DevelopmentConfig)
@app.route('/')
def hello_world():
rules = app.url_map.iter_rules()
print(app.url_map)
return json.dumps({rule.endpoint: rule.rule for rule in rules})
其实就是将app.url_map进行json转化一下,返回给前台显示即可
效果:
7.2 指定请求方式
路由默认支持GET请求,如果想要修改,则需要修改路由中的methods属性
@app.route('/', methods=["POST"])
如上所示,此方法就仅支持POST请求
测试效果:
不再支持GET请求
8. 蓝图
蓝图: Flask中蓝图是子模块的意思,一个Flask可以有多个子模块,也就是多个蓝图 BluePrint
8.1 蓝图的创建
蓝图的创建分为三步:
- 创建蓝图
- 定义视图
- 在主模块中注册蓝图
其中蓝图还分为单文件蓝图和目录蓝图,有一点区别
8.1.1 单文件蓝图
from flask import Blueprint
# 创建蓝图
user_bp = Blueprint('user', __name__)
# 定义视图
@user_bp.route('/profile')
def get_user_profile():
return "user_profile"
from flask import Flask
import json
import blueprint
app = Flask(__name__, static_url_path='/s')
app.config.from_envvar('FLASK_CONFIG_FILE', silent=True)
class DefaultConfig:
SECRET_KEY = "DEFAULT"
class DevelopmentConfig(DefaultConfig):
SECRET_KEY = "DEVELOPMENT"
def create_flask_app(config):
"""
生成flask配置信息
:param config: 通过配置类的方式
:return: app对象
"""
app.config.from_object(config)
app.config.from_envvar("FLASK_PROJECT_CONFIG_FILE", silent=True)
return app
create_flask_app(DevelopmentConfig)
# 主应用注册蓝图 可以通过url_prefix指定路径前缀
app.register_blueprint(blueprint.user_bp, url_prefix='/user')
8.1.2 目录蓝图
相比于单文件蓝图来说,目录蓝图主要有两点不一致
- 需要在目录下__init__.py 下进行蓝图的创建
- 创建蓝图后需要在__init__.py 内导入视图文件,否则无法扫描到视图
goods目录下的文件:
from flask import Blueprint
goods_bp = Blueprint("goods", __name__)
# 需要在蓝图创建后再引入,否则出现循环依赖
from . import goods_view
from . import goods_bp
@goods_bp.route("/goods")
def get_goods():
return "get_goods"
主应用:
from flask import Flask
import json
import blueprint, goods
app = Flask(__name__, static_url_path='/s')
app.config.from_envvar('FLASK_CONFIG_FILE', silent=True)
class DefaultConfig:
SECRET_KEY = "DEFAULT"
class DevelopmentConfig(DefaultConfig):
SECRET_KEY = "DEVELOPMENT"
def create_flask_app(config):
"""
生成flask配置信息
:param config: 通过配置类的方式
:return: app对象
"""
app.config.from_object(config)
app.config.from_envvar("FLASK_PROJECT_CONFIG_FILE", silent=True)
return app
create_flask_app(DevelopmentConfig)
app.register_blueprint(blueprint.user_bp, url_prefix='/user')
# 注册goods蓝图
app.register_blueprint(goods.goods_bp)
效果:
8.2 蓝图的静态资源目录和模板文件目录
类似Flask主应用,蓝图在创建时也可以指定静态资源目录和模板文件目录
# 创建蓝图
user_bp = Blueprint('user', __name__, static_url_path='/user_static', static_folder="user_static",
template_folder="user_templates")