Django mod_wsgi MemoryError

Has a strange problem with MemoryError in my Django project.

  • Ubuntu 11
  • Apache2
  • Nginx
  • mod_wsgi
  • python2.7

I have a template tag that resizes images using PIL and works fine on my dev machine, but during production it causes a 500 error with large images (~ 800 pixels). The template tag seems to work without problems, but only if the original image is already very small. The template tag is a modified version of http://djangosnippets.org/snippets/1944/

Just tried recompiling mod_wsgi for python2.7 - same error.

Is there a way to allocate more memory, or maybe something else that I just don't understand?

Any help would be greatly appreciated!

Traceback emailed me:

Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 111, in get_response response = callback(request, *callback_args, **callback_kwargs) File "/var/www/rizzyhome.com/www/django/rizzyhome/products/views.py", line 31, in designs context_instance=RequestContext(request) File "/usr/local/lib/python2.7/dist-packages/django/shortcuts/__init__.py", line 20, in render_to_response return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs) File "/usr/local/lib/python2.7/dist-packages/django/template/loader.py", line 188, in render_to_string return t.render(context_instance) File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 123, in render return self._render(context) File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 117, in _render return self.nodelist.render(context) File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 744, in render bits.append(self.render_node(node, context)) File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 757, in render_node return node.render(context) File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py", line 127, in render return compiled_parent._render(context) File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 117, in _render return self.nodelist.render(context) File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 744, in render bits.append(self.render_node(node, context)) File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 757, in render_node return node.render(context) File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py", line 127, in render return compiled_parent._render(context) File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 117, in _render return self.nodelist.render(context) File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 744, in render bits.append(self.render_node(node, context)) File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 757, in render_node return node.render(context) File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py", line 64, in render result = block.nodelist.render(context) File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 744, in render bits.append(self.render_node(node, context)) File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 757, in render_node return node.render(context) File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py", line 64, in render result = block.nodelist.render(context) File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 744, in render bits.append(self.render_node(node, context)) File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 757, in render_node return node.render(context) File "/usr/local/lib/python2.7/dist-packages/django/template/defaulttags.py", line 227, in render nodelist.append(node.render(context)) File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 885, in render return func(*func_args) File "/var/www/rizzyhome.com/www/django/rizzyhome/products/templatetags/yair.py", line 108, in thumbnail import Image, ImageOps File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 45, in <module> __import__("FixTk") File "/usr/lib/python2.7/lib-tk/FixTk.py", line 15, in <module> import ctypes File "/usr/lib/python2.7/ctypes/__init__.py", line 549, in <module> CFUNCTYPE(c_int)(lambda: None) MemoryError 

Edit: add code

 import os, errno from django import template from django.conf import settings register = template.Library() def _mkdir_p(path): try: os.makedirs(path) except OSError as exc: # Python >2.5 if exc.errno == errno.EEXIST: pass else: raise @register.simple_tag def thumbnail(image_url, width, height, THIS_ROOT=settings.MEDIA_ROOT, THIS_URL=settings.MEDIA_URL, img_w=None, img_h=None, method="crop"): """ Given the url to an image, resizes the image using the given width and height on the first time it is requested, and returns the url to the new resized image. If width or height are zero then the original ratio is maintained. """ if not img_w: img_w = width if not img_h: img_w = height image_url = unicode(image_url) # determine new paths resized_image_reduced = os.path.join('_resized_', image_url.replace(THIS_ROOT, '')) file_name, file_ext = os.path.basename(resized_image_reduced).split(os.extsep) resized_image_absolute_path = os.path.join( THIS_ROOT, os.path.dirname(resized_image_reduced), u'%s__%05d-%05d_%s%s%s' % (file_name, width, height, method, os.extsep, file_ext) ) resized_image_relative_url = os.path.join( THIS_URL, os.path.dirname(resized_image_reduced), u'%s__%05d-%05d_%s%s%s' % (file_name, width, height, method, os.extsep, file_ext) ) # make sure target directory exists _mkdir_p(os.path.realpath(os.path.dirname(resized_image_absolute_path))) # abort if thumbnail exists, original image doesn't exist, invalid width or # height are given, or PIL not installed, or thumbnail is newer than source image if os.path.exists(resized_image_absolute_path): if os.path.exists(image_url): if os.path.getmtime(resized_image_absolute_path) > os.path.getmtime(image_url): return resized_image_relative_url else: return resized_image_relative_url if not image_url: return "" try: width = int(width) height = int(height) except ValueError: return resized_image_relative_url if not os.path.exists(image_url) or (width == 0 and height == 0): return image_url try: from PIL import Image, ImageOps except ImportError: return resized_image_relative_url # open image, determine ratio if required and resize/crop/save image = Image.open(image_url) if width == 0: width = image.size[0] * height / image.size[1] elif height == 0: height = image.size[1] * width / image.size[0] if image.mode not in ("L", "RGB"): image = image.convert("RGB") try: if method == 'scale': image.thumbnail((width, height), Image.ANTIALIAS) new_w, new_h = image.size x1 = (img_w-new_w) /2 y1 = (img_h-new_h) new_image = Image.new(image.mode, (img_w, img_h), (255,255,255)) new_image.paste(image, (x1,y1)) new_image.save( resized_image_absolute_path, "JPEG", quality=100 ) elif method == 'crop': image = ImageOps.fit(image, (width, height), Image.ANTIALIAS) image.save( resized_image_absolute_path, "JPEG", quality=100 ) except Exception, e: raise return resized_image_relative_url return resized_image_relative_url 
+6
source share
1 answer

Thanks so much for commenting and offering help.

There seems to be a weird bug in the CTYPE module in __init__.py . - or something else, I just read :)

The fix, at least for me, was to comment out the last line in the __init__.py file. It seems the last line is specifically for Windows 64bit and is confusing my Ubuntu.

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=598727#38

+2
source

Source: https://habr.com/ru/post/913600/


All Articles