2012-07-13 21 views
21

Flask ile basit ama önemsiz bir uygulama oluşturmaya çalışıyorum ve dokümanlar içinde iyi açıklanmayan bir duruma girmeye devam ediyorum.Flask uygulamalarının yapısı

benim app farklı modüller arasında bölünmüş olmak istiyorum, ama ana modülün başka herhangi bir yerden ana app nesneyi (veya flask-sqlalchemy den db) erişmek zor gibi görünüyor. Görünüşe göre, her şeyin erişimi olan bir küresel olarak ele almak için kendi yolunuzu yazmak zorundasınız, ki bu da bazı şüpheli kodlar ve biraz zaman gerektirir. Ana uygulamanın başlatıldığı ve her örneğin en üst düzeyde bulunabileceği varsayılırsa, app ve db ve ve db her ikisi de oluşturulur. Fakat farklı URL işleyicilerini farklı modüllere ayırırsam, @app.route dekoratörünü kullanma yeteneğini kaybederim. Bunun etrafında app.add_url_rule('/...', some.module...) ile çalışabilirim, ancak daha sonra uygulama bu işleve aktarılmaz.

db ile aynı şey gerçekleşir - g'a yapıştırmam gerekirse veya bir şekilde app aracılığıyla erişilebilseyim bilmiyorum. Bunu yapmak, modelleri ayrı bir modüle taşımamda bana yardımcı olmaz - onları nasıl alırken db'a nasıl erişebilirim? Tüm örnekler tekrar yerel bir değişken olarak mevcut olduğunu varsayar.

bir şey bariz eksik yapıyorum yoksa burada yanlış görev için şişeyi kullanmak çalışıyorum?

+0

Dekoratörler sadece bir ürün paketleyicisidir. Tüm sunucu mantığını kapsülleyen bir sınıf oluşturabilir ve sınıfın içindeki tüm "db" ve "app" değişkenlerini saklayabilirsiniz. – Blender

+0

@Blender Sure, bunu el ile çözmenin birçok yolu var. Ya gerçekten öğrenmek istiyorum başa herhangi bir standart yol varsa ve tamamen dokümanlardan eksik gibi görünüyor eğer, ilerde daha fazla sürprizler vardır. Şişenin kendisinden bir yerde sunulan daha belirgin bir çözüm bekliyordum. – viraptor

+0

Sen Blueprint – user956424

cevap

19

Sorunuzun yanıtı, planlardır. Aslında, belgelere bakarsanız, uygulamaların modüllerde bölünmesini sağlamak için planların olduğu belirtilir.

örnek kod: app.py

from yourmodule import mod 

    app.register_blueprint(mod) 

yılında

from flask import Blueprint 

    mod = Blueprint(blueprint_name, __name__, template_folder="folder_name" 
        static_folder="folder_name") 

    @mod.route('/mymodule') 
    def view(): 
     # your code 

Bu modüllerin içine uygulamayı bölmek doğru yoldur. Daha fazla bilgi için blueprint belgelerine göz atın. Başka modülünde uygulamaya erişmek için gerektiriyorsa

Üstelik uygulamanın current_app vekil kullanmalıdır.

from flask import current_app 

Kontrol dışarı balonun yaratıcısı tarafından büyük projeler için modüller halinde şişesi uygulamasını bölmek nasıl kılavuzluk bu document.

+0

Belgelere çok güzel bağlantı! ;) –

+1

@IgnasB. Teşekkürler!Github üzerindeki bu repo'yu bana göre büyük bir flask uygulaması yapısı ile göz atın https://github.com/codecool/flask-app-structure – codecool

+0

Bir göz atacağım! ;) –

2

gördünüzmü yeni blueprintsfeature (Ben henüz kullanılabilir, ancak bu sizin durumunuzda yararlı olabilir gibi geliyor değil).