使用django-rq实现django的异步请求
环境:
Ubuntu 19.10
python 3.6
django 2.1
django-rq 2.2
安装django-rq
pip install django-rq
使用方式
配置settings
# django-rq配置,setting中的配置 RQ_QUEUES = { 'default': { 'HOST': 'localhost', # redis地址 'PORT': 6379, # redis端括号 'DB': 10, # 使用的是哪个redis db 'PASSWORD': '123456', #redis 密码 'DEFAULT_TIMEOUT': 360, # 此队列中任务的超时时间 }, 'with-sentinel': { 'SENTINELS': [('localhost', 26736), ('localhost', 26737)], 'MASTER_NAME': 'redismaster', 'DB': 10, 'PASSWORD': '123456', 'SOCKET_TIMEOUT': None, 'CONNECTION_KWARGS': { 'socket_connect_timeout': 0.3 }, }, 'high': { 'HOST': 'localhost', 'PORT': 6379, 'DB': 10, 'DEFAULT_TIMEOUT': 500, }, 'low': { 'HOST': 'localhost', 'PORT': 6379, 'DB': 10, } }RQ_EXCEPTION_HANDLERS= [] # 定义自定义异常处理函数
配置路由
#路由配置,可以在此路由查看队列的相关信息 urlpatterns = [ path('django-rq/', include('django_rq.urls')) ]
配置app
INSTALLED_APPS = ( # other apps "django_rq", )
创建视图
我这里创建一个异步任务需要两个接口,一个接口把需要处理的异步任务放入队列中(瞬间完成不需要用户等待),另一个接口则根据这个任务的id找到该任务,然后进行状态访问
from django.views import View import django_rq import rq from django.http import JsonResponse #状态访问 class LabelFile(View): def get(self, request): queue = django_rq.get_queue('low') #获取任务队列 rq_id = "job_test_id1" # 任务id rq_job = queue.fetch_job(rq_id) #获取任务 # if rq_job: if rq_job.is_finished: #判断任务是否完成 return JsonResponse( status=200, data=u'任务完成' ) elif rq_job.is_failed: #判断任务是否失败 rq_job.delete() #删除任务 return return JsonResponse( status=201, data=u'任务失败' ) else: return JsonResponse( status=202, data=u'运行中' ) #把任务放入队列中 class PushJob(View): def get(self, request): queue = django_rq.get_queue('low') #获取任务队列 rq_id = "job_test_id1" # 任务id rq_job = queue.fetch_job(rq_id) #获取任务 # 加入任务队列 queue.enqueue_call( func=test, args=( *args ), timeout=timeout, job_id=rq_id, ) return JsonResponse( status=202, data=rq_id ) #需要放入队列的函数 def test(): print('这是第一个test函数') rq_job = rq.get_current_job() rq_job.meta['data'] = "aaa" rq_job.save_meta() import time time.sleep(5) def test1(self): print('这是第二个test函数')
启动
# 只启动default队列 python manage.py rqworker default # 需要启动其他队列时只需在default后加上队列名字 python manage.py rqworker default high low
然后重复访问这个接口,直到控制台输出这个,在访问接口,可以看到django控制台输出存入的data=aaa这个值
转载:https://blog.csdn.net/qq_39248122/article/details/103897258
-----------------------------------------------------------自己项目配置---------------------------------------------------------
task.py
from django_rq import job import logging,datetime logger = logging.getLogger('worker') @job('default', timeout=360) def sync_migration_record(msg): """同步迁移记录""" # print('eeee' + msg) times = datetime.datetime.now().strftime('%Y:%m:%d %H:%M:%S') with open('task.txt', 'a') as f: f.write(msg + '\n') f.close()
views.py
# 机组信息 /product/product_index def product_index(request): sync_migration_record.delay("hello,rq") return JsonResponse({'status': 200, 'msg': "成功"}) # return render(request, 'node/index.html')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?