फ्लास्क ऐप को कई पाई फाइलों में कैसे विभाजित करें?


146

मेरे फ्लास्क एप्लिकेशन में वर्तमान में test.pyकई मार्गों और main()परिभाषित मार्ग के साथ एक एकल फ़ाइल है। क्या कोई रास्ता है जिससे मैं एक ऐसी test2.pyफ़ाइल बना सकूं जिसमें ऐसे मार्ग हों जिन्हें संभाला नहीं गया था test.py?

@app.route('/somepath')
def somehandler():
    # Handler code here

मुझे चिंता है कि बहुत सारे मार्ग हैं test.pyऔर मैं इसे ऐसे बनाना चाहूंगा कि मैं चला सकूं python test.py, जो मार्गों को भी उठाएगा test.pyजैसे कि यह उसी फ़ाइल का हिस्सा था। इसे काम करने के लिए मुझे इसमें क्या बदलाव करने test.pyऔर / या शामिल test2.pyकरने होंगे?

जवाबों:


152

आप अपने ऐप को कई मॉड्यूल में विभाजित करने के लिए सामान्य पायथन पैकेज संरचना का उपयोग कर सकते हैं, फ्लास्क डॉक्स देखें।

तथापि,

फ्लास्क आवेदन घटकों को बनाने और एक आवेदन के भीतर या भर में आम पैटर्न का समर्थन करने के लिए ब्लूप्रिंट की अवधारणा का उपयोग करता है।

आप एक अलग फ़ाइल में ब्लूप्रिंट के रूप में अपने ऐप का उप-घटक बना सकते हैं:

simple_page = Blueprint('simple_page', __name__, template_folder='templates')
@simple_page.route('/<page>')
def show(page):
    # stuff

और फिर इसे मुख्य भाग में उपयोग करें:

from yourapplication.simple_page import simple_page

app = Flask(__name__)
app.register_blueprint(simple_page)

ब्लूप्रिंट भी विशिष्ट संसाधनों को बंडल कर सकता है: टेम्पलेट या स्थिर फाइलें। कृपया सभी विवरणों के लिए फ्लास्क डॉक्स देखें।


1
कैसे हम अन्य फ़ाइल में खाका मार्गों कि हो सकता है init कि खाका की?
दिव्येंदुज

अगर मैं JWT का उपयोग करके एक सुरक्षित अंत बिंदु बनाना चाहता हूं, तो हर रूट-थ्रू फाइलों में यह कैसे होगा
अशोक श्री


17

आप सरल ट्रिक का उपयोग कर सकते हैं, जो कि मुख्य फ़ाइल से दूसरी फ़ाइल के अंदर फ्लास्क एप्लिकेशन चर आयात करना है, जैसे:

test-routes.py

from __main__ import app

@app.route('/test', methods=['GET'])
def test():
    return 'it works!'

और आपकी मुख्य फ़ाइलों में, जहाँ आपने फ्लास्क ऐप, आयात परीक्षण-मार्ग घोषित किए, जैसे:

app.py

from flask import Flask, request, abort

app = Flask(__name__)

# import declared routes
import test-routes

यह मेरी तरफ से काम करता है।


2
यह सिर्फ एक उदाहरण है, __main__आपकी प्रविष्टि फ़ाइल को संदर्भित करता है , बस !
नीमरेशम

3
शानदार, बहुत धन्यवाद। ब्लूप्रिंट या ऊपर दिए गए पैकेज का दृष्टिकोण छोटे ऐप्स के लिए ओवरकिल है।
VH-NZZ

यहाँ डॉक्स के लिए एक लिंक दिया गया है जहाँ इस विधि को समझाया गया है: https://flask.palletsprojects.com/en/1.1.x/patterns/packages/
क्रिस्टोफर

5

ऐप को ब्लूप्रिंट में विभाजित करना एक महान विचार है। हालाँकि, यदि यह पर्याप्त नहीं है, और यदि आप ब्लूप्रिंट को कई py फ़ाइलों में विभाजित करना चाहते हैं, तो यह नियमित पायथन मॉड्यूल आयात प्रणाली का उपयोग करना भी संभव है, और फिर उन सभी मार्गों से गुजरना जो अन्य फ़ाइलों से आयात किए जाते हैं। ।

मैंने ऐसा करने के लिए कोड के साथ एक Gist बनाया:

https://gist.github.com/Jaza/61f879f577bc9d06029e

जहां तक ​​मुझे जानकारी है, फिलहाल ब्लूप्रिंट को विभाजित करने का यह एकमात्र संभव तरीका है। फ्लास्क में "उप-ब्लूप्रिंट" बनाना संभव नहीं है, हालांकि इस बारे में बहुत चर्चा के साथ एक मुद्दा खुला है:

https://github.com/mitsuhiko/flask/issues/593

इसके अलावा, भले ही यह संभव था (और यह संभवतः उस मुद्दे से कुछ स्निपेट का उपयोग करने में सक्षम है), उप-ब्लूप्रिंट वैसे भी आपके उपयोग के मामले के लिए बहुत अधिक प्रतिबंधक हो सकते हैं - जैसे कि यदि आप सभी मार्गों को नहीं चाहते हैं उप-मॉड्यूल में एक ही URL उप-उपसर्ग है।


4

यह कार्य केंद्रीकृत URL मैप का उपयोग करके ब्लूप्रिंट और मुश्किल आयात के बिना पूरा किया जा सकता है

app.py

import views
from flask import Flask

app = Flask(__name__)

app.add_url_rule('/', view_func=views.index)
app.add_url_rule('/other', view_func=views.other)

if __name__ == '__main__':
    app.run(debug=True, use_reloader=True)

views.py

from flask import render_template

def index():
    return render_template('index.html')

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