栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

强制登录,七牛云上传图片

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

强制登录,七牛云上传图片

强制登录 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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1025823.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号