2013-06-03 4 views
4

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

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

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]) 

Основная часть моего приложения в инициализации .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]) 

ответ

3

Если вы хотите использовать функцию 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])