現在、フロントエンドはNextJS、バックエンドはDjangoで開発を行っています。
DjangoはHerokuにデプロイしており、一部の重い処理はHerokuのworkerで処理をさせたいと考えています。
Djangoだけであれば、下記の記事を参考にdjango-rqを使用してherokuのworkerで処理をすることができました。
https://qiita.com/penguinz222/items/e1b198d2ab174a522a81
しかし、Django REST Frameworkを使用したAPIをHerokuのworkerで処理をさせるためには、viwes.pyをどのように書くのがよろしいでしょうか?
django-rqを使用して実現が可能でしょうか?
コード
Procfile
web: gunicorn mysite.wsgi --log-file - worker: python manage.py rqworker
settings.py
python
1INSTALLED_APPS = [ 2 'django.contrib.admin', 3 'django.contrib.auth', 4 'django.contrib.contenttypes', 5 'django.contrib.sessions', 6 'django.contrib.messages', 7 'django.contrib.staticfiles', 8 'app', 9 'django_rq', 10 'rest_framework', 11] 12 13RQ_QUEUES = { 14 'default': { 15 'HOST': 'localhost', 16 'PORT': 6379, 17 'DB': 0, 18 'PASSWORD': '', 19 'DEFAULT_TIMEOUT': 7200, 20 'URL': os.getenv('REDISTOGO_URL', 'redis://localhost:6379/0'), 21 }, 22}
urls.py
python
1from django.urls import path 2from app import views 3 4urlpatterns = [ 5 path('api-test/', views.ApiTestView.as_view()), 6]
views.py
この処理は動かないですが、イメージです。
workerで重い処理を実行して、フロントエンドへレスポンスしたいです。
python
1from django_rq import job 2from rest_framework import status 3from rest_framework.permissions import AllowAny 4from rest_framework.response import Response 5from rest_framework.views import APIView 6from time import sleep 7 8 9@job 10def test(a, b): 11 # ↓ここで重い処理を実行 12 sleep(10) 13 # ↑ 14 15 data = { 16 "test": a + b 17 } 18 return data 19 20 21class ApiTestView(APIView): 22 permission_classes = (AllowAny,) 23 24 def get(self, request, *args, **kwargs): 25 # workerで処理する関数をコール 26 data = test.delay(10, 20) 27 # フロントエンドへのレスポンス 28 return Response( 29 data, 30 status=status.HTTP_200_OK 31 )
完成イメージ
フロントエンドから、APIをfetchして、jsonで結果を取得します
(これをheroku webではなく、workerで実行)
const apiRes = await fetch(`https://xxxx/api-test/`, { method: 'GET', }) const test = await apiRes.json() console.log(test)
Jsonレスポンス
{ "test": 30 }
よろしくお願致します。
あなたの回答
tips
プレビュー