首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >保存表单时不能使用芹菜延迟:对象不能JSON序列化

保存表单时不能使用芹菜延迟:对象不能JSON序列化
EN

Stack Overflow用户
提问于 2018-06-21 14:34:28
回答 2查看 13.7K关注 0票数 15

使用Django 1.8,我希望在视图中保存表单后触发延迟的芹菜函数

代码语言:javascript
复制
def new_topic(request, forum_id):
    form = TopicForm()
    uid = request.user.id
    if request.method == 'POST':
        tform = TopicForm(request.POST)
        if tform.is_valid():
            topic = tform.save(commit=False)
            topic.title = clean_title(tform.cleaned_data['title'])
            topic.description = clean_desc(tform.cleaned_data['description'])
            topic.save()
            notify_new_topic.delay( uid, topic) #<--problem here
            #rest of the views

但我得到

代码语言:javascript
复制
EncodeError at /add/topic/
<Topic: Topic object> is not JSON serializable

如果我将delay从芹菜任务中删除,我就不会有任何错误。

任务是:

代码语言:javascript
复制
@shared_task
def notify_new_topic(flwd_id, topic):
    title = topic.title
    link = topic.slug

    flwd= cached_user(flwd_id) #User.objects.get(id = flwd_id)
    print 'flwd is', flwd.username
    flwr_ids = FollowUser.objects.filter(followed=flwd).values('follower_id')
    flwrs = User.objects.filter(id__in= flwr_ids).values('id', 'username','email') 

    for f in flwrs:
        print 'flwr username:',  f['username']
        if notify_flwdp_applies(int(f['id'])):
            print 'notify flwdp applies'
            make_alerts_new_topic(flwd_id, f['id'], topic)
            print 'back from make_alerts_new_topic'

我想知道如何调试/修复这个问题?

EN

Stack Overflow用户

发布于 2021-09-14 15:17:55

既然已经提供了解决方案,我将尝试解释为什么不能将不可串行化的对象传递给芹菜任务。

为什么我们需要将可序列化的对象传递给芹菜任务?

对于芹菜,我们使用消息代理(比如Redis或RabbitMQ)。假设我们使用Redis。当调用芹菜任务时,参数将传递给Redis,以便代理可以读取它们。为了实现这一点,Redis应该支持这些参数的数据类型。

解决办法

假设要将python dictionary作为参数传递给芹菜任务,将这些值添加到芹菜配置中:

代码语言:javascript
复制
task_serializer = "json"  
result_serializer = "json"
accept_content = ["json"]

或者你可能想做

代码语言:javascript
复制
celery.conf.update(
    task_serializer="json",
    result_serializer="json",
    accept_content=["json"]
)

对于其他情况,(),将上面的json替换为picklexml等。

典型的基于文本的序列化格式有csvjsonxmlyamltoml等.基于二进制的格式有protobufavro.Python还有几个包,如picklenumpypandas,它们支持将自定义对象序列化为byte格式。您还可以制作自定义序列化程序。

这些配置是做什么的?

  1. 指示芹菜先序列化python对象,然后将它们传递给message。
  2. 从message反序列化对象,然后提供给芹菜工人。

参考资料

票数 4
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50971148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档