一、获取类里面的静态属性以及动态属性的方法

方式一:

# ===========方式一================
class Foo(object):
user = 123
def __init__(self):
self.name = 123
self.age = 456
def aaa(self):
self.name = 'sd'
obj = Foo()
# print(obj.__dict__) #获取对象属性
# print(Foo.__dict__) #获取类里面的所有属性以及方法等

方式二:

# ===============方式二==================
class Foo2(object):
A = 123
def __init__(self):
self.name = 'haiyan'
self.age = 22
# print(self.__class__.field) #获取当前类的
def __new__(cls, *args, **kwargs):
print(cls.__dict__)
return object.__new__(cls) Foo2()

二、自定义Form组件示例

import re
import copy
class ValidateError(Exception) :
'''自定义异常'''
def __init__(self,detail):
self.detail = detail # ===========自定义插件===============
class TextInput(object):
def __str__(self):
return '<input type="text">' class EmailInput(object):
def __str__(self):
return '<input type="email">' # ============字段:内部包含正则用于验证======================
class Field(object):
def __init__(self,required=True,error_message=None, widgets= None):
self.required = required
self.error_message = error_message
if not widgets:
self.widgets = TextInput() #设置默认
else:
self.widgets = widgets def __str__(self):
# return self.widgets
return str(self.widgets) #将对象转成字符串 class CharField(Field): def valid(self,val):
if self.required:
if not val:
msg = self.error_message['required']
raise ValidateError(msg) #调用自定义的异常
return val class EmailField(Field):
ERG = "^\w+@\w+$"
def valid(self,val):
if self.required:
if not val:
msg = self.error_message['required']
raise ValidateError(msg)
# print(val, type(val))
result = re.match(self.ERG,val)
if not result:
msg = self.error_message.get('invalid','格式错误')
raise ValidateError(msg)
return val # ==========================
class Form(object):
def __init__(self,data):
# print(UserForm.__dict__)#获取派生类中的所有静态字段
# print(self.__class__.__dict__) #静态动态的获取类中的所有静态字段
self.data = data
self.fields = copy.deepcopy(self.__class__.declare_field) #获取字段
self.clean_data = {}
self.errors = {}
def __new__(cls, *args, **kwargs): #在__new__里面也可以获取类中的所有静态字段
declare_field = {}
for field_name , field in cls.__dict__.items():
# print(field_name,field)
if isinstance(field,Field):
declare_field[field_name] = field
cls.declare_field = declare_field
return object.__new__(cls) #创建对象 def is_valid(self):
#用户提交的数据
# self.data #{'username':"zzz","pwd":18}
# self.fields #{'username': CharField(),"pwd": EmailField()}
for field_name , field in self.fields.items():
try:
input_val = self.data.get(field_name)
# print("---------------",field_name,input_val)
val = field.valid(input_val) #内置的验证规则自己去验证
method = getattr(self,"clean_%s"%field_name,None) #默认为None
if method:
val = method(val)
self.clean_data[field_name] = val
except ValidateError as e:
self.errors[field_name] = e.detail
return len(self.errors) ==0 #根据错误的返回,如果没有错误返回True,有错误返回False def __iter__(self): ##########自定义生成标签3
return iter(self.fields.values()) #返回的是一个迭代器 # =======================
class UserForm(Form):
username = CharField(error_message={'required': '用户名不能为空'}, widgets=TextInput())
# email = EmailField(error_message={'required': '密码不能为空', 'invalid': '邮箱格式错误'}, widgets=EmailInput()) obj = UserForm(data={'username':"haiyan","email":"dsfsgd"})
if obj.is_valid():
print(obj.clean_data)
else:
print(obj.errors)

Tronado自定义Form组件的更多相关文章

  1. Tronado【第2篇】:tronado自定义Form组件

    Tronado自定义Form组件 一.获取类里面的静态属性以及动态属性的方法 方式一: # ===========方式一================ class Foo(object): user ...

  2. 仿照wtform自定义Form组件

    仿照wtforms自定义Form组件 1.wtforms 点击查看源码分析及使用方法 2.自定义Form组件 #!usr/bin/env python # -*- coding:utf-8 -*- f ...

  3. 自定义Form组件

    一.wtforms源码流程 1.实例化流程分析 # 源码流程 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...

  4. Flask学习【第10篇】:自定义Form组件

    wtforms源码流程 实例化流程分析 1 # 源码流程 2 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...

  5. Flask【第10篇】:自定义Form组件

    自定义Form组件 一.wtforms源码流程 1.实例化流程分析 1 # 源码流程 2 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: ...

  6. BBS论坛 自定义form组件

    二.自定义form组件 from django import forms from django.forms import widgets from app01 import models # 定制f ...

  7. Flask系列(十)自定义Form组件

    一.wtforms源码流程 1.实例化流程分析 # 源码流程 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...

  8. 基于wtforms源码实现自定义form组件

    from flask import Flask,Markup,render_template,request,redirect from wtforms.form import Form from w ...

  9. 基于Django Form源码开发自定义Form组件

    import copy import re class ValidateError(Exception): def __init__(self, detail): self.detail = deta ...

随机推荐

  1. (转)创建GitHub技术博客

    https://blog.csdn.net/renfufei/article/details/37725057

  2. thinkphp如何利用反射实现钩子方法

    ThinkPHP框架的控制器模块是如何实现 前控制器.后控制器,及如何执行带参数的方法? PHP系统自带的 ReflectionClass.ReflectionMethod 类,可以反射用户自定义类的 ...

  3. PHP官方网站及PHP手册

    每个人都知道php.net,我们或早或晚的都会来到这里并不断的访问它.它是PHPer的主要参考网站,拥有大量有用的信息,但是这些信息却不是那么显而易见. 比较有用的官方PHP资源: PHP官方函数手册 ...

  4. 轻量级.NET CORE ORM框架Insql使用教程

    Insql 国人开发,是一款汲取 Mybatis 优点的.NET ORM 框架.追求简单直观,使用自由灵活等特点. 项目主页:https://rainrcn.github.io/insql 此 ORM ...

  5. 从零搭建生产环境的ghost2.0博客

    当前安装过程是在ghost cli 1.9.2上的,由于ghost更新特别快,我安装我个人博客cmlanche.com的时候还是1.9.1,当时没碰到啥问题,到1.9.2就有一点点不一样了,所以要注意 ...

  6. InnoDB存储引擎概览

    InnoDB存储引擎概览   InnoDB存储引擎以其平衡了高可靠性和高性能性而闻名遐迩,在MySQL 8.0版本中,InnoDB存储引擎是默认的存储引擎.(历史追溯从MySQL 5.5.5版本开始, ...

  7. 通向全栈之路(6)—无密码ssh连接

    (1)在用户目录下新增一个 .ssh文件 mkdir .ssh (2)生成公钥.私钥 ssh-keygen -t rsa -b 4096 -C "mail@xxx.com" (3) ...

  8. Java基础——Ajax(二)

    一.jQuery 实现 ajax $(function(){ $("#userName").blur(function(){ // 发ajax请求 用的函数原型: $.get(ur ...

  9. What is The Rule of Three?

    Question: What does copying an object mean? What are the copy constructor and the copy assignment op ...

  10. 配置supervisor管理beego应用

    一.golang.beego等环境安装与配置 二.supervisor安装 github项目地址:https://github.com/Supervisor/supervisor 克隆项目:git c ...