Docker部署web应用(django)
Docker的简介1.docker定义:docker是一个用来装应用的容器,就像杯子可以装水,笔筒可以装笔,书包可以放书一样。你可以把“Hello World!”放到docker中,也可以把网站放到docker中,你可以把任何你想到的程序放到docker中。
2.docker思想:
(1)集装箱
(2)标准化 (运输方式、存储方式、API接口)
运输方式(docker鲸鱼负责运输)
存储方式(不用关心存在哪,存在哪个盘)
API接口的标准化:Docker提供了一系列的RESTFUL API接口,包含了对Docker也就是对应用的控制,其中包括停止 查看 删除等等
(3)隔离:最底层的技术实际上是一种linux的一种内核的限制机制,叫做LXC,LXC是一种轻量级的容器虚拟化技术,最大效率的隔离了进程和资源,通过cgroup namespace等限制隔离进程组所使用的物理资源,如CPU I/O Memory等等
3、docker解决的问题
(1)docker解决了运行环境不一致带来的问题
(2)docker隔离性,每台服务器相互隔离,互不影响,可以保证自己运行的程 ...
redis主从模式,哨兵模式,cluster(集群)模式
详细可以参看《redis官网文档》或者《redis中文网》
Redis集群方式共有三种:主从模式,哨兵模式,cluster(集群)模式
主从模式:
是三种集群方式里最简单的。它主要是基于Redis的主从复制特性架构的。通常我们会设置一个主节点,N个从节点;默认情况下,主节点负责处理使用者的IO操作,而从节点则会对主节点的数据进行备份,并且也会对外提供读操作的处理。主要的特点如下:
主从模式下,当某一节点损坏时,因为其会将数据备份到其它Redis实例上,这样做在很大程度上可以恢复丢失的数据。
主从模式下,可以保证负载均衡,这里不再叙说了
主从模式下,主节点和从节点是读写分离的。使用者不仅可以从主节点上读取数据,还可以很方便的从从节点上读取到数据,这在一定程度上缓解了主机的压力。
从节点也是能够支持写入数据的,只不过从从节点写入的数据不会同步到主节点以及其它的从节点下。
从以上,我们不难看出Redis在主从模式下,必须保证主节点不会宕机——一旦主节点宕机,其它节点不会竞争称为主节点,此时,Redis将丧失写的能力。这点在生产环境中,是致命的。
哨兵模式:
是基于主从模式做的一定变 ...
Celery任务队列
什么是任务队列(Task Queue)?使用任务队列作为分发任务的机制。一个任务队列的输入是一组被称为任务的工作单元。专用的工人会持续监听任务队列来等待完成新的工作。Celery通过消息进行通信,通常使用中间人作为客户端和工人(workers)间的媒介。为了初始化一项任务,客户端会添加一条消息到队列中,然后中间人传递这条消息给一个worker。
一个Celery系统可以包含多个工人和中间人,解决高可用可平行扩展问题。
我需要什么?Celery需要一个消息传输系统来收发消息。RabbitMQ and Redis传输系统功能完备,但也有很多其他的实验性解决方案,如使用SQLite做本地开发。Celery 是用 Python 编写的,但协议可以用任何语言实现。除了 Python 语言实现之外,还有Node.js的node-celery和php的celery-php。 可以通过暴露 HTTP 的方式进行,任务交互以及其它语言的集成开发。Celery可以在单一机器上,在多台机器上,甚至跨数据中心运行。
Celery任务队列Celery 是基于Python开发的分布式任务队列。它支持使用任务队列 ...
ip封禁
封禁原因:
有时候我们写的网站会因为有些不正常的用户(爬虫)请求过于频繁,导致服务器压力过大而崩溃。这时我们需要对请求过于频繁的IP实行限制。1.获取IP,可将IP存入mysql,redis,session,中间件等进行保存2.设置倒计时(ps:你想封多久就封多久,开心就好)
思路
1.因为要确定每个接口的token是否没有被篡改,所以我们在装饰器对token进行检测。
2.在装饰器中,获取token,因为又不需要携带的接口,所以当携带token的时候,判断是否能用自己的解密方式进行解密。
3.ip封禁是一种使用频繁的数据。为了提高用户体验设置IP与uid为联合唯一索引来排重。
聊天窗emjoi表情
安装与下载
1npm install emoji-vue --save
全局配置:
1234 // 引入表情import Vue2Emoji from 'vuejs-emoji'Vue.use(Vue2Emoji)
使用方法
123456789101112131415161718192021<!-- 模板中 /> --><VueEmoji ref="emoji" @input="onInput" :value="msg" /><!-- 导包 /> -->import VueEmoji from "emoji-vue";//methods里onInput(event) { //事件。数据包含文本区域的值 this.msg = event.data;}, clearTextarea() { this.$refs.emoji.clear(); }, ...
在线人数
在线人数实现逻辑是,当一个用户访问,把用户的ip作为key放到cache中,然后设置online_ips 作为key来存放所有的ip,每次请求会先取出online_ips 的所有值,任何在根据这个list 来从cache中取出依然存在的ip,再次存入online_ips。
123456789101112131415161718192021222324252627282930313233343536# 这个过程要放到中间层中的 # PV_middleware.pyfrom django.core.cache import cachefrom django.utils.deprecation import MiddlewareMixin# EXLCLE_URL 这个是排除一些路由不进行统计的 比如# EXLCLE_URL = ['/admin/']from HuberyBlog.settings import EXCLUDE_URL # 主要在settings 中添加这个中间件class PvVisitViewMiddleware(MiddlewareMixin): ...
redis限流
redis限流限流是对系统的出入流量进行控制,防止大流量出入,导致资源不足,系统不稳定。
限流系统是对资源访问的控制组件,控制主要的两个功能:限流策略和熔断策略,对于熔断策略,不同的系统有不同的熔断策略诉求,有的系统希望直接拒绝、有的系统希望排队等待、有的系统希望服务降级、有的系统会定制自己的熔断策略,很难一一列举,所以本文只针对限流策略这个功能做详细的设计。
针对找出超出速率阈值的请求这个功能,限流系统中有两个基础概念:资源和策略。
资源 :或者叫稀缺资源,被流量控制的对象;比如写接口、外部商户接口、大流量下的读接口 策略 :限流策略由限流算法和可调节的参数两部分组成
123456789101112131415161718def can_pass_fixed_window(user, action, time_zone=60, times=30): """ :param user: 用户唯一标识 :param action: 用户访问的接口标识(即用户在客户端进行的动作) :param time_zone: 接口限制的时间段 ...
工单处理逻辑
1、在新建工单的页面中,用户选择工单类型,后台根据“工单类型与工作流关联”的表来确定使用的工作流
2、根据确定的工作流弹出工单信息输入界面(内容包括标题、详细信息、附件等等,具体表单字段通过改工作流的初始状态来确定),根据工作流的初始状态查找状态表来确定可以执行的操作(提交、保存,修改,审批等),将这些操作作为该界面的按钮,用户填写完工单基本信息后点击相应的操作按钮,来实现状态的流转。后台结合前端提交的数据并生成工单必备的字段信息(工单创建时间、创建人、工单类型、自定义字段等),将这些信息写到工单表里。其中当前状态、当前处理人通过工单流转表和状态表来确定 用户执行相应操作后导致的属性变化
3、通过创建工单页面插入到工单表中的数据“审批人”、“当前审批人”来确定哪些人有权限处理这些工单。 如果处理人类型不是“个人”,那就根据这条数据中的“当前状态“来确定接单方式,主动接单(有权限的人先执行接单操作将当前处理人变更为自己再处理),系统随机分配(后台在执行状态流转时随机设置工单当前处理人为符合条件的某一个人)
4、查看工单的界面通过 “工单查看页面表单的展现表”来确定 显示哪些字段
5、处 ...
python调用钉钉机器人发送群消息
一、添加钉钉机器人步骤一,登录钉钉,在机器人管理页面选择“自定义”机器人,输入机器人名字并选择要发送消息的群。如果需要的话,可以为机器人设置一个头像。点击“完成添加”,完成后会生成Webhook地址。
步骤二,点击“复制”按钮,即可获得这个机器人对应的Webhook地址,其格式如下:
1https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx
二、获取timestamp与sign参数12345678910111213141516171819202122232425262728293031323334# 获取timestamp参数timestamp = str(round(time.time() * 1000))# 获取sign参数secret = 'this is secret'secret_enc = secret.encode('utf-8')string_to_sign = '{}\n{}'.format(timest ...
base64图片展示
base64图片展示(后端给base64数据,前端展示图片)123456789101112-- coding: utf-8 --import base64with open("C:\Users\user\Desktop\20170508134213.png","rb") as f:b64encode是编码,b64decode是解码 base64_data = base64.b64encode(f.read())base64.b64decode(base64data) print(base64_data)
前端html中如何直接调用base64编码呢?
使用
1<img src="data:image/jpg;base64,这里是base64的编码"/>
12345678910111213141516171819202122232425262728293031export default { data: { return { ...