项目开发git,开通腾讯云短信,redis使用

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
libs/txsms/sms.py
# 通过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
libs/txsms/__init__.py
# 包对外提供的功能方法
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  
View Code

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  
View Code

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)
View Code

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 #从集合的右侧移除一个元素,并将其返回
View Code

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对应值的类型
View Code

 

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')

 

posted @ 2019-10-29 19:26  ZHANGYUZY  阅读(229)  评论(0编辑  收藏  举报