2013-06-02 22 views
5

trong Mongoengine 0.7.10, tôi vẫn có thể làm những việc như:Mongoengine 0.8.0 nghỉ setter tài sản tùy chỉnh của tôi trong các mô hình

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') 

Tuy nhiên, phá vỡ mã trên trong 0.8.0: ValidationError: ValidationError (User:None) (_password.Field is required: ['User'])

Dường như MongoEngine không nhận dạng được mật khẩu tùy chỉnh của tôi trong quá trình bắt đầu. Tôi phải tự viết này để sửa chữa nó:

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

Đây có lẽ là do sự thay đổi dưới đây (từ 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:

Tôi muốn biết nếu điều này được dự định hoặc là nó là một lỗi trong MongoEngine? Thực hành tốt nhất để viết setter thuộc tính tùy chỉnh trong mô hình của tôi là gì?

+0

Bạn đã thử mở rộng '__init__' chưa? –

+1

@ThomasOrozco Bạn có nghĩa là mở rộng như thế này? 'def __init __ (self, email, password):' Mongoengine sẽ truyền '_password' vào phương thức' User.init() ', khi mongoengine tải các tài liệu từ cơ sở dữ liệu. Điều này sẽ làm hỏng ứng dụng vì phương thức '__init__' không chấp nhận' _password'. – Jiequan

+0

Bạn nên sử dụng lại chữ ký của phương thức đã tồn tại, có khả năng mở rộng bằng '* args' và' ** kwargs'. –

Trả lời

1

Nó không phải là một lỗi - nó làm sạch một số lỗi khác và là hành động dự định như đã đề cập trong các tài liệu nâng cấp. Tuy nhiên, điều đó không tốt cho tình huống này!

Tôi nghĩ rằng một phương pháp tùy chỉnh để tạo ra các hash mật khẩu sẽ tốt hơn ví dụ: set_password check_password vv ...

triển khai Đã có PasswordField trong quá khứ và đó là điều mà tôi sẽ thêm vào tính năng bổ sung-mongoengine.

+0

Xin chào Ross, tôi đã thấy bản cập nhật của bạn về PasswordField tại đây https://github.com/MongoEngine/extras-mongoengine/ vấn đề/8 nhưng vẫn không thể tìm ra cách sử dụng miếng vá này, tôi đang sử dụng mongoengine 0.8.7 và cũng cố gắng cài đặt lại theo hướng dẫn tại đây https://github.com/noQ/mongoengine NHƯNG Khi tôi cố gắng sử dụng PasswordField nó hiển thị lỗi không xác định. Ngoài ra kiểm tra trong mongoengine.fields nhưng không có PasswordField. Bạn có thể vui lòng giúp tôi không. :) – CrazyGeek

4

Hãy thử mã này:

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') 

Nó làm việc cho tôi.

+1

Ngoài ra nếu bạn muốn lưu nó dưới dạng 'mật khẩu' không phải là' _password' trong db, thì hãy làm điều này '_password = StringField (max_length = 255, bắt buộc = True, db_field = 'password')' –

Các vấn đề liên quan