Flask - 蓝图和子域名

Posted 木叶苍蓝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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就可以访问了

以上是关于Flask - 蓝图和子域名的主要内容,如果未能解决你的问题,请参考以下文章

Flask---蓝图

12Flask实战第12天:子域名

Flask框架详细上下文管理机制

二十八:视图之主域名和子域名的实现

网站后端_Python+Flask.0012.FLASK域名相关之域名与动态子域名实现?

Flask--蓝图