我对Flask很新,因为它的价值.我正在使用蓝图来分解我的代码,并尝试使用Flask-Assets来提供资产链接.但是出于某种原因,我无法让Flask-Assets在蓝图中工作.
代码结构:
/modules
/base
__init__.py
__init__.py
/static
# ... stuff
/templates
/layout.html
Run Code Online (Sandbox Code Playgroud)
在/modules/base/__init__.py中:
from flask import Blueprint, render_template, request
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.assets import Environment, Bundle
from flask import current_app as app
default = Blueprint('base', __name__)
assets = Environment(app)
css = Bundle('css/bootstrap.min.css')
assets.register('css_all', css)
js = Bundle('js/jquery-1.7.2.min.js', 'js/bootstrap.min.js')
assets.register('js_all', js)
@default.route('/')
def index():
return render_template('index/index.html')
Run Code Online (Sandbox Code Playgroud)
基础布局中有这个:
{% assets "css_all" %}
<link rel="stylesheet" href="{{ ASSET_URL }}" />
{% endassets %}
{% assets "js_all" %}
<script type="text/javascript" src="{{ ASSET_URL }}"></script>
{% endassets %}
Run Code Online (Sandbox Code Playgroud)
实际上我现在在/modules/base/__init__.py中所拥有的内容甚至不起作用,因为它抛出"RuntimeError:在应用程序上下文之外工作".如果我将资产代码移动到索引函数中它确实有效,但每次我想添加资产时都必须重复该代码似乎很奇怪.有一个更好的方法吗?我错过了什么吗?
编辑:根据codecool的评论更新/modules/base/__init__.py,但现在它抛出"TemplateSyntaxError:遇到未知标记'资产'"错误.我认为这是因为资产对象没有传递给应用程序.
编辑2:所以从SQLAlchemy的工作方式中获取一些建议,我得到了以下工作:
在我的主__init__.py中:
from flask import Flask
from modules.base import default, assets as base_assets
from flask.ext.assets import Environment, Bundle
app = Flask(__name__)
app.register_blueprint(default)
base_assets.init_app(app)
Run Code Online (Sandbox Code Playgroud)
在base/__ init__.py中:来自flask导入Blueprint,render_template,来自于flask.ext.assets的请求导入环境,从flask导入current_app作为app
default = Blueprint('base', __name__)
assets = Environment(app)
css = Bundle('css/bootstrap2.min.css')
assets.register('css_all', css)
js = Bundle('js/jquery-1.7.2.min.js', 'js/bootstrap.min.js')
assets.register('js_all', js)
Run Code Online (Sandbox Code Playgroud)
这里的技巧是在蓝图中创建资产,将其导入基本init,然后在那里调用.init_app.然而,在这种情况下,有两个蓝图就是这样做的.最后一个被称为总是胜出.也许有可能把它拉成一些常见的模块或什么东西..
你不需要调用_get_current_object方法current_app,这就是你得到错误的原因.current_app实际上是应用程序的代理.代码应该是这样的:
app = current_app
assets = Environment(app)
Run Code Online (Sandbox Code Playgroud)
事实上,您不需要将其指定为变量.做这个:
from flask import current_app as app
assets = Environment(app)
Run Code Online (Sandbox Code Playgroud)
您将获得RuntimeError,因为_get_current_object只有在请求发生时才可用,否则您必须使用current_app.当您移动资源初始化index视图中的代码时,它开始工作,因为它现在在请求中.
_get_current_object用法来自Flask中的Signals功能,你可以在这里阅读http://flask.pocoo.org/docs/signals/#sending-signals.
编辑:
发生这种情况是因为这不是初始化Flask资产的正确位置.必须在modules/__init__.py创建应用程序时设置jinja环境的位置进行初始化.记住蓝图代码仅在访问时运行.所有全局初始化都应该在定义应用程序的模块中完成,即存在此代码的位置:
app = Flask(__name__)
assets = Environment(app)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3951 次 |
| 最近记录: |