2012-06-21 29 views
5

Po prostu zaczynam od butelki i trafiłem w szkopuł. Próbuję napisać mały blog, aby przyzwyczaić się do frameworka, więc zrobiłem dwa pakiety, "auth" i "posty". Przeczytałem w sekcji Duże aplikacje w Flask docs.Flask: Używanie wielu pakietów w jednej aplikacji

Mój katalog wygląda następująco.

>/root 
>>run.py 

>>/posts 

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

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

run.py wygląda następująco:

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

auth_app.run() 
posts_app.run() 

/posts/__init__.py i /auth/__init__.py wyglądać następująco:

from flask import Flask 

auth_app = Flask(__name__) 

import auth.views 

i views.py wyglądać następująco:

from auth import auth_app 

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

Ale zawsze, gdy uruchamiam serwer, dostępny jest tylko localhost/auth /, a wszystko inne daje 404, som zakładam, że aplikacja posts nie jest uruchamiana.

Czy ktoś może pomóc?

Odpowiedz

5

Twoja metoda auth_app.run() blokuje kontynuację twojego programu. Właśnie dlatego aplikacja posts_apps nie uruchamia się. Cały proces wyświetlania stron odbywa się w ramach metody run() Flask. Dlatego możesz stwierdzić, że nie możesz uruchomić dwóch aplikacji Flask w tym samym procesie.

Jeśli chcesz podzielić swoją aplikację na dwie takie, zalecana metoda to: blueprints. Zamiast tworzyć dwie aplikacje (auth i posty), tworzymy dwa plany. następnie utworzyć jeden wniosek jak tak ...

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

Plany to dobry pomysł! –

+0

Co jeśli schematy 'auth' i' post' muszą używać modułu 'models.py' zdefiniowanego na poziomie katalogu głównego, wraz z' run.py'?Czy miałoby sens zadeklarowanie ich jako projektów, nawet jeśli nie byłyby one "całkowicie niezależne" od głównej aplikacji, a zatem nie można ich używać w innych aplikacjach, które nie mają tego samego modelu 'models.py'? Dziękuję Ci! – aralar

+1

@ miguel5 To, co określasz jako "niezależne", zależy od Ciebie. Projekty Flask pomagają odróżnić rzeczy, na których opiera się Flask: położenie plików statycznych i szablonów, adresy URL i sposób ich mapowania do widoków itp. Jeśli chcesz tylko użyć tego do zachowania różnych katalogów , ale nadal polegać na jednym 'model.py', to jest w porządku. Jeśli chcesz także rozdzielić modele na różne struktury danych, możesz to zrobić. Sam Flask nie przejmuje się przechowywaniem pliku 'models.py'. –

4

Choć wydaje się, że podejście Marka użyciu plany pasuje do Twojego projektu dobrze, jeśli chcesz korzystać z odrębnych wniosków dla każdego pakietu należy przyjrzeć się werkzeug.wsgi.DispatcherMiddleware.

Pojedynczy proces nie może uruchomić drugiej aplikacji po uruchomieniu pierwszej (jak w pytaniu), ale to nie jest problem z DispatcherMiddleware. Możesz go użyć do zdefiniowania głównej aplikacji oraz innych na podstawie prefiksów URL.

W przykładzie na dokumentach rozróżnia się dwie aplikacje - frontend i backend - które są uruchamiane w zależności od adresu URL, na żądanie użytkownika.

Jeśli chcesz dowiedzieć się więcej, przeczytaj artykuł Matt Wrighta: "How I Structure My Flask Applications" i obejrzyj jego przykładowy projekt: Overholt. Decyduje się na użycie dwóch aplikacji: jednej dla głównej witryny (nakładka) i drugiej dla interfejsu API, a on tworzy rozróżnienie między tymi dwoma na podstawie prefiksu adresu URL. Od jego kod *:

 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) 

ten sposób, że tworzy dwie aplikacje w którym każdy ma swój określony zestaw poglądów, konfiguracji itp i jest w stanie uruchomić je z tego samego procesu interpretera Pythona.

* Należy pamiętać, że run_simple() służy wyłącznie do programowania - nie do produkcji.