2012-06-21 26 views
5

Sadece şişe ile çalışmaya başladım ve bir takılmaya başladım. Çerçeveye alışmak için küçük bir blog yazmaya çalışıyorum, böylece iki paket, bir "auth" ve "posts" yaptım. Flask docs'daki Büyük Uygulamalar bölümünü okudum.Flask: Tek bir uygulamada birden fazla paket kullanma

Dizlerim şunun gibi görünüyor.

from flask import Flask 
from auth import auth_app 
from posts import posts_app 

auth_app.run() 
posts_app.run() 

/posts/__init__.py ve bunun gibi /auth/__init__.py görünüm::

from flask import Flask 

auth_app = Flask(__name__) 

import auth.views 

ve şuna benzer views.py:

from auth import auth_app 

@auth_app.route('/auth/') 
def index(): 
    return "hello auth!" 

>/root 
>>run.py 

>>/posts 

>>>____init____.py 
>>>views.py 
>>>/templates 
>>>/static 

>>/auth 
>>>____init____.py 
>>>views.py 
>>>/templates 
>>>/static 

run.py şöyle

Ancak, sunucuyu her çalıştırdığımda, yalnızca localhost/auth/kullanılabilir ve diğer her şey bir 404 veriyor, birisi de gönderim uygulamasının çalıştırılmadığını varsayalım.

Herkes yardımcı olabilir mi?

cevap

5

auth_app.run() yönteminiz, programınızın çalışmaya devam etmesini engeller. Bu yüzden posts_apps uygulaması çalışmaz. Sayfaları sunma işleminin tamamı, Flask'in run() yöntemi içinde gerçekleşir. Bu nedenle, aynı işlem içinde iki Flask uygulaması çalıştıramayacağınıza karar verebilirsiniz.

Uygulamanızı bu şekilde ikiye bölmek isterseniz, önerilen yol blueprints kullanmaktır. İki uygulama (auth ve posts) oluşturmak yerine iki plan oluşturursunuz. Eğer siz werkzeug.wsgi.DispatcherMiddleware içine bakmak gerekir her paket için ayrı uygulamalar kullanmak istiyorsanız planları kullanarak Mark'ın yaklaşımı, projenizi uyuyor sanki görünse Ardından ... şöyle

from flask import Flask 
from auth import auth_blueprint 
from posts import post_blueprint 

app = Flask(__name__) 
app.register_blueprint(auth_blueprint) 
app.register_blueprint(post_blueprint) 
app.run() 
+0

Planlar iyi bir fikir! –

+0

Eğer "auth" ve "post" planları, "run.py" ile birlikte root düzeyinde tanımlanmış bir "models.py" modülü kullanmak zorunda kaldıysa?Daha sonra, ana uygulamadan "tamamen bağımsız" olmasalar ve aynı "models.py" ye sahip olmayan diğer uygulamalarda yeniden kullanılamaz olsalar bile bunları taslak olarak ilan etmek anlamlı olur mu? Teşekkür ederim! – aralar

+1

@ miguel5 "Bağımsız" olarak tanımladığınız şey size kalmış. Flask planları, Flask'ın umurunda olduğu şeyleri ayırmanın bir yolunu sağlar: Statik ve şablon dosyalarının konumu, URL'ler ve bunların görünümlerinize nasıl eşlendikleri vb. Eğer sadece bu dizinleri farklı tutmak için bunu kullanmak istiyorsanız ama yine de tek bir 'model.py'ye güveniyor, o zaman bu iyi. Modellerinizi ayrıca çeşitli veri yapılarına ayırmak isterseniz, bunu da yapabilirsiniz. Flask kendisi 'models.py' dosyanızı nasıl sakladığınız umurumda değil. –

4

bir uygulama oluşturmak.

Tek bir işlem, ilkini çalıştırdıktan sonra (sorunuzda olduğu gibi) ikinci bir uygulamayı çalıştıramaz, ancak bu DispatcherMiddleware ile ilgili bir sorun değildir. Bunu, ana öneklerin yanı sıra ana önekleri temel alarak tanımlamak için kullanabilirsiniz.

Dokümanlardaki örnek, kullanıcının istediği URL'ye bağlı olarak çalıştırılan iki uygulama --frontend ve backend - arasında ayrım yapmaktadır.

Daha fazla bilgi edinmek isterseniz, Matt Wright'ın "How I Structure My Flask Applications" numaralı telefonunu okuyun ve örnek projesi olan Overholt'a bakın. İki uygulamayı kullanmaya karar verir: biri ana web sitesi (önyüz) ve API için bir diğeri için, URL önekine dayalı olarak ikisi arasındaki ayrımı oluşturur. onun kod * Gönderen: Her vb görünümleri, yapılandırmaları, onun tanımlanan kümesi vardır ve aynı Python yorumlayıcısı işleminden onları çalıştırmak mümkün olduğu

 from werkzeug.serving import run_simple 
    from werkzeug.wsgi import DispatcherMiddleware 
    from overholt import api, frontend 


    application = DispatcherMiddleware(frontend.create_app(), { 
     '/api': api.create_app() 
    }) 


    if __name__ == "__main__": 
     run_simple('0.0.0.0', 5000, application, use_reloader=True, use_debugger=True) 

Bu şekilde, o iki uygulamalarını gerçekleştirir.

* run_simple() ürününün yalnızca geliştirme - üretim için kullanılmayacağını unutmayın.

İlgili konular