首页 文章

烧瓶优雅和peewee,元类冲突错误

提问于
浏览
0

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

我试图解决问题的事情:
这不起作用,因为来自noconflict导入类制造商 . 这个例子是从2003年6月开始的 . 也许它太旧了?我在python 2.7.3上运行 .
http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/

也试过这个解决方案,请参阅下面的代码块 . 我收到此错误:AttributeError:type object 'BaseModel'没有属性' 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类更改为以下代码时,我收到一个新错误 .
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的新手 . 我的主要目标是让程序使用多个类 . 这就是为什么我试图让烧瓶优雅起作用 .

解决这个问题没有烧瓶优雅的方法就像任何其他修复一样受欢迎 . 如果不使用烧瓶优雅更容易我会尝试 .

EDIT
When calling the metaclass bases, object.init() takes no parameters

class Meta(type):
    database = mysql_db

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

1 回答

  • 0

    我设法通过不使用flask-classy来解决问题 . 相反,我正在使用蓝图,flask documentation . 我不再需要BaseModel和FlakView,现在只需要BaseModel .

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

    init.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
    

相关问题