कई फाइलों में स्प्लिट पायथन फ्लास्क ऐप


88

मुझे यह समझने में परेशानी हो रही है कि एक फ्लास्क ऐप को कई फाइलों में कैसे विभाजित किया जाए।

मैं एक वेब सेवा बना रहा हूं और मैं एपीआई को अलग-अलग फाइलों में विभाजित करना चाहता हूं (खाताएपीआईडीपीओ, अपलोडएपीआईएमडीओ, ...), इसलिए मेरे पास एक विशाल अजगर फाइल नहीं है।

मैंने पढ़ा है कि आप ब्लूप्रिंट के साथ ऐसा कर सकते हैं, लेकिन मुझे पूरी तरह से यकीन नहीं है कि मार्ग मेरे लिए सही है।

अंतत: मैं एक मेन पाइथन फाइल चलाना चाहता हूं और दूसरी फाइलें शामिल करता हूं ताकि जब यह चले तो उन्हें एक बड़ी फाइल माना जाए।

उदाहरण के लिए, यदि मेरे पास Main.py और AccountAPI.py है तो मैं ऐसा करने में सक्षम होना चाहता हूं:

Main.py:

from flask import Flask
import AccountAPI

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

AccountAPI.py:

@app.route("/account")
def accountList():
    return "list of accounts"

मैं इस उदाहरण से जानता हूं कि यह स्पष्ट रूप से काम नहीं करेगा, लेकिन क्या ऐसा कुछ करना संभव है?

धन्यवाद

जवाबों:


158

हां, ब्लूप्रिंट इसे करने का सही तरीका है। आप जो करने की कोशिश कर रहे हैं वह इस तरह से प्राप्त किया जा सकता है:

Main.py

from flask import Flask
from AccountAPI import account_api

app = Flask(__name__)

app.register_blueprint(account_api)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

AccountAPI.py

from flask import Blueprint

account_api = Blueprint('account_api', __name__)

@account_api.route("/account")
def accountList():
    return "list of accounts"

यदि यह एक विकल्प है, तो आप उन्हें अलग से साफ करने के लिए अलग-अलग एपीआई / ब्लूप्रिंट के लिए अलग-अलग URL उपसर्गों का उपयोग करने पर विचार कर सकते हैं। यह उपरोक्त register_blueprintकॉल के लिए एक मामूली संशोधन के साथ किया जा सकता है :

app.register_blueprint(account_api, url_prefix='/accounts')

आगे के दस्तावेज़ीकरण के लिए, आप आधिकारिक डॉक्स पर भी नज़र डाल सकते हैं ।


यह मेरे लिए पूरी तरह से काम धन्यवाद! मुझे लगता है कि मुझे ब्लूप्रिंट डॉक्स को अधिक सावधानी से पढ़ना चाहिए था।
user1751547

अरे, मेरे पास एक प्रश्न है। उपरोक्त कोड में, क्या खाता () / डोमेन / खातों / खाते से मेल खाता है?
जेरोफ

4
क्या Main.py और AccountAPI.py में एक साझा वैश्विक चर हो सकता है जो किसी भी फाइल में है?
15

क्या एक accountListही फ़ाइल में एक वर्ग के अंदर रखने के लिए एक सरल समाधान है ?
जीए 1

एक आकर्षण की तरह काम किया, आगे अलग-अलग .py फ़ाइलों में JWT का उपयोग करके संरक्षित अंत बिंदु को कैसे जोड़ा जाए
अशोक श्री

41

का उपयोग करके Blueprintआप routesनिर्देशिका में अपने मार्ग जोड़ सकते हैं ।

संरचना

app.py
routes
    __init__.py
    index.py
    users.py

__init__.py

from flask import Blueprint
routes = Blueprint('routes', __name__)

from .index import *
from .users import *

index.py

from flask import render_template
from . import routes

@routes.route('/')
def index():
    return render_template('index.html')

users.py

from flask import render_template
from . import routes

@routes.route('/users')
def users():
    return render_template('users.html')

app.py

from routes import *
app.register_blueprint(routes)

यदि आप एक नया मार्ग फ़ाइल जोड़ना चाहते हैं accounts.py, तो कहें , आपको केवल निर्देशिका accounts.pyमें फ़ाइल बनाने की आवश्यकता है routes, ठीक उसी तरह index.pyऔर users.pyफिर routes.__init__.pyफ़ाइल में आयात करें

from .accounts import *

1
यह एक आयात त्रुटि फेंक रहा है
अभिषेक जेबराज

फ़ाइल के बीच में आयात करना बुरा व्यवहार माना जा सकता है?
टॉमसॉयर

3

यदि आप ब्लूप्रिंट का उपयोग कर रहे हैं और एक खाके के अंदर अपने ब्लूप्रिंट के url को रूट / रीडायरेक्ट करना चाहते हैं तो आप सही url_for स्टेटमेंट का उपयोग करने की आवश्यकता है।

आपके मामले में यदि आप अपने खाका का url खाता खोलना चाहते हैं, तो आपको इसे अपने खाके में इस तरह बताना होगा :

href="{{ url_for('account_api.account') }}"

और मुख्य ऐप के लिए यह इस तरह दिखेगा:

redirect(url_for('account_api.account'))

अन्यथा werzeug पुस्तकालय एक त्रुटि फेंक देगा।


1

ऐसा करने का एक और तरीका आलसी लोडिंग के साथ हो सकता है , जहां आप स्पष्ट रूप से जरूरत के आधार पर दृश्य कार्यों को संलग्न करेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.