📋 个人简介
- 💖 作者简介:大家好,我是阿牛。😜
- 📝 博主的个人网站:阿牛的博客小屋🔥
前言
这节我会介绍一下flask中的路由与蓝图,刚开始学其实大家不必着急,打好基础就行,python这门语言本身就比较简单,尤其对于学过django的同学来说,学习flask简直小菜一碟,完全可以用flask自己搭建一个像django那样的目录,使项目结构比较清晰。后期我也会专门出一个关于flask的小项目,帮助大家快速熟悉flask的项目结构以及使用,总之就一句话,使劲卷就完事了!!!
flask查询路由信息
flask不同于django,他的路由信息在装饰器中,而django则有专门的urls.py文件来放路由信息,那么下面我来说一说flask如何常看全部的路由信息。
命令行方式
flask routes
但是要注意,你要运行这个命令,你的主文件名如果不是app.py,那么你要设置FLASK_APP这个环境变量,windows下比较麻烦,手动搞一个全局环境变量吧,我试了set命令设置临时局部环境变量,总是设置不成功,各位如果感兴趣的话可以自己尝试一下,而你不用担心这个问题,我们一般用的是linux系统。下面是我手动添加的全局环境变量。
在程序中获取
在应用中url_map属性中保存着整个Flask应用的路由映射信息,可以通过读取这个属性获取路由信息
print(app.url_map)
如果想在程序中遍历路由信息,可以采用如下方式:
for rule in app.url_map.iter_rules():
print('name={} path={}'.format(rule.endpoint,rule.rule))
路由-在flask中指定请求方式
在Flask中,定义路由其默认的请求方式为:
GET
OPTIONS(自带)
HEAD(自带)
利用methods参数可以自己指定一个接口的请求方式
@app.route('/index1',methods=["POST"])
def index_1():
return "你好呀!"
#GET或者POST都行
@app.route('index2',methods=["GET","POST"])
def index_2():
return "我很好!"
不写的情况下,默认为GET
蓝图
在 Flask 中,使用蓝图 Blueprint 来分模块组织管理。
蓝图实际可以理解为是一个存储一组视图方法的容器对象,其具有如下特点:
- 一个应用可以具有多个 Blueprint 。
- 可以将一个 Blueprint 注册到任何一个未使用的 URL 下比如"/user"、"/ goods "。
- Blueprint 可以单独具有自己的模板、静态文件或者其它的通用操作方法,它并不是必须要实现应用的视图和函数的。
- 在一个应用初始化时,就应该要注册需要使用的 Blueprint 。
但是一个 Blueprint 并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中。
基本使用方式
使用蓝图可以分为三个步骤:
#1.创建一个蓝图对像
user_Bp = Blueprint('user',__name__)
#2.在这个蓝图对象上进行操作,注册路由,指定静态文件夹,注册模板过滤器
@user_Bp.route('/')
def user():
return "原来你还在哇!"
#3.在应用对象上注册这个蓝图对象
app.register_blueprint(user_Bp)
单文件蓝图
可以将创建蓝图对象与定义视图放到同一个文件中。
如下所示:
#导入Flask类和蓝图
from flask import Flask,Blueprint
# 从配置对象中加载的默认配置
class DefaultConfig(object):
SECERT_KEY = 'jstwn63bng'
# 创建Flask项目的工厂函数
def create_flask_app(config):
app = Flask(__name__)
app.config.from_object(config)
#从环境变量指向的配置文件中读取的配置信息会覆盖掉从配置对象中加载的同名参数
app.config.from_envvar("KEY")
return app
# 创建项目
app = create_flask_app(DefaultConfig)
#1.创建一个蓝图对像
user_Bp = Blueprint('user',__name__)
#2.在这个蓝图对象上进行操作,注册路由,指定静态文件夹,注册模板过滤器
@user_Bp.route('/')
def user():
return "原来你还在哇!"
#3.在应用对象上注册这个蓝图对象
app.register_blueprint(user_Bp)
# Flask应用程序的run方法启动web服务器
if __name__ == '__main__':
app.run(host='0.0.0.0',port=8000,debug=True)
将其打包成多文件的蓝图
flask不像我们的的django,如果需要像djano那样清晰的目录结构,需要我们自己封装蓝图,至于我们为什么要如此麻烦的封装呢!是因为我们像django这样封装,会使得代码模块化,便于复用,后续有其他的项目需要这一块或者与这一块相似,我们完全可以把这一块拿出来复用,增加代码开发效率。
下面是一个结构比较清晰地flask的项目结构,大家可以看一看:
------project #工程目录
|-----main. py #启动文件
|-----user #用户蓝图
| |----\_init_ py #此处创建蓝图对象
| |----passport.py
| |----profile.py
| |----...
|----goods 商品蓝图
| |----\_init_ py
| |----...
...
示例:
主文件helloworld.py
#导入Flask类
from flask import Flask
# 从配置对象中加载的默认配置
class DefaultConfig(object):
SECERT_KEY = 'jstwn63bng'
# 创建Flask项目的工厂函数
def create_flask_app(config):
app = Flask(__name__)
app.config.from_object(config)
#从环境变量指向的配置文件中读取的配置信息会覆盖掉从配置对象中加载的同名参数
app.config.from_envvar("KEY")
return app
# 创建项目
app = create_flask_app(DefaultConfig)
#从user包中导入蓝图对象
from user import user_Bp
#注册蓝图对象
app.register_blueprint(user_Bp)
# Flask应用程序的run方法启动web服务器
if __name__ == '__main__':
app.run(host='0.0.0.0',port=8000,debug=True)
user包下的初始化文件\_init_ .py
from flask import Blueprint
#创建蓝图对象
user_Bp = Blueprint('user',__name__)
#在初始化user包时,要记得导入视图文件
from . import view
user包下的视图文件view.py
from . import user_Bp
@user_Bp.route('/')
def index():
return '我在呢'
目录结构:
可以用新版flask的运行方式,在当前项目的终端输入指令flask run运行项目(flask项目运行的方式有很多,你喜欢哪一种就用哪一种)
蓝图扩展
扩展用法
1.指定蓝图的 url 前缀
在应用中注册蓝图时使用 url _ prefix 参数指定
app.register_ blueprint (user _ bp,url_prefix ='/user')
app.register blueprint (goods bp,url_prefix ='/goods')
如果你的蓝图里的所有视图函数都有一部分相同的url参数,则可以用这个前缀,省去在注册路由时对每个视图函数重复加相同参数的路劲
2.蓝图内部静态文件
和应用对象不同,蓝图对象创建时不会默认注册静态目录的路由。需要我们在创建时指定 static _ folder 参数
下面的示例将蓝图所在目录下的 static _ admin 目录设置为静态目录
admin = Btueprint ("admin",\__name__,,static _folder ='static_admin')
现在就可以使用/admin/static admin/访间 static admin 目录下的静态文件了。
也可通过 statie_url_path 改变访问路径
admin = Blueprint ("admin",\__name__,static _folder ='static_admin',statie_url_path ='lib')
3.蓝图内部模板目录
蓝图对象默认的模板目录为系统的模版目录。可以在创建蓝图对象时使用 template_folder 关键字参数设置模板目录
admin = Blueprint ("admin",\__name__,template_folder ="my_templates")
注:扩展2和扩展3博主这里不推荐,我更喜欢像django一样,在全局静态资源文件夹和模板文件夹中创建每个模块对应的资源文件目录,这样我觉的目录结构更清晰,当然,怎样搞都可以,你喜欢怎样的自己搞就是了,这就是flask的灵活。
结语
如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。