2011-04-25 11 views
5

आइए कहें कि मेरे पास मेरे फ्लास्क ऐप का एक हिस्सा है जिसे मैं कई अलग-अलग परियोजनाओं में खींचना और उपयोग करना चाहता हूं। इसमें फ्लास्क-स्क्लाक्लेमी, साथ ही विचार और टेम्पलेट्स का उपयोग करके स्क्लेक्लेमी मॉडल हैं। मैं मॉड्यूल का उपयोग करके app.route सजावटी प्राप्त कर सकता हूं, लेकिन मैं SQLAlchemy डीबी ऑब्जेक्ट को कैसे संभाल सकता हूं?आप फ्लास्क-स्क्लाक्लेमी के साथ पुनः उपयोग करने योग्य घटक कैसे बनाते हैं?

चूंकि मेरे घटक को अलग होने की आवश्यकता है, इसलिए मैं केवल डीबी ऑब्जेक्ट आयात नहीं कर सकता। लेकिन मुझे नहीं लगता कि मुझे दो बार डीबी ऑब्जेक्ट बनाना चाहिए। मैं अपने मेटाडेटा को बाकी परियोजना में मेटाडेटा के साथ कैसे मिला सकता हूं?

उत्तर

3

सबसे पहले आपको metadata साझा करना होगा और फिर से उपयोग करने योग्य ऐप के लिए फ्लास्क-स्क्लेल्चेमी डीबी.मोडेल का उपयोग न करें।

दूसरी बार आपको सिग्नल, शॉर्ट-कट और अन्य सामानों का समर्थन करने के लिए फ्लास्क-स्क्लेल्चेमी से नए अड्डों को विस्तारित करने के साथ सभी वर्गों को फिर से बनाना होगा। (गाड़ी यह हो सकता है)

ठिकानों एकीकृत:

def integrate_models(cls, nbase): 
     new_bases = list(cls.__bases__) + [nbase] 
     new_dict = dict(cls.__dict__) 
     new_dict.update(dict(nbase.__dict__)) 
     return type.__new__(cls.__class__, cls.__name__, tuple(new_bases), new_dict) 
SQLAlchemy विस्तार के साथ

उदाहरण बोतल एप्लिकेशन:

# -*- coding: utf-8 -*- 
from flask import Flask 
from flaskext.sqlalchemy import SQLAlchemy 

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' 
db = SQLAlchemy(app) 

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 
    email = db.Column(db.String(120), unique=True) 

    def __init__(self, username, email): 
     self.username = username 
     self.email = email 

    def __repr__(self): 
     return '<User %r>' % self.username 

if __name__ == '__main__': 
     from some_model_base import init_metadata 
     init_metadata(db.Model.metadata) 

     from some_model import SomeClass 

     SomeClass = integrate_models(SomeClass, db.Model) 

     db.create_all() 

     print SomeClass.query.all() 

कहाँ some_model_base.py:

from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 

def init_metadata(metadata): 
    Base.metadata = metadata 

और some_model.py :

from sqlalchemy import Column, Integer, String 
from some_model_base import Base 

class SomeClass(Base): 
    __tablename__ = 'some_table' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(50)) 

इस उदाहरण में केवल db.create_all और SomeClass.query शॉर्टकट का परीक्षण किया गया।

मेरी खराब अंग्रेजी के लिए खेद है।

+0

एचएम, मुझे इसे आजमाने की आवश्यकता होगी। क्या आप मुख्य कार्यक्रम में मॉडल के साथ संबंध बनाने के लिए मॉड्यूल को अन्य मॉड्यूल में कॉन्फ़िगर करने का कोई तरीका ढूंढ सकते हैं? –

+0

मुझे लगता है कि सबसे अच्छा तरीका यह है कि - अपने पुन: प्रयोज्य ऐप बेस क्लासेस या मिक्सइन्स में घोषित करें और फिर उनको सब्सक्राइब करने वाले ठोस मॉडल बनाएं। – estin

1

आपको flask.current_app का उपयोग करना चाहिए, यह वर्तमान एप्लिकेशन तक पहुंचने के लिए एक प्रॉक्सी ऑब्जेक्ट है, और यह कुछ एक्सटेंशन में उपयोग किया जाता है। तो, अपने कोड कुछ इस तरह दिखेगा:

from flask import current_app 
from flaskext.sqlalchemy import SQLAlchemy 

db = SQLAlchemy(current_app) 

और फिर अपने db वस्तु का उपयोग के रूप में आप आमतौर पर करना होगा। लेकिन मुझे यकीन नहीं है कि अगर उपयोगकर्ता आपके मॉड्यूल का उपयोग करता है और flaskext.sqlalchemy का उपयोग करने की भी आवश्यकता है, तो यह संघर्ष करेगा, मैं यह सुनिश्चित करने के लिए सुझाव दूंगा कि आपका मॉड्यूल किसी भी flask एप्लिकेशन के साथ 100% संगत होगा ।

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