tornado 公共模块分页 + from验证
公共模块分页
#!/usr/bin/env/python # -*- coding:utf-8 -*- #!/usr/bin/env python # -*- coding:utf-8 -*- class Pagenation: def __init__(self,current_page,all_item,base_url): """ :param current_page: 当前页 :param all_item: 所有数据总条数 :param base_url: 提交url 例如 /index/ :param per_items: 每页显示内容条数 """ try: page = int(current_page) #如果输入值不是int行则默认为第一页 except: page = 1 if page < 1: page = 1 all_pager, c = divmod(all_item, 5) #每页的内容设置为5条,超出时下一页显示 if c > 0: all_pager += 1 # 如果余数大于0,说明还需要另一页来显示 self.current_page = page # 当前页 self.all_pager = all_pager # 每页的数据 self.base_url = base_url #提交 url @property def start(self): return (self.current_page - 1) * 5 # 返回内容开始的取值范围 @property def end(self): return self.current_page * 5 # 返回内容开始的取值范围 def string_pager(self): list_page = [] if self.all_pager < 11: #设置一页显示11个页码 如果总页数为小于11的话,无论点那一页默认显示全部 s = 1 #页码开始为1 t = self.all_pager + 1 #页码结束为总页码 else: # 总页数大于11 if self.current_page < 6: #当页码大于11的时候,又分当前页码如果小于6时,显示1-12的页码 s = 1 t = 12 else: if (self.current_page + 5) < self.all_pager: # 如果当前页的数+5 据大于 每页数据时 s = self.current_page - 5 # 显示0条数据 t = self.current_page + 5 + 1 # 显示6条数据 else: s = self.all_pager - 11 t = self.all_pager + 1 # 首页 first = '<a href="/table/1">首页</a>' list_page.append(first) # 上一页 # 当前页 page if self.current_page == 1: prev = '<a href="javascript:void(0);">上一页</a>' else: prev = '<a href="/table/%s">上一页</a>' % (self.current_page - 1,) list_page.append(prev) for p in range(s, t): # 1-11 if p == self.current_page: temp = '<a class="active" href="/index/%s">%s</a>' % (p, p) else: temp = '<a href="/table/%s">%s</a>' % (p, p) list_page.append(temp) if self.current_page == self.all_pager: nex = '<a href="javascript:void(0);">下一页</a>' else: nex = '<a href="/table/%s">下一页</a>' % (self.current_page + 1,) list_page.append(nex) # 尾页 last = '<a href="/index/%s">尾页</a>' % (self.all_pager,) list_page.append(last) # 跳转 jump = """<input type='text' /><a onclick="Jump('%s',this);">GO</a>""" % ('/table/') script = """<script> function Jump(baseUrl,ths){ var val = ths.previousElementSibling.value; if(val.trim().length>0){ location.href = baseUrl + val; } } </script>""" list_page.append(jump) list_page.append(script) str_page = "".join(list_page) #插入跳转的页数 return str_page
class TableHandler(tornado.web.RequestHandler): def get(self, pager): #(pager) 页数 print(self.request.uri) conn = orm.session LIST_INFO = conn.query(orm.Userinfo.nid, orm.Userinfo.user, orm.Userinfo.pwd, orm.Userinfo.email, orm.Userinfo.ctime).all() obj = page.Pagenation(pager,len(LIST_INFO), '/table/') #细节需要注意 #获取当前页的数据 pager为页数 print(obj) # obj = pager.Pagenation(page, len(LIST_INFO), '/table/') current_list = LIST_INFO[obj.start:obj.end] # 当前页开始结束值 str_page = obj.string_pager() print(current_list,'-------------->',obj.current_page,'-------------->',str_page) self.render('table.html', list_info=current_list, current_page=obj.current_page, str_page=str_page) #查询到数据 # 当前页 #插入跳转的页数 class qqqqHandler(tornado.web.RequestHandler): def get(self): self.render('qqqq.html') settings = { 'template_path': 'views', 'static_path': 'static', 'static_url_prefix': '/sss/', } application = tornado.web.Application([ (r'/table/(?P<pager>\d*)', TableHandler) ], **settings) if __name__ == '__main__': application.listen(8888) tornado.ioloop.IOLoop.instance().start()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/sss/css/index.css"> <style> .pager a{ display: inline-block; padding: 5px; margin: 3px; background-color: cadetblue; } .pager a.active{ background-color: brown; color: white; } </style> </head> <body> <form action="/table/{{current_page}}" method="post"></form> <table border="5px"> <tr> <th>标号</th> <th> 用户名</th> <th>密码</th> <th>邮箱</th> <th>时间戳</th> </tr> {% for item in list_info %} <tr> <td>{{ item[0] }}</td> <td>{{ item[1] }}</td> <td>{{ item[2] }}</td> <td>{{ item[3] }}</td> <td>{{ item[4] }}</td> </tr> {% end %} </table> <div class="pager"> {% raw str_page %} </div> </body> </html>
from验证
#!/usr/bin/env python # -*- coding:utf-8 -*- import re import os class Field: def __init__(self): self.is_valid = False # 默认 为没匹配成功 self.name = None # 定义的html的name属性 self.value = None # 用户输入的值 self.error = None #定义为错误的信息 def match(self, name, value): #被 BaseForm中match 调用 name代表field_name(用户输入的值) value 代表post_value(列表中的值) self.name = name # name属性 = 用户输入的值 if not self.required: # required是False,则不做验证,直接返回值。 self.is_valid = True # 匹配成功 self.value = value #用户输入的值 else: if not value: #假设没有值 则给出报错信息 if self.custom_error_dict.get('required', None): #查看 有没有自定义错误信息 self.error = self.custom_error_dict['required'] # 有自定义错误信息调用 else: self.error = "%s is required" % name # 没有自定义信息则默认 else: ret = re.match(self.REGULAR, value) #如果有值,则做验证,如果验证成功返回匹配结果,没有成功返回自定义(优先记高)或默认值 if ret: self.is_valid = True self.value = value else: if self.custom_error_dict.get('valid', None): self.error = self.custom_error_dict['valid'] else: self.error = "%s is invalid" % name class StringField(Field): REGULAR = "^.*$" def __init__(self, custom_error_dict=None, required=True): # custom_error_dict错误的信息,#required为True 表示必须填值并且验证 为Fleas可以不填值不做验证 # 封装了错误的信息, self.custom_error_dict = {} #定义空字典封装错误信息 # {'required': 'IP不能为空', 'valid': 'IP格式错误'} if custom_error_dict: # 如果字典里有错误信息 self.custom_error_dict.update(custom_error_dict) #将错误的信息更新到字典中,也就是定制化错误优先级最高! self.required = required # 必须填值 super(StringField, self).__init__() #调用StringField类 执行 __init__方法 class IPField(Field): REGULAR = "^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$" def __init__(self, custom_error_dict=None, required=True): self.custom_error_dict = {} # {'required': 'IP不能为空', 'valid': 'IP格式错误'} if custom_error_dict: self.custom_error_dict.update(custom_error_dict) self.required = required super(IPField, self).__init__() class EmailField(Field): REGULAR = "^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$" def __init__(self, custom_error_dict=None, required=True): self.custom_error_dict = {} # {'required': 'IP不能为空', 'valid': 'IP格式错误'} if custom_error_dict: self.custom_error_dict.update(custom_error_dict) self.required = required super(EmailField, self).__init__() class IntegerField(Field): REGULAR = "^\d+$" def __init__(self, custom_error_dict=None, required=True): self.custom_error_dict = {} # {'required': 'IP不能为空', 'valid': 'IP格式错误'} if custom_error_dict: self.custom_error_dict.update(custom_error_dict) self.required = required super(IntegerField, self).__init__() class CheckBoxField(Field): REGULAR = "^\d+$" def __init__(self, custom_error_dict=None, required=True): self.custom_error_dict = {} # {'required': 'IP不能为空', 'valid': 'IP格式错误'} if custom_error_dict: self.custom_error_dict.update(custom_error_dict) self.required = required super(CheckBoxField, self).__init__() def match(self, name, value): self.name = name if not self.required: self.is_valid = True self.value = value else: if not value: if self.custom_error_dict.get('required', None): self.error = self.custom_error_dict['required'] else: self.error = "%s is required" % name else: if isinstance(name, list): self.is_valid = True self.value = value else: if self.custom_error_dict.get('valid', None): self.error = self.custom_error_dict['valid'] else: self.error = "%s is invalid" % name class FileField(Field): REGULAR = "^(\w+\.pdf)|(\w+\.mp3)|(\w+\.py)$" def __init__(self, custom_error_dict=None, required=True): self.custom_error_dict = {} # {'required': 'IP不能为空', 'valid': 'IP格式错误'} if custom_error_dict: self.custom_error_dict.update(custom_error_dict) self.required = required super(FileField, self).__init__() def match(self, name, file_name_list): flag = True #默认 标识符为 true self.name = name if not self.required: #不对用户输入的值进行验证 可以为空 self.is_valid = True self.value = file_name_list #用户传入的值 else: if not file_name_list: #需要验证 #假设传空值 if self.custom_error_dict.get('required', None): #查看有没自定义报错信息 self.error = self.custom_error_dict['required'] #有自定义的调用自定义的 else: self.error = "%s is required" % name # 没有则用默认报错信息 flag = False #标识符为false else: for file_name in file_name_list: #循环 #用户传入的值 if not file_name or not file_name.strip(): # 如果用户传入的有空值 if self.custom_error_dict.get('required', None): #查看有没自定义报错信息 self.error = self.custom_error_dict['required'] ##有自定义的调用自定义的 else: self.error = "%s is required" % name # 没有则用默认报错信息 flag = False #默认 标识符为 true break #退出循环 else: ret = re.match(self.REGULAR, file_name) #进行正则验证 if not ret: #如果验证失败 if self.custom_error_dict.get('valid', None): #查看有没自定义报错信息 self.error = self.custom_error_dict['valid'] #有自定义的调用自定义的 else: self.error = "%s is invalid" % name #没有则用默认报错信息 flag = False #标识符 为False break #退出 self.is_valid = flag #匹配返回结果 def save(self, request, upload_to=""): # 所有的文件列表 file_metas = request.files[self.name] for meta in file_metas: # 循环文件列表 file_name = meta['filename'] # 将用户上传的值天加到文件列表 file_path_name = os.path.join(upload_to, file_name) with open(file_path_name, 'wb') as up: up.write(meta['body']) upload_file_path_list = map(lambda path: os.path.join(upload_to, path), self.value) self.value = list(upload_file_path_list)
#!/usr/bin/env python # -*- coding:utf-8 -*- import re import os class Field: def __init__(self): self.is_valid = False self.name = None self.value = None self.error = None def match(self, name, value): self.name = name if not self.required: self.is_valid = True self.value = value else: if not value: if self.custom_error_dict.get('required', None): self.error = self.custom_error_dict['required'] else: self.error = "%s is required" % name else: ret = re.match(self.REGULAR, value) if ret: self.is_valid = True self.value = value else: if self.custom_error_dict.get('valid', None): self.error = self.custom_error_dict['valid'] else: self.error = "%s is invalid" % name class StringField(Field): REGULAR = "^.*$" def __init__(self, custom_error_dict=None, required=True): self.custom_error_dict = {} # {'required': 'IP不能为空', 'valid': 'IP格式错误'} if custom_error_dict: self.custom_error_dict.update(custom_error_dict) self.required = required super(StringField, self).__init__() class IPField(Field): REGULAR = "^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$" def __init__(self, custom_error_dict=None, required=True): self.custom_error_dict = {} # {'required': 'IP不能为空', 'valid': 'IP格式错误'} if custom_error_dict: self.custom_error_dict.update(custom_error_dict) self.required = required super(IPField, self).__init__() class EmailField(Field): REGULAR = "^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$" def __init__(self, custom_error_dict=None, required=True): self.custom_error_dict = {} # {'required': 'IP不能为空', 'valid': 'IP格式错误'} if custom_error_dict: self.custom_error_dict.update(custom_error_dict) self.required = required super(EmailField, self).__init__() class IntegerField(Field): REGULAR = "^\d+$" def __init__(self, custom_error_dict=None, required=True): self.custom_error_dict = {} # {'required': 'IP不能为空', 'valid': 'IP格式错误'} if custom_error_dict: self.custom_error_dict.update(custom_error_dict) self.required = required super(IntegerField, self).__init__() class CheckBoxField(Field): REGULAR = "^\d+$" def __init__(self, custom_error_dict=None, required=True): self.custom_error_dict = {} # {'required': 'IP不能为空', 'valid': 'IP格式错误'} if custom_error_dict: self.custom_error_dict.update(custom_error_dict) self.required = required super(CheckBoxField, self).__init__() def match(self, name, value): self.name = name if not self.required: self.is_valid = True self.value = value else: if not value: if self.custom_error_dict.get('required', None): self.error = self.custom_error_dict['required'] else: self.error = "%s is required" % name else: if isinstance(name, list): self.is_valid = True self.value = value else: if self.custom_error_dict.get('valid', None): self.error = self.custom_error_dict['valid'] else: self.error = "%s is invalid" % name class FileField(Field): REGULAR = "^(\w+\.pdf)|(\w+\.mp3)|(\w+\.py)$" def __init__(self, custom_error_dict=None, required=True): self.custom_error_dict = {} # {'required': 'IP不能为空', 'valid': 'IP格式错误'} if custom_error_dict: self.custom_error_dict.update(custom_error_dict) self.required = required super(FileField, self).__init__() def match(self, name, file_name_list): flag = True self.name = name if not self.required: self.is_valid = True self.value = file_name_list else: if not file_name_list: if self.custom_error_dict.get('required', None): self.error = self.custom_error_dict['required'] else: self.error = "%s is required" % name flag = False else: for file_name in file_name_list: if not file_name or not file_name.strip(): if self.custom_error_dict.get('required', None): self.error = self.custom_error_dict['required'] else: self.error = "%s is required" % name flag = False break else: ret = re.match(self.REGULAR, file_name) if not ret: if self.custom_error_dict.get('valid', None): self.error = self.custom_error_dict['valid'] else: self.error = "%s is invalid" % name flag = False break self.is_valid = flag def save(self, request, upload_to=""): file_metas = request.files[self.name] for meta in file_metas: file_name = meta['filename'] file_path_name = os.path.join(upload_to, file_name) with open(file_path_name, 'wb') as up: up.write(meta['body']) upload_file_path_list = map(lambda path: os.path.join(upload_to, path), self.value) self.value = list(upload_file_path_list)
#!/usr/bin/env python # -*- coding:utf-8 -*- import io import datetime import json from backend.utils import check_code from backend.core.request_handler import BaseRequestHandler from forms import account from backend.utils.response import BaseResponse from backend import commons from models import chouti_orm as ORM from sqlalchemy import and_, or_ class CheckCodeHandler(BaseRequestHandler): def get(self, *args, **kwargs): stream = io.BytesIO() img, code = check_code.create_validate_code() img.save(stream, "png") self.session["CheckCode"] = code self.write(stream.getvalue()) class LoginHandler(BaseRequestHandler): def post(self, *args, **kwargs): rep = BaseResponse() form = account.LoginForm() if form.valid(self): if form._value_dict['code'].lower() != self.session["CheckCode"].lower(): rep.message = {'code': '验证码错误'} self.write(json.dumps(rep.__dict__)) return conn = ORM.session() obj = conn.query(ORM.UserInfo).filter( or_( and_(ORM.UserInfo.email == form._value_dict['user'], ORM.UserInfo.password == form._value_dict['pwd']), and_(ORM.UserInfo.username == form._value_dict['user'], ORM.UserInfo.password == form._value_dict['pwd']) )).first() if not obj: rep.message = {'user': '用户名邮箱或密码错误'} self.write(json.dumps(rep.__dict__)) return self.session['is_login'] = True self.session['user_info'] = obj.__dict__ rep.status = True else: rep.message = form._error_dict self.write(json.dumps(rep.__dict__)) class RegisterHandler(BaseRequestHandler): def post(self, *args, **kwargs): rep = BaseResponse() form = account.RegisterForm() if form.valid(self): current_date = datetime.datetime.now() limit_day = current_date - datetime.timedelta(minutes=1) conn = ORM.session() is_valid_code = conn.query(ORM.SendMsg).filter(ORM.SendMsg.email == form._value_dict['email'], ORM.SendMsg.code == form._value_dict['email_code'], ORM.SendMsg.ctime > limit_day).count() if not is_valid_code: rep.message['email_code'] = '邮箱验证码不正确或过期' self.write(json.dumps(rep.__dict__)) return has_exists_email = conn.query(ORM.UserInfo).filter(ORM.UserInfo.email == form._value_dict['email']).count() if has_exists_email: rep.message['email'] = '邮箱已经存在' self.write(json.dumps(rep.__dict__)) return has_exists_username = conn.query(ORM.UserInfo).filter( ORM.UserInfo.username == form._value_dict['username']).count() if has_exists_username: rep.message['email'] = '用户名已经存在' self.write(json.dumps(rep.__dict__)) return form._value_dict['ctime'] = current_date form._value_dict.pop('email_code') obj = ORM.UserInfo(**form._value_dict) conn.add(obj) conn.query(ORM.SendMsg).filter_by(email=form._value_dict['email']).delete() conn.commit() self.session['is_login'] = True self.session['user_info'] = obj.__dict__ rep.status = True else: rep.message = form._error_dict self.write(json.dumps(rep.__dict__)) class SendMsgHandler(BaseRequestHandler): def post(self, *args, **kwargs): rep = BaseResponse() form = account.SendMsgForm() if form.valid(self): email = form._value_dict['email'] conn = ORM.session() has_exists_email = conn.query(ORM.UserInfo).filter(ORM.UserInfo.email == form._value_dict['email']).count() if has_exists_email: rep.summary = "此邮箱已经被注册" self.write(json.dumps(rep.__dict__)) return current_date = datetime.datetime.now() code = commons.random_code() count = conn.query(ORM.SendMsg).filter_by(**form._value_dict).count() if not count: insert = ORM.SendMsg(code=code, email=email, ctime=current_date) conn.add(insert) conn.commit() rep.status = True else: limit_day = current_date - datetime.timedelta(hours=1) times = conn.query(ORM.SendMsg).filter(ORM.SendMsg.email == email, ORM.SendMsg.ctime > limit_day, ORM.SendMsg.times >= 10, ).count() if times: rep.summary = "'已经超过今日最大次数(1小时后重试)'" else: unfreeze = conn.query(ORM.SendMsg).filter(ORM.SendMsg.email == email, ORM.SendMsg.ctime < limit_day).count() if unfreeze: conn.query(ORM.SendMsg).filter_by(email=email).update({"times": 0}) conn.query(ORM.SendMsg).filter_by(email=email).update({"times": ORM.SendMsg.times + 1, "code": code, "ctime": current_date}, synchronize_session="evaluate") conn.commit() rep.status = True else: rep.summary = form._error_dict['email'] self.write(json.dumps(rep.__dict__))
#!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornado.web from backend import uimethods as mt from controllers import home from controllers import account settings = { 'template_path': 'views', 'static_path': 'statics', 'static_url_prefix': '/statics/', 'autoreload': True, 'ui_methods': mt } application = tornado.web.Application([ (r"/index", home.IndexHandler), (r"/check_code", account.CheckCodeHandler), (r"/send_msg", account.SendMsgHandler), (r"/register", account.RegisterHandler), (r"/login", account.LoginHandler), (r"/upload_image", home.UploadImageHandler), ], **settings) if __name__ == "__main__": application.listen(8880) tornado.ioloop.IOLoop.instance().start()

浙公网安备 33010602011771号