Tronado自定义Form组件
一、获取类里面的静态属性以及动态属性的方法
方式一:

# ===========方式一================
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组件的更多相关文章
- Tronado【第2篇】:tronado自定义Form组件
Tronado自定义Form组件 一.获取类里面的静态属性以及动态属性的方法 方式一: # ===========方式一================ class Foo(object): user ...
- 仿照wtform自定义Form组件
仿照wtforms自定义Form组件 1.wtforms 点击查看源码分析及使用方法 2.自定义Form组件 #!usr/bin/env python # -*- coding:utf-8 -*- f ...
- 自定义Form组件
一.wtforms源码流程 1.实例化流程分析 # 源码流程 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...
- Flask学习【第10篇】:自定义Form组件
wtforms源码流程 实例化流程分析 1 # 源码流程 2 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...
- Flask【第10篇】:自定义Form组件
自定义Form组件 一.wtforms源码流程 1.实例化流程分析 1 # 源码流程 2 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: ...
- BBS论坛 自定义form组件
二.自定义form组件 from django import forms from django.forms import widgets from app01 import models # 定制f ...
- Flask系列(十)自定义Form组件
一.wtforms源码流程 1.实例化流程分析 # 源码流程 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...
- 基于wtforms源码实现自定义form组件
from flask import Flask,Markup,render_template,request,redirect from wtforms.form import Form from w ...
- 基于Django Form源码开发自定义Form组件
import copy import re class ValidateError(Exception): def __init__(self, detail): self.detail = deta ...
随机推荐
- 搭建jenkins集群
搭建jenkins集群是为了解决单点服务器存在的性能瓶颈,也有业务的需要,比如:java服务打包的环境我们需要linux,ios打包的服务器需要mac机. 一.创建agent节点 1.打开 系统管理- ...
- ADNI数据
之前整理的数据相关内容 数据的模态有 Clinical Data(临床数据) Genetic(基因数据) MRI PET BIOSPECIMEN(生物样本) 各模态数据的内容.特点 Clinical ...
- bootstrap3中container与container_fluid的区别
.container与.container_fluid是bootstrap中的两种不同类型的外层容器,按照官方的说法,这两者的区别是: .container 类用于固定宽度并支持响应式布局的容器. . ...
- 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- 阿里云 Ubuntu16.04 apache2 ssl证书下载与安装(必须有域名)
阿里云申请免费SSL证书并下载(包含xxx.key|xxx._root_bundle.crt|xxx._public.crt三个文件) 用https是自己的网站收到保护,不易被攻克,所以保护自己的网站 ...
- LInux Crontab及命令
定时任务(cron job)被用于安排那些需要被周期性执行的命令.利用它,你可以配置某些命令或者脚本,让它们在某个设定的时间内周期性地运行.cron 是 Linux 或者类 Unix 系统中最为实用的 ...
- C#7.2——编写安全高效的C#代码
原文地址:https://docs.microsoft.com/zh-cn/dotnet/csharp/write-safe-efficient-code?view=netcore-2.1 值类型的优 ...
- Python 练习:简单的购物车(二)
优化了上一个购物车程序:http://www.cnblogs.com/klvchen/p/8577269.html #输入工资salary = input("Please input you ...
- The open source JavaScript graphing library that powers Plotly
https://plot.ly/javascript/time-series/ https://plot.ly/javascript/ https://github.com/plotly/plotly ...
- CSS之fontAwesome代替网页icon小图标
引言 奥森图标(Font Awesome)提供丰富的矢量字体图标—通过CSS可以任意控制所有图标的大小 ,颜色,阴影. 网页小图标到处可见,如果一个网页都是干巴巴的文字和图片,而没有小图标,会显得非常 ...