2016-08-21 6 views
0

より大きいファイルを非同期でs3にアップロードしようとしています。http://python-rq.org/の文書に従っています。ワーカーは稼働していますが、仕事をしていません。Redis Queueを使ってherokuのdjangoで非同期処理をいくつか試してみました

views.py

def youmaterial(request): 

    if request.method == 'POST': 

     newdoc = Youmaterial(docfile = request.FILES['file'],user=request.user) 
     newdoc.save() 
     msg='dee' 
      # Redirect to the document list after POST 
     return HttpResponse(json.dumps({'message': msg})) 

    else: 
     form1 = DocumentForm() 
    return render(request,'mat_upload.html',{'form':form1}) 

def create_job(): 
    redis_conn = Redis() 
    q = Queue(connection=redis_conn) # no args implies the default queue 

# Delay execution of count_words_at_url('http://nvie.com') 
    job = q.enqueue(youmaterial, 'http://heroku.com') 

worker.py

import os 
import urlparse 
from redis import Redis 
from rq import Worker, Queue, Connection 

listen = ['high', 'default', 'low'] 

redis_url = os.getenv('REDISTOGO_URL') 
if not redis_url: 
    raise RuntimeError('Set up Redis To Go first.') 

urlparse.uses_netloc.append('redis') 
url = urlparse.urlparse(redis_url) 
conn = Redis(host=url.hostname, port=url.port, db=0, password=url.password) 

if __name__ == '__main__': 
    with Connection(conn): 
     worker = Worker(map(Queue, listen)) 
     worker.work() 

Procfie:

web: gunicorn gettingstarted.wsgi --log-file - 
worker: python -u worker.py 

Settings.py(これは私にエラーを与えます。)

DJANGO_SETTINGS_MODULE=config.settings rqworker high default low 

答えて

0

AFAIKのように、ビュー全体の機能をこのようにエンキューすることはできません(requestオブジェクトを期待しますが、strを渡します)。

何らかの非同期処理ビューを実現しようとしていますか?代わりに、長い処理機能を識別し、ビュー内の仕事をエンキュー、もっとこのようにする必要があります

def s3_async_upload(obj): 
    obj.save() 

def youmaterial(request): 

    if request.method == 'POST': 

     newdoc = Youmaterial(docfile=request.FILES['file'], user=request.user) 
     # Replace newdoc.save() 
     q.enqueue(s3_async_upload, obj=newdoc) 
     msg = 'dee' 
     # Redirect to the document list after POST 
     return HttpResponse(json.dumps({'message': msg})) 

    else: 
     form1 = DocumentForm() 

    return render(request, 'mat_upload.html', {'form': form1}) 

# or with the `@job` decorator, usage: s3_async_upload(obj=newdoc) 

@job 
def s3_async_upload(obj): 
    obj.save() 

たぶん他の設定が欠落しているが、のに役立つことを願っています!

+0

このことを試してみます。ありがとう –

関連する問題