1.项目开发git操作
2.开通腾讯云短信
3.redis简单介绍
一.项目开发git操作
1.基本流程
""" 1、开发前,拉一次远程仓库 2、工作区进行开发 3、将开发结果提交到本地版本库 - git status查看时没有待处理的事件 4、拉取远程仓库(每一次要提交远程仓库前必须先拉) 5、如果出现冲突,线下沟通(协商重新开发冲突文件),要重新走3、4步 6、没有冲突,提交到远程仓库 """
2.协同开发
""" 1)所有人在一个分支上进行开发 - 通常开发分支名为dev 2)遵循git开发流程:先提交本地版本库,再拉取服务器代码,最后提交代码 提交本地版本库:git commit -m '版本信息' 拉取服务器代码:git pull 源名 分支名 提交代码:git push 源名 分支名 """
3.冲突解决
"""
如果你们都提交了对方没有的文件,
需要先拉代码 git pull
git pull origin dev
:p 退出
把他代码拉下来了以后,发现没有冲突,就继续提交 git push origin dev
1)打开冲突文件 2)定位到冲突位置: >>>>>冲突开始 自身代码 ==== 冲突代码 <<<<<<版本号 3)删除冲突提示信息:>>>>>冲突开始、====、<<<<<<版本号 4)线下沟通整合自身代码与冲突代码,形成最终代码结果 5)重新提交本地版本库,再拉取服务器代码,最后提交代码 """
4.合并分支
""" eg:将dev分支内容合并到prod分支上 1)切换到prod分支:git checkout prod 2)合并dev分支:git merge dev """
二.开通腾讯云短信
""" 1、官网注册实名账号:https://cloud.tencent.com 2、选取短信服务创建短信应用 3、申请签名与短信模板 - 通过微信公众号申请 """
腾讯云短信二次封装:
libs/txsms/settings.py
# 短信应用 SDK AppID - SDK AppID 以1400开头 APP_ID = ... # 短信应用 SDK AppKey APP_KEY = "..." # 短信模板ID,需要在短信控制台中申请 TEMPLATE_ID = ... # 签名 - 是`签名内容`,而不是`签名ID` SMS_SIGN= "..." # 电话前缀 MOBILE_PREFIX = 86
# 通过MacOS ssl安全认证 import ssl ssl._create_default_https_context = ssl._create_unverified_context # 获取验证码的功能 import random def get_code(): code = '' for i in range(4): code += str(random.randint(0, 9)) return code # 短信发送者 from qcloudsms_py import SmsSingleSender from .settings import * sender = SmsSingleSender(APP_ID, APP_KEY) # 发送验证码 from utils.logging import logger def send_sms(mobile, code, exp): try: # 发送短信 response = sender.send_with_param(MOBILE_PREFIX, mobile, TEMPLATE_ID, (code, exp), sign=SMS_SIGN, extend="", ext="") # 成功 if response and response['result'] == 0: return True # 失败 logger.warning('%s - %s' % ('短信发送失败', response['result'])) except Exception as e: # 异常 logger.warning('%s - %s' % ('短信发送失败', e)) return False
# 包对外提供的功能方法 from .sms import get_code, send_sms
from libs import txsms code = txsms.get_code() print(code) print(txsms.send_sms('电话', code, 5))
三.redis简单介绍
为什么要学习redis数据库
""" 1、redis是内存 no-sql 数据库,相比mysql等硬盘数据库效率高 2、在内存值配置数据库使用,而不直接使用内存,redis存储的数据是可以管理的 3、memcache也是内存数据库,且django默认采用的就是memcache数据库,用redis替换memcache的路由很简单,后者更强大 redis支持更多的数据类型 redis自带缓存机制,出现数据库系统崩溃数据也是可以有找回的功能 redis可以主动完成数据持久化(自带数据持久化功能) redis的数据过期时间机制也可以自身完成 """
redis安装
注:在官网安装系统版本,下载对应安装包安装即可
# 1.安装redis与可视化操作工具
# 2.在服务中管理redis服务器的开启关闭
# 3.命令行简单使用redis:
-- redis-cli # 启动客户端
-- set key value # 设置值
-- get key # 取出值
# 4.redis支持:字符串、字典、列表、集合、有序集合
# https://www.runoob.com/redis/redis-tutorial.html
# 5.特点:可持久化、单线程单进程并发
redis数据类型
""" 支持的数据类型:String、Hash、List、Set、Sorted Set 1.String:存储其他类型不能存的所有数据 2.Hash:存储 key-value 形式数据,类似于字典 3.List:存储 一系列有序value 形式数据,列表(数组) 4.Set:存储 一系列无序value 形式数据,集合 5.Sorted Set:存储 有排列标号value 形式数据,排行 """
字符串类型
""" 重要方法 set:key value get:key mset:k1 v1 k2 v2 ... kn vn mget:k1 k2 ... kn setex:key exp value """
1.String类型存取
1 set(self, name, value, ex=None, px=None, nx=False, xx=False) 2 3 #在Redis中设置值,默认不存在则创建,存在则修改 4 red.set('key', 'value') 5 #参数: 6 # set(name, value, ex=None, px=None, nx=False, xx=False) 7 # ex,过期时间(秒) 8 # px,过期时间(毫秒) 9 # nx,如果设置为True,则只有key不存在时,当前set操作才执行,同#setnx(key, value) 10 # xx,如果设置为True,则只有key存在时,当前set操作才执行 11 12 13 setex(self, name, value, time) 14 #设置过期时间(秒) 15 16 psetex(self, name, time_ms, value) 17 #设置过期时间(豪秒) 18 mset(self, *args, **kwargs) 19 20 #批量设置值 21 red.mget({"key1":'value1', "key2":'value2'}) 22 get(self, name) 23 24 #获取某个key的值 25 red.get('key1') 26 mget(self, keys, *args) 27 28 #批量获取 29 red.mget("key1","key1") 30 strlen(self, name) 31 32 #返回key对应值的字节长度(一个汉字3个字节) 33 red.strlen("key") 34 append(name, value) 35 36 #在name对应的值后面追加内容 37 red.set("key","value") 38 print(r.get("key")) #输出:'value' 39 r.append("key","one") 40 print(r.get("key")) #输出:'valueone' 41
2.Hash类型:一个name对应一个dic字典来存储
1 hset(self, name, key, value) 2 3 #name对应的hash中设置一个键值对(不存在,则创建,否则,修改) 4 red.hset("name","key","value") 5 hget(self, name, key) 6 7 red.hset("name","key","value") 8 #在name对应的hash中根据key获取value 9 print(red.hget("name","key"))#输出:'value' 10 hgetall(self, name) 11 12 #获取name所有键值对 13 red.hgetall("name") 14 hmset(self, name, mapping) 15 16 #在name对应的hash中批量设置键值对,mapping:字典 17 dic={"key1":"aa","key2":"bb"} 18 red.hmset("name",dic) 19 print(red.hget("name","key2"))#输出:bb 20 hmget(self, name, keys, *args) 21 22 #在name对应的hash中批量获取键所对应的值 23 dic={"key1":"aa","key2":"bb"} 24 red.hmset("name",dic) 25 print(red.hmget("name","key1","key2"))#输出:['aa', 'bb'] 26 hlen(self, name) 27 28 #获取hash键值对的个数 29 print(red.hlen("name"))#输出:2 30 hkeys(self, name) 31 32 #获取hash中所有key 33 red.hkeys("name") 34 hvals(self, name) 35 36 #获取hash中所有value 37 red.hvals("name") 38 hexists(self, name, key) 39 40 #检查name对应的hash是否存在当前传入的key 41 print(red.hexists("name","key1"))#输出:Ture 42 hdel(self, name, *keys) 43 44 #删除指定name对应的key所在的键值对,删除成功返回1,失败返回0 45 print(red.hdel("name","key1"))#输出:1 46 hincrby(self, name, key, amount=1) 47 48 #与hash中key对应的值相加,不存在则创建key=amount(amount为整数) 49 print(red.hincrby("name","key",amount=10))#返回:10 50
3.list类型:一个name对应一个列表存储
1 lpush(self, name, *values) 2 3 #元素从list的左边添加,可以添加多个 4 red.lpush('name','元素1','元素2') 5 rpush(self, name, *values) 6 7 #元素从list右边添加,可以添加多个 8 red.rpush('name','元素1','元素2') 9 lpushx(self, name, *values) 10 11 #当name存在时,元素才能从list的左边加入 12 red.lpushx('name','元素1') 13 rpushx(self, name, *values) 14 15 #当name存在时,元素才能从list的右边加入 16 red.rpushx('name','元素1') 17 llen(self, name) 18 19 #name列表长度 20 red.llen('name') 21 linsert(self, name, where, refvalue, value) 22 23 复制代码 24 # 在name对应的列表的某一个值前或后插入一个新值 25 red.linsert("name","BEFORE","元素2","元素1.5")#在列表内找到第一个"元素2",在它前面插入"元素1.5" 26 27 #参数: 28 # name: redis的name 29 # where: BEFORE(前)或AFTER(后) 30 # refvalue: 列表内的值 31 # value: 要插入的数据 32 复制代码 33 lset(self, name, index, value) 34 35 #对list中的某一个索引位置重新赋值 36 red.lset("name",0,"abc") 37 lrem(self, name, value, num=0) 38 39 复制代码 40 #删除name对应的list中的指定值 41 red.lrem("name","元素1",num=0) 42 43 # 参数: 44 # name: redis的name 45 # value: 要删除的值 46 # num: num=0 删除列表中所有的指定值; 47 # num=2 从前到后,删除2个; 48 # num=-2 从后向前,删除2个''' 49 复制代码 50 lpop(self, name) 51 52 #移除列表的左侧第一个元素,返回值则是第一个元素 53 print(red.lpop("name")) 54 lindex(self, name, index) 55 56 #根据索引获取列表内元素 57 print(red.lindex("name",1)) 58 lrange(self, name, start, end) 59 60 #分片获取元素 61 print(red.lrange("name",0,-1)) 62 ltrim(self, name, start, end) 63 64 #移除列表内没有在该索引之内的值 65 red.ltrim("name",0,2)
4.set集合:集合是不允许重复的列表
1 sadd(self, name, *values) 2 3 #给name对应的集合中添加元素 4 red.sadd("name","aa") 5 red.sadd("name","aa","bb") 6 scard(self, name) 7 8 #获取name对应的集合中的元素个数 9 red.scard("name") 10 smembers(self, name) 11 12 #获取name对应的集合的所有成员 13 red.smembers('name') 14 sdiff(self, keys, *args) 15 16 复制代码 17 #在第一个name对应的集合中且不在其他name对应的集合的元素集合 18 red.sadd("name","aa","bb") 19 red.sadd("name1","bb","cc") 20 red.sadd("name2","bb","cc","dd") 21 22 print(red.sdiff("name","name1","name2"))#输出:{aa} 23 复制代码 24 sismember(self, name, value) 25 26 #检查value是否是name对应的集合内的元素 27 smove(self, src, dst, value) 28 29 #将某个元素从一个集合中移动到另外一个集合 30 spop(self, name) 31 32 #从集合的右侧移除一个元素,并将其返回
5.其他操作
1 flushdb(self,asynchronous=False) 2 3 #清空当前db中的数据,默认是同步。若开启异步asynchronous=True,会新起一个线程进行清空操作,不阻塞主线程 4 flushall(self,asynchronous=False) 5 6 #清空所有db中的数据,默认是同步。异步同flushdb 7 delete(self, *names) 8 9 #根据name删除redis中的任意数据类型 10 exists(self, name) 11 12 #检查redis的name是否存在 13 keys(self, pattern='*') 14 15 #根据* ?等通配符匹配获取redis的name 16 expire(self,name ,time) 17 18 #为某个name的设置过期时间 19 rename(self, src, dst) 20 21 #重命名 22 move(self, name, db)) 23 24 # 将redis的某个name移动到指定的db下 25 randomkey(self) 26 27 #随机获取一个redis的name(不删除) 28 type(self, name) 29 30 # 获取name对应值的类型
pycharm使用redis
依赖:需要在终端安装
pip3 install redis
直接使用:
import redis r = redis.Redis(host='127.0.0.1', port=6379)
连接池使用:
import redis pool = redis.ConnectionPool(host='127.0.0.1', port=6379) r = redis.Redis(connection_pool=pool)
缓存使用:(这个需要额外的在终端安装 pip3 install django-redias )重要***********************
# 1.将缓存存储位置配置到redis中:settings.py CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/10", # 10 代表放入redis的第十个数据库,因为redis自带15个数据库 "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} } } } # 2.操作cache模块直接操作缓存:views.py from django.core.cache import cache # 结合配置文件实现插拔式 # 存放token,可以直接设置过期时间 cache.set('token', 'header.payload.signature', 10) # 取出token token = cache.get('token')