2012-06-21 3 views
5

Я только начинаю с фляжки, и я попал в ловушку. Я пытаюсь написать небольшой блог, чтобы привыкнуть к структуре, поэтому я сделал два пакета: «auth» и «posts». Я прочитал раздел «Большие приложения» в Flask docs.Колба: использование нескольких пакетов в одном приложении

Мой каталог выглядит следующим образом.

>/root 
>>run.py 

>>/posts 

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

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

run.py выглядит следующим образом:

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

auth_app.run() 
posts_app.run() 

/posts/__init__.py и /auth/__init__.py выглядеть следующим образом:

from flask import Flask 

auth_app = Flask(__name__) 

import auth.views 

и views.py выглядеть следующим образом:

from auth import auth_app 

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

Но всякий раз, когда я запускаю сервер, доступен только localhost/auth /, а все остальное дает 404, som. Я предполагаю, что приложение posts не запускается.

Может ли кто-нибудь помочь?

ответ

5

Ваш метод auth_app.run() блокирует вашу программу от продолжения работы. Вот почему приложение posts_apps не запускается. Весь процесс обслуживания страниц происходит в методе Run() Flask. Поэтому вы можете заключить, что вы не можете запускать два приложения Flask в том же процессе.

Если вы хотите разделить приложение на два, как это, рекомендуется использовать blueprints. Вместо создания двух приложений (auth и posts) вы создаете два чертежа. Затем вы создаете одно приложение, как так ...

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

Чертежи - это хорошая идея! –

+0

Что делать, если чертежи 'auth' и' post' должны были использовать модуль 'models.py', определенный на корневом уровне, вместе с' run.py'?Тогда было бы целесообразно объявить их в виде чертежей, даже если они не были «полностью независимы» от основного приложения и, следовательно, не могли использоваться повторно в других приложениях, которые не имеют одинаковых «models.py»? Спасибо! – aralar

+1

@ miguel5 То, что вы определяете как «независимый», зависит от вас. Чертежи с флагами помогают создать способ разделить то, что заботит Флакс: расположение статических файлов и шаблонов, URL-адреса и способы их сопоставления с вашими представлениями и т. Д. Если вы хотите использовать это только для того, чтобы эти каталоги отличались , но все-таки полагаться на один 'model.py', то это прекрасно. Если вы хотите также разделить ваши модели на различные структуры данных, вы также можете это сделать. Flask сама по себе не заботится о том, как вы храните файл 'models.py'. –

4

Хотя кажется, что подход Марка используя чертежи подходит для вашего проекта хорошо, если вы хотите использовать отдельные приложения для каждого пакета, который вы должны смотреть в werkzeug.wsgi.DispatcherMiddleware.

Один процесс не может запустить второе приложение после запуска первого (как в вашем вопросе), но это не проблема с DispatcherMiddleware. Вы можете использовать его для определения основного приложения, а также других на основе префиксов URL.

В примере на документах различают два приложения - frontend и backend - которые запускаются в зависимости от URL-адреса, который запрашивает пользователь.

Если вы хотите узнать больше, прочитайте "How I Structure My Flask Applications" Мэтта Райт и посмотрите на его примерный проект Overholt. Он решает использовать два приложения: один для основного сайта (frontend), а другой для API, и он создает различие между ними на основе префикса URL. Из своего кода *:

 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) 

Таким образом, он создает два приложения, в котором каждый из них имеет свой определенный набор представлений, конфигураций и т.д., и позволяет запускать их из того же самого процесса интерпретатора Python.

* Обратите внимание, что run_simple() предназначен только для разработки - не для производства.

Смежные вопросы