Flask对token的解码&挂载&装饰器&七牛云上传

创建一个utils/JwtTools.py文件夹

import jwt
class JwtTool():
    def valid(self, token):

        secret_key = current_app.config.get('SECRET_KEY')
        try:
            time.sleep(2)
            payload = jwt.decode(token, secret_key, algorithms='HS256')
            print(payload)
            return payload
        except Exception as e:
            print(e)
            return False

写入登录逻辑


# 请求前挂载
@user_bp.before_request
def gz():
    req = reqparse.RequestParser()
    req.add_argument('token', default='', location='headers')
    args = req.parse_args()
    token = args['token']

    payload = JwtTool().valid(token)
    print('========', payload)

    if not payload:
        uid = 0
    else:
        uid = payload['id']
    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):
        user_info = UserModel.query.get(g.uid)

        return jsonify({
            'code': 200,
            'msg': '用户信息获取成功',
            'data': {
                'username': user_info.username,
                'img': user_info.img
            }
        })
api.add_resource(UserView, '/user')        

一个简单上传图片的逻辑

class UploadView(Resource):
    def post(self):
        key = '1.jpg'
        ak = 'qIpsogKsnioK63SvhCDMp*************OGOW4_'
        sk = 'Gmg0YLb5QKzQYxAH2Dspi**************U43L5'

        q = Auth(ak, sk)
        bucket = 'h2111p7123'
        token = q.upload_token(bucket, key, 3600)

        res = put_file(token, key, './static/1.jpg', version='v2')

        if res[0]['key'] == key:
            return jsonify({'code': 200, 'msg': '上传成功'})
        return jsonify({'code': 400, 'msg': '上传失败'})

api.add_resource(UploadView, '/upload')

封装七牛云上传方法

  1. 创建一个utils/QiniuTooks.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_BUCHET_NAME')

    def upload(self, localfilepath, newfilename):
        """
        上传图片
        :param localfilepath:  图片路径
        :param newfilename:   上传后的图片名
        :return:
        """
        token = self.q.upload_token(self.bucket_name, newfilename, 3600)
        ser = put_file(token, newfilename, localfilepath, version='v2')
        if ser[0]['key'] == newfilename:
            return newfilename
        return False



if __name__ == '__main__':
    from app import app
    with app.app_context():
        QiniuTool().upload('./../static/1.jpg', 'static/img/1.jpg')
  1. 在视图中调用
from datetime import datetime
from utils.QiniuTools import QiniuTool


class UploadView(Resource):
    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 = f'{now_time + str(random.randint(1000,9999))}.{ext}'
        # print(new_name)
        # 拼接路由保存到本地
        save_path = f'static/{new_name}'
        img.save(save_path)
        
        # 上传到七牛云
        res = QiniuTool().upload(save_path, save_path)
        if not res:
            return jsonify({'code': 400, 'msg': '上传失败'})

        # 保存到数据库
        user_info = UserModel.query.get(g.uid)
        user_info.img = save_path
        db.session.commit()

        return jsonify({'code': 200, 'msg': '上传成功', 'data': save_path})


api.add_resource(UploadView, '/upload')
  1. 前端vue使用vant主键
afterRead(file){
        var data = new FormData()
        data.append('file', file.file)
        console.log(data)
        this.axios.post('/upload', data)
        .then(res =>{
            console.log('文字识别的响应:', res.data)
        })
},
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值