Flask:blueprint

Posted Flask学习笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask:blueprint相关的知识,希望对你有一定的参考价值。

Blueprint

中文翻译蓝图 但是和我们理解的蓝图不一样,它只是blueprint的意译.

使用蓝图的好处就是可以将不同功能主用的视图函数/类视图放在不同的模块中,可以更加方便的开发和维护.Flask可以更加模块化.

以豆瓣为例,它包含了不同的模块:

  • 用户模块

  • 读书模块

  • 电影模块

  • ....等等

可以创建一个类似的结构,并使用Blueprint来实现,文件结构:

  blueprint_mode
 ├── app.py
 ├── blueprint_model
 │   └── user_model.py
 └── templates

blueprint创建流程

  1. 导入Blueprint:from flask import Blueprint

  2. 创建一个蓝图:例如user_db = Blueprint('user', __name__, url_prefix='/user'),第一参数指定蓝图名称,第二个参数与flask中的使用是相同的用于指定静态文件的相对路径,也方便其他三方插件报错时定位问题,第三个参数prefix为这个蓝图指定url前缀,这个前缀会和视图函数/类视图指定的url直接连接起来形成一个有效的url

  3. 视图函数:也是和Flask的使用一样,使用对应的route装饰器即可

  4. 导入蓝图所在的文件夹:from blueprint_model import user_model

  5. 注册蓝图:使用方法app.register_blueprint(user_db)即可

  6. html模板查找规则:如果创建蓝图时,第二个参数使用的是__name__,那么默认的模板文件路径就是项目根目录下的templates文件夹(Flask实例化时的__name__),如果不想使用这个templates文件夹,可以在实例化Blueprint时指定template_folder参数,那么此时模板文件的查找顺序就是先在templates文件夹中查找,查找不到时,就会在蓝图文件同级目下template_folder参数指定的文件夹(Blueprint实例化时的__name__)中查找

  7. 静态文件查找规则:如果创建蓝图时,如果第二个参数使用的是__name__,那么,在使用url_for('staic',f ilename='xxx')时,就只会在项目根目录的static文件夹中查找,如果使用url_for('bluprintName.static', filename='xxx')就会在蓝图创建时static_folder参数指定的文件夹中查找

  8. url_for反转:反转获取蓝图中的url时,必须加上蓝图名称的前缀,即便是就在该蓝图模块中使用url_for,也要加上蓝图的名称,例如url_for('blue_name.viewfunc_name')

实现

创建app.py

 from flask import Flask
 from blueprint_model import user_model
 
 app = Flask(__name__)
 app.config.update({
  'DEBUG':True,
  'TEMPLATES_AUTO_RELOAD':True
 })
 
 @app.route('/')
 def hello_world():
  return 'Hello World!'
 
 # 用户模块
 # 读书模块
 # 电影模块
 
 # 注册蓝图
 app.register_blueprint(user_model.user_db)
 
 if __name__ == '__main__':
  app.run()

创建一个python package 并创建user_mode

 #!/usr/bin/env python
 # encoding: utf-8
 
 # 用户模块
 from flask import Blueprint
 
 # 初始化
 """
 Blueprint(
      name,     定义一个blueprint的名字
      import_name, blueprint package的名字,默认是__name__
      static_folder=None,   指定静态模板文件路径
      static_url_path=None,
      template_folder=None, 指定渲染文件路径
      url_prefix=None,   在访问url前统一添加一个参数
      subdomain=None, 指定子域名
      url_defaults=None,
      root_path=None,
      cli_group=_sentinel,
 )
 """
 user_db = Blueprint('user', __name__, url_prefix='/user')
 
 # 定义路由
 @user_db.route('/profile/')
 def get_profile():
  """http://127.0.0.1:5000/user/profile/"""
  return '个人信息页面'
 
 @user_db.route('/profile/update/')
 def update_profile():
  """http://127.0.0.1:5000/user/profile/update/"""
  return '修改个人信息'

蓝图中设置子域名

 app.config.update({
  'SERVER_NAME':'kningyuan.com:5000'  
 })
 ...
 
 app.run(host='192.168.0.100')
 # sudo vim /etc/hosts
 # 添加
 
 192.168.0.110 kningyuan.com
 192.168.0.110 download.kningyuan.com

app.py

 from flask import Flask
 from blueprint_model import  download_model
 
 app = Flask(__name__)
 app.config.update({
  'DEBUG':True,
  'TEMPLATES_AUTO_RELOAD':True,
  "SERVER_NAME": "kningyuan.com:5000"  # 设置网站主域名
 })
 
 @app.route('/')
 def hello_world():
  return 'Hello World!'
 
 # 注册蓝图
 app.register_blueprint(user_model.user_db)
 app.register_blueprint(download_model.download_db)
 
 if __name__ == '__main__':
  app.run(host='192.168.0.110')

download_model.py

 # download下载 blueprint
 
 from flask import Blueprint
 
 download_db = Blueprint('download', __name__, subdomain='download')
 
 @download_db.route('/')
 def index():
  return 'download index page'
 
 
 @download_db.route('/download/')
 def get_download():
  return 'download page'

浏览器访问,能正确访问到网址.

 http://download.kningyuan.com:5000/
 http://download.kningyuan.com:5000/download/



以上是关于Flask:blueprint的主要内容,如果未能解决你的问题,请参考以下文章

Python进阶(四十九)-初识Flask Blueprint

Flask blueprint

flask+blueprint路由配置

flask BluePrint

Flask Blueprint AttributeError: 'module' object has no attribute 'name' 错误

二十六:视图之蓝图的概念和基本使用