zoukankan      html  css  js  c++  java
  • Flask

     蓝图:

    之前我们写的 url 和视图函数都是在同一个文件,如果项目比较大的话,这显然不是一个合理的结构,而蓝图可以优雅的帮我们实现这个需求。例如:

    from flask import Blueprint
    
    bp = Blueprint('user', __name__, url_prefix='/user/')
    
    @bp.route('/')
    def index():
        return u"用户首页"
    
    @bp.route('/profile/'):
    def profile():
        return u"个人简介"

    然后我们在主程序中,通过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=5000)

    以后访问/user/,/user/profile/,都是执行user.py文件中的视图函数,这样就实现了项目的模块化。

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

    寻找静态文件:

    默认不设置如何静态文件路径,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')}">

    寻找模板文件:

    跟静态文件一样,默认不设置任何模板文件的路径,将会在项目的templates中寻找模板文件。也可以设置其他的路径,在构造函数Blueprint中有一个template_folder参数可以设置模板路径,如:

    bp = Blueprint('admin', __name__, url_prefix='/admin', template_folder='templates')

    模板文件和静态文件有点区别,以上代码写完以后,如果你渲染一个模板 return render_template('admin.html') , Flask 默认会去项目根目录下的templates文件夹中查找admin.html文件,如果没有找到,才会去蓝图文件所在的目录下的templates文件夹中寻找:

    url_for 生成 url

    用url_for生成蓝图的url,使用的格式是:蓝图名称+ . +视图函数名称。比如要获取 admin 这个蓝图下的 index 视图函数的 url ,应该采用以下方式:

    url_for('admin.index')

    其中这个蓝图名称是在创建蓝图的时候,传入的第一个参数。bp = Blueprint('admin', __name__, url_prefix='/admin', template_folder='templates')

    子域名:

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

    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:5000'
    
    # 注册蓝图,指定了subdomain
    app.register_blueprint(admin.bp)
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000, debug=True)

    修改本地的host文件

    访问example.com:5000就可以访问了

  • 相关阅读:
    [转发]深入理解git,从研究git目录开始
    iOS系统网络抓包方法
    charles抓包工具
    iOS多线程中performSelector: 和dispatch_time的不同
    IOS Core Animation Advanced Techniques的学习笔记(五)
    IOS Core Animation Advanced Techniques的学习笔记(四)
    IOS Core Animation Advanced Techniques的学习笔记(三)
    IOS Core Animation Advanced Techniques的学习笔记(二)
    IOS Core Animation Advanced Techniques的学习笔记(一)
    VirtualBox复制CentOS后提示Device eth0 does not seem to be present的解决方法
  • 原文地址:https://www.cnblogs.com/xushuhai/p/9110792.html
Copyright © 2011-2022 走看看