0

我试图让我的用户类同时使用 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 '
双重继承导致元类冲突

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 类更改为以下代码时,我收到一个新错误。
class BaseModel(Model):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 新手。我的主要目标是让程序与多个类一起工作。这就是为什么我试图让烧瓶优雅地工作。

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

编辑
调用元类基础时, object.__init__() 不带参数

class Meta(type):
    database = mysql_db

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

4

1 回答 1

0

我设法通过不使用flask-classy来解决问题。相反,我使用的是蓝图、烧瓶文档。我不再需要 BaseModel 和 FlakView,现在只需要 BaseModel。

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

_初始化_.py

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

用户.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
于 2013-07-24T14:17:10.193 回答