2010-08-18 37 views
5

Tôi có chế độ xem trong ứng dụng Django tự động tạo hình ảnh bằng PIL, lưu trữ nó trong máy chủ phương tiện Nginx và trả về mẫu html có thẻ img trỏ tới url của nó.Hình ảnh Django và được tạo động

Điều này hoạt động tốt, nhưng tôi nhận thấy có vấn đề. Cứ mỗi 5 lần tôi truy cập chế độ xem này, trong 1 trong số đó, hình ảnh không hiển thị.

tôi đã làm một số điều tra và tôi thấy một cái gì đó thú vị, đây là phản ứng tiêu đề HTTP khi hình ảnh làm cho đúng:

Accept-Ranges:bytes 
Connection:keep-alive 
Content-Length:14966 
Content-Type:image/jpeg 
Date:Wed, 18 Aug 2010 15:36:16 GMT 
Last-Modified:Wed, 18 Aug 2010 15:36:16 GMT 
Server:nginx/0.5.33 

và đây là tiêu đề khi hình ảnh không tải:

Accept-Ranges:bytes 
Connection:keep-alive 
Content-Length:0 
Content-Type:image/jpeg 
Date:Wed, 18 Aug 2010 15:37:47 GMT 
Last-Modified:Wed, 18 Aug 2010 15:37:46 GMT 
Server:nginx/0.5.33 

Lưu ý rằng Nội dung-Lenth bằng 0. Điều gì có thể gây ra điều này? Bất kỳ ý tưởng về làm thế nào tôi có thể tiếp tục gỡ lỗi vấn đề này?

Chỉnh sửa: Khi chế độ xem được gọi, nó gọi phương thức "vẽ" này của mô hình. Đây là cơ bản những gì nó (Tôi đã gỡ bỏ phần lớn các mã cho rõ ràng):

def draw(self): 
    # Open/Creates a file 
    if not self.image: 
     (fd, self.image) = tempfile.mkstemp(dir=settings.IMAGE_PATH, suffix=".jpeg") 
     fd2 = os.fdopen(fd, "wb") 
    else: 
     fd2 = open(os.path.join(settings.SITE_ROOT, self.image), "wb") 

    # Creates a PIL Image 
    im = Image.new(mode, (width, height)) 

    # Do some drawing 
    ..... 

    # Saves 
    im = im.resize((self.get_size_site(self.width), 
        self.get_size_site(self.height))) 
    im.save(fd2, "JPEG") 
    fd2.close() 

Edit2: Đây là website: http://xxxcnn7979.hospedagemdesites.ws:8000/cartao/99/

nếu bạn tiếp tục nhấn F5 hình ảnh ở bên phải sẽ cuối cùng render.

+0

Khi hàm lượng độ dài bằng không, bạn có thể nói nếu hình ảnh được tạo thành công và tồn tại trên máy chủ? –

+0

Có, nó đã được tạo chính xác, khi bạn cố truy cập trực tiếp url hình ảnh nó sẽ mở ra. –

+0

Tại sao bạn chắp thêm và thay đổi chuỗi truy vấn nhận được? –

Trả lời

4

Chúng tôi đã gặp phải sự cố này khi viết các trang HTML ra đĩa. Giải pháp cho chúng tôi là ghi vào một tệp tạm thời và sau đó đổi tên tệp thành nguyên tử. Bạn cũng có thể muốn xem xét sử dụng fsync.

Nguồn đầy đủ có sẵn ở đây: staticgenerator/__init__.py, nhưng đây là các bit hữu ích:

import os 
import stat 
import tempfile 

... 

f, tmpname = tempfile.mkstemp(dir=directory) 
os.write(f, content) 
# See http://docs.python.org/library/os.html#os.fsync 
f.flush() 
os.fsync(f.fileno()) 
os.close(f) 
# Ensure it is webserver readable 
os.chmod(tmpname, stat.S_IREAD | stat.S_IWRITE | stat.S_IWUSR | stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH) 
# Rename is an atomic operation in POSIX 
# See: http://docs.python.org/library/os.html#os.rename 
os.rename(tmpname, fn) 
Các vấn đề liên quan