2015-12-15 7 views
6

मैं Flask-Migrate उपयोग करना चाहते हैं और उनके उदाहरण से देख रहा हूँ:मैं डीबी ऑब्जेक्ट को पास किए बिना app.py के बाहर फ्लास्क मॉडलों को कैसे विभाजित करूं?

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 
from flask.ext.script import Manager 
from flask.ext.migrate import Migrate, MigrateCommand 

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

db = SQLAlchemy(app) 
migrate = Migrate(app, db) 

manager = Manager(app) 
manager.add_command('db', MigrateCommand) 

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(128)) 

if __name__ == '__main__': 
    manager.run() 

यह एक सरल खेलने उदाहरण के रूप में अच्छा काम करता है, लेकिन मैं एक मॉडल की तुलना में अधिक है और मैं मॉडल को परिभाषित नहीं करना चाहते इस स्क्रिप्ट और एक में जो मेरे आवेदन कोड को परिभाषित करता है। इस प्रकार, मैं उन्हें एक मॉडल फ़ाइल में खींचना चाहता हूं जिसे मैं दोनों के बीच साझा कर सकता हूं।

मैं User कक्षा को models.py में रखकर और फिर वहां से उपयोगकर्ता को आयात करके ऐसा करने का प्रयास कर रहा हूं। दुर्भाग्य से, यह NameError: name 'db' is not defined फेंकता है।

मेरा प्रश्न (ओं) हैं:

  • मैं अपने models.py में db = SQLAlchemy(app) का प्रयोग करना होगा, और यदि हां यह दोनों मेरे प्रवास स्क्रिप्ट और कुप्पी आवेदन अपने आप में उपलब्ध हो जाएगा?
  • यदि मैं इसे models.py में नहीं डाल सकता (या नहीं), तो मैं अपने मॉडल को db पारित किए बिना अपनी फ़ाइल में कैसे उपयोग करूं?
+0

इसे देखें https://realpython.com/blog/python/python-web-applications-with-flask-part-ii/ – PetarP

उत्तर

10

मॉड्यूल में इस तरह का एक छोटा सा एप्लीकेशन विभाजन करना मुश्किल है, क्योंकि आपको बहुत से मामले मिलते हैं जहां आपके द्वारा बनाए गए दो मॉड्यूल को एक-दूसरे पर पारस्परिक रूप से आयात करने की आवश्यकता होती है, जिससे परिपत्र निर्भरताएं बनती हैं।

मैं अनुशंसा करता हूं कि आप एक ऐप फ़ैक्टरी फ़ंक्शन का उपयोग करके और बड़े एक्सटेंशन को प्रारंभ करने में देरी से एक बड़े एप्लिकेशन को कैसे व्यवस्थित कर सकते हैं। एक उदाहरण एप्लिकेशन जो यह करता है Flasky ऐप मेरी पुस्तक में दिखाया गया है।

सभी ने कहा कि, आवेदन को दो हिस्सों में अलग करना संभव है, आपको केवल आयात विवरण कहां से सावधान रहना होगा। नीचे दिए गए उदाहरण में, मैंने db इंस्टेंस और User मॉडल को model.py फ़ाइल में बनाने के लिए स्थानांतरित करने का निर्णय लिया।

from flask import Flask 
from flask.ext.script import Manager 
from flask.ext.migrate import Migrate, MigrateCommand 

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

from models import db # <-- this needs to be placed after app is created 
migrate = Migrate(app, db) 

manager = Manager(app) 
manager.add_command('db', MigrateCommand) 

if __name__ == '__main__': 
    manager.run() 

और यहाँ मॉडल है:

यहां मुख्य आवेदन के मॉड्यूल है।py:

from __main__ import app 
from flask.ext.sqlalchemy import SQLAlchemy 

db = SQLAlchemy(app) 

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(128)) 

यहां मुख्य मॉड्यूल app पैदा करेगा, और उसके बाद ही models.py आयात करेगा। जब model.py मुख्य मॉड्यूल से app आयात करने का प्रयास करता है, तो यह पहले से ही बनाया जा चुका है। यदि आप अन्य आयात के साथ फ़ाइल के शीर्ष पर from models import db स्थानांतरित करते हैं तो यह कोड टूट जाता है।

+1

में 'ऐप' और' डीबी' दोनों जोड़ सकते हैं। मैं आपका उदाहरण समझता हूं लेकिन यदि मैं चाहता हूं कि क्या mod.py को अलग-अलग .pys में विभाजित करना है? उदाहरण के लिए User.py, Foo.py, Bar.py। मैं ऐसा करने के लिए एक रास्ता खोजने के लिए संघर्ष कर रहा हूँ। –

+1

@VitorHugo आप 'मॉडल' पैकेज बना सकते हैं, पैकेज की '__init __। Py' फ़ाइल में' db' उदाहरण बना सकते हैं, फिर प्रति मॉडल एक मॉड्यूल जोड़ें, इन सभी मॉड्यूल को 'db' instance' से आयात करने के साथ। आयात डीबी'। – Miguel

+0

यह काम करता है लेकिन जब मैं 'मॉडलों से आयात डीबी' के बाद मुख्य अनुप्रयोग मॉड्यूल पर db.create_all() करता हूं तो यह टेबल नहीं बनाता है जो तब होता है जब मैं models.py करता हूं। क्या यह एक अलग चीज़ होनी चाहिए या मुझे इसके बारे में चिंता करनी चाहिए? –

0

यहां एक विचार है। आप एक पैकेज model बना सकते हैं जिसमें आप कक्षाओं को व्यक्तिगत .py फ़ाइलों के रूप में परिभाषित करते हैं। उदाहरण के लिए, user.py में User कक्षा शामिल है।

__init__.py फ़ाइल में आप db चर परिभाषित कर सकते हैं। आप from user import User कथन भी शामिल कर सकते हैं ताकि पैकेज के बाहर सीधे User ऑब्जेक्ट तक पहुंच हो सके। उदाहरण के लिए आप import model का उपयोग कर प्रोग्राम में कहीं और model पैकेज आयात कर सकते हैं और फिर User कक्षा का सीधे उपयोग करने के लिए model.User का उपयोग कर सकते हैं।

user.py उपयोग from ..model import db जो db चर __init__.py फाइल में परिभाषित आयात में सीधे db चर का उपयोग करने के लिए।

+0

क्या इसका मतलब यह नहीं है कि मुझे 'ऐप' पास करने की आवश्यकता है (' डीबी = SQLAlchemy (ऐप) ')' डीबी' के बजाय चारों ओर? – NewGuy

+0

ठीक है, उस स्थिति में आप '__init __। Py' – aliasm2k

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

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