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 pullgit 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')
来源:https://www.cnblogs.com/zahngyu/p/11760971.html
