前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我的python学习--第十四天(一)

我的python学习--第十四天(一)

作者头像
py3study
发布2020-01-10 16:10:09
6700
发布2020-01-10 16:10:09
举报
文章被收录于专栏:python3

一、运维管理系统(基于Flask)回顾

1、权限控制

  通过session实现权限控制,session是一个全局字典,当用户登录时,可以获取到用户的用户名,通过查找数据库获取用户的权限保存进session中,在每次页面跳转时同过查询session中的权限实现权限管理。

2、base64和md5加密方式的区别

 在用户添加和登录中使用到了md5加密,md5属于单向加密,是不可逆的,数据库密码保存的是加密后的字符串。同时可以通过加盐的方式提高密码的安全性

代码语言:javascript
复制
from hashlib import md5
... ...
password = md5(request.form.get('password')+salt).hexdigest()

  在token中使用的就是base64加密算法,base64属于对称加密,可以进行解密

代码语言:javascript
复制
import base64,time,random
... ...
token = base64.b64encode('%s|%s|%s|%s|%s'% (name,uid,role,str(random.random()),int(time.time()+7200)))
... ...
key = base64.b64decode(token)

3、各种前端插件

  •   sweetalert:一款不需要jQuery支持的原生js提示框,显示更优雅
  •   datatables:一款jQuery表格插件,可以实现分页,即时搜索和排序
  •   Validform:表单验证插件,对输入值进行简单验证
  •   highcharts,echaets:数据可视化插件
  •   multiselect:下拉多选插件,使下拉菜更优雅

二、使用echarts绘制中国地图

  实例:获取网站访问用户的全国分布图  

  方法:读取nginx的访问日志,从nginx日志中通过split()函数获取访问用户的ip地址,将获取的ip进行统计,获取一个dict,key是ip地址,value是ip出现次数,使用阿里或百度提供的api接口,通过ip地址获取到真是的地址并在echarts的中国地图上显示。

代码语言:javascript
复制
# 从nginx日志获取所有的ip地址
res = {}
for line in open('log.log'):
    tmp = line.split(' ')
    ip = tmp[0]
    res[ip] = res.get(ip,0)+1
代码语言:javascript
复制
# 通过baidu的api获取到真实地址、经纬度,并一起写入数据库
token = 'q5mTrTGzCSVq5QmGpI9y18Bo'
 
for key,val in res.items():
    url = 'http://api.map.baidu.com/location/ip?ak='+token+'&ip=%s&coor=bd09ll'%(key)
    r = requests.get(url)
    geo_data = r.json()
    if geo_data['status']==0:
        tmp = (key,geo_data['content']['address_detail']['province'],geo_data['content']['point']['x'],geo_data['content']['point']['y'],val)
        sql = 'insert into log_map(ip,province,geox,geoy,count) values ("%s","%s","%s","%s",%s)'%tmp
        cur.execute(sql)
代码语言:javascript
复制
# 回调函数
@app.route('/mapdata')
def mapdata():
   if not session.get('name'):
        return redirect("/login")
   # 获取所有省份和对应的范围次数,由于是根据ip进行入库,多个ip可能属于同一个省份,故结果需要去重
   fields = ['province','count']
   data = db.list('log_map',fields)   
   
   # 相同省份的次数累加,最终结果res = {'北京':40,'上海':50,.....}
   res = {}
   for x in data:
       p_name = x['province']
       res[p_name]=res.get(p_name,0)+x['count']

   # 将数据拼接为echart匹配的格式 [{'name':'北京','value':40},{'name':'上海','value':40},...]
   result = []
   for k,v in res.items():
       tmp={}
       # 去掉多余的后缀
       tmp['name'],tmp['value']=k.rstrip('省市回维吾尔壮族自治区'),v
       result.append(tmp)
   print result
   mapdata = {'code':0,'result':result}
   return  json.dumps(mapdata)

三、工单系统

  流程:用户提交工单请求(工单类型,请求内容),发送邮件给管理员,管理员收到邮件后对工单进行处理,并发邮件给工单申请人告知可以执行,申请人执行后再次发送邮件给管理员报告执行完毕,管理员根据执行的结果,对工单进行处理(成功或失败),并对工单进行处理反馈。

工单申请

代码语言:javascript
复制
@app.route("/jobadd/",methods=['GET','POST'])
@login_request.login_request
def jobadd():
    name = session.get('name')
    id = session.get('id')
    if request.method == 'GET':
        return render_template('/job/jobadd.html',info = session,role = session.get('role'))
    else:
        # 获取申请类型和请求内容
        data = dict((k,v[0]) for k,v in dict(request.form).items())
        # 添加申请人
        data['apply_persion'] = name
        
        # 请求内容不能为空,将数据保存到数据库
        if not data['apply_desc']:
            return json.dumps({'code':1,'errmsg':'job description can not be null'})
        conditions = [ "%s='%s'" %  (k,v) for k,v in data.items()]
        db.add('ops_jobs',conditions)
        
#       # 获取申请人信息
#        user = db.list('users',fields_user,id)
#       # 从用户列表获取邮箱账号和密码(暂时没有)
#        email,passwd = user['email'],user['password']
#       # 发送邮件(需要发件人账号密码,密码,收件人,正文)
#        myMail.mymail(email,passwd,localemail,data)

        return json.dumps({'code':0,'result':'apply job success'})

工单处理

代码语言:javascript
复制
# 修改工单状态
''' 
{'0':'未处理','1':'处理中','2':'完成','3':'失败'}
'''
@app.route('/update_status/',methods=['POST'])
@login_request.login_request
def update_status():
    data = dict((k,v[0]) for k,v in dict(request.form).items())
    res = {}    
    if data['status'] == '1':
        # 当工单为未处理状态时,第一次对工单处理,只添加处理人信息
        data['deal_persion'] = session.get('name')
    else:
        # 第二次处理则添加处理结束的时间信息
        data['deal_time'] = time.strftime(ISOTIMEFORMAT,time.localtime())


    conditions = [ "%s='%s'" %  (k,v) for k,v in data.items()]
    db.update('ops_jobs',conditions,data['id'])
    return json.dumps({'code':0,'result':'execute completed!'})

显示工单时,只需要根据工单的状态‘0’,‘1’为工单申请列表,‘2’,‘3’则为工单的历史列表

工单申请列表需通过申请时间倒序排序,同理,历史列表通过处理结束时间倒序排序,让列表一目了然

在工单处理时,可以根据当前的状态,对操作进行隐藏,减少很多不必要的麻烦

代码语言:javascript
复制
{% if job.status == 0 %}
<button data-id='`job`.`id`' class='btn btn-info exec'>处理</button>
<button data-id='`job`.`id`' disabled='disabled' class='btn btn-success complete'>完成</button>
{% elif job.status == 1 %}
<button data-id='`job`.`id`' disabled='disabled' class='btn btn-info exec'>处理中</button>
<button data-id='`job`.`id`' class='btn btn-success complete'>完成</button>
{% endif %}

效果图


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/08/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档