标签: Python3

  • Vue 实现分页效果 代码实例

    Vue 实现分页效果 代码实例

    分页思路:

    首先是定义页号currentPage 和 页大小pagesize,用一个数组保存总数据;

    用一个计算属性page_arrs,作用是 让页面展示的是我们所需要的页面

    而我们在page_arrs中要分割原数组,用一个slice()方法进行分割;

    在控件button上绑定点击方法,对页号currentPage进行修改,从而修改整个页面展示

    Python Django vue {{}} 括号冲突 问题 解决 图文教程

    分页css采用了bootstrap的标准代码,在使用时直接引用bootstrap的css即可。

    Javascript代码:

    var app = new Vue({
        delimiters:['{[', ']}'],//区分django的模板标记
        el: '#app',
        data: {
            arrs: {{goods|safe}},//django模板中原样输出
            titles : ['序号','服务商','机房',"CPU",'内存','硬盘','带宽','流量','线路','IPV4','架构','价格','库存'],
            currentPage : 1,//当前页号
            pagesize :12, //每页大小
            all:0,//总页数
        },  
        filters:{
            formatPrice: function(obj){
                $str = '';
                if(obj.annual)
                    $str += '$'+obj.annual+'/年<br/>';
                if(obj.quarter)
                    $str += '$'+obj.quarter+'/季<br/>';
                if(obj.month)
                    $str += '$'+obj.month+'/月<br/>';
                return $str;
            },
            stockToBuy: function(obj){
                if( obj.stock === 1 ){
                    return '<a href="//www.jiloc.com/go/bwh-'+obj.pid+'" class="btn btn-primary active" role="button" aria-pressed="true">购买</a>';
                }else{
                    return '<button class="btn btn-secondary" disabled="true">售罄</button>';
                }
            }
        },
        created: function () {
            var self = this;
            // $.ajax({
            //     // url: 'https://vpsdalao.com/api/records?provider=Bandwagon',
            //     url: '/ajax_goods',
            //     type: 'get',
            //     data: {},
            //     dataType: 'json'
            // }).then(function (res) {
            //     // console.log(res.data)
            //     self.items = res.data
            // }).fail(function () {
            //     console.log('失败');
            // })
        },
        computed:{
            page_arrs(){
                let {currentPage,pagesize,all} = this
                this.all = Math.ceil(this.arrs.length/pagesize)
                return this.arrs.slice((currentPage-1)*pagesize,currentPage*pagesize)
            },
            indexs: function(){
                var left = 1;
                var right = this.all;
                var ar = [];
                if(this.all>= 5){
                    if(this.currentPage > 3 && this.currentPage < this.all-2){
                        left = this.currentPage - 2
                        right = this.currentPage + 2
                    }else{
                        if(this.currentPage<=3){
                            left = 1
                            right = 5
                        }else{
                            right = this.all
                            left = this.all -4
                        }
                    }
                }
                while (left <= right){
                    ar.push(left)
                    left ++
                }
                return ar
            },
            current_page(){
                return this.currentPage
            }
        },
        methods: {
            primaryPage(){
                this.currentPage = 1
            },
            prePage(){
                if(this.currentPage == 1){
                    return
                }
                this.currentPage = this.currentPage - 1
            },
            nextPage(){
                if(this.currentPage == Math.ceil(this.arrs.length/this.pagesize)){
                    return
                }
                this.currentPage = this.currentPage + 1
            },
            lastPage(){
                this.currentPage = Math.ceil(this.arrs.length/this.pagesize)
            },
            btnClick: function(data){//页码点击事件
                if(data != this.currentPage){
                    this.currentPage = data 
                }
            },
        },
    })

    HTML代码部分

        <div class="container-fluid" id="app">
            <section class="text-center">
                <h1>VPS库存监控列表</h1>
                <p><a href="//www.jiloc.com/go/bwh">搬瓦工</a>优惠码:<code>BWH3HYATVBJW</code> ,
                <p>数据最后更新时间:<code>{{update_time}}</code></p>
            </section>
            <table class="table table-striped table-bordered table-hover">
                <thead>
                <tr>
                    <th v-for="title in titles">{[title]}</th>
                </tr>
                </thead>
                <tbody>
                <tr v-for="(item,index) in page_arrs" :key="index">
                    <td>{[index+1]}#</td>
                    <td>{[item.company__name]}</td>
                    <td>{[item.dc]}</td>
                    <td>{[item.cpu]}</td>
                    <td>{[item.ram]}</td>
                    <td>{[item.disk]}</td>
                    <td>{[item.bandwidth]}</td>
                    <td>{[item.traffic]}</td>
                    <td>{[item.route]}</td>
                    <td>{[item.ipv4]}</td>
                    <td>{[item.arch]}</td>
                    <td v-html="$options.filters.formatPrice(item)"></td>
                    <td v-html="$options.filters.stockToBuy(item)" ></td>
                </tr>
                </tbody>
            </table>
            <nav aria-label="Page navigation">
                <ul class="pagination  justify-content-center">
                  <li :class="current_page == 1 ? 'page-item disabled' : 'page-item' "><a class="page-link" href="#" @click="primaryPage"> << </a></li>
                  <li :class="current_page == 1 ? 'page-item disabled' : 'page-item' "><a class="page-link" href="#" @click="prePage"> < </a></li>
                  <li v-for="index in indexs" :class="current_page == index ? 'page-item active' : 'page-item' "><a class="page-link" href="#"  @click="btnClick(index)">{[ index ]}</a></li>
                  <li class="page-item disabled"><a class="page-link" href="#" aria-disabled="true">{[current_page]} / {[all]}</a></li>
                  <li :class="current_page == all ? 'page-item disabled' : 'page-item' "><a class="page-link" href="#" @click="nextPage()"> > </a></li>
                  <li :class="current_page == all ? 'page-item disabled' : 'page-item' "><a class="page-link" href="#" @click="lastPage"> >> </a></li>
                </ul>
            </nav>
        </div>
  • python中的线程之semaphore控制每次信号量

    python中的线程之semaphore控制每次信号量

    semaphore是一个内置的计数器

    每当调用acquire()时,内置计数器-1
    每当调用release()时,内置计数器+1

    计数器不能小于0,当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。
    来看下面的代码:

    import time
    import threading
    def foo():
    	time.sleep(2)	#程序休息2秒
    	print("ok",time.ctime())
    for i in range(20):
    	t1=threading.Thread(target=foo,args=())	#实例化一个线程
    	t1.start()	#启动线程
    

    执行结果:

    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017
    ok Tue Jul 18 20:05:58 2017

    可以看到,程序会在很短的时间内生成20个线程来打印一句话。

    如果在主机执行IO密集型任务的时候再执行这种类型的程序时,计算机就有很大可能会宕机。
    这时候就可以为这段程序添加一个计数器功能,来限制一个时间点内的线程数量。

    代码如下:

    import time
    import threading
    s1=threading.Semaphore(5)	#添加一个计数器
    def foo():
    	s1.acquire()	#计数器获得锁
    	time.sleep(2)	#程序休眠2秒
    	print("ok",time.ctime())
    	s1.release()	#计数器释放锁
    
    for i in range(20):
    	t1=threading.Thread(target=foo,args=())	#创建线程
    	t1.start()	#启动线程	
    

    执行结果:

    ok Tue Jul 18 20:04:38 2017
    ok Tue Jul 18 20:04:38 2017
    ok Tue Jul 18 20:04:38 2017
    ok Tue Jul 18 20:04:38 2017
    ok Tue Jul 18 20:04:38 2017
    ok Tue Jul 18 20:04:40 2017
    ok Tue Jul 18 20:04:40 2017
    ok Tue Jul 18 20:04:40 2017
    ok Tue Jul 18 20:04:40 2017
    ok Tue Jul 18 20:04:40 2017
    ok Tue Jul 18 20:04:42 2017
    ok Tue Jul 18 20:04:42 2017
    ok Tue Jul 18 20:04:42 2017
    ok Tue Jul 18 20:04:42 2017
    ok Tue Jul 18 20:04:42 2017
    ok Tue Jul 18 20:04:44 2017
    ok Tue Jul 18 20:04:44 2017
    ok Tue Jul 18 20:04:44 2017
    ok Tue Jul 18 20:04:44 2017
    ok Tue Jul 18 20:04:44 2017

  • rrdtool 生成 .xml .png 出现 rrdtool.OperationalError: the RRD does not contain an RRA matching the chosen CF

    rrdtool 生成 .xml .png 出现 rrdtool.OperationalError: the RRD does not contain an RRA matching the chosen CF

    公司业务需要,我们要将.rrd文件转化成.xml,修改内容再通过.xml转化成.rrd或者图形。在Ubuntu中转化正常,但是到了Centos下就报错如下:

    rrdtool.OperationalError: the RRD does not contain an RRA matching the chosen CF

    Ubuntu的rrdtool版本为:1.7.0

    Centos的rrdtool版本为:1.4.8

    可能是因为版本问题,然后我们写的.xml文件又不规范。python生成.xml的部分代码如下:

    tmp_xml_str += '<!-- {} UTC / {} --> <row><v>{}</v><v>{}</v></row>\n        '.format(write_time,tmp_time,traffic_in,traffic_out)
    xml_str = '\
    <?xml version="1.0" encoding="utf-8"?>\n\
    <!DOCTYPE rrd SYSTEM "http://oss.oetiker.ch/rrdtool/rrdtool.dtd">\n\
    <!-- Round Robin Database Dump -->\n\
    <rrd>\n\
        <version>0003</version>\n\
        <step>300</step> <!-- Seconds -->\n\
        <lastupdate>{}</lastupdate> <!-- {} UTC -->\n\
        <ds><name> traffic_in </name><type> COUNTER </type></ds>\n\
        <ds><name> traffic_out </name><type> COUNTER </type></ds>\n\
        <rra>\n\
            <cf>MAX</cf>\n\
            <pdp_per_row>1</pdp_per_row> <!-- 300 seconds -->\n\
            <database>\n\
                {} \
            </database>\n\
        </rra>\n\
    </rrd>'.format(tmp_time,write_time,tmp_xml_str)   

    注意:我们此处写的是 <cf>MAX</cf> 。原先我们这里写的是 <cf>AVERAGE</cf> ,但是我们在新的rrd生成图的时候写的又是MAX,可能这里2个参数不一致导致了以上错误。

  • Python Django vue {{}} 括号冲突 问题 解决 图文教程

    Python Django vue {{}} 括号冲突 问题 解决 图文教程

    我们在使用django+vue开发的时候,可能会遇到{{}}这种冲突的问题,因为这2个工具都是使用 {{}} 来包裹变量的。下面我们记录一下修改vue的默认包裹方法:

    全局修改

    Vue.config.delimiters = ["{[", "]}"]

    使用时部分修改

    new Vue({
      delimiters:['{[', ']}'],
      el: '.el',
      data:{}
     })
  • python requirements.txt 环境安装生成依赖列表及使用教程

    python requirements.txt 环境安装生成依赖列表及使用教程

    当我们在迁移python及django程序时,需要安装很多的依赖环境,下面我们记录一下安装依赖的方法,本人python新手。如有不对的地方,请指出。

    虚拟环境下生成

    pip freeze >requirements.txt

    生成后文件requirements.txt是这个样子:

    certifi==2018.1.18
    chardet==3.0.4
    idna==2.6
    pyaml==17.12.1
    PyYAML==3.12
    requests==2.18.4
    urllib3==1.22

    虚拟环境安装

    pip install -r requirements.txt
  • python 获取某月的第一天零点和最后一天的时间 代码实例

    python 获取某月的第一天零点和最后一天的时间 代码实例

    在Python实际开发中我们可能会需要用到指定某个年月获取第一天到最后一天的时间,下面记录一下代码段:

    # -*- coding: utf-8 -*-
     
    import time
    import datetime
    import random
    import calendar
     
     
    def get_current_month_start_and_end(date):
        """
        年份 date格式: 2017-09-08
        :param date:
        :return: 本月第一天日期和本月最后一天日期
        """
        if date.count('-') != 2:
            raise ValueError('- is error')
        year, month = str(date).split('-')[0], str(date).split('-')[1]
        end = calendar.monthrange(int(year), int(month))[1]
        start_date = '%s-%s-01 00:00:00' % (year, month)
        end_date = '%s-%s-%s 23:59:59' % (year, month, end)
        return start_date, end_date
     
     
    if __name__ == '__main__':
        print(get_current_month_start_and_end('2019-05-24'))
  • Linux 系统中 rrdtool 生成的图出现中文乱码(方块中带数字) 解决办法 图文教程

    Linux 系统中 rrdtool 生成的图出现中文乱码(方块中带数字) 解决办法 图文教程

    问题描述

    最近在帮公司迁移python的系统时出现了rrdtool绘图中无法显示中文的问题,如下图所示:

    查了很久的资料发现基本上说的都是cacti的中文乱码。但是在cacti里,绘出来的图中文是可以正常显示的。后来我们又手动编译安装了几次rrdtool包括后来换了几次版本。但是都不能解决中文的问题。这里就不详细说明。下面我们具体说一下我们的排查步骤。

    问题排查步骤

    locale 命令确认终端环境已支持中文

    rrdtool命令行直接生成图片,查看是否有中文乱码

    为了确认不是python程序的问题,我们直接使用终端rrdtool命令生成图图片,命令如下:

    rrdtool graph test.png --imgformat=PNG --start=1591259400 --end=1591295400 --title='SH-05-G06-H5720-Core - 流量 - Eth-Trunk2 - (to guipinglu_H6810)' --base=1000 --height=120 --width=500 --alt-autoscale-max --lower-limit=0 COMMENT:"从 2020/06/04 16\:30\:00 到 2020/06/05 02\:30\:00\c" COMMENT:"  \n" --vertical-label='bits per second' --slope-mode --font TITLE:10: --font AXIS:8: --font LEGEND:8: --font UNIT:8: DEF:a="/var/www/html/rra/940/33165.rrd":traffic_in:MAX DEF:b="/var/www/html/rra/940/33165.rrd":traffic_out:MAX DEF:c="/var/www/html/rra/940/33165.rrd":traffic_in:AVERAGE CDEF:cdefa=a,8,* CDEF:cdefe=b,8,* CDEF:cdefi=a,UN,INF,UNKN,IF AREA:cdefa#00CF00FF:"流入"  GPRINT:cdefa:LAST:"当前\:%8.2lf %s"  GPRINT:cdefa:AVERAGE:"平均\:%8.2lf %s"  GPRINT:cdefa:MAX:"最大\:%8.2lf %s\n"  LINE1:cdefe#002A97FF:"流出"  GPRINT:cdefe:LAST:"当前\:%8.2lf %s"  GPRINT:cdefe:AVERAGE:"平均\:%8.2lf %s"  GPRINT:cdefe:MAX:"最大\:%8.2lf %s\n"  AREA:cdefi#8F9286FF:"" 

    但是发现在终端中就已经无法正常显示中文了。基本可以确定是系统环境的问题。

    结论:没有中文字体原因导致

    后来无意中想到,也许是没有中文字体造成的。后来经过安装了字体之后就可以显示中文了。Centos7 安装中文字体 图文教程。

  • 解决Nginx的connect() to 127.0.0.1:8080 failed (13: Permission denied) while connect

    解决Nginx的connect() to 127.0.0.1:8080 failed (13: Permission denied) while connect

    前篇文章我们写了 Docker 下使用Centos系统镜像安装 uwsgi 运行 Python3 Django ,我们在实际运行 Nginx+uWSGI 搭配时出现 502 Bad Getway ,在nginx的error.log错误日志中,我们可以看到如下:

     connect() to 127.0.0.1:8080 failed (13: Permission denied) while connecting to upstream,

    经过一番检查以及google,应该是SeLinux的导致的。执行下面命令即可:

    setsebool -P httpd_can_network_connect 1

    关闭SELinux的两种方法

  • Python Django 修改文件后 不生效 解决办法

    Python Django 修改文件后 不生效 解决办法

    问题描述

    这里主要是在线上环境,我们上传代码后,发现没有生效。

    因为会生成.pyc文件。

    解决办法

    # 关闭所有 uwsgi进程,发现通过uwsgi --roload ****.pid 不一定有用
    killall -9 uwsgi
    # 启动 uwsgi
    uwsgi --ini /home/wwwroot/laoji.org/uwsgi.ini 
     
    # 重启一下nginx
    service nginx reload

  • windows下如何设置pip源为国内 图文教程

    windows下如何设置pip源为国内 图文教程

    在这里我使用清华源来做示范

    win+R 打开用户目录%HOMEPATH%,在此目录下创建 pip 文件夹,在 pip 目录下创建 pip.ini 文件, 内容如下,

    在pip文件夹里新建的pip.ini代码如下

    [global]
    timeout = 6000
    index-url = https://pypi.tuna.tsinghua.edu.cn/simple
    trusted-host = pypi.tuna.tsinghua.edu.cn

    另外还有一些其他国镜像

    阿里云  http://mirrors.aliyun.com/pypi/simple/ 
    中国科技大学   https://pypi.mirrors.ustc.edu.cn/simple/ 
    豆瓣(douban)  http://pypi.douban.com/simple/ 
    清华大学  https://pypi.tuna.tsinghua.edu.cn/simple/ 
    中国科学技术大学  http://pypi.mirrors.ustc.edu.cn/simple/

  • Python 跨文件 function函数 定义全局变量 代码实例

    Python 跨文件 function函数 定义全局变量 代码实例

    老季是Python新手,下面我们记录一下如何跨文件定义一个全局变量。

    • cnc.py 主程序文件
    • func.py 功能函数文件
    • cmcc.py

    我们需要在main.py、cmss.py里定义了一个变量,lockfile 当然这里文件里的各个值是不同的。我们如何在func.py的函数里使用这个lockfile的值呢?

    开始我们使用的是 global lockfile 方法,这种只能在单文件里赋值,比如:

    lockfile = 1
    def jrun():
        global lockfile   
        return lockfile+2

    这样的话可以正常运行,返回3 。但是如果我们把jrun()放入到另外一个文件里,就无法运行了。因为在这个py模块中并没有一个叫做lockfile的变量,于是就会报错未定义。 下面我们给出正确的方法。

    cnc.py

    import func
    lockfile = '/tmp/laoji.org.cnc'
    func.GlobalVar.lockFileName = lockfile #赋值到func里
    func.t = 123
    a()

    func.py

    class GlobalVar:
        lockFileName = None
    t = None
    def a():
        xxx = GlobalVar.lockFileName #这里就可以调用到设置的lockFileName值
        global t
        # 这里也同样可以调用到t的值
        dosomething...

    cmc.py

    import func
    lockfile = '/tmp/laoji.org.cmc'
    func.GlobalVar.lockFileName = lockfile  #这里就可以调用到设置的lockfile值了
    func.t = 333
    a()

    这里仅仅提供思路,大家还要根据实际情况举一反三。

  • Python3 Django 文件下载 中文文件名乱码 解决方案

    Python3 Django 文件下载 中文文件名乱码 解决方案

    本文记录一下在python3 django web开发中,下载文件时文件名为中文,出现乱码的解决方案。

    前端:

    <a href="/download/">下载</a>

    url.py:

    urlpatterns = [
        path('download/', download)
    ]

    views.py:

    from django.http import FileResponse
     
    def download(request):
        file = open('./static/download/简历.docx', 'rb')
        response = FileResponse(file)
        response['Content-Type'] = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
        response['Content-Disposition'] = 'attachment;filename= '+'简历'.encode('utf-8').decode('ISO-8859-1')+'.docx'
        return response
    

    来解释一下download函数:

    1、首先是打开存放文件的目录,‘.’表示根目录,也就是你整个django项目的根目录。我的“简历.docx”文件就放在djangoProjectName/static/download/目录下。

    2、docx使用的MIME类型是 application/vnd.openxmlformats-officedocument.wordprocessingml.document。

    3、因为文件名中有中文,如果直接在Content-Disposition中包含中文会导致文件名无法正常显示,因此要以'简历'.encode('utf-8').decode('ISO-8859-1')的形式进行转码。

    网上搜到常用的有三种方法实现文件下载,我这边就试了这一种,其他你可以自己去搜一下然后试试。

WeChat
↑