校验字段的局部钩子和全局钩子源码分析

view中使用is_valid()方法:

 def post(self, request, *args, **kwargs):
        # 新增
        response = {'status': 100, 'msg': '新增成功'}
        book_ser = BookSerializer(data=request.data)
        # 提交的字段校验通过
        if book_ser.is_valid():
            book_ser.save()
            response['book'] = book_ser.data
        else:
            response['msg'] = book_ser.errors
        return Response(response)

局部钩子和全局钩子函数代码

#局部钩子
    def validate_title(self,value):
        from rest_framework import exceptions
        if value.startswith('sb'):
            raise exceptions.ValidationError('xxx')
        return value
#全局
def validate(self, attrs):
    from rest_framework import exceptions
    if attrs.get('title')== attrs.get('title2'):
        return attrs
    else:
        raise exceptions.ValidationError('不想等啊')

通过is_valid()方法找到源码中的run_validation


最后执行self.to_internal_value(data)

流程总结:

  • is_valid---->self.run_validation-(执行Serializer的run_validation)
  • 然后执行self.to_internal_value(data)
  • 循环字段,完成校验功能

原文地址:https://www.cnblogs.com/wanlei/p/10426517.html

时间: 2024-08-30 07:10:14

校验字段的局部钩子和全局钩子源码分析的相关文章

Django框架(十六)—— forms组件、局部钩子、全局钩子

forms组件.局部钩子.全局钩子 一.什么是forms组件 forms组件就是一个类,可以检测前端传来的数据,是否合法. 例如,前端传来的邮箱数据,判断邮件格式对不对,用户名中不能以什么开头,等等 二.forms组件的使用 1.使用语法 from django.shortcuts import render, HttpResponse from django import forms # 1.先写一个类,继承Form class MyForm(forms.Form): # 定义一个属性,可以用

Django框架(十四)-- forms组件、局部钩子、全局钩子

一.什么是forms组件 forms组件就是一个类,可以检测前端传来的数据,是否合法. 例如,前端传来的邮箱数据,判断邮件格式对不对,用户名中不能以什么开头,等等 二.forms组件的使用 1.使用语法 from django.shortcuts import render, HttpResponse from django import forms # 1.先写一个类,继承Form class MyForm(forms.Form): # 定义一个属性,可以用来校验字符串类型 # 限制最大长度是

Django REST framework之序列化组件以及源码分析+全局、局部Hook

序列化两大功能 a.对queryset类型进行序列化 b.对用户请求的数据进行校验 a.对queryset类型进行序列化 举例说明: 表设计 1 from django.db import models 2 3 4 class UserGroup(models.Model): 5 title = models.CharField(max_length=32) 6 7 8 class UserInfo(models.Model): 9 user_type_choices = ( 10 (1, '普

源码分析之FastJson全局配置日期格式导致@JSONField(format = "yyyy-MM-dd")注解失效

出现的问题 我全局配置的时间格式是:yyyy-MM-dd HH:mm:ss @JSONField注解配置的时间格式是:yyyy-MM-dd 最终的返回结果是:yyyy-MM-dd HH:mm:ss 问题:为啥不是以注解定义的时间格式为主呢? 先说答案,后面再分析: FastJson的全局配置日期格式会导致@JSONField注解失效 使用建议: 1.若全局配置了日期格式,就不要使用@JSONField注解 2.若想使用@JSONField注解,就不要全局配置日期格式 一.FastJson全局配置

HDFS源码分析数据块校验之DataBlockScanner

DataBlockScanner是运行在数据节点DataNode上的一个后台线程.它为所有的块池管理块扫描.针对每个块池,一个BlockPoolSliceScanner对象将会被创建,其运行在一个单独的线程中,为该块池扫描.校验数据块.当一个BPOfferService服务变成活跃或死亡状态,该类中的blockPoolScannerMap将会更新. 我们先看下DataBlockScanner的成员变量,如下: // 所属数据节点DataNode实例 private final DataNode

利用debug钩子拦截全局钩子,经典反黑客技术

// 键盘钩子消息处理过程LRESULT CALLBACK DebugProc ( int nCode, WPARAM wParam, LPARAM lParam ){ if ( nCode == HC_ACTION ) {  PDEBUGHOOKINFO pDebugHookInfo = (PDEBUGHOOKINFO)lParam ;  switch ( wParam )  {  case WH_KEYBOARD:  case WH_MOUSE:   {    // 如果钩子不是由当前DEB

jQuery-1.9.1源码分析系列(七) 钩子(hooks)机制及浏览器兼容

处理浏览器兼容问题实际上不是jQuery的精髓,毕竟让技术员想方设法取弥补浏览器的过错从而使得代码乱七八糟不是个好事.一些特殊情况的处理,完全实在浪费浏览器的性能:突兀的兼容解决使得的代码看起来既不美观也也不能对前端技术有任何提升.但是不管怎么说,只要不同的浏览器存在,就有可能出现兼容性问题,我们还必须去解决.比较好的是jQuery提供了一些比较优雅的浏览器兼容方案. 在处理浏览器兼容问题的时候最没有技术含量的方式是if…else..分支判断.jQuery中用到很多处理兼容的方法:多用于普通兼容

线程专用钩子和全局钩子的区别

其实就是全局和局部的区别 如果可以用线程Hook实现就最好用线程Hook 因为Hook技术用的不好会大大降低整个Windows系统的性能 这也是为什么WinCE不支持HOOK的原因了 至于键盘HOOK用SetWindowsHookEx带WH_KEYBOARD参数就可以了 比如你做一个全局的键盘HOOK,这样不管当前激活的应用程序是什么 只要有键盘消息,windows都会先问问你的Hook Proc, "老第,这个键如何啊?" 完了你的Hook Proc拿过来左看右看, 最后说 &quo

sshe源码分析——全局架构

在Web.xml中 <!-- 需要拦截的JSP --> <filter> <filter-name>sessionFilter</filter-name> <filter-class>sy.util.base.SessionFilter</filter-class> <init-param> <param-name>include</param-name> <!-- 在securityJsp这