Skip to content

请求解析工具

说明

utils/common.py 提供请求数据解析相关的工具函数,核心函数 parse_request_body() 用于解析请求体 JSON 数据。这些工具函数在各业务模块中广泛使用。

parse_request_body

解析请求体 JSON 数据,返回 (data, error) 元组。这是业务模块中最常用的请求解析函数。

python
# utils/common.py
def parse_request_body(request):
    """
    解析请求体JSON数据

    Args:
        request: HttpRequest对象

    Returns:
        tuple: (data, error)
               成功时 data 为解析后的字典,error 为 None
               失败时 data 为 None,error 为错误描述字符串
    """
    try:
        if not hasattr(request, 'body') or request.body is None:
            return None, None
        if not request.body:
            return None, "参数不能为空"

        json_data = request.body.decode('utf-8')
        if not json_data:
            return None, "参数不能为空"

        data = json.loads(json_data)
        return data, None

    except json.JSONDecodeError as e:
        return None, "参数格式错误"
    except UnicodeDecodeError as e:
        return None, "参数编码错误"
    except Exception as e:
        return None, "参数处理失败"

使用示例:

python
def add_example(request):
    # 解析请求参数
    data, error = parse_request_body(request)
    if error:
        return R.failed(msg=error)

    # 使用解析后的数据
    name = data.get('name')
    status = data.get('status')
    # ...

温馨提示

parse_request_body() 返回元组 (data, error),成功时 data 为字典、error 为 None;失败时 data 为 None、error 为错误描述字符串。调用方应先检查 error 再使用 data

GET 参数获取

Django 中获取 GET 查询参数使用 request.GET

python
def get_example_page(request):
    # 获取分页参数
    page_no = int(request.GET.get('pageNo', 1))
    page_size = int(request.GET.get('pageSize', PAGE_SIZE))

    # 获取筛选参数
    name = request.GET.get('name')
    status = request.GET.get('status')

    if name:
        queryset = queryset.filter(name__contains=name)
    if status:
        queryset = queryset.filter(status=status)

POST 表单参数

获取 POST 表单数据使用 request.POST

python
def upload_file(request):
    # 获取上传的文件
    file = request.FILES.get('file')

    # 获取表单字段
    field_name = request.POST.get('name', '')

文件上传参数

获取上传文件使用 request.FILES

python
file = request.FILES.get('file')
if file:
    original_name = file.name       # 原始文件名
    file_size = file.size           # 文件大小
    # 分块读取文件内容
    for chunk in file.chunks():
        f.write(chunk)

表单错误处理

utils/regular.py 中的 get_err() 函数用于提取 Django 表单验证错误信息:

python
# utils/regular.py
def get_err(form):
    """
    获取表单错误文本,多个错误用'/'分隔

    使用示例:
        form = UserForm(data)
        if not form.is_valid():
            error_msg = get_err(form)
            return R.failed(msg=error_msg)
    """
    error_list = []
    for item in form.errors.get_json_data().values():
        error_list.append(item[0].get('message'))
    return '/'.join(error_list)

参数格式化(日志用)

format_params() 函数将请求参数格式化为 JSON 字符串,自动过滤敏感字段:

python
# utils/common.py
def format_params(params):
    """
    格式化请求参数,自动过滤密码等敏感字段
    敏感字段值替换为 '******'
    """
    sensitive_fields = ['password', 'old_password', 'new_password', 'confirm_password']
    if isinstance(params, dict):
        params_copy = params.copy()
        for field in sensitive_fields:
            if field in params_copy:
                params_copy[field] = '******'
        return json.dumps(params_copy, ensure_ascii=False)
    return json.dumps(params, ensure_ascii=False)

日期格式化

python
# utils/common.py
def format_datetime(dt, format_str='%Y-%m-%d %H:%M:%S'):
    """格式化日期时间对象为字符串"""
    return dt.strftime(format_str) if dt else None

总结

请求解析工具函数覆盖了 JSON 请求体解析、GET/POST 参数获取、文件上传、表单验证错误提取等常见场景。parse_request_body() 是最核心的函数,返回 (data, error) 元组,调用方应先检查错误再使用数据。get_err() 将 Django 表单验证错误转换为可读字符串。

小蚂蚁云团队 · 提供技术支持