【问题标题】:Django - call celery Task from viewDjango - 从视图中调用 celery 任务
【发布时间】:2019-07-02 03:46:37
【问题描述】:

我想从我的 views.py 中调用一个 celery 任务,但由于某种原因,我收到以下错误:

...

tasks.py

...

urls.py

...

提前致谢

【问题讨论】:

  • 发生此错误时,您在哪个 url 访问视图? pk 不是 None / 用户真的存在吗? celery 任务似乎没有问题(但是,由于需要序列化,它可能拒绝接受用户作为参数),而是查询用户。
  • 能否请您更具体一些,我对编程很陌生,我不太确定您的意思。如果我删除 pk 我得到“'用户'类型的对象不是 JSON 可序列化的”

标签: python django task celery


【解决方案1】:

您的user = get_user_model.objects.get(pk=pk) 行应更改为user = get_user_model().objects.get(pk=pk)get_user_model 是一种返回项目默认用户模型的方法。 get_user_model 方法不会被调用,直到你把函数括号放在它后面(比如get_user_model())。

【讨论】:

  • 您好,非常感谢您的提示 :) 遗憾的是,这并不能解决整个问题。我相应地更新了我的帖子
  • 请阅读@mfrackowiak 的评论以了解您更新的问题。
【解决方案2】:

您没有在 url 中传递用户的 pk,因此它始终为 None 并且具有 pk=None 的用户不存在。您应该将 pk 添加到 url,例如 url(r'^user/wallet_deposit/new_addr_btc/(?P<pk>\d+)$', MyProject_Accounts.wallet_deposit_gen_new_addr_btc, name='wallet_deposit_gen_new_addr_btc')。此外,用户应该能够到达正确的 url(您应该正确生成链接)。 也许,作为用户,我应该只能更改我的帐户?如果是这样,您应该从请求中获取经过身份验证的用户,就像在 else 块中所做的那样

【讨论】:

  • 现在我收到以下错误:NoReverseMatch at /user/wallet_deposit Reverse for 'wallet_deposit_gen_new_addr_btc' 没有找到任何参数。尝试了 1 种模式:['user/wallet_deposit/new_addr_btc/(?P\\d+)$'] 我是对的,您在回答时写错了 (\d+)$' ? ^^
  • 是的,对不起,我混合并匹配了 django 1.x 和 django 2.x 语法:)。但我认为只有一个斜线就足够了(?P<pk>\d+)。正如我之前提到的“同样,用户应该能够到达正确的 url(您应该正确生成链接)。”我的意思是,当您反转 url 时,您应该关心 pk 作为参数传递。你是如何反转网址的?
  • 似乎我没有这样做,无论如何我不知道如何在这里完成:(
  • 如果你在 url 栏中直接通过了 url,你应该在 and 处添加 pk,就像 localhost:8000/user/wallet_deposit/new_addr_btc/1 如果存在具有 pk=1 的用户,在其他情况下你应该放一个现有用户的pk。你有没有想过使用经过身份验证的用户request.user,而不是在url中传递pk
  • 这似乎可行,但现在我得到:'User' 类型的对象不是 JSON 可序列化的 user = request.user if request.method == 'GET': allocate_new_btc_address.delay(user)跨度>
最近更新 更多