【问题标题】:Implementing MVC in Python? (using Flask and MongoKit)在 Python 中实现 MVC? (使用 Flask 和 MongoKit)
【发布时间】:2013-05-30 04:56:42
【问题描述】:

我来自意大利面条代码 PHP 背景。我正在尝试通过使用 Flask 和 MongoDB 学习 Python 来学习 MVC。我认为这个问题可能适用于其他情况。这更像是一个新手 Python 问题。但这是我第一次遇到这种设置。

我正在使用 Flask 和蓝图来布局我的应用程序。我将每个主要站点功能分解为 myapp 的子目录(模块/蓝图)。这是我的目录结构

目录结构

/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 中设置了一个类,如下所示。我知道最后一个语句没有定义。我不确定它是放在那里还是我需要把它放在其他地方。或者如果它确实去了那里,我如何从 init.py 中的 create_app() 获取“db”。我认为这与 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])

【问题讨论】:

    标签: python mongodb model-view-controller flask mongokit


    【解决方案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])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-24
      • 2015-05-25
      • 2011-02-02
      • 2023-03-09
      • 2019-05-17
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多