7

DjangoプロジェクトのMemoryErrorに奇妙な問題があります。

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

PILを使用して画像のサイズを変更し、開発マシンでうまく機能するテンプレートタグがありますが、本番環境では、大きな画像(〜800px)で500エラーが発生します。テンプレートタグは問題なく機能しているようですが、元の画像がすでに非常に小さい場合に限ります。テンプレートタグは、http://djangosnippets.org/snippets/1944/の修正バージョンです。

python2.7用にmod_wsgiを再コンパイルしようとしました-同じエラー。

より多くのメモリを割り当てる方法はありますか、それとも私が理解していない何か他のものがありますか?

どんな助けでも大歓迎です!

私に電子メールで送信されたトレースバックは次のとおりです。

    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

編集:コードの追加

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
4

1 に答える 1

5

コメントと支援を提供してくれてありがとう。

__init__.pyどうやら、CTYPEモジュールのに奇妙なバグがあります。-または何でも、私はそれを読んだだけです:)

__init__.py少なくとも私にとっての修正は、ファイルの最後の行をコメントアウトすることでした。最後の行は特にWindows64ビット用で、Ubuntuを台無しにしているようです。

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

于 2012-05-09T19:35:19.630 に答える