2012-07-09 16 views
6

मैं फ्लास्क के लिए काफी नया हूं, इसके लिए क्या लायक है। मैं अपने कोड को तोड़ने के लिए ब्लूप्रिंट का उपयोग कर रहा हूं और संपत्ति लिंक की सेवा के लिए फ्लास्क-एसेट्स का उपयोग करने की कोशिश कर रहा हूं। किसी कारण से, हालांकि, मुझे ब्लूप्रिंट के भीतर काम करने के लिए फ्लास्क-एसेट्स नहीं मिल सकते हैं।फ्लास्क-एसेट्स का उपयोग कर फ्लास्क में ब्लूप्रिंट-विशिष्ट संपत्तियां?

कोड संरचना:

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

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

और आधार लेआउट उस में यह है:

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

वास्तव में मैं क्या /modules/base/__init__.py में अभी भी काम नहीं करता है, क्योंकि यह "रनटाइम त्रुटि: अनुप्रयोग सह के बाहर काम कर रहा है ntext "। अगर मैं इंडेक्स फ़ंक्शन में संपत्ति कोड ले जाता हूं तो यह काम करता है, लेकिन जब भी मैं संपत्ति जोड़ना चाहता हूं तो उस कोड को दोहराना पड़ता है। क्या ऐसा करने के लिए इससे अच्छा तरीका है? क्या मैं कुछ भूल रहा हूँ?

संपादित करें: 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) 

आधार/__ init__.py: फ्लास्क आयात से ब्लूप्रिंट, render_template, अनुरोध flask.ext.assets आयात पर्यावरण, बंडल फ्लास्क आयात current_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) 

यह चाल यहां ब्लूप्रिंट में संपत्तियां बना रही है, इसे आधार init में आयात कर रही है, और फिर .init_app को कॉल कर रही है। जहां यह टूट जाता है, हालांकि, दो ब्लूप्रिंट होने में ऐसा होता है। आखिरी जिसे हमेशा बुलाया जाता है। शायद इसे कुछ सामान्य मॉड्यूल या कुछ में खींचना संभव होगा ..

+0

मैंने आपकी नई समस्या के समाधान के साथ अपना उत्तर संपादित कर दिया है। – codecool

उत्तर

7

आपको _get_current_object विधि current_app पर कॉल करने की आवश्यकता नहीं है और यही कारण है कि आपको त्रुटि क्यों मिल रही है। current_app वास्तव में ऐप के लिए प्रॉक्सी है। कोड इस तरह होना चाहिए:

app = current_app 
    assets = Environment(app) 

दरअसल, आप चर के रूप में निर्दिष्ट की जरूरत नहीं है। यह करें:

 from flask import current_app as app 

    assets = Environment(app) 

आप RuntimeError हो रही है क्योंकि _get_current_object उपलब्ध है केवल जब एक अनुरोध पर जा रहा है है अन्यथा आप current_app उपयोग करना होगा। जब आपने index दृश्य के अंदर कोड प्रारंभ करने वाली संपत्तियों को स्थानांतरित किया तो यह काम करना शुरू कर दिया क्योंकि यह अब अनुरोध के अंदर था।

_get_current_object का उपयोग फ्लास्क में सिग्नल कार्यक्षमता में आता है और आप इसके बारे में यहां http://flask.pocoo.org/docs/signals/#sending-signals पढ़ सकते हैं।

संपादित करें:

इसका कारण यह है इस बोतल संपत्ति प्रारंभ करने में सही स्थान नहीं है हो रहा है। इसे modules/__init__.py में प्रारंभ किया जाना है जहां ऐप बनाया गया है, जहां जिन्जा पर्यावरण स्थापित किया गया है। याद रखें ब्लूप्रिंट कोड केवल तभी चलाया जाता है जब इसे एक्सेस किया जाता है। सभी वैश्विक प्रारंभिक मॉड्यूल में किया जाना चाहिए जहां आपका ऐप परिभाषित किया गया है, जहां यह कोड मौजूद है:

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

सही। current_object केवल अनुरोध संदर्भ में मौजूद है। – Brent81

+0

कि यह लोड नहीं की समस्या का हल है, लेकिन अब यह एक त्रुटि फेंकता है: 'jinja2.exceptions.TemplateSyntaxError TemplateSyntaxError: आई अज्ञात टैग 'assets'.' मुझे लगता है कि क्योंकि कुप्पी के आस्तियों प्रतिसाद नहीं आपत्ति है' वास्तव में फ्लास्क ऐप ऑब्जेक्ट में संलग्न नहीं हो रहा है। – greggilbert

+0

मैंने मूल init में संपत्तियों को प्रारंभ करने का भी प्रयास किया है, और यह कुछ भी नहीं बदलता है। क्या आप कह रहे हैं, कि ब्लूप्रिंट्स ने अपनी संपत्ति निर्धारित करना संभव नहीं है? – greggilbert

संबंधित मुद्दे