实现步骤:
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