2013-07-23 2 views
0

J'essaie de faire fonctionner ma classe d'utilisateur avec BaseModel et FlaskView. Cela entraîne l'erreur de conflit de métaclasse et je ne peux pas le résoudre.flask-classy et peewee, erreur de conflit de métaclasse

choses que j'ai essayé de résoudre le problème:
Cela ne fonctionne pas à cause de la de classmaker import noconflict. L'exemple est de juin 2003. Peut-être est-il trop vieux? Je cours sur python 2.7.3.
http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/

Vous avez également essayé cette solution, voir les blocs de code ci-dessous. -je obtenir cette erreur: AttributeError: objet de type 'BaseModel' n'a pas d'attribut 'métaclasse'
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 

Quand je change la classe BaseModel au code suivant, je reçois une nouvelle erreur.
classe BaseModel (modèle): TypeError: Erreur lors de l'appel des bases de métaclasse ce constructeur ne prend aucun argument

from peewee import * 
#sqlite is used for easy testing. 
mysql_db = SqliteDatabase('test.db') 


class BaseModel(Model): 

    class Meta: 
     database = mysql_db 

    __metaclass__ = Meta 

Je ne sais pas comment je peux résoudre ce problème, je suis nouveau à Python. Mon objectif principal est de faire fonctionner le programme avec plusieurs classes. C'est pourquoi j'essaie de faire fonctionner flask classy.

Une façon de résoudre ce problème sans flask classy est tout aussi bienvenue que toute autre solution. Si vous n'utilisez pas le flacon chic, c'est plus facile, je vais essayer.

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

class Meta(type): 
    database = mysql_db 

Quand je change le code à ce que je reçois l'erreur suivante:
TypeError: Erreur lors de l'appel du conflit des bases de métaclasse: la métaclasse d'une classe dérivée doit être une sous-classe (non-stricte) des métaclasses de toutes ses bases

Répondre

0

J'ai réussi à résoudre le problème en n'utilisant pas flask-classy. Au lieu de cela, j'utilise des plans, flask documentation. Je n'ai plus besoin de BaseModel et de FlakView, seul le BaseModel est nécessaire maintenant.

Voici mon code de travail:
Je n'ai plus besoin de FlaskView parce que je n'utilise plus de flak-classy. Plus d'erreur de méta-classe!

_ _.py initialisation

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 
Questions connexes