zoukankan      html  css  js  c++  java
  • 项目开发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')
  • 相关阅读:
    org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache.maven.archiver.MavenArchiveConfiguration)
    快速制作gif动图
    Linux中安装Oracle11g后出现监听的问题及解决办法
    navicat连接不上Linux服务器上的MySQL
    lapacke svd实例
    ubuntu lapack安装与使用
    python numpy访问行列元素的方法
    numpy opencv matlab eigen SVD结果对比
    相似变换 SimilarityTransform 以及skimage源码
    OpenCV仿射变换+投射变换+单应性矩阵
  • 原文地址:https://www.cnblogs.com/zahngyu/p/11760971.html
Copyright © 2011-2022 走看看