百度智能云+redis+celery异步队列进行文字识别

实现步骤:

1.调用百度接口获取百度access_token

# tools文件下的comm.py文件


# 使用自己的百度云AK和SK
API_KEY = "xxxxxx"
SECRET_KEY = "xxxxxxxx"

def get_access_token():
    """
    使用 AK,SK 生成鉴权签名(Access Token)
    :return: access_token,或是None(如果错误)
    """
    url = "https://aip.baidubce.com/oauth/2.0/token"
    params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}
    return str(requests.post(url, params=params).json().get("access_token"))

2.使用accesstoken、headers调取百度的文字识别接口
headers使用百度指定的Content-Type和Accept
headers = {
‘Content-Type’: ‘application/x-www-form-urlencoded’,
‘Accept’: ‘application/json’
}
3.由于百度设置企业和个人每次传输的qps不一致,当我们的接口访问量过大时,性能会受到影响,这时候我们使用队列解决这个问题。
将所有请求的file文件存入队列中,用redis进行缓存,企业的qps被设置为10,个人为2,所以我们在队列中提取数据时,以每秒十条数据进行提取

# views.py
from .tools.comm import *
from .tools.myredis import r

class AuthenticationView(APIView):
    def post(self,request):
        headers = {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Accept': 'application/json'
        }
        token = request.data.get('accesstoken')
        getimg = request.data.get('file')
        img_url = getimg[0]['content'].split(',')[1]
        # 将图片传入队列中
        r.list_push('baiduimageurl', getimg)
        # 从队列中获取10条数据
        imglist = r.list_getbymin('baiduimageurl', 0, 10)
        OCR_URL = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"
        image_url = OCR_URL + "?access_token=" + token
        for img in imglist:
            url = img.decode()
            mes = image_url
            r.str_add(url,json.dumps(mes))
            mes = r.str_get(img)
            # 网页添加
            data = urlencode({'image': img_url})            # 报param image not exist时用,因为需要将data转为dict类型
            # 接口添加
            # img_url = base64.b64encode(img.read())
            try:
                if mes:
                    req = requests.request('POST', url=image_url, data=data, headers=headers).text
                    result_json = json.loads(req)
                    # 存入数据库
                    User.objects.create(
                        nikename = result_json['words_result'][0]['words'],
                        mobile=result_json['words_result'][1]['words']
                    )
                    return Response({"code":200,'mes':result_json})
                else:
                    return Response({"code":10020})
            except Exception as e:
                return Response({'code':500,'msg':e})
# tools文件下的myredis.py文件

import redis


class RedisConn:
    def __init__(self) -> None:
        self.r = redis.Redis()

    # 字符串添加
    def str_add(self, key, value, time=0):
        if time == 0:
            self.r.set(key, value)
        else:
            self.r.setex(key, time, value)

    # 字符串获取
    def str_get(self, key):
        value = self.r.get(key)
        if value:
            value = value.decode()
        else:
            value = None
        return value

    # list封装 1 2 3 4
    def list_push(self, key, value):
        return self.r.lpush(key, value)

    # list封装
    def list_getall(self, key):
        return self.r.lrange(key, 0, -1)

    def list_getbymin(self, key, min, max):
        return self.r.lrange(key, min, max)
r = RedisConn()

celery定时任务配置

目录结构

在这里插入图片描述

# settings配置


# Celery配置
# from kombu import Exchange, Queue
# 设置任务接受的类型,默认是{'json'}
CELERY_ACCEPT_CONTENT = ['application/json']
# 设置task任务序列列化为json
CELERY_TASK_SERIALIZER = 'json'
# 请任务接受后存储时的类型
CELERY_RESULT_SERIALIZER = 'json'
# 时间格式化为中国时间
CELERY_TIMEZONE = 'Asia/Shanghai'
# 是否使用UTC时间
CELERY_ENABLE_UTC = False
# 指定borker为redis 如果指定rabbitmq CELERY_BROKER_URL = 'amqp://guest:guest@localhost:5672//'
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0'
# 指定存储结果的地方,支持使用rpc、数据库、redis等等,具体可参考文档 # CELERY_RESULT_BACKEND = 'db+mysql://scott:tiger@localhost/foo' # mysql 作为后端数据库
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
# 设置任务过期时间 默认是一天,为None或0 表示永不过期
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24
# 设置worker并发数,默认是cpu核心数
# CELERYD_CONCURRENCY = 12
# 设置每个worker最大任务数
CELERYD_MAX_TASKS_PER_CHILD = 100


# 指定任务的位置
CELERY_IMPORTS = (
    'base.tasks',
)
# 使用beat启动Celery定时任务
# schedule时间的具体设定参考:https://docs.celeryproject.org/en/stable/userguide/periodic-tasks.html
CELERYBEAT_SCHEDULE = {
    'add-every-10-seconds': {
        'task': 'base.tasks.cheduler_task',
        'schedule': 1,
        # 'args': ('hello', )  # 传参
    },
}
# settings的同级目录下新建celery.py文件

# 实列化celery的过程
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery, platforms

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project_one.settings')  # django_project_one处改为自己的项目名
# 实例化celery
app = Celery('django_project_one',broker='redis://127.0.0.1:6379/1',  # 任务存放的地方
             backend='redis://127.0.0.1:6379/15')
       		# django_project_one处改为自己的项目名
app.config_from_object('django.conf:settings')
app.autodiscover_tasks()
platforms.C_FORCE_ROOT = True

# @app.task(bind=True)
# def debug_task(self):
#     print('Request: {0!r}'.format(self.request))
# settings同级的__init__.py文件

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)

在项目目录下创建base文件夹,在base文件夹下创建tasks.py文件

from __future__ import absolute_import, unicode_literals
from celery import shared_task
import time,requests,json
from video_khd.tools.myredis import r



@shared_task
def cheduler_task(name):
    # 这里写从队列里取数据的操作,就是需要走定时任务的操作
    pass
启动worker任务

windows下启动:celery -A django_project_one.tasks worker -l info -P eventlet
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值