关于python:flask-classy和peewee,元类冲突错误

flask-classy and peewee, metaclass conflict error

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

我尝试解决问题的方法:
这不起作用,因为来自Noconflict导入类生成器。示例来自2003年6月。也许它太旧了?我运行的是python 2.7.3。< BR>http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/

还尝试了这个解决方案,请参见下面的代码块。我得到这个错误:attributeError:type对象'baseModel'没有属性'metaclass'双重继承导致元类冲突

1
2
3
4
5
from base_model import BaseModel
from flask.ext.classy import FlaskView

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

< BR>

1
2
3
4
5
6
7
8
9
from peewee import *
#sqlite is used for easy testing.
mysql_db = SqliteDatabase('test.db')


class BaseModel(Model):

    class Meta:
        database = mysql_db

< BR>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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类更改为以下代码时,会得到一个新的错误。< BR>类基础模型(模型):类型错误:调用元类基时出错此构造函数不接受参数

1
2
3
4
5
6
7
8
9
10
11
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.uu init_uu()不接受任何参数

1
2
class Meta(type):
    database = mysql_db

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


我设法解决了这个问题,不使用高级烧瓶。相反,我使用的是蓝图、烧瓶文档。我不再需要basemodel和flakview,现在只需要basemodel。

这是我的工作代码:
我不再需要花瓶,因为我不再使用花瓶。不再有MeteClass错误!

_初始PY

1
2
3
4
from flask import Flask
import user
app = Flask(__name__)
app.register_blueprint(user.bp)

用户.py

1
2
3
4
5
6
7
8
9
10
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