![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Python
旷古的寂寞
这个作者很懒,什么都没留下…
展开
-
Django大文件分块上传和分块下载
下面是简单的demo,可能有Bug,需要的看官拿去自己拓展吧。views.py#!/usr/bin/env python# -*- coding: utf-8 -*-import osimport reimport statimport base64import shutilimport pickleimport rehashimport mimetypesimport posixpathfrom django.conf import settingsfrom urllib原创 2021-07-27 15:55:22 · 2297 阅读 · 0 评论 -
全国电话区号->地址映射表
{ "010": {"customerProvince": "北京", "customerCity": "北京"}, "021": {"customerProvince": "上海", "customerCity": "上海"}, "022": {"customerProvince": "天津", "customerCity": "天津"}, "023": {"customerProvince": "重庆", "customerCity": "重庆"}, "852".原创 2021-07-26 16:37:29 · 953 阅读 · 0 评论 -
python中的进程、线程、协程,它们的区别和联系
1. 进程的定义进程是系统进行资源分配和调度的一个独立单位。import multiprocessingimport timedef sing(): for i in range(89): print('----正在唱歌-----') time.sleep(1)def dance(): for i in range(3): print('----正在跳舞-----') time.sleep(89)if __name...转载 2020-07-27 18:52:23 · 288 阅读 · 0 评论 -
WSGI 协议运行原理
基本概念:WSGI:全称是Web Server Gateway Interface,WSGI是一种规范,用来描述web server如何与web application通信的规范。server和application的规范在PEP 3333中有具体描述。要实现WSGI协议,必须同时实现web server和webapplication,当前运行在WSGI协议之上的web框架有Flask,Django等。WSGI协议主要包括server和application两部分:WSGI server负责...转载 2020-07-23 21:56:09 · 169 阅读 · 0 评论 -
with及上下文管理器的原理和应用
这篇博客主要总结with用法,自定义上下文管理器,以及__exit__的参数相关内容。with 语句是 Pyhton 提供的一种简化语法,适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,with 语句主要是为了简化代码操作。with:文件使用后自动关闭# 创建一个文件test.txt,若存在则打开,写入Hello Python# 创建/打开文件f = open('test.txt', 'w')f.write("Hello Python")#转载 2020-07-23 21:51:46 · 162 阅读 · 0 评论 -
Python字典底层实现原理
在Python中,字典是通过散列表或说哈希表实现的。字典也被称为关联数组,还称为哈希数组等。也就是说,字典也是一个数组,但数组的索引是键经过哈希函数处理后得到的散列值。哈希函数的目的是使键均匀地分布在数组中,并且可以在内存中以O(1)的时间复杂度进行寻址,从而实现快速查找和修改。哈希表中哈希函数的设计困难在于将数据均匀分布在哈希表中,从而尽量减少哈希碰撞和冲突。由于不同的键可能具有相同的哈希值,即可能出现冲突,高级的哈希函数能够使冲突数目最小化。Python中并不包含这样高级的哈希函数,几个重要(用于处理字转载 2020-07-23 21:45:51 · 117 阅读 · 0 评论 -
线程池使用:CPU密集型和IO密集型
#1 cpu密集型: cpu使用率较高(也就是一些复杂运算,逻辑处理),所以线程数一般只需要cpu核数的线程就可以了。 这一类型的在开发中多出现的一些业务复杂计算和逻辑处理过程中。#1 I/O密集型: cpu使用率较低,程序中会存在大量I/O操作占据时间,导致线程空余时间出来,所以通常就需要开cpu核数的两倍的线程, 当线程进行I/O操作cpu空暇时启用其他线程继续使用cpu,提高cpu使用率 通过上述可以总结出:线程的最佳数量: 最佳线程数目 = ((线程等待时间+线程CPU...转载 2020-07-23 01:01:49 · 1852 阅读 · 0 评论 -
python实现的三层系统调用模型,模拟消息堆积的情况
前段时间我们的客户端总是Read timeout,定位以后发现是中间的消息转发系统消息堆积了。消息堆积的原因是底层系统处理部分消息的时间比较长,异步IO转发消息是并发而不是并行的,这部分处理时间长的网络IO占用了大量并发切片时间和资源,导致原本处理很快的那部分请求也被阻塞了。我们使用了线程池解决这个问题,实现并行的网络交互,避免了长时间请求阻塞其他请求,下面是系统架构模型及解决方案。一、底层服务端#!/usr/bin/env python# -*- coding:utf-8 -*-im原创 2020-07-23 00:52:20 · 114 阅读 · 0 评论 -
关于json,pickle,BSON的区别
json适用于跨语言的序列化、反序列化场景,但是对内部数据类型要求较严格。import jsonprint(json.loads(json.dumps({'test': 'test'})))with open('test.txt', 'w') as file: json.dump({'test': 'test'}, file)with open('test.txt', 'r') as file: print(json.load(file))pickle可用于序列化python原创 2020-07-22 00:51:09 · 187 阅读 · 0 评论 -
Python调度器(Scheduler)简单用例
apscheduler调度器类型:BlockingScheduler 阻塞式调度器BackgroudScheduler 非阻塞式后台调度器AsyncIOSchedulerGeventSchedulerTornadoSchedulerTwistedSchedulerQtScheduler#!usr/bin/env pythonimport timeimport loggingfrom datetime import datetimefrom apscheduler.s原创 2020-07-22 00:25:52 · 2484 阅读 · 0 评论 -
Python连接MQTT的示例
MQTT服务的安装配置:https://cloud.tencent.com/developer/article/1350337#!usr/bin/env pythonimport timefrom paho.mqtt.client import Clientclass Client(Client): print_log = True # 控制是否输出MQTT交互日志 def on_message(self, client, userdata, message): .原创 2020-07-21 23:50:28 · 742 阅读 · 0 评论 -
Python ftplib模块解决socket交互阻塞问题
ftplib模块操作FTP服务器时很容易阻塞,原因各种各样,有时还与ftp服务器有关。下面的demo重载了ftplib模块,主要是使用了非阻塞的socket(self.sock.setblocking(0)),以及使用conn.recv接收数据代替conn.makefile生成文件句柄接收数据,解决了阻塞问题,同时增加了一些功能。#!usr/bin/env pythonimport osimport reimport timeimport socketimport ftplibimpo原创 2020-07-20 19:16:47 · 1324 阅读 · 0 评论 -
并发和并行的区别
并发(concurrency)和并行(parallellism)是:解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。解释三:并行是在多台处理器上同时处理多个任务。如 hadoop 分布式集群,并发是在一台处理器上“同时”处理多个任务。所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执.转载 2020-07-20 17:59:05 · 152 阅读 · 0 评论 -
Python生成指定长度和字符类型的随机密码并校验安全性
#!/usr/bin/env python# -*- coding:utf-8 -*-import reimport timeimport stringimport randomdef new_password(min_pass_len, max_pass_len, min_char_kind): pass_choice = [string.ascii_lowercase, string.ascii_uppercase, string.digits, .原创 2020-07-19 22:05:59 · 473 阅读 · 0 评论 -
python推送数据到kafka的kerberos服务验证(ubuntu)
1. 安装必要的依赖包apt-get install krb5-kdc libkrb5-dev python3-six -y --fix-missingpip3 install gssapi==1.6.6 kafka-python==2.0.1 -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com2. 获取必要的配置文件krb5.conf、kafka.keytab、jaas.conf放到/etc目录原创 2020-07-07 18:19:42 · 944 阅读 · 0 评论 -
django+vue的csrf_token传递
django向vue前端传递csrf_token,可以使用接口传递from django.middleware.csrf import get_tokendef get_csrf_token(request): return JsonResponse({'csrf_token': get_token(request) or 'NOTPROVIDED'})也可以使用装饰器装饰视图函数,这样csrf_token会被添加到cookie里面,这种方式要注意Domain的配置from原创 2020-05-31 16:32:30 · 1577 阅读 · 0 评论 -
Python rsa加密解密/签名验签,aes加密解密
#!/usr/bin/env python# -*- coding:utf-8 -*-import base64from Crypto import Randomfrom Crypto.Hash import MD5 # or use SHAfrom Crypto.Cipher import AESfrom Crypto.PublicKey import RSAfrom Crypto.Cipher import PKCS1_v1_5from Crypto.Signature import.原创 2020-05-31 16:25:36 · 346 阅读 · 0 评论 -
Django中自定义限制访问频率的反爬虫中间件
一、安装用到的Python库pip install geoip2 redis django-redis二、下载IP地理位置数据库,保存到项目根目录下链接: https://pan.baidu.com/s/1TaSQcgw4OimBrDH0ERLKKw 提取码: ixa7三、自定义中间件,保存到项目根目录下的backends.py中from random import...原创 2020-01-19 15:35:11 · 693 阅读 · 0 评论 -
sqlalchemy动态定义表模型,以及带来的内存泄露问题的解决
一、表模型动态定义方法最近遇到一个需求场景,需要在mysql中动态生成存储日志数据的表。我使用的数据库ORM是sqlalchemy,经过查阅文档,找到了如下的实现方法,需要的朋友可以拿去用了,注意查看注释哦。#!/usr/bin/env python2# -*- coding:utf-8 -*-from sqlalchemy import Column, BigInteger, Da...原创 2020-01-16 18:43:06 · 1460 阅读 · 0 评论 -
用gunicorn实现Django高并发的解决方案
Django提供了自带的runserver命令启动服务,这种方式一般用于开发环境以便于调试程序,并发量比较小的时候也是可以应对的,但是并发量超过这种方式的承载能力时,就需要使用gunicorn启动Django的服务来提高并发能力了。一、安装依赖包:pip3 install django==2.0.6 gevent==1.4.0 gunicorn==19.7.1二、在项目的settin...原创 2019-12-26 12:26:38 · 2636 阅读 · 0 评论 -
tornado使用持久连接,保持一定的连接数,实现端口复用的方法
一、应用场景和实现方法最近遇到一个与对端交互的特殊场景,对端限制了单个IP的端口连接数量。如果我频繁的打开和关闭TCP连接,只保证连接的数量小于限定值,对我来说,TCP连接已经关闭,端口也回收了,但是对方的端口还是识别为被占用的状态,这就导致大量的连接被拒绝。所以我查阅相关资料,实现了持久化连接、端口复用的功能,下面是一个基于Python2.7,用tornado 4.5.3框架写的...原创 2019-12-25 19:23:21 · 2366 阅读 · 0 评论 -
Django的ORM中使用CASE-THEN-ELSE子句批量过滤更新数据的方法
最近有一个新的需求场景,需要根据不同的过滤条件修改数据为相应的内容,比如id=n时修改name='name_n'。大量的这种操作肯定需要批量处理,否则一条一条修改效率是很低的。Mysql中可以使用CASE-THEN-ELSE子句实现这样的效果,Django的ORM也提供了相应的方法,如下所示:参考官方文档:https://docs.djangoproject.com/en/2.2/ref/mo...原创 2019-12-17 11:33:06 · 1254 阅读 · 0 评论 -
自定义python多进程下可用的TimedRotatingFileHandler,解决使用logging模块写日志冲突问题
如题,解决多进程写日志冲突的问题,用法和logging模块原生的TimedRotatingFileHandler一样,但是不支持按星期保留日志,也不支持utc参数,需要的老铁可以自己定制。需要注意的是这里没有使用进程锁,打开文件必须使用"a+"模式,改的时候要注意别改错了。# -*- coding:utf-8 -*-import osimport timeimport loggin...原创 2019-11-27 20:01:37 · 1883 阅读 · 0 评论 -
获取scrapy的请求队列操作及队列处理完毕后sleep并重启爬虫
一、源码分析Scrapy默认爬虫引擎是scrapy.core.engine.ExecutionEngine,其中的_next_request函数负责从调度器的队列中取得下一个Request对象进行处理,处理完后会调用spider_is_idle函数检查爬虫的请求队列是否为空,下面是简略的源代码:class ExecutionEngine(object): ... de...原创 2019-11-21 16:42:20 · 3196 阅读 · 7 评论 -
RSA签名验签、加密解密,基于Python2下的Crypto
一、签名和验签# -*- coding: utf-8 -*-import base64from Crypto import Randomfrom Crypto.Hash import SHAfrom Crypto.PublicKey import RSAfrom Crypto.Signature import PKCS1_v1_5def get_keys(): ra...原创 2019-11-18 15:44:47 · 464 阅读 · 0 评论 -
django的csrf验证机制以及403、400异常的排查方法
一、CSRF验证CSRF(Cross-site request forgery)跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或者XSRF。是一种对网站的恶意利用。Django通过在post请求中添加csrfmiddlewaretoken参数进行验证,防止CSRF攻击。添加csrfmiddlewaretoken参数的几种方...原创 2019-08-13 11:49:46 · 526 阅读 · 0 评论 -
python获取内网IP和外网IP的方法
获取内网IP:import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.connect(('8.8.8.8', 80))print(s.getsockname()[0])s.close()获取外网IP:import requestsprint(requests.get('http://ifcon...原创 2019-08-13 17:34:36 · 5308 阅读 · 1 评论 -
常用3602汉字表
一乙二十丁厂七卜人入八九几儿了力乃刀又三于干亏士工土才寸下大丈与万上小口巾山千乞川亿个勺久凡及夕丸么广亡门义之尸弓己已子卫也女飞刃习叉马乡丰王井开夫天无元专云扎艺木五支厅不太犬区历尤友匹车巨牙屯比互切瓦止少日中冈贝内水见午牛手毛气升长仁什片仆化仇币仍仅斤爪反介父从今凶分乏公仓月氏勿欠风丹匀乌凤勾文六方火为斗忆订计户认心尺引丑巴孔队办以允予劝双书幻玉刊示末未击打巧正扑扒功扔去甘世古节本术汇头汉宁穴它...原创 2018-09-28 10:33:05 · 1213 阅读 · 0 评论 -
使用Python生成大文件的md5,可用于文件分块传输的校验
包含了大文件安全读取的方法,md5对象的转换和存储方法,示例如下:import rehashimport pickleimport base64file_path = '' # 文件路径file_hash = rehash.md5() # 生成md5迭代器with open(file_path, 'rb') as the_file: for line in the...原创 2019-08-12 17:28:56 · 966 阅读 · 0 评论 -
解决django高并发时数据库连接量过大的问题(实现连接池的方法)
Django默认每访问一次数据库都会创建一个新的数据库连接,执行完数据库操作后再关闭连接。这在高并发的场景下会导致连接数不断增多,最终出现“too many connections”错误。如果我们使用gunicorn的gevent模式运行项目,那么不能在项目中使用threading(多线程)模块进行数据库操作。因为gevent会给threading模块动态打补丁,这会导致数据库连接无法复用,出...原创 2019-08-16 14:19:18 · 10039 阅读 · 0 评论 -
django的model使用上容易遇到的坑,default=datetime.now和auto_now、null和blank、save和update、bulk_create
一、django设置字段动态默认时间的四种方式:from django.db import modelsfrom datetime import datetimeclass User(models.Model): id = models.BigAutoField('主键', primary_key=True) name = models.CharField('名字'...原创 2019-08-12 15:53:55 · 6370 阅读 · 0 评论 -
关于django2.0的favicon.ico和media的配置
在settings.py中MEDIA_URL = '/media/'TEMPLATES[0]['OPTIONS']['context_processors'].append('django.template.context_processors.media')在urls.py中from django.urls import re_pathfrom django.conf imp...原创 2018-09-29 10:40:17 · 770 阅读 · 0 评论 -
Python校验IPv4、IPv6的IP地址是否可用的方法
利用socket库附带的校验功能实现校验。import socketdef is_ipv4(ip): try: socket.inet_pton(socket.AF_INET, ip) except AttributeError: # no inet_pton here, sorry try: socket.in...原创 2018-09-29 10:15:58 · 5554 阅读 · 0 评论 -
django继承form表单后重置属性的方法
django的表单模型是一大亮点功能,有时多个表单存在相似的字段,我们可以进行继承复用,如果要在继承后修改某些属性,可以利用Python的super函数重载表单的初始化函数。from django import formsclass PasswordForm(forms.Form): password = forms.CharField(max_length=20, min_l...原创 2018-09-29 10:07:31 · 850 阅读 · 0 评论 -
在django的form表单及ajax提交的数据中添加认证的csrfmiddlewaretoken
1. 对于ajax提交数据,把下面的代码加入到js的头部,可以保证ajax执行时自动提交参数csrfmiddlewaretoken。$.ajaxSetup({data: {csrfmiddlewaretoken: '{{ csrf_token }}' }});2. 对于form表单提交数据,在表单内部加入{% csrf_token %}标签,会自动生成一个input标签<f...原创 2018-09-28 17:27:40 · 5966 阅读 · 0 评论 -
django2.0在模板中渲染通用变量
django中需要为所谓模板增加通用的渲染变量,有三种方式。第一种是在每个视图函数增加渲染的变量,这种方式是效率最低的。第二种方式是每个视图函数都使用一个通用的装饰器,在装饰器中统一渲染,这种方式也比较麻烦。第三种方式是自定义模板中间件,如下所示:# mysite/backends.py中编写中间件def render(request): return {'CACHE_...原创 2018-09-28 16:48:48 · 376 阅读 · 0 评论 -
2018年7月中华人民共和国县以上行政区划代码
数据来源:http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/20180708230813.html注:1、台湾省、香港特别行政区和澳门特别行政区暂缺地市和区县信息 2、每月发布的区划变更表是根据区划变更地的统计人员在统计信息系统更新后的情况所绘制, 与区划变更文件发布的时间有一定的延迟性,但在每年的...原创 2018-09-28 10:21:15 · 2057 阅读 · 0 评论 -
django-debug-toolbar的配置,解决访问速度慢和nginx转发请求后debug_toolbar不显示的问题
1. 访问速度慢启用debug_toolbar后网页加载变得很慢,这是因为debug_toolbar需要jquery文件,默认情况下debug_toolbar会从google引用jquery,这就很尴尬了,解决方法如下。下载jquery-3.3.1.min.js,然后放到项目的static静态资源文件夹下面,然后在setttings.py中:# JQUERY_URL对应的地址映射到...原创 2018-09-27 18:45:20 · 961 阅读 · 0 评论 -
django使用数据库缓存时避免用户鉴权频繁查询用户数据
一个特殊的业务场景,需要使用数据库作为缓存,导致django在用户鉴权时频繁查询数据库,用户访问每个需要权限的页面都会查询一次。为了减少数据库开销,把用户数据缓存,需要重载AUTHENTICATION_BACKENDS配置。AUTHENTICATION_BACKENDS = ['mysite.backends.ModelBackend']然后自定义的ModelBackend如下:f...原创 2018-09-27 18:19:22 · 887 阅读 · 0 评论 -
Django2.0结合geoip2模块实现根据ip地址屏蔽异常请求
首先安装geoip2:sudo pip3 install geoip2然后下载GeoIP的数据库放到项目目录下:wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gzgunzip GeoLite2-Country.mmdb.gzwget http://geolite.max...原创 2018-09-27 18:03:28 · 666 阅读 · 0 评论