Python 使用Django、芹菜和Redis计划任务

Python 使用Django、芹菜和Redis计划任务,python,django,celery,Python,Django,Celery,我在芹菜中添加了一个用于数据导出的任务。我希望当用户调用Export all按钮时,导出任务开始,前端显示django消息,而后台继续导出。但是从我所能做的来看,我在views.py: def CasesPaluExport(request): export_cases_palu.delay(request=request) messages.success(request, 'CasesPaluExport') return JsonResponse({"Ok": "o

我在芹菜中添加了一个用于数据导出的任务。我希望当用户调用
Export all
按钮时,导出任务开始,前端显示django消息,而后台继续导出。但是从我所能做的来看,我在
views.py

def CasesPaluExport(request):
    export_cases_palu.delay(request=request)
    messages.success(request, 'CasesPaluExport')
    return JsonResponse({"Ok": "ok"}, safe=False)
这在
tasks.py
中:

def export_cases_palu(request):
    try:
        plaintext = get_template('stock/download_case_palu.txt')
        htmly = get_template('stock/download_case_palu.html')
        d = Context({'username': request.user.username})

        subject, from_email, to = 'Download all cases palu', settings.DEFAULT_FROM_EMAIL, request.user.email
        text_content = plaintext.render(d)
        html_content = htmly.render(d)
        msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
        msg.attach_alternative(html_content, "text/html")
        msg.send()
    except:
        logging.warning("Tried to send download email to user {0}".format(request.user))
问题是,每当我调用
CasesPaluExport
函数时,我都会在
export\u cases\u palu.delay(request=request)
行中得到一个错误:

Internal Server Error: /user/casepaluexport/
Traceback (most recent call last):
  File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/user/project/user/views.py", line 170, in CasesPaluExport
    export_cases_palu.delay(request=request)
  File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/celery/app/task.py", line 413, in delay
    return self.apply_async(args, kwargs)
  File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/celery/app/task.py", line 536, in apply_async
    **options
  File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/celery/app/base.py", line 737, in send_task
    amqp.send_task_message(P, name, message, **options)
  File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/celery/app/amqp.py", line 554, in send_task_message
    **properties
  File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/kombu/messaging.py", line 169, in publish
    compression, headers)
  File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/kombu/messaging.py", line 252, in _prepare
    body) = dumps(body, serializer=serializer)
  File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/kombu/serialization.py", line 221, in dumps
    payload = encoder(data)
  File "/usr/lib/python2.7/contextlib.py", line 35, in __exit__
    self.gen.throw(type, value, traceback)
  File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/kombu/serialization.py", line 54, in _reraise_errors
    reraise(wrapper, wrapper(exc), sys.exc_info()[2])
  File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/kombu/serialization.py", line 50, in _reraise_errors
    yield
  File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/kombu/serialization.py", line 221, in dumps
    payload = encoder(data)
  File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/kombu/utils/json.py", line 72, in dumps
    **dict(default_kwargs, **kwargs))
  File "/usr/lib/python2.7/json/__init__.py", line 250, in dumps
    sort_keys=sort_keys, **kw).encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
  File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/kombu/utils/json.py", line 62, in default
    return super(JSONEncoder, self).default(o)
  File "/usr/lib/python2.7/json/encoder.py", line 184, in default
    raise TypeError(repr(o) + " is not JSON serializable")
EncodeError: <WSGIRequest: POST '/user/casepaluexport/'> is not JSON serializable
[20/Nov/2017 15:47:56] "POST /user/casepaluexport/ HTTP/1.1" 500 186320
内部服务器错误:/user/casepaluexport/
回溯(最近一次呼叫最后一次):
文件“/home/user/.virtualenvs/project/local/lib/python2.7/site packages/django/core/handlers/exception.py”,第41行,在内部
响应=获取响应(请求)
文件“/home/user/.virtualenvs/project/local/lib/python2.7/site packages/django/core/handlers/base.py”,第187行,在get\u响应中
response=self.process\u异常\u由\u中间件(e,请求)
文件“/home/user/.virtualenvs/project/local/lib/python2.7/site packages/django/core/handlers/base.py”,第185行,在get\u响应中
响应=包装的回调(请求,*回调参数,**回调参数)
文件“/home/user/.virtualenvs/project/local/lib/python2.7/site packages/django/views/decorators/csrf.py”,第58行,包装视图
返回视图函数(*args,**kwargs)
文件“/home/user/project/user/views.py”,第170行,在casesPalueExport中
导出案例延迟(请求=请求)
文件“/home/user/.virtualenvs/project/local/lib/python2.7/site packages/celery/app/task.py”,第413行,延迟
返回self.apply\u async(args、kwargs)
文件“/home/user/.virtualenvs/project/local/lib/python2.7/site packages/celery/app/task.py”,第536行,在apply\u async中
**选择权
文件“/home/user/.virtualenvs/project/local/lib/python2.7/site packages/celery/app/base.py”,第737行,在发送任务中
amqp.发送任务消息(P、名称、消息、**选项)
文件“/home/user/.virtualenvs/project/local/lib/python2.7/site packages/芹菜/app/amqp.py”,第554行,在发送任务消息中
**性质
文件“/home/user/.virtualenvs/project/local/lib/python2.7/site packages/kombu/messaging.py”,第169行,在publish中
压缩(标题)
文件“/home/user/.virtualenvs/project/local/lib/python2.7/site packages/kombu/messaging.py”,第252行,在
正文)=转储(正文,序列化程序=序列化程序)
文件“/home/user/.virtualenvs/project/local/lib/python2.7/site packages/kombu/serialization.py”,第221行,在转储中
有效载荷=编码器(数据)
文件“/usr/lib/python2.7/contextlib.py”,第35行,在__
self.gen.throw(类型、值、回溯)
文件“/home/user/.virtualenvs/project/local/lib/python2.7/site packages/kombu/serialization.py”,第54行,出现错误
重新发送(包装器,包装器(exc),sys.exc_info()[2])
文件“/home/user/.virtualenvs/project/local/lib/python2.7/site packages/kombu/serialization.py”,第50行,出现错误
产量
文件“/home/user/.virtualenvs/project/local/lib/python2.7/site packages/kombu/serialization.py”,第221行,在转储中
有效载荷=编码器(数据)
文件“/home/user/.virtualenvs/project/local/lib/python2.7/site packages/kombu/utils/json.py”,第72行,转储
**dict(默认值,**kwargs))
文件“/usr/lib/python2.7/json/_init__.py”,第250行,转储
排序键=排序键,**千瓦)。编码(obj)
文件“/usr/lib/python2.7/json/encoder.py”,第207行,在encode中
chunks=self.iterencode(o,\u one\u shot=True)
iterencode中的文件“/usr/lib/python2.7/json/encoder.py”,第270行
返回_iterencode(o,0)
默认情况下,文件“/home/user/.virtualenvs/project/local/lib/python2.7/site packages/kombu/utils/json.py”第62行
返回super(JSONEncoder,self).default(o)
默认情况下,文件“/usr/lib/python2.7/json/encoder.py”第184行
raise TypeError(repr(o)+“不可JSON序列化”)
EncodeError:不可序列化JSON
[20/Nov/2017 15:47:56]“POST/user/casepaluexport/HTTP/1.1”500 186320

这可能表示服务器仍在等待http响应。我怎样才能解决这个问题

错误告诉您它无法序列化整个
请求
以将其发送到任务

 export_cases_palu.delay(user_id=request.user.id)
但是您在任务本身中使用的唯一请求是用户对象。您应该只发送用户ID,并在任务中获取对象本身

 export_cases_palu.delay(user_id=request.user.id)


(另外,您不应该将整个任务包装在try/except中。)

错误告诉您无法序列化整个
请求以将其发送到任务

 export_cases_palu.delay(user_id=request.user.id)
但是您在任务本身中使用的唯一请求是用户对象。您应该只发送用户ID,并在任务中获取对象本身

 export_cases_palu.delay(user_id=request.user.id)


(另外,你不应该把整个任务都打包成一次尝试/除此之外。)

第一件事:每次向芹菜添加或删除任何方法时,你都必须重新启动芹菜

第二件事:芹菜在数据库中内部存储(堆栈)方法调用,其参数为JSON对象格式,因此您只能在其中传递JSON可序列化对象,而请求不是JSON可序列化的。第一件事:每次向芹菜添加或删除任何方法时,您都必须重新启动芹菜
第二件事:芹菜在一个数据库中内部存储(堆栈)方法调用,其参数为JSON对象格式,所以您只能在那里传递JSON可序列化对象,而请求不是JSON可序列化的