2013-07-23 55 views
0

我想讓我的用戶類與BaseModel和FlaskView一起工作。這導致了元類衝突錯誤,我無法解決它。燒瓶 - 優雅和peewee,元類衝突錯誤

事情我試圖來解決這個問題:
這並沒有因爲從noconflict進口classmaker工作。這個例子是從2003年6月開始的。也許它太老了?我在python 2.7.3上運行。
http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/

也試過這個解決方案,看下面的代碼塊。 我得到這個錯誤:AttributeError的:對象類型 'BaseModel' 有沒有屬性 '元類'
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(模型): 類型錯誤:錯誤調用元類基礎 當這個構造函數沒有參數

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。 我的主要目標是讓程序使用多個類。這就是爲什麼我試圖讓燒瓶優雅的工作。

解決這個問題的方法沒有燒瓶優雅和其他任何修補程序一樣受歡迎。如果不使用瓶子,優雅更容易,我會試一試。

編輯
When calling the metaclass bases, object.__init__() takes no parameters

class Meta(type): 
    database = mysql_db 

當我的代碼更改爲這我得到以下錯誤:
類型錯誤:錯誤調用元類基礎元類衝突時:一個派生類的元類必須是所有基類元類的(非嚴格)子類

回答

0

我設法解決了這個問題,因爲沒有使用燒瓶優雅。相反,我使用藍圖,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