【问题标题】:NameError: name 'hasattr' is not defined - Python3.6, Django1.11, Ubuntu16-17, Apache2.4, mod_wsgiNameError: name 'hasattr' is not defined - Python3.6, Django1.11, Ubuntu16-17, Apache2.4, mod_wsgi
【发布时间】:2017-12-09 21:49:03
【问题描述】:

我已经设置了我的 Python/Django 虚拟环境,并将 mod_wsgi 设置为守护程序模式,并且很确定(以前做过)它“大部分正确”,除了我收到以下错误.. .

[Thu Jul 06 00:35:26.986363 2017] [mpm_event:notice] [pid 11442:tid 140557758930432] AH00493: SIGUSR1 received.  Doing graceful restart
Exception ignored in: <object repr() failed>
Traceback (most recent call last):
  File "/home/jamin/www/dev.tir.com/py361ve/lib/python3.6/site-packages/PIL/Image.py", line 572, in __del__
NameError: name 'hasattr' is not defined
[Thu Jul 06 00:35:27.194483 2017] [mpm_event:notice] [pid 11442:tid 140557758930432] AH00489: Apache/2.4.25 (Ubuntu) mod_wsgi/4.5.15 Python/3.6 configured -- resuming normal operations
[Thu Jul 06 00:35:27.194561 2017] [core:notice] [pid 11442:tid 140557758930432] AH00094: Command line: '/usr/sbin/apache2'

我的 django 应用程序本身可以通过 wsgi.py 正常加载,但它似乎与核心 python 有关(我的设置可能出错)出错了:NameError: name 'hasattr' is not defined

在浏览器中 - 我得到一个普通的“服务器错误 (500)”页面,而不是标准的 Apache“内部服务器错误”页面。

省略我的 VirtualHost 和超出此处的步骤是我为自己整理的基本步骤,如果你能发现任何东西...(我尝试了所有不同的 python 包,而不仅仅是 -venv)

Install Python 3.6 and virtualenv
    sudo apt-get update
    sudo apt-get install python3.6-venv
    sudo apt-get install virtualenv
(or find the latest and greatest python package that includes pip https://packages.ubuntu.com/ )


Install Apache2
    sudo apt-get install apache2 apache2-dev


Make and enter a folder for your project - then build a Virtual Environment in it
    mkdir ~/example.com
    cd ~/example.com
    virtualenv --python=/usr/bin/python3.6 py361ve

Enter your new Virtual Environment to install packages to it
    source py361ve/bin/activate

Install Django, mod_wsgi, and any other needed packages
    pip install django
    pip install mod_wsgi
    pip install ...
(no need for pip3 in virtual environment - django should be the latest release)


Run following command and place output in apache config file ( in /etc/apache2/ )
    mod_wsgi-express module-config


Exit your virtual environment
    deactivate
(You can re-enter your virtual environment any time using the source method in step 8)

当我停止/启动/重新启动 apache2 时会发生以下情况...

apache2 stop...

[Thu Jul 06 06:01:34.190940 2017] [mpm_event:notice] [pid 2015:tid 140157449797120] AH00491: caught SIGTERM, shutting down
_______________________________________________________________
apache2 start...

[Thu Jul 06 06:02:39.076741 2017] [mpm_event:notice] [pid 2181:tid 140553545080320] AH00489: Apache/2.4.25 (Ubuntu) mod_wsgi/4.5.15 Python/3.6 configured -- resuming $
[Thu Jul 06 06:02:39.076890 2017] [core:notice] [pid 2181:tid 140553545080320] AH00094: Command line: '/usr/sbin/apache2'
_______________________________________________________________
apache2 restart...

Exception ignored in: <object repr() failed>
Traceback (most recent call last):
  File "/home/jamin/www/dev.tir.com/py361ve/lib/python3.6/site-packages/PIL/Image.py", line 572, in __del__
NameError: name 'hasattr' is not defined
[Thu Jul 06 06:05:43.307877 2017] [mpm_event:notice] [pid 2181:tid 140553545080320] AH00491: caught SIGTERM, shutting down
[Thu Jul 06 06:05:43.492499 2017] [mpm_event:notice] [pid 2301:tid 140353155558912] AH00489: Apache/2.4.25 (Ubuntu) mod_wsgi/4.5.15 Python/3.6 configured -- resuming $
[Thu Jul 06 06:05:43.492705 2017] [core:notice] [pid 2301:tid 140353155558912] AH00094: Command line: '/usr/sbin/apache2'

【问题讨论】:

  • 在我的情况下,这被证明是一个完全不相关的问题:当我打开登录时,我发现 django 发出 500 代码是因为模板 URL 有问题。解决后,页面开始正常运行。 hasattr 错误对我来说是一个红鲱鱼。
  • @user2658323 非常感谢!在找到您的评论之前,我已经花了大约 3 个小时调试这个问题 - 事实证明,我的问题也与 Pillow 完全无关,如果在我的 settings.py 中将 DEBUG 设置为 True 就很明显了。 .
  • @martonbognar - 是的,设置中的 DEBUG = true 选项在这种情况下也救了我。我立即发现了我的问题!
  • 在我的情况下,这是由 SELinux 阻止 apache 访问文件引起的。
  • Dismine - 我认为文件访问也与我的问题有关。事实上,这似乎是很多时候的问题????

标签: python django python-3.x ubuntu mod-wsgi


【解决方案1】:

这可能是因为当 Python 解释器在进程关闭时被销毁时,代码仍在后台线程中运行。在解释器销毁期间发生的情况是所有模块都被清除,并且事物的属性访问通常返回 None 作为后备。在这种情况下,看起来内置模块在 PIL 对象被销毁之前已被擦除,因此它找不到 hasattr。

您能否确认这只发生在 Apache 重新启动和进程关闭时?

【讨论】:

  • 我进行了一些测试,并将结果发布在原始帖子中。我希望它有所帮助 - 迫不及待地想知道我在这里做错了什么愚蠢的事情(通常是这种情况)
  • 你没有做任何愚蠢的事情,这只是在关闭进程并且守护线程仍在运行时可能发生的事情。如果您在服务器的正常运行中没有看到问题,您可以忽略它。问题仍然是您是否正在创建后台线程以在请求完成后运行任何任务。一般来说,在请求完成后使用线程来运行任务是一个坏主意。最好使用单独的任务队列系统,例如 Celery。
  • 是的,我是——在清除所有其他问题后,我从来没有在 Django 设置中设置过DEBUG = True...启动并正常运行,并且从一开始就从未写过这篇文章。是什么让你不骂我们格雷厄姆?
  • 设置DEBUG=True 无助于改变可能发生此问题的事实,而且您通常无能为力。唯一的部分解决方案是注册atexit 回调,它会在进程关闭时触发,然后您首先尝试停止线程。如果线程不是专门为查找回调标记的某些关闭信号而设计的,则无济于事。
【解决方案2】:

我也遇到了同样的问题。

[Wed Sep 12 16:30:19 2018] [notice] Apache/2.2.15 (Unix) DAV/2 mod_wsgi/4.6.4     
Python/3.6 configured -- resuming normal operations
Exception ignored in: <object repr() failed>
Traceback (most recent call last):
  File "/mnt/workshop/py36env/lib/python3.6/site-packages/PIL/Image.py", line 600, in __del__
NameError: name 'hasattr' is not defined
Exception ignored in: <object repr() failed>
Traceback (most recent call last):
  File "/mnt/workshop/py36env/lib/python3.6/site-packages/PIL/Image.py", line 600, in __del__
NameError: name 'hasattr' is not defined
Exception ignored in: <object repr() failed>
Traceback (most recent call last):
  File "/mnt/workshop/py36env/lib/python3.6/site-packages/PIL/Image.py", line 600, in __del__
NameError: name 'hasattr' is not defined
Exception ignored in: <object repr() failed>
Traceback (most recent call last):
  File "/mnt/workshop/py36env/lib/python3.6/site-packages/PIL/Image.py", line 600, in __del__
NameError: name 'hasattr' is not defined
Exception ignored in: <object repr() failed>
Traceback (most recent call last):
  File "/mnt/workshop/py36env/lib/python3.6/site-packages/PIL/Image.py", line 600, in __del__
NameError: name 'hasattr' is not defined
[Wed Sep 12 16:33:57 2018] [notice] caught SIGTERM, shutting down
[Wed Sep 12 16:33:58 2018] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)

这可能发生在您创建了一个新目录但从未授权时。

我通过以下方式修复了它:

chmod -R 755 /mnt/workshop/your_project_path
chown -R apache:apache /mnt/workshop/your_project_path

【讨论】:

    【解决方案3】:

    尝试完全卸载 PIL,然后重新安装 Pillow 包。

    其实PIL老包和Pillow包有冲突,和django新版本冲突。

    您需要安装新的 Pillow 包。

    先卸载两个

    sudo pip3 uninstall pil
    sudo pip3 uninstall pillow
    

    重新安装枕头

    sudo pip3 install pillow
    

    【讨论】:

    • 我在我的虚拟环境和常规安装中都试过了。我可以在我的虚拟机中卸载/重新安装枕头,但不能在我的 Windows 测试环境中(仅使用 django 服务器)没有任何 PIL/Pillow 问题。也许这是一个更深层次的问题......
    猜你喜欢
    • 2021-02-16
    • 1970-01-01
    • 2022-12-02
    • 2013-04-09
    • 1970-01-01
    • 2020-11-07
    • 2017-01-09
    • 2017-06-14
    相关资源
    最近更新 更多