年度归档: 2019 年

  • git push 提交操作出现 fatal: Authentication failed for 错误 解决方案

    git push 提交操作出现 fatal: Authentication failed for 错误 解决方案

    场景描述

    通常我们在日常开发时一般使用记住git密码功能,但是如果密码输入错误了就不会再弹出输入密码框了。

    git add . ; git commit -m ‘laoji.org ‘ ; git push
    On branch master
    Your branch is ahead of ‘origin/master’ by 1 commit.
    (use “git push” to publish your local commits)
    nothing to commit, working tree clean
    remote: Coding 提示: Authentication failed.
    remote: 认证失败,请确认您输入了正确的账号密码。

    配置用户信息

    git config --global user.name [username]
    git config --global user.email [email]

    查询用户信息

    git config --list

    3、如果push遇到在输入密码是熟错后,就会报这个错误fatal: Authentication failed for

    解决办法( 请使用管理员运行 )

    git config --system --unset credential.helper

    之后你在push就会提示输入名称和密码

    如不使用管理员运行可能会出现如下错误:

    error: could not lock config file C:/Program Files/Git/mingw64/etc/gitconfig: Permission denied

  • Python3 机房间流量调度系统

    Python3 机房间流量调度系统

    场景需求

    公司有很多机房,但是由于机房见的流量价格不一致,所以如果可以的话需要尽量使用便宜的流量。以缩减流量的成本。

    解决方案

    使用2台设备作为调度中心,将所有需要调出的流量全部调到调度中心设备。然后将这些流量切成固定片数(80片)。然后通过Python脚本计算机房上联速率后决定切片去不同的机房。然后登录调度中心的交换机执行对应的traffic-policy命令。

    这里老季也是第一次使用Python,可以说是完完全全的边学python3边写项目。

    这里使用的是Django框架来写,因为简单快捷。Django适合一个人快速开发,可以在后台少些很多很多代码。

    相关文章

    实现功能

    一阶段调度( 所有机房流量均小于后台设定的95上限值)

    在流量足够的场景下,将调出的流量调度到每个机房,使得每个机房都不超过各机房的95上限。

    二阶调度(所有机房流量均大于95上限)

    在所有机房流量均超过95上限的场景下,通过后台设定的权重,优先将流量调度到权重小的机房。使其小于95阀值。

    当机房流量大于95阀值时,将超出95阀值的流量调往下一个机房。

  • Python3 如何只允许一个脚本实例运行?

    Python3 如何只允许一个脚本实例运行?

    场景需求

    Python3中如何保证同样的脚本在运行时只允许一个运行实例,不允许新建一个脚本重新运行?我们这里使用文件锁的方式,简单方便。下面给出代码实例。

    代码实例

    import sys ,os 
    def lockFile(lockfilepath):
        '''
        :param lockfilepath:文件锁,文件名
        '''
        if os.path.exists(lockfilepath):
            #文件存在,说明脚本正在执行
            logging.critical("×××××× 脚本正在执行中,退出本次调度 ××××××")
            sys.exit()
        else:
            #文件不存在,创建文件,并执行任务。
            logging.info('已开启文件锁 %s',lockfilepath)
            subprocess.getoutput('echo "" > '+lockfilepath)
            return True
    def unLockFile(lockfilepath):
        os.remove(lockfilepath)
        logging.info('已释放文件锁 %s',lockfilepath)

    调用方法

    lockFileName = '/tmp/SCHEDULINGVLAN.Lock'
    func.lockFile(lockFileName)
    #.... do something else ....
    func.unLockFile(lockFileName)
    

    这里lockfileName设定了文件存储位置。

    如果程序意外出错,执行不到程序的最下面释放文件锁的话,永远无法新起脚本进程。

    当然这里也可以使用try / catch的方式来捕捉以外错误,同时释放文件锁。

  • 2019年各云厂家双11活动汇总

    腾讯云

    腾讯云双11活动地址链接直达

    • 标准型S4/S3 1核/2G/50G 1M宽带 88元/每年
    • 标准型S2 2核/4G/50G 5M宽带 998元/3年
    • 国内短信套餐包 10000条 360元/2年
    • 标准型S2 企业版 2核/4G/50G 3M宽带 688元/3年
    • 标准型S2 企业版 2核/8G/50G 5M宽带 1288元/3年
    • 标准型S2 企业版 4核/8G/50G 5M宽带 2888元/3年

    阿里云

    阿里云双11活动地址链接直达

    • ECS突发性能型t5 1核/2G/40G 1M宽带 86元/每年
    • ECS突发性能型t5 1核/2G/40G 1M宽带 229元3年
    • ECS共享型n4 2核/4G/40G 3M宽带 799元3年
    • ECS共享通用型mn4 2核/8G/40G 5M宽带 1399元3年
    • 突发性能t5 香港 1核/1G/40G 1M宽带 119元/每年
    • 国内短信套餐包 5000条 160元/2年

    滴滴云

    滴滴云双11活动地址链接直达

    • DC2爆款秒杀 1核 / 2GB内存 / 40GB高效云盘 / 1MB带宽 68元/年
    • DC2性价比之王 2核 / 4GB内存 / 40GB高效云盘 / 2MB带宽 468元/3年
    • DC2爆款必抢 2核 / 4GB内存 / 40GB高效云盘 / 5MB带宽 668元/3年
    • GPU入门基础P4版 2核 / 8GB内存 / 80GB高效云盘 / 1MB带宽/8GB显卡 1068元/年

    华为云

    华为云双11活动链接直达链接直达

    • 1核 / 2G 1MB宽带 ¥81.00/年
    • 2核 / 4G 1MB宽带 ¥388.22/年

  • 华为云双11活动 1核2G 年付仅¥81/元

    华为云双11活动 1核2G 年付仅¥81/元

    一年一度的双11到了,我们这里写一下华为云的活动,1核2G 年付仅¥81/元。还有¥49一年的域名注册服务还是相当给力的。

    华为云活动:华为云双11活动直达链接

    云服务器

    最低1核心 2GB 1M带宽 可选北京、上海、广州三个国内机房之一,年付只需要81元,这有点看谁价格低的态势。对于我们用户而言,管你如何竞争,谁价格低,配置高,稳定就用谁。

    华为云服务器直接购买的2折优惠活动81元年付套餐需要等待到九点才开始,如果我们有需要的网友到时候开始之后选择,需要是新注册用户。对于后面需要邀请才可以购买的套餐基本没有兴趣,作为一个新商家活动,居然这么套路用户,肯定没有人去邀请购买。所以直接81元的套餐限时活动还是有可能有人需要的。

    S6服务器新老用户都可以购买没有限制,这个配置是比较大的,属于中等用户项目需求。

    域名

    同时,有需要便宜域名的华为云49元.COM域名目前看还是比较便宜的。

  • Linux查找/根目录依次查找大文件 思路分析

    Linux查找/根目录依次查找大文件 思路分析

    前面我们写了BT宝塔面板 磁盘爆满处理方法 图文教程,近日发现服务器被莫名其妙的塞满了,下面我们记录一下如何从/根目录下手查找大文件的位置。

    根目录/查找大文件

    du -h --max-depth=1 /

    依次查找进入 /www 目录

    du -h --max-depth=1 /www/

    这里可以适当的调整 --max-depth 得参数,就是文件夹深度。

    依次往下进一步查找即可。

  • Python微信红包代码实例 微信红包的架构设计

    Python微信红包代码实例 微信红包的架构设计

    Python微信红包算法实例

    #!/usr/bin/env python
    # coding: utf-8
    import random
    # m : 红包个数
    # n : 红包人数
    # packet : 本次抢到的金额 , 所有金额以分为计算
    def redEnvelope(m,n):
        remain = m*100 #剩余金额
        nn = n #剩余人数
        for i in range(1,n):
            if remain == 0 :
                print('已经全部发完了')
            else :
                packet = random.randint(1,int(remain/nn*2))
                nn -= 1
                remain -= packet 
                print('第%d位成员红包的金额为%.2f元 , 余额为%.2f , 剩余%d人未领红包'%(i,packet/100,remain/100,nn))
        print('最后一个成员红包金额为%.2f元'%(remain/100))

    Python调用方法

    redEnvelope(100,4)

    运行结果

    第1位成员红包的金额为45.65元 , 余额为54.35 , 剩余3人未领红包
    第2位成员红包的金额为16.10元 , 余额为38.25 , 剩余2人未领红包
    第3位成员红包的金额为20.98元 , 余额为17.27 , 剩余1人未领红包
    最后一个成员红包金额为17.27元

    概况:2014年微信红包使用数据库硬抗整个流量,2015年使用cache抗流量。

    微信的金额什么时候算?

    答:微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储。。
    采取实时计算金额的考虑:预算需要占存储,实时效率很高,预算才效率低。

    实时性:为什么明明抢到红包,点开后发现没有?

    答:2014年的红包一点开就知道金额,分两次操作,先抢到金额,然后再转账。
    2015年的红包的拆和抢是分离的,需要点两次,因此会出现抢到红包了,但点开后告知红包已经被领完的状况。进入到第一个页面不代表抢到,只表示当时红包还有。

    分配:红包里的金额怎么算?为什么出现各个红包金额相差很大?

    答:随机,额度在0.01和剩余平均值*2之间。
    例如:发100块钱,总共10个红包,那么平均值是10块钱一个,那么发出来的红包的额度在0.01元~20元之间波动。
    当前面3个红包总共被领了40块钱时,剩下60块钱,总共7个红包,那么这7个红包的额度在:0.01~(60/7*2)=17.14之间。
    注意:这里的算法是每被抢一个后,剩下的会再次执行上面的这样的算法(Tim老师也觉得上述算法太复杂,不知基于什么样的考虑)。 这样算下去,会超过最开始的全部金额,因此到了最后面如果不够这么算,那么会采取如下算法:保证剩余用户能拿到最低1分钱即可。 如果前面的人手气不好,那么后面的余额越多,红包额度也就越多,因此实际概率一样的。

    红包的设计

    答:微信从财付通拉取金额数据郭莱,生成个数/红包类型/金额放到redis集群里,app端将红包ID的请求放入请求队列中,如果发现超过红包的个数,直接返回。根据红包的裸祭处理成功得到令牌请求,则由财付通进行一致性调用,通过像比特币一样,两边保存交易记录,交易后交给第三方服务审计,如果交易过程中出现不一致就强制回归。

    发性处理:红包如何计算被抢完?

    答:cache会抵抗无效请求,将无效的请求过滤掉,实际进入到后台的量不大。cache记录红包个数,原子操作进行个数递减,到0表示被抢光。财付通按照20万笔每秒入账准备,但实际还不到8万每秒。

    通如何保持8w每秒的写入?

    答:多主sharding,水平扩展机器。

    据容量多少?

    答:一个红包只占一条记录,有效期只有几天,因此不需要太多空间。

    询红包分配,压力大不?

    答:抢到红包的人数和红包都在一条cache记录上,没有太大的查询压力。

    一个红包一个队列?

    答:没有队列,一个红包一条数据,数据上有一个计数器字段。

    有没有从数据上证明每个红包的概率是不是均等?

    答:不是绝对均等,就是一个简单的拍脑袋算法。

    拍脑袋算法,会不会出现两个最佳?

    答:会出现金额一样的,但是手气最佳只有一个,先抢到的那个最佳。

    每领一个红包就更新数据么?

    答:每抢到一个红包,就cas更新剩余金额和红包个数。

    红包如何入库入账?

    数据库会累加已经领取的个数与金额,插入一条领取记录。入账则是后台异步操作。

  • MySQL int类型 最大值范围 关于mysql 使用int类型出现 1264 Out of range value for column 错误的解决办法

    MySQL int类型 最大值范围 关于mysql 使用int类型出现 1264 Out of range value for column 错误的解决办法

    关于mysql 出现 1264 Out of range value for column , 首先我们了解一下MySQL中int类型的基础知识。

    字节

    我们都知道计算机是以二进制为基础。存储的基本单位是 Bit,也称为比特、二进制位。1bit 可以表示 0 或者 1 两个数字,是可能存在的最小的信息量,任何小于1 bit 的内容都算不上信息。

    复杂的内容就要用多 bit 来表示。Byte ,也称为字节,通常用作计量单位。1 byte 等于 8 bit,即 1 byte 可以表示 28 内容。

    MySQL 中的字节

    先说明一下,在 MySQL 中的整数类型,可以分为 unsigned 和 signed 两种,即无符号和有符号,具体内容这里不展开。tinyint 的大小就是 1 byte,在 signed 类型能表示的数字以下表为例。(注:表格根据《编码》修改,仅做举例说明,不代表 MySQL 实际存储)

    二进制数十进制数
    10000000-128
    10000001-127
    10000010-126
    10000011-125
    ……
    11111101-3
    11111110-2
    11111111-1
    000000000
    000000011
    000000102
    ……
    011111100124
    011111101125
    011111110126
    011111111127

    int 最大值

    在上表中我们看到,首位的 bit 用来表示符号,因此在 sigend 是少一位 bit 来存储内容。int 是 4 byte,结合上述,可以得出 int 在 signed 最大值为

    2**31−1=2147483647

    在 unsigned 中,无需首位 bit 表示符号,因此为

    2**32−1=4294967295

    解决办法

    此时可能是数据值超出了范围,我们可能需要将 int 类型 改成 bigint .

  • Linux下关闭 MySQL 的binlog日志功能 图文教程

    Linux下关闭 MySQL 的binlog日志功能 图文教程

    LNMP一键安装包安装的MySQL默认是开启了日志文件的,如果数据操作比较频繁就会产生大量的日志,在/usr/local/mysql /var/下面产生mysql-bin.0000* 类似的文件,而且一般都在几十MB到几个GB,更甚会吃掉整个硬盘空间,从来导致mysql无法启动或报错,下面我们来说一说如何关闭MySQL的日志功能?

    删除日志 

    /usr/local/mysql/bin/mysql -u root -p
    reset master;

    修改/etc/my.cnf 文件

    log-bin=mysql-bin 
    binlog_format=mixed   

    这两行前面加上#,将其注释掉。

    重启mysql数据库

    /etc/init.d/mysql restart

    本文以LNMP一件安装包安装的环境为例 除MySQL重启命令和配置文件路径可能略有不同,其他一样。

  • Mysql查询某字段值重复的数据

    Mysql查询某字段值重复的数据

    查询user表中,user_name字段值重复的数据及重复次数

    select user_name,count(*) as count from user group by user_name having count>1;

  • Python3 中如何实现冒泡排序算法?

    Python3 中如何实现冒泡排序算法?

    什么是冒泡排序算法?

    临近的两个元素进行比较,然后互换顺序,一趟走完之后最大的或者最小的元素排在第一个或者最后一个位置(最大或者最小看实际需求),给的的感觉就是一个小泡泡一直冒啊冒,所以有个好听的名字叫冒泡算法

    举个例子,有数组[10, 1, 18, 30, 23, 12, 7, 5, 18, 17],我们使用从小到大的排序方法

    第一趟,外排下标为0,对应的值为10

    内排开始

    ①下标0和下标1的值进行比较。10和1比,发现1比10小,进行互换,内排一次完成,结果是[1, 10, 18, 30, 23, 12, 7, 5, 18, 17]

    ②下标1和下标2的值进行比较。10和18比,10比18小,保持不变,结果是[1, 10, 18, 30, 23, 12, 7, 5, 18, 17]

    ③下标2和下标3的值进行比较。18和30比,18比30小,保持不变,结果是[1, 10, 18, 30, 23, 12, 7, 5, 18, 17]

    ④下标3和下标4的值进行比较。30和23比,30比23大,进行互换,结果是[1, 10, 18, 23, 30, 12, 7, 5, 18, 17]

    ……一直这样紧邻的两个数比下去,第一趟外排结束,结果是[1, 10, 18, 23, 12, 7, 5, 18, 17, 30],我们发现,我们经过了这一次排序,把最大值30送到了右侧

    第二趟,外排下标是1

    内排开始

    ①下标0和下标1的值进行比较。1和10比,1比10小,保持不变,内排一次完成,结果是[1, 10, 18, 23, 12, 7, 5, 18, 17, 30]

    ②下标1和下标2的值进行比较。10和18比,10比18小,保持不变,内排二次完成,结果是[1, 10, 18, 23, 12, 7, 5, 18, 17, 30]

    …………

    ④下标3和下标4的值进行比较。12和23比,23比12小,进行互换,内排四次完成,结果是[1, 10, 18, 12, 23, 7, 5, 18, 17, 30]

    ⑤下标4和下标5的值进行比较。23和7比较,23比7大,进行互换,内排五次完成,结果是[1, 10, 18, 12, 7, 23, 5, 18, 17, 30]

    …………经过一系列排序,结束,结果为[1, 10, 18, 12, 7, 5, 18, 17, 23, 30],这个时候我们把第二大的数据23放到正确的位置

    第三趟

    …………结果为[1, 10, 12, 7, 5, 18, 17, 18, 23, 30]

    …………

    …………

    最终结果为[1, 5, 7, 10, 12, 17, 18, 18, 23, 30]

    至此,排序完成。

    Python3 代码实例

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    #冒泡排序
     
    def bubble_sort(the_list):
        i = 0
        while i < len(the_list):
            j = 0
            while j < len(the_list)-1:
                print(the_list[j],the_list[j+1])
                if the_list[j] > the_list[j+1]:
                    the_list[j], the_list[j+1] = the_list[j+1], the_list[j]
                j = j+1
                print(the_list)
            print("======"+str(the_list))
            i = i+1
        return the_list
    if __name__ == '__main__':
        the_list = [10, 1, 18, 30, 23, 12, 7, 5, 18, 17]
        print("排序前:" + str(the_list))
        print("排序后:" + str(bubble_sort(the_list)))
    

    运行结果

    排序前:[10, 1, 18, 30, 23, 12, 7, 5, 18, 17]
    10 1
    [1, 10, 18, 30, 23, 12, 7, 5, 18, 17]
    10 18
    [1, 10, 18, 30, 23, 12, 7, 5, 18, 17]
    18 30
    [1, 10, 18, 30, 23, 12, 7, 5, 18, 17]
    30 23
    [1, 10, 18, 23, 30, 12, 7, 5, 18, 17]
    30 12
    [1, 10, 18, 23, 12, 30, 7, 5, 18, 17]
    30 7
    [1, 10, 18, 23, 12, 7, 30, 5, 18, 17]
    30 5
    [1, 10, 18, 23, 12, 7, 5, 30, 18, 17]
    30 18
    [1, 10, 18, 23, 12, 7, 5, 18, 30, 17]
    30 17
    [1, 10, 18, 23, 12, 7, 5, 18, 17, 30]
    ======[1, 10, 18, 23, 12, 7, 5, 18, 17, 30]
    1 10
    [1, 10, 18, 23, 12, 7, 5, 18, 17, 30]
    10 18
    [1, 10, 18, 23, 12, 7, 5, 18, 17, 30]
    18 23
    [1, 10, 18, 23, 12, 7, 5, 18, 17, 30]
    23 12
    [1, 10, 18, 12, 23, 7, 5, 18, 17, 30]
    23 7
    [1, 10, 18, 12, 7, 23, 5, 18, 17, 30]
    23 5
    [1, 10, 18, 12, 7, 5, 23, 18, 17, 30]
    23 18
    [1, 10, 18, 12, 7, 5, 18, 23, 17, 30]
    23 17
    [1, 10, 18, 12, 7, 5, 18, 17, 23, 30]
    23 30
    [1, 10, 18, 12, 7, 5, 18, 17, 23, 30]
    ======[1, 10, 18, 12, 7, 5, 18, 17, 23, 30]
    1 10
    [1, 10, 18, 12, 7, 5, 18, 17, 23, 30]
    10 18
    [1, 10, 18, 12, 7, 5, 18, 17, 23, 30]
    18 12
    [1, 10, 12, 18, 7, 5, 18, 17, 23, 30]
    18 7
    [1, 10, 12, 7, 18, 5, 18, 17, 23, 30]
    18 5
    [1, 10, 12, 7, 5, 18, 18, 17, 23, 30]
    18 18
    [1, 10, 12, 7, 5, 18, 18, 17, 23, 30]
    18 17
    [1, 10, 12, 7, 5, 18, 17, 18, 23, 30]
    18 23
    [1, 10, 12, 7, 5, 18, 17, 18, 23, 30]
    23 30
    [1, 10, 12, 7, 5, 18, 17, 18, 23, 30]
    ======[1, 10, 12, 7, 5, 18, 17, 18, 23, 30]
    1 10
    [1, 10, 12, 7, 5, 18, 17, 18, 23, 30]
    10 12
    [1, 10, 12, 7, 5, 18, 17, 18, 23, 30]
    12 7
    [1, 10, 7, 12, 5, 18, 17, 18, 23, 30]
    12 5
    [1, 10, 7, 5, 12, 18, 17, 18, 23, 30]
    12 18
    [1, 10, 7, 5, 12, 18, 17, 18, 23, 30]
    18 17
    [1, 10, 7, 5, 12, 17, 18, 18, 23, 30]
    18 18
    [1, 10, 7, 5, 12, 17, 18, 18, 23, 30]
    18 23
    [1, 10, 7, 5, 12, 17, 18, 18, 23, 30]
    23 30
    [1, 10, 7, 5, 12, 17, 18, 18, 23, 30]
    ======[1, 10, 7, 5, 12, 17, 18, 18, 23, 30]
    1 10
    [1, 10, 7, 5, 12, 17, 18, 18, 23, 30]
    10 7
    [1, 7, 10, 5, 12, 17, 18, 18, 23, 30]
    10 5
    [1, 7, 5, 10, 12, 17, 18, 18, 23, 30]
    10 12
    [1, 7, 5, 10, 12, 17, 18, 18, 23, 30]
    12 17
    [1, 7, 5, 10, 12, 17, 18, 18, 23, 30]
    17 18
    [1, 7, 5, 10, 12, 17, 18, 18, 23, 30]
    18 18
    [1, 7, 5, 10, 12, 17, 18, 18, 23, 30]
    18 23
    [1, 7, 5, 10, 12, 17, 18, 18, 23, 30]
    23 30
    [1, 7, 5, 10, 12, 17, 18, 18, 23, 30]
    ======[1, 7, 5, 10, 12, 17, 18, 18, 23, 30]
    1 7
    [1, 7, 5, 10, 12, 17, 18, 18, 23, 30]
    7 5
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    7 10
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    10 12
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    12 17
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    17 18
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    18 18
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    18 23
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    23 30
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    ======[1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    1 5
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    5 7
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    7 10
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    10 12
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    12 17
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    17 18
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    18 18
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    18 23
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    23 30
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    ======[1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    1 5
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    5 7
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    7 10
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    10 12
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    12 17
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    17 18
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    18 18
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    18 23
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    23 30
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    ======[1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    1 5
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    5 7
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    7 10
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    10 12
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    12 17
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    17 18
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    18 18
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    18 23
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    23 30
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    ======[1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    1 5
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    5 7
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    7 10
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    10 12
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    12 17
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    17 18
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    18 18
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    18 23
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    23 30
    [1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    ======[1, 5, 7, 10, 12, 17, 18, 18, 23, 30]
    排序后:[1, 5, 7, 10, 12, 17, 18, 18, 23, 30]

  • 在Python3 Django框架 模板中如何使用条件判断?

    在Python3 Django框架 模板中如何使用条件判断?

    老季在本篇记录一下在Django的开发中,如何在模板中使用if判断条件。

    views.py

    # view 文件
    def func(request):
        ...
        return render(request,"index.html",{
            'current_user':"alex",
            'user_list':['alex','eric',
            'user_dict':{'k1':'v1','k2':'v2'}]
        })

    .html 模板

    # html 文件
    <html>
        ....
    <body>
        <div>{{current_user}}</div>
        <a>{{ user_list.0}}</a>
        # 条件判断
        {% if age %}
            <a> 有年龄<a>
        {% else %}
            <a> 无年龄<a>
        {% endif %}
        # 嵌套条件判断
        {% if age %}
            <a> 有年龄<a>
        {% if age > 16 %}
            <a>老男人<a>
        {% else %}
            <a>小男孩<a>
        {% else %}
            <a> 无年龄<a>
        {% endif %}
        <body>
    </html>
WeChat
↑