6

내 장고 프로젝트에 MemoryError의와 이상한 문제를 가졌어요.장고 mod_wsgi에 MemoryError의

  • 우분투 11
  • 아파치
  • Nginx에
  • mod_wsgi에
  • python2.7

내가 PIL을 사용하여 이미지 크기를 조정하고 내 dev-에서 잘 작동되는 템플릿 태그가 머신에서 작동하지만 생산시에는 큰 이미지 (~ 800px)에서 500 오류가 발생합니다. 템플릿 태그는 원본 이미지가 이미 매우 작을 때만 문제없이 작동하는 것처럼 보입니다. 같은 오류가 - 템플릿 태그는 그냥 python2.7에 대한 mod_wsgi에 재 컴파일 시도

http://djangosnippets.org/snippets/1944/의 수정 된 버전입니다.

더 많은 메모리 아니면 뭔가 다른 내가 그냥 이해하고 있지 않다 할당 할 수있는 방법이 있나요?

도움이 될 것입니다. 역 추적이 나에게 이메일로 전송

은 다음과 같습니다

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 
+0

실제 코드 게시. – agf

+0

원래 게시물에 내 (수정 된) 스크립트를 추가했습니다. 감사합니다! – sframe

+0

SELinux를 운영중인가요? SELinux를 일부 플랫폼에서하는 ctypes 몇 가지 알려진 문제가 있습니다 : http://stackoverflow.com/questions/3762566/occasional-ctypes-error-importing-numpy-from-mod-wsgi-django-app – GDorn

답변

2

감사합니다.

은 분명히 CTYPE 모듈에 대한 __init__.py에 이상한 버그가있다. - 또는 무엇이든, 방금 읽었습니다.

최소한 수정 사항은 __init__.py 파일의 마지막 줄을 주석 처리하는 것이 었습니다. 마지막 줄이 Windows 64 비트 전용이고 우분투를 망가 뜨리는 것 같습니다.

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

+0

그냥뿐만 아니라 파이썬 2.7.3이 가로 질러. 이것은 코드에서 버그가 아니기 때문에 큰 놀라움이었습니다. 이것은 자신의 코드에있는 버그입니다. 이 질문을 게시 해 주셔서 감사합니다. – Feanor