当前位置:网站首页>强制登录,七牛云上传图片
强制登录,七牛云上传图片
2022-07-27 05:02:00 【qishaoawei】
强制登录 jwt验证
上个博客中已经写好了校验jwt的函数
紧接着项目在views目录下的users.py文件中
from flask import Blueprint, jsonify, g, request # 导入蓝图
from flask_restful import Api, Resource, fields, marshal, reqparse
from models.model import UserModel2, db
from utils.QiniuTools import QiniuTool
from utils.jwtTools import JwtTools # 导入生成jwt的类
from utils.SmsTools import SmsTool # 导入生成验证码的类
import random
# # url_prefix # 指定当前蓝图下所有路由的前缀
user_dp = Blueprint('user_dp', __name__, url_prefix='/users') # 实例化蓝图对象
api = Api(user_dp) # 实例化蓝图收集器#实例化一个Api对象 Api对象的作用是用来搜集路由的
# 定义类视图 继承自Resource类,通过Api的实例化对象进行搜集
class SmsView(Resource):
def post(self): #获取验证码蓝图
...
@user_dp.before_request
def gz(): #钩子函数 每个请求到来前都执行一次
rep = reqparse.RequestParser()
rep.add_argument('token', location='headers')
args = rep.parse_args()
token = args['token']
payload = JwtTools().valid(token)
print(payload)
if not payload:
uid = 0
else:
uid = payload['uid']
g.uid = uid
def login(func): #装饰器
def warpper(*args, **kwargs):
print('检测登录')
if not g.uid: #如果为空则说明没登录
return jsonify({
'code': 403,
'msg': '用户未登录'
})
return func(*args, **kwargs)
return warpper
class UserView(Resource):
@login #装饰器
def get(self): # 测试是否成功
uid = g.uid
user_info = UserModel2.query.get(uid)
print('user_info:',user_info)
return jsonify({
'code': 200,
'msg': '用户信息获取成功',
'data': {
'username': user_info.username,
'img': user_info.img
}
})
def post(self):
...
api.add_resource(UserView, '/user') # 完整地址是 /users/user

七牛云上传图片
首先创建七牛云账号,然后进入个人中心记下自己的秘钥
然后进入对象存储里的空间管理创建一个空间
CDN 测试域名
上传图片后就可以 域名+图片名就可以查看图片
后端配置
在settings目录下的secret.py文件中继续添加
class SecretConfig():
RL_ACC_ID='8aaf07088185853e01*************' #ACCOUNT SID(主账户ID)
RL_ACC_TOKEN='8ac934ad5ddf44a4**************' #AUTH TOKEN(账户授权令牌)
RL_APP_ID='8aaf07088185853e*****************' #AppID(默认)
RL_TID='1' #短信模板ID
RDS_HOST='127.0.0.1' #redis数据库host
RDS_PORT=6379 #redis端口号
RDS_PASSWORD='*********' #redis密码
QINIU_AK='Gs9_LCLxZ9RnNYijO-Gnx******************' #AK
QINIU_SK='KQwHB4cBqEOcxd3jlZM99****************' #sk
QINIU_BUCKET_NAME='p7h2111a' #七牛云空间
在utils目录中创建QiniuTools.py文件
from qiniu import Auth, put_file
from flask import current_app
class QiniuTool():
def __init__(self):
ak = current_app.config.get('QINIU_AK')
sk = current_app.config.get('QINIU_SK')
self.q = Auth(ak, sk)
self.bucket_name = current_app.config.get('QINIU_BUCKET_NAME')
def upload(self, localfilepath, newfilename):
''' 七牛云上传图片 :param localfilepath: 本地图片地址 :param newfilename: 上传后的名字 :return: ''' #空间名字 #上传后的名字 #有效期
token = self.q.upload_token(self.bucket_name, newfilename, 3600)
#生成的token #上传后的名字 #本地图片地址
res = put_file(token, newfilename, localfilepath, version='v2')
print(res)
if res[0]['key']==newfilename:
return newfilename
else:
return False
if __name__ == '__main__': #可以现在这测试一下
from app import app
with app.app_context():
QiniuTool().upload('./../static/靠枕.jpg','靠枕.jpg')
在视图中实现
from flask import Blueprint, jsonify, g, request # 导入蓝图
from flask_restful import Api, Resource, fields, marshal, reqparse
from models.model import UserModel2, db
from utils.QiniuTools import QiniuTool
from utils.jwtTools import JwtTools # 导入生成jwt的类
from utils.SmsTools import SmsTool # 导入生成验证码的类
import random
# # url_prefix # 指定当前蓝图下所有路由的前缀
user_dp = Blueprint('user_dp', __name__, url_prefix='/users') # 实例化蓝图对象
api = Api(user_dp) # 实例化蓝图收集器#实例化一个Api对象 Api对象的作用是用来搜集路由的
class UploadView(Resource):
@login
def post(self):
img = request.files.get("img") #上传图片
ext = img.filename.split(".")[-1] #根据.分割并取出后部分
now_time = datetime.strftime(datetime.now(), "%Y%m%d%H%M%S") #时间年月日
new_name = "%s%s.%s" % (now_time, random.randint(100000, 999999), ext) #拼接中间添上随机数
save_path = "static/%s" % new_name #插入生成的名字
img.save(save_path)
# 至此,图片上传到本地
# 接下来传到七牛云
res = QiniuTool().upload(save_path, save_path)
if not res:
return jsonify({
"code": 400,
"msg": "文件上传失败"
})
# 把上传后的文件名存入数据库
user_info = UserModel2.query.get(g.uid)
user_info.img = res
db.session.commit()
return jsonify({
"code": 200,
"msg": '文件上传成功',
"data": {
"key": res
}
})
###另一种方法
# key='靠枕.jpg'
# ak = 'Gs9_LCLxZ9RnNYijO-G********************'
# sk = 'KQwHB4cBqEOcxd3j**********************'
# bucket = 'p7h2111a'
# q=Auth(ak,sk)
# token=q.upload_token(bucket,key,3600)
# res=put_file(token,key,'./static/靠枕.jpg',version='v2')
# if res[0]['key']==key:
# return jsonify({
# 'code':200,
# 'msh':'上传成功'
# })
# return jsonify({
# 'code': 400,
# 'msh': '上传失败'
# })
api.add_resource(UploadView, '/upl') # 完整地址是 /users/upl

边栏推荐
猜你喜欢

Bean's life cycle & dependency injection * dependency auto assembly

Sparse array → saving and continuation of Gobang

Scientific Computing Library -- Matplotlib

35. Scroll

笔记系列之docker安装Postgresql 14

Critical path principle

Database connection pool & Druid usage

Notes Series docker installation PostgreSQL 14

The concept of cloud native application and 15 characteristics of cloud native application

String class
随机推荐
JVM上篇:内存与垃圾回收篇--运行时数据区四-程序计数器
弹球小游戏
numpy 数据类型转化
李宏毅机器学习组队学习打卡活动day05---网络设计的技巧
Niuke sword refers to the path in the offer--jz12 matrix
SQL数据库→约束→设计→多表查询→事务
Differences among bio, NiO and AIO
笔记系列k8s编排MySQL容器-有状态的容器创建过程
String class
B1022 a+b in d-ary
Rolling Division
JVM Part 1: memory and garbage collection part 11 -- execution engine
Create datasource using Druid connection pool
B1024 scientific counting method
素数筛选(埃氏筛法,区间筛法,欧拉筛法)
Differences and examples between internal classes and static internal classes
How to quickly and effectively solve the problem of database connection failure
JVM Part 1: memory and garbage collection part 12 -- stringtable
JVM上篇:内存与垃圾回收篇九--运行时数据区-对象的实例化,内存布局与访问定位
I've heard the most self disciplined sentence: those I can't say are silent