1.項目開發git操做html
2.開通騰訊雲短信mysql
3.redis簡單介紹git
一.項目開發git操做redis
1.基本流程sql
""" 一、開發前,拉一次遠程倉庫 二、工做區進行開發 三、將開發結果提交到本地版本庫 - git status查看時沒有待處理的事件 四、拉取遠程倉庫(每一次要提交遠程倉庫前必須先拉) 五、若是出現衝突,線下溝通(協商從新開發衝突文件),要從新走三、4步 六、沒有衝突,提交到遠程倉庫 """
2.協同開發數據庫
""" 1)全部人在一個分支上進行開發 - 一般開發分支名爲dev 2)遵循git開發流程:先提交本地版本庫,再拉取服務器代碼,最後提交代碼 提交本地版本庫:git commit -m '版本信息' 拉取服務器代碼:git pull 源名 分支名 提交代碼:git push 源名 分支名 """
3.衝突解決django
"""
若是大家都提交了對方沒有的文件,
須要先拉代碼 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 """
二.開通騰訊雲短信緩存
""" 一、官網註冊實名帳號:https://cloud.tencent.com 二、選取短信服務建立短信應用 三、申請簽名與短信模板 - 經過微信公衆號申請 """
騰訊雲短信二次封裝:安全
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數據庫
""" 一、redis是內存 no-sql 數據庫,相比mysql等硬盤數據庫效率高 二、在內存值配置數據庫使用,而不直接使用內存,redis存儲的數據是能夠管理的 三、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類型存取
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
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字典來存儲
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
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對應一個列表存儲
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
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集合:集合是不容許重複的列表
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
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.其餘操做
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
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')