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
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()
app
<!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>
pager.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)
froms.py
#!/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)
fields
#!/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__))
account
#!/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()
app

 

posted @ 2016-08-14 23:59  起来了皮  阅读(408)  评论(1)    收藏  举报