2011-02-01 52 views
6

Tôi có một số trang web theo một ứng dụng Django mà tôi muốn triển khai bộ đệm ẩn trên trang web. Tuy nhiên nó được chứng minh là một rắc rối thực sự.Django - Nhiều trang web Caching trang web

điều xảy ra là settings.CACHE_MIDDLEWARE_KEY_PREFIX được đặt một lần khi khởi động và tôi không thể tiếp tục và thay đổi tùy thuộc vào trang web hiện tại là gì. Do đó, nếu trang của url http://website1.com/abc/ được lưu trong bộ nhớ cache thì http://website2.com/abc/ sẽ hiển thị phiên bản được lưu trong bộ nhớ cache của http://website1.com/abc/. Cả hai trang web này đang chạy trên cùng một cá thể Django vì đây là những gì các trang web Django xuất hiện để cho phép chúng tôi làm.

Đây có phải là phương pháp không chính xác không? Bởi vì tôi không thể tự động đặt CACHE_MIDDLEWARE_KEY_PREFIX trong thời gian chạy, tôi không thể lưu vào bộ nhớ cache nhiều trang web bằng cách sử dụng bộ đệm ẩn của Trang web Django. Tôi cũng không thể làm điều này cho mẫu và xem bộ đệm ẩn.

Tôi có ấn tượng rằng cách này thực sự cần phải được thiết lập là mỗi trang web cần một cá thể Django riêng của nó khá giống hệt ngoại trừ tệp cài đặt, trong trường hợp của tôi sẽ khác nhau chỉ bằng giá trị CACHE_MIDDLEWARE_KEY_PREFIX. Những trường hợp Django tất cả đọc và ghi vào cơ sở dữ liệu tương tự. Điều này liên quan đến tôi vì nó có thể tạo ra một số vấn đề mới.

Tôi có đi đúng hướng hay tôi nhầm lẫn về cách kiến ​​trúc đa trang web cần hoạt động? Tôi đã kiểm tra các tài liệu Django và không có đề cập đến thực sự về cách xử lý bộ nhớ đệm (đó không phải là cấp thấp bộ nhớ đệm) cho các ứng dụng Django phục vụ nhiều trang web.

+0

Bạn đã tìm thấy một giải pháp cho điều đó không? –

Trả lời

1

(Disclaimer: sau đây là hoàn toàn suy đoán và chưa được thử nghiệm Tiêu thụ với một nhúm muối..)

Nó có thể là có thể sử dụng trang trí vary_on_headers xem để bao gồm các 'chủ' tiêu đề trong khóa bộ nhớ cache. Điều đó sẽ dẫn đến các khóa bộ nhớ cache bao gồm tiêu đề Máy chủ HTTP, do đó cô lập các bộ đệm hiệu quả cho các trang web của bạn.

@vary_on_headers('Host') 
def my_view(request): 
    # .... 

Tất nhiên, điều đó sẽ chỉ hoạt động trên cơ sở mỗi lần xem và phải thêm trang trí cho tất cả các chế độ xem có thể là một rắc rối lớn.

Đào vào source of @vary_on_headers cho biết việc sử dụng patch_vary_headers() cái nào có thể sử dụng trong phần mềm trung gian để áp dụng cùng một hành vi ở cấp trang web. Một cái gì đó dọc theo dòng:

from django.utils.cache import patch_vary_headers 

class VaryByHostMiddleware(object): 
    def process_response(self, request, response): 
     patch_vary_headers(response, ('Host',)) 
     return response 
0

Bạn cần thay đổi get_full_path để build_absolute_uri trong django.util.cache

def _generate_cache_header_key(key_prefix, request): 
"""Returns a cache key for the header cache.""" 
#path = md5_constructor(iri_to_uri(request.get_full_path())) 
path = md5_constructor(iri_to_uri(request.build_absolute_uri())) # patch using full path 
cache_key = 'views.decorators.cache.cache_header.%s.%s' % (
    key_prefix, path.hexdigest()) 
return _i18n_cache_key_suffix(request, cache_key) 


def _generate_cache_key(request, method, headerlist, key_prefix): 
"""Returns a cache key from the headers given in the header list.""" 
ctx = md5_constructor() 
for header in headerlist: 
    value = request.META.get(header, None) 
    if value is not None: 
     ctx.update(value) 
#path = md5_constructor(iri_to_uri(request.get_full_path())) 
path = md5_constructor(iri_to_uri(request.build_absolute_uri())) 
cache_key = 'views.decorators.cache.cache_page.%s.%s.%s.%s' % (
    key_prefix, request.method, path.hexdigest(), ctx.hexdigest()) 
return _i18n_cache_key_suffix(request, cache_key) 

Hoặc tạo bạn sở hữu bộ nhớ cache middleware hơi thay đổi cho nhiều trang. http://macrotoma.blogspot.com/2012/06/custom-multisite-caching-on-django.html

1

Tôi gặp sự cố này gần đây. Những gì tôi đã làm dựa trên documentation là tạo một phương thức tùy chỉnh để thêm id trang web vào khóa được sử dụng để lưu vào bộ nhớ cache chế độ xem.

Trong cài đặt.py thêm đối số KEY_FUNCTION:

CACHES = { 
    'default': { 
     'BACKEND': 'path.to.backend', 
     'LOCATION': 'path.to.location', 
     'TIMEOUT': 60, 
     'KEY_FUNCTION': 'path.to.custom.make_key_per_site', 
     'OPTIONS': { 
      'MAX_ENTRIES': 1000 
     } 
    } 
} 

Và phương pháp make_key tùy chỉnh của tôi:

def make_key_per_site(key, key_prefix, version): 
    site_id = '' 
    try: 
     site = get_current_site() # Whatever you use to get your site's data 
     site_id = site['id'] 
    except: 
     pass 
    return ':'.join([key_prefix, site_id, str(version), key]) 
+0

get_current_site() yêu cầu đối số 'yêu cầu'. đó là một ý tưởng hay, nhưng cuối cùng thì không hiệu quả. – Florian

Các vấn đề liên quan