【问题标题】:Change Celery task to run on-demand with clicking a button通过单击按钮将 Celery 任务更改为按需运行
【发布时间】:2022-01-04 16:54:37
【问题描述】:

我有一个 celery 任务,它会定期运行并为所有使用某种会计服务的公司获取一些数据。我现在需要通过单击按钮使该任务按需运行,并且只获取当前公司的数据。

修改后的芹菜任务:

@APP.task
def import_data_for_company(company_id):
    for integration in settings.INTEGRATIONS:
        if integration["owner"]["company_id"] == company_id:
            print("omlette du fromage")

Django 模板中的当前按钮

{% for integration in settings.INTEGRATIONS %}
    {% if company.company_id == integration.owner.company_id %}
        <div class="button">
        <a class="btn" href="#">Import Data</a>
        </div>
    {% endif %}
{% endfor %}

我需要从 Django 模板触发该任务,并在执行此操作时将公司 ID 作为参数传递。但根据this 的评论,我无法从 Django 模板传递参数。在这里编写自定义模板标签/过滤器似乎没有帮助。

通过此按钮调用该函数有哪些选择?

必须注意,我对此仍然很陌生。

【问题讨论】:

  • 为什么你在模板和芹菜任务中使用相同的循环似乎是多余的
  • 是的,看起来不太好。 INTEGRATIONS 是一个字典列表,所以我必须遍历它们,以 1)获取正确的公司规格(任务)和 2)检查当前公司是否列在 INTEGRATIONS 中,然后才显示按钮。您对此有更好的建议吗?

标签: django celery


【解决方案1】:

您应该创建一个带有您的公司 ID 的视图。在此视图中,您将触发import_data_for_company。然后您可以重定向回您的初始视图。或者您也可以使用 AJAX 触发视图。 相应地在模板中添加 URL:{% url 'some_name' company.company_id %}

urls.py:

path(
    "your_desired_trigger_url/<id:company_id>/",
    trigger_company_data,
    name="some_name",
),

views.py:

def trigger_company_data(request, company_id):
    import_data_for_company(company_id)
    return HttpResponseRedirect(reverse("your_initial_view"))

【讨论】:

    猜你喜欢
    • 2018-04-14
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2017-05-31
    • 2013-07-12
    • 1970-01-01
    相关资源
    最近更新 更多