2012-09-02 38 views
22

Tôi đang viết một mô-đun python sẽ chứa một số hàm sẽ thao tác cơ sở dữ liệu mongodb.Xác thực dữ liệu đơn giản

Làm cách nào để xác thực dữ liệu đầu vào được truyền cho hàm đó trước khi lưu vào cơ sở dữ liệu? Ví dụ:

Ví dụ: giả sử một trong các hàm trong mô-đun là createUser(user) chấp nhận từ điển python làm đối số. Từ điển này chứa thông tin người dùng để lưu vào cơ sở dữ liệu. Tôi muốn tạo một quy trình xác nhận tự động để kiểm tra xem cấu trúc từ điển có phù hợp với cấu trúc cơ sở dữ liệu hay không.

+0

Tôi không thực sự quen thuộc với điều này, nhưng tôi nghĩ bạn có thể muốn sử dụng ORM (xem http://stackoverflow.com/questions/2781682/mongodb-orm-for-python) - mặc dù bạn sẽ mất tính linh hoạt của một NoSQL DB. –

+0

Cảm ơn. Tôi biết về khả năng sử dụng ORM nhưng trong trường hợp này tôi muốn trực tiếp thao tác cơ sở dữ liệu MongoDB. – anujkk

+2

https://github.com/nicolaiarocci/cerberus/. Tôi thích khiêu gợi nhưng bây giờ thích cerberus. Tất cả các quy tắc có thể được khai báo trong một tệp yaml có thể đọc được của con người như trái ngược với sự cần thiết cho các callables trong các thư viện khiêu dâm và các thư viện khác. – chishaku

Trả lời

2

Tôi phát hành "pyvaru" (https://github.com/daveoncode/pyvaru) cách đây vài ngày, đây là thư viện xác thực dữ liệu đơn giản, linh hoạt và không phô trương cho Python 3 (3.4+), dựa trên khái niệm quy tắc xác thực.

Trích từ doc:

Với một mô hình hiện để xác nhận, như hình dưới đây (nhưng nó có thể là một từ điển đơn giản hoặc bất kỳ cấu trúc dữ liệu kể từ pyvaru không thực hiện bất kỳ giả định trên các dữ liệu định dạng):

class User: 
    def __init__(self, first_name: str, last_name: str, date_of_birth: datetime, sex: str): 
     self.first_name = first_name 
     self.last_name = last_name 
     self.date_of_birth = date_of_birth 
     self.sex = sex 

chúng tôi phải xác định một validator, bằng cách thực hiện các get_rules() phương pháp và cho từng lĩnh vực, chúng tôi muốn xác chúng ta phải cung cấp một hoặc nhiều quy tắc thích hợp (s).

from pyvaru import Validator 
from pyvaru.rules import TypeRule, FullStringRule, ChoiceRule, PastDateRule 

class UserValidator(Validator): 
    def get_rules(self) -> list: 
     user = self.data # type: User 
     return [ 
      TypeRule(apply_to=user, 
        label='User', 
        valid_type=User, 
        error_message='User must be an instance of user model.', 
        stop_if_invalid=True), 
      FullStringRule(user.first_name, 'First name'), 
      FullStringRule(user.last_name, 'Last name'), 
      ChoiceRule(user.sex, 'Sex', choices=('M', 'F')), 
      PastDateRule(user.date_of_birth, 'Date of birth') 
     ] 

Cuối cùng chúng ta có hai lựa chọn về cách sử dụng validator tùy chỉnh của chúng tôi:

Là một bộ xử lý ngữ cảnh:

with UserValidator(user): 
    # do whatever you want with your valid model 

Trong trường hợp này mã bên trong với sẽ chỉ được thực hiện nếu xác nhận thành công, nếu không một ValidationException (có chứa một tài sản validation_result với báo cáo thích hợp) được nêu ra.

Bằng cách gọi phương thức validate() (mà trả về một ValidationResult)

validation = UserValidator(user).validate() 
if validation.is_successful(): 
    # do whatever you want with your valid model 
else: 
    # you can take a proper action and access validation.errors 
    # in order to provide a useful message to the application user, 
    # write logs or whatever 

Giả sử chúng ta có một thể hiện của một tài khoản cấu hình như hình dưới đây:

user = User(first_name=' ', 
      last_name=None, 
      date_of_birth=datetime(2020, 1, 1), 
      sex='unknown') 

Bằng cách chạy một xác nhận với các quy tắc được xác định trước đó, chúng tôi sẽ nhận được một ValidationResult với các lỗi sau:

{ 
    'First name': ['String is empty.'], 
    'Last name': ['Not a string.'], 
    'Sex': ['Value not found in available choices.'], 
    'Date of birth': ['Not a past date.'] 
} 
Các vấn đề liên quan