2013-06-02 8 views
5

in Mongoengine 0.7.10, kann ich immer noch Dinge wie:Mongoengine 0.8.0 bricht meine benutzerdefinierte Set-Eigenschaft in Modellen

class User(db.Document): 
    email = db.EmailField(unique=True, required=True) 
    _password = db.StringField(max_length=255, required=True) 

    @property 
    def password(self): 
     return self._password 

    @password.setter 
    def password(self, password): 
     self._password = bcrypt.generate_password_hash(password) 
user = User(email='[email protected]', password='12345') 

die oben genannten Code bricht in 0.8.0 jedoch: ValidationError: ValidationError (User:None) (_password.Field is required: ['User'])

Es scheint, dass MongoEngine meinen benutzerdefinierten Passwort-Setter während der Initiierung nicht erkannt hat. Ich muss diese manuell schreiben, um es zu beheben:

user = User(email='[email protected]') 
user.password='12345' 

Dies ist wahrscheinlich auf Grund der folgenden Änderungen (ab Mongonengine 0.8 upgrading notes):

Previously, if you had data the database that wasn’t defined in the Document definition, it would set it as an attribute on the document. This is no longer the case and the data is set only in the document._data dictionary:

Ich möchte wissen, ob dies beabsichtigt ist oder es ein Fehler in MongoEngine? Was ist die beste Vorgehensweise, um den benutzerdefinierten Eigenschaften-Setter in mein Modell zu schreiben?

+0

Haben Sie versucht, '__init__' zu verlängern? –

+1

@ThomasOrozco Meinen Sie sich so? 'def __init __ (selbst, E-Mail, Passwort):' Mongoengine wird '_password' in' User.init() 'Methode übergeben, wenn mongoengine die Dokumente aus der Datenbank lädt. Dies würde die App zum Absturz bringen, weil die '__init__' Methode' _password' nicht akzeptiert. – Jiequan

+0

Sie sollten die Signatur der bereits existierenden Methode wiederverwenden, möglicherweise mit '* args' und' ** kwargs'. –

Antwort

1

Es ist kein Fehler - es räumt einige andere Fehler auf und war die beabsichtigte Aktion, wie in den Upgrade-Dokumenten erwähnt. Das ist jedoch nicht gut für diese Situation!

Ich denke, eine benutzerdefinierte Methode für das Passwort-Hash zu schaffen wäre besser, zB: set_password check_password etc ...

Es wird Kennwortauszuwählen Implementierungen in der Vergangenheit, und das ist etwas, was ich zu extras-mongoengine hinzufügen.

+0

Hallo Ross, Ich habe Ihr Update bezüglich PasswordField hier gesehen https://github.com/MongoEngine/extras-mongoengine/ Probleme/8, aber immer noch nicht herausfinden, wie man diesen Patch verwenden, ich benutze Mongoengine 0.8.7 und auch versuchen, neu zu installieren, wie hier Anleitung https://github.com/noQ/mongoengine aber wenn ich versuche zu verwenden PasswordField zeigt einen nicht definierten Fehler an. Auch in mongoengine.fields eingecheckt, aber es gibt kein PasswordField. Kannst du mir bitte helfen? :) – CrazyGeek

4

Versuchen Sie diesen Code:

class User(db.Document): 
    email = db.EmailField(unique=True, required=True) 
    _password = db.StringField(max_length=255, required=True, db_field='password') 

    def __init__(self, *args, **kwargs): 
      db.Document.__init__(self, *args, **kwargs) 

      if 'password' in kwargs: 
       self.password = kwargs['password'] 

    @property 
    def password(self): 
     return self._password 

    @password.setter 
    def password(self, password): 
     self._password = bcrypt.generate_password_hash(password) 
user = User(email='[email protected]', password='12345') 

Es funktioniert für mich.

+1

Auch wenn Sie es als 'Passwort' nicht als' _password' in db speichern möchten, tun Sie dies '_password = StringField (max_length = 255, erforderlich = True, db_field = 'password')' –

Verwandte Themen