Flask(二) 路由及蓝图

168 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 蓝图的创建

蓝图的创建分为三步:

  1. 创建蓝图
  2. 定义视图
  3. 在主模块中注册蓝图

其中蓝图还分为单文件蓝图和目录蓝图,有一点区别

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 目录蓝图

相比于单文件蓝图来说,目录蓝图主要有两点不一致

  1. 需要在目录下__init__.py 下进行蓝图的创建
  2. 创建蓝图后需要在__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")