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

方式一:

# ===========方式一================
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. lightswitch Grid 控件添加 CheckBox 多选

    ACTIVATING MULTI SELECTION WITH CHECKBOXES IN A LIGHTSWITCH GRID WITH A ONE-LINER 2013/04/02 · by pa ...

  2. 基于vue框架手写一个notify插件,实现通知功能

    简单编写一个vue插件,当点击时触发notify插件,dom中出现相应内容并且在相应时间之后清除,我们可以在根组件中设定通知内容和延迟消失时间. 1. 基础知识 我们首先初始化一个vue项目,删除不需 ...

  3. set get del

    //设置 $ob = new Redis(); $ob->connect('127.0.0.1', 6379); $re = $ob->set('str1', serialize(['a' ...

  4. 数据库MongoDB

    一.MongoDB简介 MongoDB是由c++语言编写的,是一个基于分布式文件存储的开源数据库系统,在高负载的情况下,添加更多的节点,可以保证服务器性能.MongoDB旨在为web应用提供扩展的高性 ...

  5. java awt学习笔记

    最近这两天,花了些时间温习了java.awt的学习,故今日花些时间写下自己的总结吧. 1.常见的组件:Button.TextArea.Label.Checkbox.TextField Containe ...

  6. SPI 驱动框架

    SPI 驱动框架 1. 枚举过程 drivers/spi/spi.c: spi_register_board_info /* 对于每一个spi_master,调用spi_match_master_to ...

  7. SQL 查看表每一个列的名字以及类型

    select a.name,b.name from sys.columns as a join sys.types as b on a.system_type_id=b.system_type_id ...

  8. session持久化到sqlserver

    每次想使用都会忘记单词,所幸记录下来.简单步骤记录. 第一步:找到cmd目录 输入:cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 进入该目录. 第二 ...

  9. 深入理解Java虚拟机--阅读笔记三

    垃圾收集器 手机算法是内存回收的方法论,垃圾收集器是内存回收的具体实现. 并行:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态 并发:值用户线程与垃圾收集线程同时执行(但并不一定是并行的) ...

  10. SQL Server 基本INSERT语句

    1.基本INSERT语句,单行插入 如果没有列出列,则使一一对应. 2.多行插入 3.INSERT INTO ... SELECT 语句 要插入的语句是从其他表中查询出来的. 注意:数据类型得相同或者 ...