月度归档: 2020 年 6 月

  • python3 requests解决中文乱码问题的几种方法

    python3 requests解决中文乱码问题的几种方法

    有三种方法解决请求后乱码问题。

    方法一:获取二进制数据,再利用str进行编码转换

    import requests
    url='http://music.baidu.com'
    r = requests.get(url)
    html=r.content
    html_doc=str(html,'utf-8') #html_doc=html.decode("utf-8","ignore")
    print(html_doc)

    方法二:使用r.text

    Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 r.text 之时,Requests 会使用其推测的文本编码。你可以找出 Requests 使用了什么编码,并且能够使用 r.encoding 属性来改变它.
    但是Requests库的自身编码为: r.encoding = ‘ISO-8859-1’
    可以 r.encoding 修改编码

    import requests
    url='http://music.baidu.com'
    r=requests.get(url)
    r.encoding='utf-8'
    print(r.text)

    方法三:apparent_encoding获取网页编码

    上面的两个方法,适用于网页编码是utf-8的情况,但如果网页的默认编码不是utf-8,那么在设置编码的话就无从下手的,毕竟编码的类型那么多。这样可以使用 apparent_encoding获取网页使用的编码,在进行设置,如下:

    import requests
    url='http://laoji.org'
    r=requests.get(url)
    print(r.apparent_encoding)
    r.encoding=r.apparent_encoding
    print(r.text)
  • Nodecache新注册赠送1TB CDN加速 有香港加速节点可选

    Nodecache新注册赠送1TB CDN加速 有香港加速节点可选

    目前我们做网站项目一般都会用到CDN加速,比如我们熟悉的百度CDN、腾讯云CDN、阿里云CDN等云服务商都是有这类服务的。但是大部分国内服务商都是需要网站域名BeiA和接入才可以使用国内节点。而且我们看到提供香港等亚洲节点比较少,要不就是类似CloudFlare这类全部海外节点。

    今天看到Nodecache商家有提供付费CDN服务,在节点中有海外、香港节点等可选。看到商家介绍是属于GlobalCache旗下品牌,同时也有提供SSL证书、DNS、WAF、以及安全防护等。对于新注册用户还有赠送1TB有效期一个月的CDN流量,而且对于他们的流量可以选择地区的,比如可以选择全球用户,也可以选择亚洲用户节点。

    Nodecache账户注册

    官网地址:www.nodecache.com

    这里我们可以注册账户,注册完毕之后直接邮件激活就可以,然后可以看到得到赠送的1TB流量,有效期是一个月的。

  • windows pip使用国内源 图文教程

    windows pip使用国内源 图文教程

    前面我们记录了MacOS 下 Python3 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
  • MacOS 下 Python3 pip 配置国内源

    MacOS 下 Python3 pip 配置国内源

    国内源列表(推荐用阿里云的)

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

    方法一:安装时指定

    pip install ipython -i http://mirrors.aliyun.com/pypi/simple/

    如果提示 host 不被信任可以加上参数 –trusted-host

    pip install ipython -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
    

    方法二:永久设置

    mkdir ~/.pip
    vi ~/.pip/pip.conf # 创建一个pip配置文件# 写入配置

    写入如下代码:

    [global]
    index-url = http://mirrors.aliyun.com/pypi/simple/
    [install]
    trusted-host = mirrors.aliyun.com
  • 让 Homebrew 走代理更新

    让 Homebrew 走代理更新

    之前我们说过,由于国内网络进一步恶劣,使用 brew 也要Mac下的brew切换到国内的镜像源,但是这样的方法治标不治本,更新是快了,可是下载还是一样。

    结果就是导致大部分的更新都需要去下载源码然后本地编译,运气差一点的干脆源码也下载不下来,每次都要取消然后重试,不停地手工重复。

    ——如果能让终端命令走代理就好了。

    是的,你可能想到了什么比如 proxychains-ng 这类的软件,其实不用,因为 brew 是支持全局代理的,我们只需要在当前环境当中加入代理配置即可。

    在终端中输入如下代码:

    export ALL_PROXY=socks5://127.0.0.1:1080

    如果说你想要 brew 永久如此,我们就需要将环境变量写入终端的配置当中,这取决于你的终端,如果是默认的 bash,则写入 ~/.bash_profile ,如果是 zsh,则写在 ~/.zshrc  里。

    或者直接用如下语句来将命令直接导入到配置文件里。

    echo export ALL_PROXY=socks5://127.0.0.1:1080 >> ~/.bash_profile 

    zsh终端(MAC OS下切换默认终端为zsh 图文教程)

    echo export ALL_PROXY=socks5://127.0.0.1:1080 >> ~/.zsh_profile

    这样,Homebrew 就能通过代理来更新了,速度嗖嗖的。:)

  • VPS库存监控系统

    VPS库存监控系统

    最近闲来无事,弄了一个基于的django+vue的东西出来,主要是用于监控一些商家的VPS库存情况。我们是vue新手,边学边做,有不对的地方还望大佬指点~

    安装/Install

    本环境需要python3的运行环境以及python3-pip下载源码后运行 ` pip3 install django `

    然后将数据库导入

    python3 manage.py makemigrations --merge ; python3 manage.py migrate

    创建后台超级用户

     python3 manage.py createsuperuser

    开始启动服务

    python3 manage.py runserver 0.0.0.0:80

    启动后,可以在浏览器中打开 http://127.0.0.1/admin 的“商品”及“商家”中填入数据,否则首页会运行报错。

    定时监控/Crontab

    定时每分钟检查VPS商家库存情况,需要在商家的属性中设定`检查库存`:`是`然后将以下命令加入到crontab中。(Linux命令详解:crontab 定时任务)

     */1 * * * * cd /data/wwwroot/vps-stock-monitor/ ; python3 manage.py run > /dev/null 2>&1 &

    如在windows系统中,需要加入到计划任务中。

  • 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'))
WeChat
↑