繁体   English   中英

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

[英]flask-classy and peewee, metaclass conflict error

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

我尝试解决此问题的方法:
由于noconflict导入类创建者的影响,这没用 这个例子是从2003年6月开始的。也许它太旧了? 我正在python 2.7.3上运行。
http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/

也尝试过此解决方案,请参见下面的代码块。 我收到此错误:AttributeError:类型对象'BaseModel'没有属性' 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的新手。 我的主要目标是使程序与多个类一起使用。 这就是为什么我要让烧瓶优雅地工作。

与其他解决方案一样,没有烧瓶优雅的情况下解决此问题的方法也同样受欢迎。 如果不使用flask classy比较容易,我会尝试一下。

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

class Meta(type):
    database = mysql_db

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

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

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

_ 初始化 _.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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM