Flask uygulaması birden fazla py dosyasına nasıl bölünür?


146

Şişe uygulamam şu anda test.pybirden fazla main()rotayı ve tanımlı rotayı içeren tek bir dosyadan oluşuyor . test2.pyİşlenmeyen yolları içeren bir dosya oluşturmamın bir yolu var mı test.py?

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

test.pyİçinde çok fazla yol olduğundan endişe duyuyorum ve ben de aynı dosyanın bir parçasıymış gibi python test.pyyolları alacak , çalıştıracak şekilde yapmak istiyorum test.py. Bunun işe yaraması için ne yapmam test.pyve / veya dahil etmem test2.pygerekiyor?

Yanıtlar:


153

Uygulamanızı birden çok modüle bölmek için normal Python paket yapısını kullanabilirsiniz , Flask belgelerine bakın.

Ancak,

Flask, uygulama bileşenlerini yapmak ve bir uygulama içinde veya uygulamalar arasında ortak kalıpları desteklemek için bir plan kavramı kullanır.

Uygulamanızın bir alt bileşenini ayrı bir dosyada Blueprint olarak oluşturabilirsiniz:

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

Ve sonra ana bölümde kullanın:

from yourapplication.simple_page import simple_page

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

Planlar ayrıca belirli kaynakları da paketleyebilir: şablonlar veya statik dosyalar. Tüm ayrıntılar için lütfen Flask belgelerine bakın.


1
bu planın başlangıcındaki diğer plan dosyalarımıza nasıl sahip olabiliriz ?
divyenduz

JWT kullanarak güvenli bir bitiş noktaları yapmak istiyorsanız o zaman nasıl her route.py dosyalarında yapacağız
Ashok Sri

19

Başka bir dosyanın içindeki ana flask uygulaması değişkeni olan basit hileyi kullanabilirsiniz, örneğin:

test-routes.py

from __main__ import app

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

ve flask uygulamasını bildirdiğiniz ana dosyalarınızda, aşağıdaki gibi test yollarını içe aktarın:

app.py

from flask import Flask, request, abort

app = Flask(__name__)

# import declared routes
import test-routes

Benim tarafımdan çalışıyor.


2
Bu sadece bir örnek, __main__giriş dosyanıza atıfta bulunuyor, hepsi bu!
nimeresam

3
Harika, çok teşekkürler. Blueprint veya yukarıdaki paket yaklaşımı küçük uygulamalar için gereğinden fazladır.
VH-NZZ

İşte bu yöntemin açıklandığı belgelere bir bağlantı: https://flask.palletsprojects.com/en/1.1.x/patterns/packages/
Christopher

1
@nimeresam Benim için çalıştı ama dosyanın import test-routesüstünde olamayacağını öğrenmek zorundaydım app.py. Silahı çökertti, ancak içe aktarmayı dosyanın altına taşıdıktan sonra çalıştı. "sadece modülün içe aktarılmasını sağlamak ve bunu dosyanın altında yapıyoruz"
Niklas R.


5

Uygulamayı taslaklara bölmek harika bir fikirdir. Ancak, bu yeterli değilse ve daha sonra Blueprint'in kendisini birden fazla py dosyasına bölmek istiyorsanız, bu normal Python modülü içe aktarma sistemini kullanarak ve sonra diğer dosyalardan içe aktarılan tüm yollar arasında döngü yaparak da mümkündür. .

Bunu yapmak için kod ile bir Gist oluşturdum:

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

Bildiğim kadarıyla, şu anda bir Blueprint'i bölmenin tek mümkün yolu bu. Flask'ta "alt planlar" oluşturmak mümkün değildir, ancak bununla ilgili çok fazla tartışmayla ilgili bir sorun var:

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

Ayrıca, mümkün olsa bile (ve muhtemelen bu konu dizisindeki bazı parçacıkları kullanabiliyorsa), alt planlar yine de kullanım durumunuz için çok kısıtlayıcı olabilir - örn. aynı URL alt önekine sahip alt modül.


4

Bu görev, Merkezi URL Haritası kullanılarak taslaklar ve zorlayıcı ithalatlar olmadan gerçekleştirilebilir

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')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.