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.']
}
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. –
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
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