【问题标题】:RQ AttributeError: 'module' object has no attributeRQ AttributeError:“模块”对象没有属性
【发布时间】:2015-12-20 10:31:11
【问题描述】:

我正在尝试使用 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

'

【问题讨论】:

    标签: python django python-rq django-rq


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          _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'
          

          【讨论】:

            【解决方案5】:

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

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

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

            【讨论】:

              【解决方案6】:

              我遇到了类似的问题,确保在应用程序的__init__.py 中导入模块解决了问题。

              【讨论】:

                【解决方案7】:

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

                # 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'                                                       
                

                【讨论】:

                  【解决方案8】:

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

                  【讨论】:

                    猜你喜欢
                    • 2022-01-11
                    • 2010-11-18
                    相关资源
                    最近更新 更多