![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Django
Django学习
白小白的小白
你知道的越多,你不知道的越多!
展开
-
django迁移表命令
生成迁移文件:python3/python manage.py makemigrations迁移:python3/python manage.py migrate原创 2020-08-12 15:07:48 · 1534 阅读 · 0 评论 -
记一次djnago orm框架中的数据优化
1 only和defer优化有一个表为:然后我在djnago中使用orm框架中查询,sql语句为:obj = AppOauthInfoLog.objects.all().first()print(obj.id)print(obj.app_id)执行的sql结果为:根据图片可以看出来,这条sql把表中的所有字段都给查询了出来,这样明显浪费i/o,如果我们使用only来优化那:obj = AppOauthInfoLog.objects.only("id", "app_id").first(原创 2021-07-03 11:28:30 · 165 阅读 · 0 评论 -
django使用装饰器来验证权限
在django项目中,我们需要验证权限等,使用django封装的不能够准确的提醒用户是缺少什么权限,所以我们就可以使用装饰器在视图上来进行权限管理装饰器的原理:闭包,在函数内部定义一个函数,并且这个函数用到了外部函数的变量,那么将这个函数以及用到的变量称之为闭包视图代码:from django.utils.decorators import method_decoratorfrom users.decorator import set_func, DecoratorClass# @meth.原创 2021-05-09 10:31:07 · 1040 阅读 · 0 评论 -
rabbitmq在python中实现延时队列(库存回滚)
RabbitMQ延时队列实现1.1 消息的TTL消息的TTL(Time To Live)就是消息的存活时间,单位是毫秒 RabbitMQ 可以对队列和消息分别设置TTL对队列设置就是队列没有消费者连着的保留时间,也可以对每一个单独的消息做单独的设置。超过了这个时间,我们认为这个消息就是死了,称之为死信如果队列设置了,消息也设置了,那么会取小的。所以一个消息如果被路由到不同的队列中,这个消息死亡的时间有可能不一样(不同的队列设置)。这里单讲单个消息的TTL,因为它才是实现延迟任务的关键。可以通过设..原创 2021-05-07 15:15:44 · 674 阅读 · 0 评论 -
rabbitmq在python中实现流量削峰
在电商项目中,一但有秒杀活动,一瞬间进来的请求较多,假设一秒中进来的请求2万,但是数据库的并发只有2000,那么如果不做限制的话,db一下就会被打死或者导致很卡,那么就可以利用rabbitmq的ack机制prefetch_count(限制未处理消息的最大值)来平缓的取出数据来进行数据库的操作import threading, timeimport pikaclass SingletonClass(object): """单例模式用来少创建连接""" # 加锁,防止并发较高时,同.原创 2021-04-29 14:26:58 · 476 阅读 · 0 评论 -
django 中如何将两个查询集合并
在我们项目中,由于各种原因或者分表后,我们需要查询两个表然后将其合并并排序来序列化返回给前端,那么我们合并查询集:代码:# -*- coding: utf-8 -*-# !/usr/bin/python3import os, datetime, time, random,base64, jsonimport sysimport oss2BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__fi原创 2021-04-27 11:37:38 · 1802 阅读 · 0 评论 -
django中权限和认证
权限和认证:地址转载 2021-03-19 14:07:31 · 230 阅读 · 0 评论 -
python红包转账高并发处理
最近项目中有一个功能,就是转账红包(即时提现到支付宝,秒到账),每天限制用户提现一次,刚开始,每天和支付宝对账的时候都能对上,但是后来随着用户的增多,每天几万人提现,并发量上来了,发现有时候账单对不上,后来发现死锁了,然后使用事务并优化代码,这个问题解决了,随着时间的推移,突然发现有些用户提现了一次,支付宝给他连续转账了好几次,有的甚至几十次,然后看代码逻辑,怎么都没有发现问题,后来给支付宝提工单,支付宝那边回复是我这边连续调了转账接口好多次,然后就在思考这是为什么?由于每个用户每天只能提现一次,所以请原创 2021-03-16 10:40:42 · 263 阅读 · 0 评论 -
python中可逆的加密方式
django中的SessionBasefrom django.contrib.sessions.backends.base import SessionBasenum = random.randint(1, 999)session_obj = SessionBase()data = {'num':num, 'app_id': 123456786987, 'user_id': 234242342340}data_str = session_obj.encode(data) # 编码为字符串.原创 2021-03-12 16:10:37 · 1135 阅读 · 1 评论 -
django中批量修改数据
在django 3.1版本中,出现了model的一个方法,就是批量修改数据库的数据,那么具体如何使用那优点:快速,方便,性能更好缺点:不能更新模型的主键,每个模型的 save() 方法没有被调用,而且 pre_save 和 post_save 信号没有被发送,更新定义在多表继承祖先上的字段将给每个祖先带来额外的查询(也就是如果更新外键的话还是不要使用)使用方法(更新type和sum_fans 字段):from users.models import Userquerys = User.obj.原创 2021-03-10 15:26:03 · 4231 阅读 · 0 评论 -
django中model中的外键删除
on_delete = models.CASCADE删除关联数据的时候,与之的关联也删除on_delete = models.DO_NOTHING删除关联数据的时候,什么操作也不做on_delete = models.PROTRCT删除关联数据的时候,引发报错on_delete = models.SET_NULL删除关联数据的时候,与之关联的只设置为空on_delete = models.SET_DEFAULT删除关联数据的时候,与之关联的只设置为默认值on_delete = models.SET原创 2021-03-04 17:07:42 · 533 阅读 · 1 评论 -
django + uwsgi添加并发量
我们公司有个项目,用户突破了十万,导致页面非常卡,当初是怀疑是数据库的数据太多的原因,然后就添加索引,结果还是那么慢,我就通过时间去查询到底是哪一句sql比较慢,结果发现查询sql还是很快啊,没有超过一秒都出来了,然后怀疑是数据库的并发数量小了,然后设置大一点,发现还是很慢,实在找不出来原因的时间,我在日志中找到了如下的标志:Mon Jan 25 17:29:11 2021 - *** uWSGI listen queue of socket ":8001" (fd: 3) full !!! (101/1原创 2021-01-25 18:50:18 · 1951 阅读 · 0 评论 -
阿里云oss上传图片
在项目开发过程中,文件存储无非就是第一,存放到我们自己的服务器,但是这种方式有一个很大的弊端就是随着用户的增加,存放到服务器的数据或者图片越来越多,那么就会很占服务器的带宽,这样后期会很影响服务器的性能,导致卡顿,第二就是使用阿里云的oss数据存储,但是注意,阿里云的域名需要配置一下,不然我们后端返回给前端的url,前端拿到url后拉取图片,会报跨域错误,配置下就可以了,阿里云存储文件有两种方式:当用户上传图片时,前端向我们后端去请求一个接口,后端向阿里云要一个token,然后后端把拿到的token返回原创 2021-01-21 09:51:56 · 1158 阅读 · 0 评论 -
基于django搭建文件存放服务器
在我们的工作中,有的公司不会让你使用阿里云服务器来存放图片,而是要存放在自己的服务器,这就很烦人,但是我们也要搞啊,models:from uuid import uuid4from django.contrib.auth.models import AbstractUserfrom django.db import modelsfrom itsdangerous import JSONWebSignatureSerializer as JWSSerializer# Create your m原创 2021-01-08 17:39:08 · 1567 阅读 · 0 评论 -
python生成链接二维码
django生成链接二维码,用户扫码之后跳转到指定链接(生成的二维码图片转成了base64,前端收到之后需要转成图片即可):import qrcode, base64from io import BytesIOfrom django.http import HttpResponseclass LinkCodeAPIView(APIView): """链接二维码""" def get(self, request): status_http = 'http://'原创 2021-01-07 11:48:42 · 1076 阅读 · 0 评论 -
python为图片盖印章
为图片盖印章,印章首先也要是一张图片:代码:from PIL import Imageclass ImageStampAPIView(GenericAPIView): """给图片盖章功能""" permission_classes = [IsAuthenticated] def get(self, request): im = Image.open("/home/sundries/1.png") # 图片 stamp原创 2021-01-07 11:31:56 · 1549 阅读 · 1 评论 -
python为图片添加中文汉字水印
在django中为汉字添加水印:import PILfrom PIL import Image, ImageDraw, ImageFontclass ImageWatermarkAPIView(GenericAPIView): """给图片添加水印""" permission_classes = [IsAuthenticated] def get(self, request): # 设置所使用的字体和字体的大小(注意有的字体中文是画不出来的)原创 2021-01-07 10:57:48 · 829 阅读 · 0 评论 -
微信公众号分享链接到微信 qq的python后台代码
微信公众号分享微信 微博 qq的python后台代码:import randomimport requestsimport timeimport hashlibimport django_redisimport loggingfrom random import Randomfrom api_users.WeChatOauth import conflogger = logging.getLogger('django')class ApiWeChatSharePay(object原创 2021-01-06 15:17:33 · 533 阅读 · 1 评论 -
centos7下使用python将docx变为pdf
在centos中将docx变为pdf需要libreoffice包来支撑,有了libreoffice,则方便了多下载libreoffice,可以去官网下载最新版本,然后在centos中安装,libreoffice官方网址:libreoffice官方网址安装libreoffice:解压:tar -zxvf LibreOffice_7.0.4_Linux_x86-64_rpm.tar.g(我这里下载的最新的)cd LibreOffice_7.0.4.2_Linux_x86-64_rpmcd RP原创 2021-01-05 15:24:07 · 1589 阅读 · 3 评论 -
django中怎么使用mysql数据库的事务
在进行后端业务开始操作修改数据库时,可能会涉及到多张表的数据修改,对这些数据的修改应该是一个整体事务,即要么一起成功,要么一起失败,Django中对于数据库的事务,默认每执行一句数据库操作,便会自动提交。我们需要在保存数据库操作中自己控制数据库事务的执行流程在Django中可以通过django.db.transaction模块提供的atomic来定义一个事务,atomic提供两种用法:装饰器的用法(在这个函数下如果报错,那么这个函数中所有sql语句都会撤销):from django.db impo原创 2020-12-25 10:39:16 · 392 阅读 · 0 评论 -
django框架使用elasticsearch实现全文检索
首先你的服务器上要安装有docker,具体如何安装,我的另一篇博客有安装elasticsearch环境(docker安装)拉取镜像docker image pull delron/elasticsearch-ik:2.4.6-1.0运行容器docker run -d -p 9200:9200 -p 9300:9300 --name search delron/elasticsearch-ik:2.4.6-1.0首先安装相关的依赖包pip3 install drf-haystack .原创 2020-12-23 17:24:19 · 310 阅读 · 0 评论 -
django中使用redis来实现签到和uv数据统计
在我们的实际开发中,有时候会用到一些功能,比如签到和一些数据统计,那么这些功能,我们不可能去建立一些表去专业为签到和数据统计去服务,因为签到和数据统计这些都会导致这个表的数据越来越多,导致服务器整体性能下降,那么我们就可以用redis的一些功能来处理:签到功能:我们签到可以使用redis中的位图bitmap功能来实现,具体的bitmap功能介绍可以看这里:bitmap功能介绍数据统计:如果我们有一个功能是统计每天这个功能模块有多少用户访问,我们就可以使用HyperLogLog来统计:H原创 2020-12-21 15:49:27 · 343 阅读 · 3 评论 -
drf框架之session的存放地址
如果我们使用drf框架状态保持使用的是session的话,而不是jwt,那么我们的后台肯定要保存数据,用于对比验证,这样保存到那里就成了问题,保存到mysql中,这是框架默认的存储地址,在setting中可以不用设置,但是这种当用户少的时候是没问题的,但是用户量很大的时候,服务器开销就会很大,影响性能保存到缓存中redis中,这样的话查询速度就会很快,但是我们都知道redis数据一旦存储满的话,就会实行删除策略,这样会丢失一部分数据,导致用户状态无法保持,所以最好的办法就是 数据库-缓存 并用,两者.原创 2020-12-21 11:36:41 · 440 阅读 · 0 评论 -
drf框架使用channels实现websocket请求
在线发送ws请求地址转载 2020-12-15 10:56:18 · 1233 阅读 · 0 评论 -
centos7部署django+nginx+uwsgi
1.当我们项目写好之后,如何去部署到正式服上去那,部署的时候,我们需要三个东西,项目代码,nginx, uwsgi这三个东西,至于nginx如何安装,我在上一篇博客上已经写了,至于nginx如何代理,nginx还需要配置一下,我们先看一下一个请求过来的流程图:2. 我们先配置nginx,我上一篇博客中nginx已经安装好了,接下来配置就可以了2.1 执行命令:cd /usr/local/nginx/conf2.2 然后打开:vim nginx.conf (nginx.conf就是nginx的配置原创 2020-12-01 16:39:08 · 373 阅读 · 0 评论 -
django搭建项目目录
搭建项目目录,首先你要先有python环境,然后安装上django,有了这两个包才可以搭建django创建django框架:django-admin.py startproject 项目名称cd 到与settings.py同目录下,创建apps, mkdir apps(apps文件夹就是以后写业务逻辑的目录,)cd 到apps目录下创建app:python /home/vir/two_fashion/two_fashion/manage.py startapp app名称 然后执行命令 touch原创 2020-11-27 17:15:14 · 664 阅读 · 0 评论 -
python中布隆过滤器的使用
文章地址:转载地址转载 2020-11-18 11:20:58 · 345 阅读 · 0 评论 -
架构图
架构图:应用架构(平台架构):站在整个平台视角,描述整个平台架构技术架构技术架构,是从架构师的视角 描述服务开发使用到的技术栈系统架构系统架构是从架构师的视角,描述整个系统的结构、分层、部署方式业务架构(产品架构)业务结构,是从业务、产品视角,描述整个平台、或某个产品的实现。这张图是挪用的,非本人所画,仅为描述问题。画图工具:Processon 在线版,收费的,模板库比较丰富,可以克隆模板,画图比较方便画图网站1drawio 在线和离线都有,免费的,我经常用,可以存储转载 2020-11-17 16:51:18 · 315 阅读 · 0 评论 -
linux安装虚拟环境
sudo pip install virtualenvsudo pip install virtualenvwrapper如果在第二步遇到什么链接不安全请使用https,则执行下面命令执行解决:3.1 升级pip: sudo pip install --upgrade pip3.2 升级setuptools: sudo pip install --upgrade setuptools3.3 安装pbr扩展包:sudo pip install pbr -i https://pypi.tuna.原创 2020-11-11 10:03:38 · 723 阅读 · 0 评论 -
python Django drf pc端支付宝支付
支付宝支付其实就是两步,首先,前端向后端请求订单(预付单),然后拿到订单之后请求后端去支付,后端自己去配置一些参数,然后将一个url返回给前端,前端拿到url去请求,就会返回一个支付宝二维码,用户扫码成功之后,会向请求后端的一个接口去返回支付接口,如果后端验签成功,修改订单状态即可参考:支付宝开发文档 支付宝第三方sdkclass PaymentView(CreateAPIView, UpdateAPIView): """订单支付""" permission_classes =.原创 2020-09-30 09:42:16 · 1389 阅读 · 1 评论 -
drf框架序列化器报错处理
在drf框架中,我们很多的数据检验都是在序列化器中完成的,但是序列化器报错的信息就会很奇怪,所以我们最好是使用自己封装的序列化器来对报错信息进行封装,我是这样处理的未处理之前:{ "data": null, "code": 1, "message": { "password": [ "请填写合法的整数值。" ] }}处理之后:{ "data": null, "code": 1,原创 2020-09-27 14:49:16 · 1022 阅读 · 0 评论 -
Django pc app端微信登录
最近项目中需要微信登录,不仅要pc端登录,还要有app端的登录,今天,先记录一下pc端微信登录,首先我查看了微信登录的官网,里面写了好多,但是到最后总结,其实说了好多废话,好多步骤都是用不要的,其实只是需要两步就可以了:向微信请求url,什么意思哪,就是后台需要请求一个链接,拿到链接之后,发送给前端,前端拿到这个url之后,发送请求,这样就会得到一个一个二维码,用户会可以扫这个二维码进行登录class WeChatAuthURLView(APIView): """获取微信登录url(获取co原创 2020-09-27 09:48:42 · 999 阅读 · 3 评论 -
orm中的大于小于
__gt 大于__gte 大于等于__lt 小于__lte 小于等于原创 2020-08-27 15:53:25 · 1641 阅读 · 0 评论 -
django按照小时,天数,月份,年份分组
小时:from django.db.models.functions import TruncDay, TruncHour, TruncMonthhours = User.objects.filter(is_staff=False, date_joined__range=(t_day, now_time)).annotate( hour=TruncHour('date_joined')).values('hour').annotate(count=Count('id'))原创 2020-08-01 17:32:17 · 1601 阅读 · 0 评论 -
drf框架重写分页paginate_queryset
解决当page超出范围时报错而不是然会一个空的问题:代码:from rest_framework.pagination import PageNumberPaginationfrom collections import OrderedDictfrom rest_framework.response import Responsefrom django.core.paginator import InvalidPagefrom rest_framework.exceptions import N原创 2020-07-24 11:52:40 · 2292 阅读 · 0 评论 -
redis实现订单支付(延时队列)
在电商网站中,我们经常会遇到订单支付,退货时间问题,那么怎么去处理那?设置定时任务,使用liunx中的at定时就可以轻松搞定,这里不在过多的研究使用redis延时队列:redis有一个数据类型,Sset叫做可以排序的集合(有序集合),为什么会是有序的那,是因为它与set相比有个属性叫score,sset就是这个属性(字段)来排序的,那如何实现延时队列那?实现方法:利用zset保存队列信息,score按照时间戳存放,再启动一个任务(线程),一直扫这个zset,判断当前时间和队列中的时间大小信息,如原创 2020-07-21 16:16:20 · 1850 阅读 · 0 评论 -
django中使用redis做缓存中间件
由于电商后台的首页,客户要求的数据特别多,都是从各个表中查出来的,我大致算了一下,大概要查30多个表,我想这不行啊,于是决定使用使用redis作为缓存使用客户要求的首页展示数据,这只是一小小部分我决定写一个脚本,每天晚上凌晨时查询db,放入redis,# -*- coding: utf-8 -*-#!/usr/bin/python3import osimport sysimport datetimeBASE_DIR = os.path.dirname(os.path.dirn原创 2020-07-21 11:47:08 · 371 阅读 · 1 评论 -
linux crontab不执行原因
今天写了一个python脚本,然后定时是每1分钟执行一次,过了好久,我突然发现定时脚本更改的数据库数据没有更改过来,当时有两个想法在我脑海中浮现:1.脚本内容写错了,2.定时任务没有执行脚本内容写错了:怎么排查那?直接在终端中执行python3 脚本,发现果然脚本内容代码报错了,然后修改过来,心想这次可以了吧,可以,过了两分钟后,发现数据库数据还是没有改过来,可以脚本没有错误了啊,没办法,只能把锅给crontab定时器了crontab排查:先看crontab日志:cd /var/log原创 2020-07-21 11:29:10 · 2909 阅读 · 0 评论 -
python解决高并发下库存问题
在电商促销或秒杀活动或普通购买商品中,一般会有这样的问题:一件商品的库存只有5件,同时A用户买了5个,B用户买了5个,都提交数据,照成库存不足的问题(超卖问题)如何解决这个问题有两个方案,悲观锁和乐观锁悲观锁:在查询商品储存的时候加锁 select_for_update() 在发生事务的commit或者是事务的rollback时,自动释放该锁,这样其他用户就可以接着查询该商品@transaction.atomic def post(self, request): ..原创 2020-07-14 15:54:36 · 725 阅读 · 0 评论 -
django中when case的用法
转载自:https://blog.csdn.net/kuanggudejimo/article/details/103577257when case根据不同的条件修改数据:# -*- coding:utf-8 -*-from django.db import modelsfrom datetime import datetimefrom django.db.models import Case, When, Value, Q class Book(models.Model): b转载 2020-07-03 12:56:07 · 1251 阅读 · 0 评论