#redis连接
#redis里的数据重启内存式会消失,或者内存满了,会按照redis的算法删除数据
#name:随便写 host:118.24.3.40 port:6379 Auth(密码):HK139bc&*
#数据类型 string hash 要从redis中取数据,需要知道key是什么,他的类型是什么
#bytes类型 字节类型, 例如:f = open('a.jpg','wb')#bytes
#数据库db0-16个,任意选一个
#redis- view as:plain test
import redis,time
r=redis.Redis(host='118.24.3.40',
password='HK139bc&*',
port=6379,
db=5,
decode_responses=True)#decode_responses=True返回的数据转换成非bytes类型
r.set('student','abc')
#
r.set('矿泉水','{"price":111,"count":11}')
# print(r.get('矿泉水'))#redis返回的是bytes类型
# data=r.get('矿泉水')
# print(data.decode())#bytes类型转成字符串
# s='你好'
# print(s.encode())#字符串转成bytes类型
# #过期时间
# expire=60*60*24
# r.set('fd_session','sdjflksjdfkdsjlskdjfkld',expire) #TTl 显示还有多长时间过期 -1是永久保存
#hash类型
# r.hset('students','fd','{"money":19999,"addr":"北京"}')
# r.hset('students','ds','{"money":20000,"addr":"上海"}')
# r.hset('students','ljj','{"money":300000,"addr":"广州"}')
# print(r.hget('students','ds'))#获取某一条数据
# print(r.hgetall('students'))#获取所有的数据
# #把字典(bytes类型的数据)存储到表中
# d=r.hgetall('students')
# print(d)
# new_d={}
# for k,v in d.items():
# new_d[k.decode()]=v.decode()
# print(new_d)
# r.hdel('students','ds')
# r.delete('students’)
# r.expire('students','10')#指定某个key的过期时间
#获取当前数据库里有多少个key
# print(r.keys())
# print(r.keys('s*'))
# print(r.type('stu'))#查看key是什么类型的
# print(r.flushdb())#清空当前数据库中所有的key
# print(r.flushall())#清空所有数据库中所有的key
# print(r.exists('student'))#判断key是否存在
#管道 批量操作
# p=r.pipeline()#建立管道,直到执行execute时,才一次性写进内存
# p.exists('students')
# p.hgetall('students')
# r.hset('students','fd','{"money":19999,"addr":"北京"}')
# r.hset('students','ds','{"money":20000,"addr":"上海"}')
# r.hset('students','ljj','{"money":300000,"addr":"广州"}')
# r.hset('students','gw','{"money":300000,"addr":"深圳"}')
# s=p.execute()#执行,返回一个list,这个list里面是每一个命令执行的结果
# print(s)
# print(r.exists('students'))
#使用管道和不使用管道的时间比较
# start_time = time.time()
# for i in range(100):
# r.set('key%s'%i,'%s'%i)
# print('不用管道的时间',time.time()-start_time)
#
# start_time = time.time()
# p = r.pipeline()
# for i in range(100):
# p.set('key%s'%i,'%s'%i)
# print('用管道的时间',time.time()-start_time)
# 结果
# 不用管道的时间 5.31457257270813
# 用管道的时间 0.0
#出现文件夹(key里面带冒号)
# r.set('product:kqs','{"count":1,“price”:123}')
# r.set('product:kl','{"count":7,“price”:123}')
# r.set('product:whh','{"count":5,“price”:123}')
#迁移redis
#a服务器上装了redistribution,现在服务器要迁移了,迁移到b服务器,b服务器已经装好了redis
# 思路:
# 从redis里面获取所有的key
# 判断key的类型
# 从aredis里面get出来
# set到b里面
# r=redis.Redis(host='118.24.3.40',
# password='HK139bc&*',
# port=6379,
# db=5,
# decode_responses=True)
# r2=redis.Redis(host='118.24.3.40',
# password='HK139bc&*',
# port=6378,
# db=5,
# decode_responses=True)
# # print(r2.flushall())
# p=r2.pipeline()
#
# for k in r.keys():
# key_type=r.type(k)
# if key_type=='string':
# velue=r.get(k)
# p.set(k,velue)
# elif key_type=='hash':
# hash_data=r.hgetall(k)#{'xx':xxx}
# for filed,data in hash_data.items():
# p.hset(k,filed,data)
#
# p.execute()
#如果迁移所有的数据库,在redis连接上面加
# for i in range(17)
# 修改 db=i
import base64
#可以解密,一般用于传输数据时对数据加密,不用于密码的加密
#加密
# s = 'jdkjsdjfakd45-8#&%)'
# r = base64.b64encode(s.encode())
# print(r.decode())
#解密
s='amRranNkamZha2Q0NS04IyYlKQ=='
r = base64.b64decode(s.encode())
print(r.decode())
#安装模块
#pip install flask 或者 pip install fastapi
#然后再装 pip install uvicorn
import fastapi
from fastapi import Form#参数是通过form传入
from starlette.requests import Request#参数是通过form传入
import uvicorn
import tools
server = fastapi.FastAPI()#启动Fastapi这个服务,接口是挂在这个服务上的
#再安装模块 pip install python-multipart
# @server.post('/login')#登录,参数是通过form传入
# def login(request:Request,username:str=Form(...),password:str=Form(...)):
# return{'username':username,'password':password}
# @server.get('/login')#登录
# def login(username:str,password:str):
# return{'username':username,'password':password}
@server.get('/test')#不填参数
def test():
return{'msg':'您好'}#返回的必须是字典
@server.get('/product')#返回是字典类型
def product():
return{
'code':0,
'data':[
{'product_name':'朝朝盈1号','status':0},
{'product_name':'朝朝盈1号','status':0},
{'product_name':'朝朝盈1号','status':0},
{'product_name':'朝朝盈1号','status':0}
]
}
@server.get('/pay')#付款
def pay(money:float,status='1'):#status默认值为1
if status=='0':
return {'code':1,'status':'fail'}
elif status=='1':
return {'code':0,'status':'success','balance':money}
@server.post('/reg')#注册
def reg(username:str,password:str,cpassword:str):
if username.strip() and password.strip() and cpassword.strip():
if password.strip() != cpassword.strip():
return {'code':-1,'msg':'两次输入的密码不一致'}
else:
sql='select * from app_myuser where username="%s";'%username
if tools.execute_sql(sql):
return {'code':-1,'msg':'用户已存在'}
else:
p=tools.my_md5(password)
insert_sql='insert into app_myuser (username,passwd) value ("%s","%s");'%(username,p)
tools.execute_sql(insert_sql)
return {'code': 0, 'msg': '注册成功!'}
else:
return {'code':-1,'msg':'必填参数不能为空'}
@server.get('/login')#登录
def login(username:str,password:str):
if username.strip() and password.strip():
p = tools.my_md5(password)
query_sql = 'select * from app_myuser where username="%s"and passwd="%s";' % (username,p)
if tools.execute_sql(query_sql):
return {'code':'0', 'msg': '登陆成功!'}
else:
return {'code':'-1', 'msg': '用户名或密码错误!'}
else:
return {'code':'-1', 'msg': '必填参数不能为空'}
uvicorn.run(server,port=8888,debug=True)
#在浏览器中输入http://127.0.0.1:8888/login?username=abc&password=123456
#在浏览器中输入http://127.0.0.1:8888/docs 查看接口文档
#127.0.0.1只能在本地访问,host=0.0.0.0 其他人可以通过你的IP地址访问,192.168.1.xxx:8888/product)
# uvicorn.run(server,port=8888,debug=True,host=0.0.0.0)
# 三种验证方式
# 在地址栏中输入http://127.0.0.1:8888/login?username=gw&password=1
# 在接口文档中 http://127.0.0.1:8888/docs
# 在postman中测试接口
import flask
import tools
import json
#轻量级的web开发框架
server = flask.Flask(__name__)
@server.route('/login',methods=['post','get'])
def login():
# username=flask.request.values.get('username')
# password=flask.request.values.get('password')
username=flask.request.values.get('username','')#username默认为空
password=flask.request.values.get('password','')#password默认为空
print(username, password)
print(flask.request.cookies.get('PHPSESSID'))
print('json',flask.request.json)
# flask.json.get('xxxxx')#入参是json类型
# flask.request.cookies.get('xxxxx')#获取cookie里的数据
# flask.request.headers.get('xxxxx')#获取headers里的数据
# flask.request.files.get('xxxxx')#获取文件里的数据
if username.strip() and password.strip():
p = tools.my_md5(password)
query_sql = 'select * from app_myuser where username="%s"and passwd="%s";' % (username,p)
if tools.execute_sql(query_sql):
return json.dumps({'code':'0', 'msg': '登陆成功!'},ensure_ascii=False)
else:
return json.dumps({'code':'-1', 'msg': '用户名或密码错误!'})
else:
return json.dumps({'code':'-1', 'msg': '必填参数不能为空'})
# @server.route('/reg',methods=['post','get'])
# def reg():
# username = flask.request.values.get('username')
# password = flask.request.values.get('password')
# cpassword = flask.request.values.get('cpassword')
# if username.strip() and password.strip() and cpassword.strip():
# if password.strip() != cpassword.strip():
# return json.dumps({'code': -1, 'msg': '两次输入的密码不一样'})
# else:
# sql='select * from app_myuser where username="%s";'%username
# if tools.execute_sql(sql):
# return json.dumps({'code':-1,'msg':'用户已经存在'})
# else:
# p = tools.my_md5(password)
# insert_sql = 'insert into app_myuser (username,passwd) value ("%s","%s");'%(username,p)
# tools.execute_sql(insert_sql)
# return json.dumps({'code':0,'msg':'注册成功!'},ensure_ascii=False)
#
# else:
# return json.dumps({'code':-1,'msg':'必填参数不能为空'})
server.run(host='127.0.0.1',port=8999,debug=True)#加上debug后,添加接口会自动重启
#做接口自动化
#python自带的模块(非常不好用,不用)常用的是requests
#pip install requests
#开发好了一个接口 server
#请求接口 client
# print('**********不用urllib,太麻烦**************************************************')
# import urllib
# from urllib import request
# from urllib.parse import urlencode
# url = 'http://127.0.0.1:8999/login?username=gw&password=1'
# req = request.urlopen(url)#get请求
# dic=json.loads(req.read().decode())
# print(dic)
# url='http://127.0.0.1:8999/login'
# data={'username':'gw','password':'1'}
# req=request.urlopen(url,urlencode(data).encode())
# dic=json.loads(req.read().decode())
# print(dic)
# print('**********不用urllib,太麻烦**************************************************')
#请求方式:get、post、传coolie、hedders、传json、传文件、下载文件
import requests
import json
url='http://127.0.0.1:8999/login'
data={'username':'gw','password':'1'}
#get请求
r=requests.get(url,data)
#post请求
#r=requests.post(url,data)
#r=requests.post(url,data=data,params={"version":1.0})#在url里也传参数,在body里也传参数,params是把参数传到url后头的
print(r.json())#->字典 需要取值d.get('')
print(r.text)#字符串格式(不需要处理直接保存的)
print(r.content)#bytes类型的(二进制),例如:下载图片
print(r.status_code)#返回的状态码
# import requests
# import json
# url='http://127.0.0.1:8999/login'
# data={'username':'gw','password':'1'}
# #传cookie
# #Cookie: PHPSESSID=c1a4bf85f3db6f30e7dbd524ae00047a
# cookie={'PHPSESSID':'c1a4bf85f3db6f30e7dbd524ae00047a'}
# # r=requests.post(url,data=data,params={"version":1.0},cookies=cookie)
# #传headers
# headers={'cookie':'PHPSESSID=c1a4bf85f3db6f30e7dbd524ae00047a'}
# #r=requests.post(url,data=data,params={"version":1.0},headers=headers)
# #传json
# r=requests.post(url,json=data)
#
# print(r.json())#->字典 需要取值d.get('')
# print(r.text)#字符串格式(不需要处理直接保存的,例如:保存网页等)
# print(r.content)#bytes类型的(二进制),例如:下载图片
# print(r.status_code)#返回的状态码
#上传文件
# import requests
#
# url='http://api.nnzhp.cn/api/file/file_upload'
# data={'file':open(r'E:\gw\python\test1/a.txt','rb')}
# r=requests.post(url,files=data)
# print(r.json())#->字典 需要取值d.get('')
# print(r.text)#字符串格式(不需要处理直接保存的,例如:保存网页等)
# print(r.content)#bytes类型的(二进制),例如:下载图片
# print(r.status_code)#返回的状态码
#下载文件
# import requests
#
# r=requests.get('https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=293407302,1362956882&fm=26&gp=0.jpg')
# #如果遇到https报错,加上参数verify
# #r=requests.get('https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=293407302,1362956882&fm=26&gp=0.jpg',verify=False)
#
#
# print(r.content)#bytes类型的(二进制),例如:下载图片
#
# f=open('tuzi.jpg','wb')
# f.write(r.content)
# f.close()
#
# print(r.status_code)#返回的状态码