Реализация MVC в Python? (используя Flask и MongoKit)

Я пришел из PHP-кода спагетти. Я пытаюсь изучить MVC, обрезая зубы на Python с помощью Flask и MongoDB. Я думаю, что этот вопрос может относиться к другим ситуациям. Это скорее вопрос новичка в Python. Но здесь я впервые сталкиваюсь с этой настройкой.

Я использую Flask с Blueprints для компоновки своего приложения. Я разбиваю каждую важную функцию сайта на подкаталог myapp (module/blueprint). Вот моя структура каталогов

Dir структура

/proj/config.py
/proj/runserver.py
/proj/myapp/
/proj/myapp/__init__.py
/proj/myapp/static/
/proj/myapp/templates/
/proj/myapp/templates/users/
/proj/myapp/templates/forums/
/proj/myapp/templates/frontend/
/proj/myapp/users/
/proj/myapp/users/__init__.py
/proj/myapp/users/models.py
/proj/myapp/users/views.py
/proj/myapp/forums/ ..
/proj/myapp/frontend/ ..

Поэтому я пытаюсь реализовать этот простой пример MongoKit. Но вместо того, чтобы иметь это в одном файле. Мне нужно распространить его по шаблону MVC.

Образец MongoKit

from flask import Flask, request, render_template, redirect, url_for
from flask.ext.mongokit import MongoKit, Document

app = Flask(__name__)

class User(Document):
    __collection__ = 'user'
    structure = {
        'name': unicode,
        'email': unicode,
    }
    required_fields = ['name', 'email']
    use_dot_notation = True

db = MongoKit(app)
db.register([User])

Основная часть моего приложения находится в init.py и выглядит так:

/ myapp / _init_.py

from flask import Flask, render_template, abort
from flask.ext.mongokit import MongoKit, Document

from .home.views import mod as home_blueprint
from .users.views import mod as user_blueprint
from .forums.views import mod as forum_blueprint

def create_app():
    app = Flask(__name__)
    app.config.from_object('config')

    # Register blueprints
    app.register_blueprint(home_blueprint)
    app.register_blueprint(user_blueprint, url_prefix="/users")
    app.register_blueprint(forum_blueprint, url_prefix="/forums")

    db = MongoKit(app)

    @app.errorhandler(404)
    def not_found(error):
        return render_template('404.html')

    @app.errorhandler(500)
    def internal_error(exception):
        return "Some internal error has taken place.  Alert somebody!"

    return app

И тогда я не совсем уверен, что делать с остальными. Я установил класс в /myapp/users/models.py, как показано ниже. Я знаю, что последнее утверждение не определено. Я не уверен, идет ли он туда или мне нужно поместить это куда-нибудь еще. Или, если это действительно так, как мне получить "db" из create_app() в init.py. Я полагаю, что это имеет меньшее отношение к MongoKit и основному Python.

/myapp/users/models.py

from flask.ext.mongokit import MongoKit, Document

class User(Document):
    structure = {
    'name': unicode,
    'email': unicode,
}
    use_dot_notation = True

db.register([User])

1 ответ

Решение

Если вы хотите использовать функцию create_app, то я бы изменил ваш __init__.py что-то вроде:

/myapp/__init__.py

from flask import Flask, render_template, abort
from flask.ext.mongokit import MongoKit, Document

from .home.views import mod as home_blueprint
from .users.views import mod as user_blueprint
from .forums.views import mod as forum_blueprint

def create_app():
    app = Flask(__name__)
    app.config.from_object('config')

    # Register blueprints
    app.register_blueprint(home_blueprint)
    app.register_blueprint(user_blueprint, url_prefix="/users")
    app.register_blueprint(forum_blueprint, url_prefix="/forums")

    db = MongoKit(app)

    @app.errorhandler(404)
    def not_found(error):
        return render_template('404.html')

    @app.errorhandler(500)
    def internal_error(exception):
        return "Some internal error has taken place.  Alert somebody!"

    return app,db

# Make sure you are calling create_app func below:
(app,db) = create_app()

Теперь в коде вашей модели вы можете ссылаться на переменную db.

/myapp/users/models.py

from flask.ext.mongokit import MongoKit, Document

# import db below like this
from myapp import db

class User(Document):
    structure = {
    'name': unicode,
    'email': unicode,
}
use_dot_notation = True

# ok to do this below
db.register([User])
Другие вопросы по тегам