澳门京葡网站python tornado 完成类禅道系统,pythontornado

虽然现在代码还没有用到异步,后来发现自己公司的除了禅道就记录bug没有什么可以用的工具了,虽然现在代码还没有用到异步,后来发现自己公司的除了禅道就记录bug没有什么可以用的工具了,虽然现在代码还没有用到异步,后来发现自己公司的除了禅道就记录bug没有什么可以用的工具了,我选择的是flask 框架,其实做这个平台呢

澳门京葡网站 6

python tornado 完毕类禅道系统,pythontornado

   近年来楼主加班 喽,
好久未有更新本人的博客了,哎,一言难尽,废话笔者就不说了,来最早上优良。

背景:方今市道上有无尽bug管理工科具,但是各有各的特点,最盛名,最流行的正是禅道,贰个不时的时机接触到了python
,学到tornado后,就想着去怎么去用到实处,后来开掘自身公司的除了禅道就记录bug未有怎么能够用的工具了。

言语:python3 第三库 :tornado,qiniu(用于云存款和储蓄文件),数据库用sqlite

why  use
tornado?很五个人实在会这么问我,小编以为tornado能够完毕异步,即便以往代码还一直不选拔异步,笔者感到到依旧很精确的框架,值得学习,将来数不尽供销合作社都在用,个人感到那是三个没有错的,值得我们我们去上学的框架。

来探视自家的要求文书档案

澳门京葡网站 1

大题是那样的概貌,那么获得这些的时候,作者会进行需要分析,

需求怎样的数据库,
数据模型之间的关系,即便未来依然有为数相当的多地点是写死的还一贯不进行找出功效的设置,可是自个儿相信,有了现行反革命以此demo

那么自身开首来布置下自家根本会组织

澳门京葡网站 2

handlsers 存放类似flask的views

models存数据库相关的,

static存放静态

template存放模板

untils寄存公共库

setting 配置文件

urls url地址映射

run 运营文件。

 那么本身来开端准备小编的数据,其实笔者的数据模型也是起起落落的。

选取用了sqlalchemy,从前用过flask的sqlalchemy以为没有错

from models.dataconfig import db_session,Base,create_all
from sqlalchemy import  Column,Integer,DateTime,Boolean,String,ForeignKey,desc,asc,Text
from sqlalchemy.orm import  relationship,backref
from untils.common import encrypt
import datetime
class User(Base):
 __tablename__='users'
 id=Column(Integer(),primary_key=True)
 username=Column(String(64),unique=True,index=True)
 email=Column(String(64))
 password=Column(String(64))
 last_logtime=Column(DateTime())
 status=Column(Integer())
 leves=Column(Integer())
 iphone=Column(Integer())
 Projects=relationship('Project',backref='users')
 shebei=relationship('Shebei',backref='users')
 file=relationship('FilePan',backref='users')
 banben=relationship('BanbenWrite',backref='users')
 testresult=relationship('TestResult',backref='users')
 testcase=relationship('TestCase',backref='users')
 buglog=relationship('BugLog',backref='users')
 def __repr__(self):
  return self.username
 @classmethod
 def get_by_id(cls, id):
  item = db_session.query(User).filter(User.id==id).first()
  return item
 @classmethod
 def get_by_username(cls, username):
  item = db_session.query(User).filter(User.username== username).first()
  return item
 @classmethod
 def get_count(cls):
  return db_session.query(Shebei).count()
 @classmethod
 def add_new(cls,username,password,iphone,email,leves):
  new=User(username=username,iphone=iphone,email=email,leves=leves)
  new.password=encrypt(password)
  new.status=0
  db_session.add(new)
  try:
   db_session.commit()
  except:
   db_session.rollback()
class Shebei(Base):
 __tablename__='shebeis'
 id=Column(Integer(),primary_key=True)
 shebei_id=Column(String(32),unique=True)
 shebei_name=Column(String(64))
 shebei_xitong=Column(String(64))
 shebei_xinghao=Column(String(255))
 shebei_jiage=Column(Integer())
 shebei_fapiaobianhao=Column(String(64))
 shebei_quanxian=Column(Boolean())
 shebei_jie=Column(Boolean())
 shebei_shuyu=Column(String())
 shebei_date=Column(DateTime())
 shebei_user=Column(String())
 gou_date=Column(DateTime())
 shebei_status=Column(String(16))
 she_sta=Column(Integer(),default=0)
 ruku_user=Column(Integer(),ForeignKey('users.id'))
 def __repr__(self):
  return self.shebei_name
 @classmethod
 def get_by_name(cls,name):
  item=db_session.query(Shebei).filter(Shebei.shebei_name==name).first()
  return item
 @classmethod
 def get_by_id(cls,id):
  item=db_session.query(Shebei).filter(Shebei.id==id).first()
  return item
 @classmethod
 def get_count(cls):
  return db_session.query(Shebei).count()
class TestResult(Base):
 __tablename__='testresults'
 id=Column(Integer(),primary_key=True)
 porject_id=Column(Integer(),ForeignKey('projects.id'))
 creat_time=Column(DateTime())
 bug_first=Column(Integer())
 ceshirenyuan=Column(String(255))
 is_send=Column(Boolean(),default=True)
 filepath=Column(String(64))
 status=Column(Integer(),default=0)
 user_id=Column(Integer(),ForeignKey('users.id'))
 def __repr__(self):
  return self.porject_name
 @classmethod
 def get_by_name(cls,name):
  item=db_session.query(TestResult).filter(TestResult.porject_name==name).first()
  return item
 @classmethod
 def get_by_id(cls,id):
  item=db_session.query(TestResult).filter(TestResult.id==id).first()
  return item
 @classmethod
 def get_by_user_id(cls,user_id):
  item=db_session.query(TestResult).filter(TestResult.user_id==user_id).first()
  return item
 @classmethod
 def get_count(cls):
  return db_session.query(TestResult).count()
class BanbenWrite(Base):
 __tablename__='banbens'
 id=Column(Integer(),primary_key=True)
 porject_id=Column(Integer(),ForeignKey('projects.id'))
 creat_time=Column(DateTime(),default=datetime.datetime.now())
 banbenhao=Column(String(32))
 is_xian=Column(Boolean(),default=False)
 is_test=Column(Boolean(),default=False)
 status=Column(Integer())
 user_id=Column(Integer(),ForeignKey('users.id'))
 bugadmin=relationship('BugAdmin',backref='banbens')
 def __repr__(self):
  return self.banbenhao
 @classmethod
 def get_by_name(cls,name):
  item=db_session.query(BanbenWrite).filter(BanbenWrite.porject_name==name).first()
  return item
 @classmethod
 def get_by_id(cls,id):
  item=db_session.query(BanbenWrite).filter(BanbenWrite.id==id).first()
  return item
 @classmethod
 def get_by_user_id(cls,user_id):
  item=db_session.query(BanbenWrite).filter(BanbenWrite.user_id==user_id).first()
  return item
 @classmethod
 def get_count(cls):
  return db_session.query(BanbenWrite).count()
class FilePan(Base):
 __tablename__='files'
 id=Column(Integer(),primary_key=True)
 file_fenlei=Column(String(64))
 file_name=Column(String(64))
 down_count=Column(Integer(),default=0)
 creat_time=Column(DateTime(),default=datetime.datetime.now())
 status=Column(Integer(),default=0)
 down_url=Column(String(64))
 is_tui=Column(Boolean(),default=False)
 user_id=Column(Integer(),ForeignKey('users.id'))
 def __repr__(self):
  return self.file_name
 @classmethod
 def get_by_file_name(cls,name):
  item=db_session.query(FilePan).filter(FilePan.file_name==name).first()
  return item
 @classmethod
 def get_by_id(cls,id):
  item=db_session.query(FilePan).filter(FilePan.id==id).first()
  return item
 @classmethod
 def get_by_user_id(cls,user_id):
  item=db_session.query(FilePan).filter(FilePan.user_id==user_id).first()
  return item
 @classmethod
 def get_count(cls):
  return db_session.query(FilePan).count()
class BugAdmin(Base):
 __tablename__='bugadmins'
 id=Column(Integer(),primary_key=True)
 porject_id=Column(Integer(),ForeignKey('projects.id'))
 bugname=Column(String(64))
 bugdengji=Column(String(64))
 bugtime=Column(DateTime(),default=datetime.datetime.now())
 bug_miaoshu=Column(String(255))
 ban_id=Column(Integer(),ForeignKey('banbens.id'))
 fujian=Column(String(64))
 is_que=Column(Boolean())
 bug_status=Column(String(64))
 bug_jiejuefangan=Column(String(64))
 bug_send=Column(String(64))
 status=Column(Integer(),default=0)
 bug_log=relationship('BugLog',backref='bugadmins')
 user_id=Column(Integer(),ForeignKey('users.id'))
 def __repr__(self):
  return self.bugname
 @classmethod
 def get_by_bugname(cls,bugname):
  item=db_session.query(BugAdmin).filter(BugAdmin.bugname==bugname).first()
  return item
 @classmethod
 def get_by_id(cls,id):
  item=db_session.query(BugAdmin).filter(BugAdmin.id==id).first()
  return item
 @classmethod
 def get_by_porject_name(cls,porject_name):
  item=db_session.query(BugAdmin).filter(BugAdmin.porject_name==porject_name).first()
  return item
 @classmethod
 def get_count(cls):
  return db_session.query(BugAdmin).count()
class TestCase(Base):
 __tablename__='testcases'
 id=Column(Integer(),primary_key=True)
 porject_id=Column(Integer(),ForeignKey('projects.id'))
 casename=Column(String(64))
 case_qianzhi=Column(String())
 case_buzhou=Column(String())
 case_yuqi=Column(String())
 status=Column(Integer(),default=0)
 case_crea_time=Column(DateTime(),default=datetime.datetime.now())
 user_id=Column(Integer(),ForeignKey('users.id'))
 def __repr__(self):
  return self.casename
 @classmethod
 def get_by_project_name(Cls,project_name):
  item=db_session.query(TestCase).filter(TestCase.project_name==project_name).first()
  return item
 @classmethod
 def get_by_casename(Cls,casename):
  item=db_session.query(TestCase).filter(TestCase.casename==casename).first()
  return item
 @classmethod
 def get_by_id(cls,id):
  item=db_session.query(TestCase).filter(TestCase.id==id).first()
  return item
 @classmethod
 def get_count(cls):
  return db_session.query(TestCase).count()
class BugLog(Base):
 __tablename__='buglogs'
 id=Column(Integer(),primary_key=True)
 bug_id=Column(Integer(),ForeignKey('bugadmins.id'))
 caozuo=Column(String())
 caozuo_time=Column(DateTime())
 user_id=Column(Integer(),ForeignKey('users.id'))
 def __repr__(self):
  return self.caozuo
 @classmethod
 def get_by_id(Cls,id):
  item=db_session.query(BugLog).filter(BugLog.id==id).first()
  return item
 @classmethod
 def get_by_user_id(Cls,user_id):
  item=db_session.query(BugLog).filter(BugLog.user_id==user_id).first()
  return item
 @classmethod
 def get_by_bug_id(Cls,bug_id):
  item=db_session.query(BugLog).filter(BugLog.bug_id==bug_id).first()
  return item
class Project(Base):
 __tablename__='projects'
 id=Column(Integer(),primary_key=True)
 name=Column(String(64))
 user_id=Column(Integer(),ForeignKey('users.id'))
 bug_log=relationship('BugAdmin',backref='projects')
 banben=relationship('BanbenWrite',backref='projects')
 testresult=relationship('TestResult',backref='projects')
 testcase=relationship('TestCase',backref='projects')
 def __repr__(self):
  return self.name
 @classmethod
 def get_by_id(cls,id):
  item=db_session.query(Project).filter(Project.id==id).first()
  return item 
 @classmethod
 def get_by_name(cls,name):
  item=db_session.query(Project).filter(Project.name==name).first()
  return item

 那是数据库相关的,

 1 数据库配置相关的
 2 
 3 from sqlalchemy import  create_engine
 4 from  sqlalchemy.orm import  scoped_session,sessionmaker
 5 from sqlalchemy.ext.declarative import  declarative_base
 6 engine=create_engine('sqlite:///shebei.db',convert_unicode=True)
 7 Base=declarative_base()
 8 db_session=scoped_session(sessionmaker(bind=engine))
 9 def create_all():
10     Base.metadata.create_all(engine)
11 def drop_all():
12     Base.metadata.drop_all(engine)

 

骨子里在开拓的历程中,也超越了累累绊脚石,比如下载平昔兑现不好,比如分页,也是参照别人的兑现的,

分页公共模块

class Pagination:
    def __init__(self, current_page, all_item):
        try:
            page = int(current_page)
        except:
            page = 1
        if page < 1:
            page = 1
        all_pager, c = divmod(all_item, 10)
        if int(c) > 0:
            all_pager += 1
        self.current_page = page
        self.all_pager = all_pager
    @property
    def start(self):
        return (self.current_page - 1) * 10
    @property
    def end(self):
        return self.current_page * 10
    def string_pager(self, base_url="/index/"):
        if self.current_page == 1:
            prev = '<li><a href="javascript:void(0);">上一页</a></li>'
        else:
            prev = '<li><a href="%s%s">上一页</a></li>' % (base_url, self.current_page - 1,)
        if self.current_page == self.all_pager:
            nex = '<li><a href="javascript:void(0);">下一页</a></li>'
        else:
            nex = '<li><a href="%s%s">下一页</a></li>' % (base_url, self.current_page + 1,)
        last = '<li><a href="%s%s">尾页</a></li>' % (base_url, self.all_pager,)
        str_page = "".join((prev,nex,last))
        return str_page

 

在上传文件的时候,原来寄存在该地,结果吧,下载管理不佳,于是乎选用了七牛,需求到七牛的官方网址去注册本身的账号

from qiniu import Auth,put_file,etag,urlsafe_base64_encode
import qiniu.config
access_key='uVxowDUcYx641ivtUb111WBEI4112L3D117JHNM_AOtskRh4'
secret_key='PdXU9XrXTLtp1N21bhU1Frm1FDZqE1qhjkEaE9d1xVLZ5C'
def sendfile(key,file):
    q=Auth(access_key,secret_key)
    bucket_name='leilei22'
    token = q.upload_token(bucket_name, key)
    ret, info = put_file(token, key, file)
    me= ret['hash']
    f=etag(file)
    if me==f:
        assert_t=True
    else:
        assert_t=False
    return assert_t

 解析Excel,主要用来上传测量检验用例

import xlrd,xlwt
from xlutils.copy import copy
def datacel(filepath):
    file=xlrd.open_workbook(filepath)
    me=file.sheets()[0]
    nrows=me.nrows
    porject_id_list=[]
    casename_list=[]
    case_qianzhi_list=[]
    case_buzhou_list=[]
    case_yuqi_list=[]
    for i in range(1,nrows):
        porject_id_list.append(me.cell(i,0).value)
        casename_list.append(me.cell(i,2).value)
        case_qianzhi_list.append(me.cell(i,3).value)
        case_buzhou_list.append(me.cell(i,4).value)
        case_yuqi_list.append(me.cell(i,1).value)
    return porject_id_list,casename_list,case_qianzhi_list,case_buzhou_list,case_yuqi_list

事实上这么未来国有模块完毕了,其达成在得以入手去起头写咱俩的代码了,首要的代码,还会有静态分界面,因为前后端都以本身本人,作者的前端其实仍旧从互连网找来的模板,

学学的道路是惨恻的,可是本人信任自个儿是能够成功的,

from tornado.web import RequestHandler
from models.model_py import User
class BaseHandler(RequestHandler):
 @property
 def db(self):
  return self.application.db
 def get_current_user(self):
  user_id = self.get_secure_cookie('user_id')
  if not user_id:
   return None
  return User.get_by_id(int(user_id))

 基础的类集成了RequestHandler的类,,进行了一部分轻巧易行的自定义,然后继续能够用这几个,

进过两周的支付,已经变成了成熟的,

源码已经开源道github

 

除此以外笔者提供vip指点,python自动化,python学习方面,python做测量检验开辟方面,作者都会提供辅导,vip平生有效,现价700,联系qq:952943386,稍后会更新qq群,喜欢的心上人能够来,自己也是从三个不懂啥是python到现行反革命能做东西,从15的2k到17的10k+都以辛酸泪,能够与大家一道共勉,提供思路,能够让您走的更远,作者也是从白纸一张华晨步步走来,借使你是新结束学业的学生这些也契合您,能够给您辅导,不过本身能做的便是带你,不过自己不是培养陶冶班,未有提供就业的机遇,笔者只会在有机缘的时候给你推荐,学无穷境,此时恐怕本人只能教您有的测量检验,提供专门的学问指引,小编恐怕将来会带给您越来越多。

本身是二个大学专科学生,也是一位发奋到明日。

 

tornado 达成类禅道系统,pythontornado
这两天楼主加班 喽,
好久未有更新自身的博客了,哎,一言难尽,废话笔者就隐瞒了,来发轫上卓越。…

   最近楼主加班 喽,
好久未有更新自身的博客了,哎,一言难尽,废话笔者就隐瞒了,来伊始上非凡。

   近来楼主加班 喽,
好久未有更新自身的博客了,哎,一言难尽,废话作者就隐瞒了,来起初上出色。

 
本来的准备是翻新完8之后呢,早先时期就不在更新了,近些日子攻读flask后,手又想付出个阳台吗,吧作者事先写的框架给接纳上,产生四个简约的接口测验化平台吗,–IAPTest 

背景:近来市情上有相当多bug处理工科具,不过各有各的特色,最有名,最盛行的正是禅道,贰个偶发的机缘接触到了python
,学到tornado后,就想着去怎么去用到实处,后来发掘自个儿集团的除了禅道就记录bug未有何能够用的工具了。

背景:方今市道上有成百上千bug管理工科具,可是各有各的特征,最出名,最流行的就是禅道,二个偶然的机缘接触到了python
,学到tornado后,就想着去怎么去用到实处,后来开采本身集团的除了禅道就记录bug未有怎么能够用的工具了。

自己给她起名,有未有痛感很泼辣啊,其实撤这么多不如来点使用的,其实做那个平台吗,越多的是对flask学习的一个应用呢。当时和好想想了一凌晨,其实也不理解大家想要的都以何等体统的,所以呢,就起来做了上面包车型的士设计。

言语:python3 第三库 :tornado,qiniu(用于云存款和储蓄文件),数据库用sqlite

言语:python3 第三库 :tornado,qiniu(用于云存款和储蓄文件),数据库用sqlite

澳门京葡网站 3

why  use
tornado?很三人实在会这么问笔者,作者感到到tornado能够达成异步,固然未来代码还平素不选用异步,作者备感依然很准确的框架,值得学习,今后游人如织供销合作社都在用,个人认为那是三个不错的,值得我们我们去上学的框架。

why  use
tornado?很三个人其实会那样问小编,小编认为tornado能够兑现异步,即使未来代码还不曾利用异步,小编深感依然很不利的框架,值得学习,现在广大公司都在用,个人以为那是几个不容置疑的,值得大家我们去读书的框架。

大题上,第一版的demo版本的急需正是那般的,因为这里未有设想别的太多,
那么接下去正是来初阶选取了,小编选择的是flask 框架,前端呢
,作者用的是bootstarp框架,

来探视自身的急需文书档案

来探问本身的须求文书档案

那就是说接下去,作者是要对自家的数据库进行设计。这里要提的是自己对权力的统一盘算呢,小编越多的是选择了五个较为轻松的方法,小编去用三个字段去开展权力决定,小编动用level字段,
0就象征自身那一个顾客是普通顾客,1便是管理员客商,这里相当多地点的去除都做了组织者和非管理员的界别,管理员能够对全部的张开删除,可是普通管理是无法的,
客户处理分界面只好助理馆员去运作这么些。

澳门京葡网站 4

澳门京葡网站 5

上边给下本身数据库方面包车型大巴代码片段。

大题是这么的概貌,那么得到这几个的时候,小编会举办需要分析,

大题是这么的概貌,那么得到那个的时候,作者会进行要求深入分析,

class User(db.Model):
    __tablename__='users'
    id=db.Column(db.Integer(),primary_key=True,autoincrement=True)
    username=db.Column(db.String(63),unique=True)
    password=db.Column(db.String(252))
    user_email=db.Column(db.String(64),unique=True)
    status=db.Column(db.Integer(),default=0)
    level=db.Column(db.Integer(),default=0)
    phone = db.relationship('TestResult', backref='users', lazy='dynamic')
    def __repr__(self):
        return  self.username
    def set_password(self,password):
        self.password=generate_password_hash(password)
    def check_password(self,password):
        return  check_password_hash(self.password,password)
class Interface(db.Model):
    __tablename__='interfaces'
    id=db.Column(db.Integer(),primary_key=True,autoincrement=True)
    project_name=db.Column(db.String(252))
    models_name=db.Column(db.String(252))
    Interface_name=db.Column(db.String(252))
    Interface_url=db.Column(db.String(252))
    Interface_meth= db.Column(db.String(252),default='GET')
    Interface_par=db.Column(db.String(252))
    Interface_back=db.Column(db.String(252))
    Interface_user_id=db.Column(db.Integer(),db.ForeignKey('users.id'))
    def __repr__(self):
        return  self.Interface_name
class InterfaceTest(db.Model):
    __tablename__='interfacetests'
    id = db.Column(db.Integer(), primary_key=True, autoincrement=True)
    project=db.Column(db.String(252))
    model=db.Column(db.String(252))
    Interface_name= db.Column(db.String(252))
    Interface_url = db.Column(db.String(252))
    Interface_meth = db.Column(db.String(252))
    Interface_pase = db.Column(db.String(252))
    Interface_assert=db.Column(db.String(252))
    Interface_user_id = db.Column(db.Integer(), db.ForeignKey('users.id'))
    def __repr__(self):
        return  self.yongli_name
class TestResult(db.Model):
    __tablename__='tstresults'
    id=db.Column(db.Integer(),primary_key=True,autoincrement=True)
    Test_user_id=db.Column(db.Integer(),db.ForeignKey('users.id'))
    test_num=db.Column(db.Integer())
    pass_num=db.Column(db.Integer())
    fail_num = db.Column(db.Integer())
    skip_num=db.Column(db.Integer())
    test_time=db.Column(db.DateTime(),default=datetime.datetime.now())
    hour_time=db.Column(db.Integer())
    test_rep=db.Column(db.String(252))
    test_log=db.Column(db.String(252))
    def __repr__(self):
        return  self.id

亟需什么的数据库,
数据模型之间的涉嫌,尽管以后依然有那多少个地方是写死的还未有举行搜索效果的安装,不过自身相信,有了以后那一个demo

内需什么样的数据库,
数据模型之间的涉嫌,固然今后依然有许多地点是写死的还未有举行寻找功用的设置,不过笔者相信,有了明天这么些demo

  这里的代码呢,小编就不一一赘述,
接口,接口测量检验用例,接口执行结果,都是和客户表一对多的关联,有了数据表,大家就能够去创设大家的数据库了,在开创的时候,我们还必要加一个配置文件,这里存放着某些数据库的着力配置相关的。

那么本人发轫来安插下本人根本会组织

那正是说作者起来来设计下自身第一会组织

SECRET_KEY = 'BaSeQuie'
    basedir=os.path.abspath(os.path.dirname(__file__))
    SQLALCHEMY_DATABASE_URI = "sqlite:///" + os.path.join(basedir, "data.sqlite")
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    SQLALCHEMY_TRACK_MODIFICATIONS=False
    CSRF_ENABLED = True

澳门京葡网站 6

澳门京葡网站 6

  那样大家就足以去生成大家的数据库, 

handlsers 存放类似flask的views

handlsers 贮存类似flask的views

界面来啊正是前段界面的编排,和后端管理函数的编辑,这里呢,小编就不雷同呈报了,这里呢
给大家下边包车型地铁多少个地点的代码片段,显示下,首假如上传和下载这一块。