2012-07-09 27 views
6

Tôi khá mới với Flask, cho những gì nó có giá trị. Tôi đang sử dụng bản thiết kế để chia nhỏ mã của mình và đang cố sử dụng Flask-Assets để phân phát các liên kết nội dung. Vì một lý do nào đó, tôi không thể lấy Flask-Assets để làm việc trong kế hoạch chi tiết.Tài sản chi tiết cụ thể trong Flask sử dụng Flask-Assets?

cấu trúc Mã số:

/modules 
    /base 
     __init__.py 
    __init__.py 
/static 
    # ... stuff 
/templates 
    /layout.html 

Trong /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') 

Và cách bố trí cơ sở có này trong đó:

{% assets "css_all" %} 
    <link rel="stylesheet" href="{{ ASSET_URL }}" /> 
{% endassets %} 
{% assets "js_all" %} 
    <script type="text/javascript" src="{{ ASSET_URL }}"></script> 
{% endassets %} 

Trên thực tế những gì tôi có trong /modules/base/__init__.py ngay bây giờ thậm chí không hoạt động, vì nó ném "RuntimeError: làm việc bên ngoài ứng dụng co ntext ". Nếu tôi di chuyển mã tài sản vào hàm chỉ mục nó hoạt động, nhưng có vẻ lạ khi phải lặp lại mã đó mỗi lần tôi muốn thêm nội dung. Có cách nào tốt hơn để làm điều này? Tui bỏ lỡ điều gì vậy?

Edit: /modules/base/__init__.py cập nhật mỗi comment codecool, nhưng bây giờ nó ném một "TemplateSyntaxError: Gặp thẻ vô danh 'tài sản'" lỗi. Tôi nghĩ rằng điều này là bởi vì các đối tượng tài sản không nhận được thông qua thông qua các ứng dụng.

Chỉnh sửa 2: Vì vậy, tham gia một số lời khuyên từ cách SQLAlchemy làm điều gì đó, tôi nhận này để sắp xếp công việc như sau:

Trong __init__.py chính của tôi:

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) 

Trong cơ sở/__ init__.py: từ nhập khẩu bình đồ Blueprint, render_template, yêu cầu từ flask.ext.assets nhập khẩu Môi trường, Gói từ bình nhập current_app làm ứng dụng

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) 

Bí quyết ở đây là tạo nội dung trong kế hoạch chi tiết, nhập nó vào init cơ sở, sau đó gọi .init_app tại đó. Tuy nhiên, trong trường hợp này, có hai bản thiết kế thực hiện điều này. Người cuối cùng được gọi là luôn thắng. Có lẽ nó sẽ có thể để kéo này ra vào một số mô-đun phổ biến hoặc một cái gì đó ..

+0

Tôi đã chỉnh sửa câu trả lời của mình với giải pháp cho vấn đề mới của bạn. – codecool

Trả lời

7

Bạn không cần phải gọi _get_current_object phương pháp trên current_app và đó là lý do tại sao bạn nhận được lỗi. current_app thực sự là proxy cho ứng dụng. Mã phải như sau:

app = current_app 
    assets = Environment(app) 

Infact, bạn không cần phải gán nó làm biến. Làm điều này:

 from flask import current_app as app 

    assets = Environment(app) 

Bạn đang nhận được RuntimeError vì _get_current_object chỉ có sẵn khi yêu cầu đang xảy ra nếu không bạn phải sử dụng current_app. Khi bạn di chuyển nội dung khởi tạo mã bên trong chế độ xem index thì nó bắt đầu hoạt động như bây giờ bên trong một yêu cầu.

_get_current_object việc sử dụng có chức năng Tín hiệu trong Flask và bạn có thể đọc về nó tại đây http://flask.pocoo.org/docs/signals/#sending-signals.

Chỉnh sửa:

Điều này xảy ra vì đây không phải là nơi thích hợp để khởi tạo nội dung Flask. Nó phải được khởi tạo trong modules/__init__.py nơi môi trường jinja được thiết lập khi ứng dụng được tạo. Hãy nhớ rằng mã bản thiết kế chỉ chạy khi nó được truy cập. Tất cả việc khởi tạo toàn cầu phải được thực hiện trong mô-đun nơi ứng dụng của bạn được xác định tức là nơi mã này hiện diện:

app = Flask(__name__) 
    assets = Environment(app) 
+0

. current_object chỉ tồn tại trong ngữ cảnh yêu cầu. – Brent81

+0

Đó giải quyết vấn đề của nó không tải, nhưng bây giờ nó ném một lỗi: 'jinja2.exceptions.TemplateSyntaxError TemplateSyntaxError: Gặp thẻ vô danh 'assets'.' Tôi nghĩ đó là bởi vì Flask-Tài sản phản đối isn' t thực sự được nối vào đối tượng ứng dụng Flask. – greggilbert

+0

Tôi đã cố gắng khởi tạo tài sản trong init cơ sở là tốt, và điều đó không thay đổi bất cứ điều gì. Bạn đang nói, sau đó, rằng nó không thể có kế hoạch chi tiết thiết lập tài sản riêng của họ? – greggilbert

Các vấn đề liên quan