1

我正在尝试使用 RQ 创建后台作业:

import django_rq                                                         


    def _send_password_reset_email_async(email):                             
        print(email)                                                         

    # Django admin action to send reset password emails                                                                 
    def send_password_reset_email(modeladmin, request, queryset):            
        for user in queryset:                                                
            django_rq.enqueue(_send_password_reset_email_async, user.email)  
    send_password_reset_email.short_description = 'Send password reset email'

我一直收到这个错误,似乎我在做一些愚蠢的事情?

Traceback (most recent call last):
  File "/home/lee/Code/cas/venv/lib/python3.4/site-packages/rq/worker.py", line 568, in perform_job
    rv = job.perform()
  File "/home/lee/Code/cas/venv/lib/python3.4/site-packages/rq/job.py", line 

495, in perform
    self._result = self.func(*self.args, **self.kwargs)
  File "/home/lee/Code/cas/venv/lib/python3.4/site-packages/rq/job.py", line 206, in func
    return import_attribute(self.func_name)
  File "/home/lee/Code/cas/venv/lib/python3.4/site-packages/rq/utils.py", line 151, in import_attribute
    return getattr(module, attribute)
AttributeError: 'module' object has no attribute '_send_password_reset_email_async

'

4

8 回答 8

10

添加评论,因为我也遇到了这个错误:

当您更改代码时,Django 开发网络服务器会动态重新加载,但 rqworker 进程不会。因此,如果您添加/修改任务并立即调用它,您可能会遇到此错误,因为新代码(您的 Web 代码)试图调用旧代码(RQ 任务)。

停止/重新启动 rqworker 就可以了。

于 2016-04-01T11:28:06.317 回答
2

所以,你真正需要做的是将模块导入某个文件,然后对其执行延迟。@MrE,所以没有必要在init .py 文件中导入它

于 2019-05-17T08:03:18.657 回答
1

当您从主目录或其他目录运行 rqworker 时,会出现此问题。在命令提示符中导航到您的 python 文件所在的目录,然后运行 ​​rqworker 命令。

注意:注意你的 redis 服务器运行的端口,如果它不是默认的,即 6379,那么你将不得不在像这样运行 rqworker 时提及端口,your_python_file_directory_path $ rqworker --url redis://localhost:port

于 2021-06-24T07:17:47.783 回答
0

就我而言,我没有将任务放在 tasks.py 文件中......

于 2020-02-26T15:27:23.470 回答
0

如何_send_password_reset_email_async将 reset_email 函数包含在内 -

def send_password_reset_email(modeladmin, request, queryset):  
    def _send_password_reset_email_async(email):                             
        print(email)  

    for user in queryset:                                                
        django_rq.enqueue(_send_password_reset_email_async, user.email)  

send_password_reset_email.short_description = 'Send password reset email'
于 2015-09-23T08:05:28.900 回答
0

尝试将您的函数写入另一个文件,将其作为模块导入

# in my_utility.py
def send_password_reset_email_async(email):                             
    print(email)  

然后

import django_rq                                                         
from my_utility import send_password_reset_email_async

#def _send_password_reset_email_async(email):                             
#   print(email)                                                         

# Django admin action to send reset password emails                                                                 
def send_password_reset_email(modeladmin, request, queryset):            
    for user in queryset:                                                
        django_rq.enqueue(send_password_reset_email_async, user.email)  
send_password_reset_email.short_description = 'Send password reset email'                                                       
于 2019-05-30T06:40:20.917 回答
0

在https://github.com/ui/django-rq/issues/125中复制@richardbarran 的评论

当您更改代码时,Rqworker 不会动态重新加载,但 Django 开发网络服务器会因此,如果您添加/修改任务并立即调用它,您可能会遇到此错误,因为新代码(您的 Web 代码)尝试调用旧代码代码(RQ 任务)。

停止/重新启动 rqworker 就可以了。

于 2017-08-29T13:09:38.960 回答
0

我有一个类似的问题,并确保在__init__.py应用程序中导入模块解决了这个问题。

于 2017-09-19T04:01:45.043 回答