Rapidjson поможет вам проверить параметры | Месяц темы Python

задняя часть Python

Эта статья участвует в "Месяце тем Python", подробнее см.Ссылка на мероприятие

Поиск по общедоступным номерам Wechat [Программа Юань Сяочжуан], Ленивый человек не может наслаждаться отдыхом~

предисловие

При использовании фреймворка Django для разработки проектов с отдельными интерфейсом и сервером обычно необходимо проверять параметры, передаваемые из интерфейса.Существует много способов проверки, вы можете использоватьdrfДля проверки также можно использоватьjsonПроверьте, эта статья представлена ​​​​на PythonrapidjsonОсновное использование и способы выполнения проверки параметров.

Внедрение и установка rapidjson

rapidjsonЭто синтаксический анализатор и сериализация C++ JSON с очень хорошей производительностью.Он упакован как пакет расширения для Python3, что означает, что его можно использовать в Python3.rapidjsonСериализация и десериализация данных и проверка параметров, что очень удобно и просто в использовании.

rapidjsonКоманда установки:pip install python-rapidjson.

Базовое использование Rapidjson

rapidjsonиjsonМодули одинаковы в основном использовании, за исключением того, чтоrapidjsonпо определенным параметрам иjsonМодули несовместимы.Эти параметры обычно не используются.Я не буду приводить здесь слишком много.Подробности см.rapidjsonофициальная документация. Базовое использование вводит два метода сериализацииdump/dumps, десериализованныйload/loadsиспользоватьjsonмодуль может быть.

dumps & dumpОба этих метода сериализуют объект экземпляра Python в строку в формате JSON, а их использование и параметры примерно одинаковы.dumpкоэффициент методаdumpsМетод имеет еще один необходимыйfile_likeпараметр.

метод дампов()

Результат, возвращаемый этим методом, представляет собой экземпляр строки Python. Параметров много, здесь представлены только три параметра, которые часто используются.

rapidjson.dumps(obj, *, skipkeys=False, ensure_ascii=True, write_mode=WM_COMPACT, indent=4, default=None, sort_keys=False, number_mode=None, datetime_mode=None, uuid_mode=None, bytes_mode=BM_UTF8, iterable_mode=IM_ANY_ITERABLE, mapping_mode=MM_ANY_MAPPING, allow_nan=True)

skipkeys

Этот параметр указывает, следует ли пропускать недоступный словарь.keyсериализовать, если по умолчаниюFalse, если изменить наTrueСловарьkeyЕсли это не основные типы данных (str int float bool None) пропуститkeyне бросаяTypeErrorисключение.

import rapidjson
from pprint import pprint

dic = {
    True: False,
    (0,): 'python'
}
res = rapidjson.dumps(dic)
pprint(res)  # TypeError: {True: False, (0,): 'python'} is not JSON serializable

res = rapidjson.dumps(dic, skipkeys=True)
pprint(res)  # '{}'

ensure_ascii

Этот параметр указывает, содержит ли сериализованный результат только символы ASCII. Значение по умолчанию равноTrue, все символы, отличные от ASCII, будут экранированы после сериализации экземпляра Python, если значение этого параметра изменено наFalse, добавление выведет символы такими, какие они есть.

dic = {
    'name': '丽丽',
    'name1': 'lili'
}
res = rapidjson.dumps(dic)
pprint(res)   # '{"name":"\\u4E3D\\u4E3D","name1":"lili"}'

res = rapidjson.dumps(dic, ensure_ascii=False)
pprint(res)  # '{"name":"丽丽","name1":"lili"}'

sort_keys

Этот параметр указывает, будет ли словарь при сериализацииkeyСортировать по алфавиту. По умолчаниюFalse, если изменить наTrue, результат сериализации словаря соответствует словарюkeyотсортированы по алфавиту.

dic = {
    'name': '丽丽',
    'age': '10'
}
res = rapidjson.dumps(dic, ensure_ascii=False, sort_keys=True)
pprint(res)  # '{"age":"10","name":"丽丽"}'

метод дамп()

этот метод иdumpsМетод очень похож, за исключением того, что метод принимает один дополнительный обязательный параметр — afile-likeДоступный для записи объект потока, такой как файловый объект, принимает первый аргументobjСериализация и запись в доступный для записи объект потока.

rapidjson.dump(obj, stream, *, skipkeys=False, ensure_ascii=True, write_mode=WM_COMPACT, indent=4, default=None, sort_keys=False, number_mode=None, datetime_mode=None, uuid_mode=None, bytes_mode=BM_UTF8, iterable_mode=IM_ANY_ITERABLE, mapping_mode=MM_ANY_MAPPING, chunk_size=65536, allow_nan=True)

Вот основное использование этого метода:

# 写入文件
dic = {
    'name': '丽丽',
    'age': '10'
}
f = open('1.py', 'w', encoding='utf8')
res = rapidjson.dump(dic, f)
pprint(res)

# 或者下面这种用法
import io

stream = io.BytesIO()
dump('bar', stream)
print(stream.getvalue())  # b'"bar"'

Validator class

rapidjsonсерединаValidatorКлассы можно использовать для проверки параметров.ValidatorПараметрыJSON schema, когда нам нужно знать, какие поля ожидаются в данных JSON и как представлены значения, этоJSON SchemaЕго использование представляет собой формат объявления для описания структуры данных JSON, и его также можно понимать как правило проверки параметров. еслиJSON schemaнедоступен в формате JSON, он выдастJSONDecodeErrorисключение.

Параметр класса является правилом проверки, если данные JSON не проходят проверку, они будут выброшеныValidationErrorИсключение состоит из трех частей: типа ошибки, правил проверки и позиции, в которой возникает ошибка в строке JSON.

import rapidjson
from pprint import pprint

validate = rapidjson.Validator('{"required": ["a", "b"]}')  # 表示a和b这两个参数是必须的
validate('{"a": null, "b": 1}')  # 符合规则
validate('{"a": null, "c": false}')  # rapidjson.ValidationError: ('required', '#', '#')
validate = rapidjson.Validator('{"type": "array",'  # 参数类型是array
                     ' "items": {"type": "string"},'  # array中的每个元素类型是string
                     ' "minItems": 1}')  # array中元素数量最少为1

validate('["foo", "bar"]')  # 符合规则
validate('[]')  #  rapidjson.ValidationError: ('minItems', '#', '#')

оJSON schemaДополнительные правила проверки параметров и спецификации определений см. *Официальный документ схемы JSON*, следующееJSON schemaФормат только для справки:

LOGIN_SCHEMA = {
    "type": "object",
    "properties": {
        "token": "string",
        "number": "integer"
    },
    "required": ["token"],
}   
}

validate = rapidjson.Validator(rapidjson.dumps(LOGIN_SCHEMA))
data = {
    'token': 'python',
    'number': 10
}
validate(rapidjson.dumps(data))

Эпилог

Статья была впервые опубликована в публичном аккаунте WeChat.Ченг Юань Сяочжуан, синхронизировано сНаггетс.

Кодировать слова непросто, объясните, пожалуйста, источник перепечатки, а маленькие друзья, которые проходят мимо, протягивают свои милые пальчики и ставят лайк перед уходом (╹▽╹)

image.png