蓝图和子域名

蓝图和子域名

  • 1、蓝图

    • 之前我们写的url和视图函数都是处在同一个文件,如果项目比较大的话,这显然不是一个合理的结构,而蓝图可以优雅的帮我们实现这种需求。
      from flask import Blueprint
      bp = Blueprint('user',__name__,url_prefix='/user/')
      @bp.route('/')
      def index():
          return "用户首页"
      @bp.route('profile/')
      def profile():
          return "个人简介"
      
    • 然后我们在主程序中,通过app.register_blueprint()方法将这个蓝图注册进url映射中,看下主app的实现
      from flask import Flask
      import user
      app = Flask(__name__)
      app.register_blueprint(user.bp)
      if __name__ == '__main__':
          app.run(host='0.0.0.0',port=9000)
      
    • 以后访问/user/,/user/profile/,都是执行的user.py文件中的视图函数,这样就实现了项目的模块化。

    以上是对蓝图的一个简单介绍,但是使用蓝图还有几个需要注意的地方,就是在蓝图如何寻找静态文件、模板文件,url_for函数如何反转url

  • 2、寻找静态文件

    • 默认不设置任何静态文件路径,Jinja2会在项目的static文件夹中寻找静态文件。也可以设置其他的路径,在初始化蓝图的时候,Blueprint这个构造函数,有一个参数static_folder可以指定静态文件的路径
      bp = Blueprint('admin',__name__,url_prefix='/admin',static_folder='static')
      
    • static_folder可以是相对路径(相对蓝图文件所在的目录),也可以是绝对路径。在配置完蓝图后,还有一个需要注意的地方是如何在模板中引用静态文件。在模板中引用蓝图,应该要使用蓝图名+.+static来引用
      <link href="{{ url_for('admin.static',filename='about.css') }}">
      
  • 3、寻找模板文件

    • 跟静态文件一样,默认不设置任何模板文件的路径,将会在项目的templates中寻找模板文件。也可以设置其他的路径,在构造函数Blueprint中有一个template_folder参数可以设置模板的路径
      bp = Blueprint('admin',__name__,url_prefix='/admin',template_folder='templates')
      
    • 模板文件和静态文件有点区别,以上代码写完以后,如果你渲染一个模板return render_template(‘admin.html’),Flask默认会去项目根目录下的templates文件夹中查找admin.html文件,如果找到了就直接返回,如果没有找到,才会去蓝图文件所在的目录下的templates文件夹中寻找。
  • 4、url_for生成url

    • 用url_for生成蓝图的url,使用的格式是:蓝图名称+.+视图函数名称。比如要获取admin这个蓝图下的index视图函数的url
      url_for('admin.index')
      
    • 其中这个蓝图名称是在创建蓝图的时候,传入的第一个参数。
      bp = Blueprint('admin',__name__,url_prefix='/admin',template_folder='templates')
      
  • 5、子域名

    • 子域名在许多网站中都用到了,比如一个网站叫做xxx.com,那么我们可以定义一个子域名cms.xxx.com来作为cms管理系统的网址,子域名的实现一般也是通过蓝图来实现,在之前章节中,我们创建蓝图的时候添加了一个url_prefix=/user作为url前缀,那样我们就可以通过/user/来访问user下的url。但使用子域名则不需要。另外,还需要配置SERVER_NAME,
      比如app.config[SERVER_NAME]=‘example.com:9000’。并且在注册蓝图的时候,还需要添加一个subdomain的参数,这个参数就是子域名的名称

      from flask import Blueprint
      bp = Blueprint('admin',__name__,subdomain='admin')
      @bp.route('/')
      def admin():
          return 'Admin Page'
      
    • 这个没有多大区别,接下来看主app的实现

      from flask import Flask
      import admin
      # 配置`SERVER_NAME`
      app.config['SERVER_NAME'] = 'example.com:8000'
      # 注册蓝图,指定了subdomain
      app.register_blueprint(admin.bp)
      if __name__ == '__main__':
          app.run(host='0.0.0.0',port=8000,debug=True)
      
    • 写完以上两个文件后,还是不能正常的访问admin.example.com:8000这个子域名,因为我们没有在host文件中添加域名解析,你可以在最后添加一行127.0.0.1 admin.example.com,就可以访问到了。另外,子域名不能在127.0.0.1上出现,也不能在localhost上出现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值