flask-classy 和 peewee,元类冲突错误

Posted

技术标签:

【中文标题】flask-classy 和 peewee,元类冲突错误【英文标题】:flask-classy and peewee, metaclass conflict error 【发布时间】:2013-07-22 12:26:09 【问题描述】:

我正在尝试让我的用户类同时使用 BaseModel 和 FlaskView。这导致元类冲突错误,我无法解决。

我尝试解决的问题: 由于 from noconflict import classmaker,这不起作用。该示例来自 2003 年 6 月。也许它太旧了?我在 python 2.7.3 上运行。 http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/

也尝试过此解决方案,请参阅下面的代码块。 我收到此错误:AttributeError: type object 'BaseModel' has no attribute 'metaclass'Double inheritance causes metaclass conflict

from base_model import BaseModel
from flask.ext.classy import FlaskView

class CombinedMeta(BaseModel.__metaclass__, FlaskView.__metaclass__):
    pass

from peewee import *
#sqlite is used for easy testing.
mysql_db = SqliteDatabase('test.db')


class BaseModel(Model):

    class Meta:
        database = mysql_db

from combined_meta import CombinedMeta
from base_model import BaseModel
from flask.ext.classy import FlaskView
from flask.ext.classy import route
from peewee import *
from flask import request
from utility import response_json
from utility import send_email
from utility import random_string

class User(BaseModel, FlaskView):
    __metaclass__ = CombinedMeta

    @route('/<username>', methods=['GET'])
    def read_user(self, username):
        #cool method stuff

当我将 BaseModel 类更改为以下代码时,我收到一个新错误。 类 BaseModel(模型): TypeError:调用元类库时出错 这个构造函数没有参数

from peewee import *
#sqlite is used for easy testing.
mysql_db = SqliteDatabase('test.db')


class BaseModel(Model):

    class Meta:
        database = mysql_db

    __metaclass__ = Meta

我不知道如何解决这个问题,我是 Python 新手。 我的主要目标是让程序与多个类一起工作。这就是我试图让烧瓶优雅工作的原因。

无需烧瓶经典即可解决此问题的方法与任何其他修复方法一样受欢迎。如果不使用flask classy更容易,我会尝试一下。

编辑 When calling the metaclass bases, object.__init__() takes no parameters

class Meta(type):
    database = mysql_db

当我将代码更改为此时,我收到以下错误: TypeError: 调用元类基类时出错元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类

【问题讨论】:

【参考方案1】:

我设法通过不使用flask-classy解决了这个问题。相反,我使用的是蓝图,flask documentation。我不再需要 BaseModel 和 FlakView,现在只需要 BaseModel。

这是我的工作代码: 我不再需要 FlaskView,因为我不再使用 flak-classy。不再有meteclass错误!

_初始化_.py

from flask import Flask
import user
app = Flask(__name__)
app.register_blueprint(user.bp)

user.py

from base_model import BaseModel
class User(BaseModel):
    username = CharField(primary_key=True)
    password = CharField(null=False)

bp = Blueprint('user', __name__)

@bp.route('/user/method', method=['GET'])
def method()
#method stuff

【讨论】:

以上是关于flask-classy 和 peewee,元类冲突错误的主要内容,如果未能解决你的问题,请参考以下文章

peewee 和 peewee-async:为啥异步速度较慢

EXAMPLE FOR PEEWEE 多姿势使用 PEEWEE

peewee连接池使用指南

Peewee 在运行时注册新模型

Peewee:如何更新特定字段?

Flask和peewee FlaskDB()“连接已经打开”与APScheduler