2011-02-01 16 views
6

मेरे पास एक Django एप्लिकेशन के तहत कई साइटें हैं जिन्हें मैं साइट वाइड कैशिंग को कार्यान्वित करना चाहता हूं। हालांकि यह एक वास्तविक परेशानी साबित हो रहा है।Django - एकाधिक साइट्स साइट कैशिंग

क्या होता है कि settings.CACHE_MIDDLEWARE_KEY_PREFIX स्टार्टअप पर एक बार सेट किया गया है, और मैं आगे नहीं जा सकता और वर्तमान साइट के आधार पर इसे बदल नहीं सकता। नतीजतन यदि यूआरएल http://website1.com/abc/ का एक पृष्ठ कैश किया गया है तो http://website2.com/abc/http://website1.com/abc/ के कैश किए गए संस्करण को प्रस्तुत करता है। ये दोनों वेबसाइटें एक ही Django उदाहरण पर चल रही हैं क्योंकि यह है कि Django साइटें हमें ऐसा करने की अनुमति देती हैं।

क्या यह एक गलत दृष्टिकोण है? क्योंकि मैं रनटाइम के दौरान गतिशील रूप से CACHE_MIDDLEWARE_KEY_PREFIX सेट नहीं कर सकता क्योंकि मैं Django की साइट वाइड कैशिंग का उपयोग करके कई साइटों को कैश करने में असमर्थ हूं। मैं टेम्पलेट के लिए ऐसा करने में असमर्थ हूं और कैशिंग देख रहा हूं।

मुझे यह धारणा मिलती है कि जिस तरह से इसे वास्तव में स्थापित करने की आवश्यकता है, वह यह है कि प्रत्येक साइट को अपने स्वयं के Django इंस्टेंस की आवश्यकता होती है जो सेटिंग्स फ़ाइल को छोड़कर काफी समान है, जो मेरे मामले में केवल CACHE_MIDDLEWARE_KEY_PREFIX के मान से अलग होगा। ये Django सभी पढ़ते हैं और एक ही डेटाबेस को लिखते हैं। यह मुझे चिंतित करता है क्योंकि यह कई नए मुद्दों को बना सकता है।

क्या मैं सही रास्ते पर जा रहा हूं या क्या मुझे गलती है कि बहु साइट आर्किटेक्चर को कैसे काम करने की आवश्यकता है? मैंने Django दस्तावेज़ों की जांच की है और Django अनुप्रयोगों के लिए कैशिंग को संभालने के तरीके का वास्तविक उल्लेख नहीं है (जो निम्न स्तर पर कैशिंग है) जो कई साइटों को सेवा प्रदान करता है।

+0

आपको लगता है कि के लिए एक समाधान मिला py KEY_FUNCTION तर्क जोड़ सकता हूँ? –

उत्तर

1

(अस्वीकरण: निम्नलिखित विशुद्ध रूप से अटकलें लगाई जा रही है और परीक्षण नहीं किया गया नमक की एक चुटकी के साथ उपयोग करें।।)

यह vary_on_headers दृश्य डेकोरेटर का उपयोग करने के 'होस्ट' शामिल करने के लिए संभव हो सकता है कैश कुंजी में हेडर। इसका परिणाम कैश कुंजी में होना चाहिए जिसमें HTTP होस्ट हेडर शामिल है, इस प्रकार प्रभावी रूप से आपकी साइट के लिए कैश को अलग कर रहा है।

@vary_on_headers('Host') 
def my_view(request): 
    # .... 
बेशक

, कि केवल एक पर-व्यू के आधार पर काम करेंगे, और सभी दृश्यों पर एक डेकोरेटर जोड़ने के लिए होने एक बड़ी परेशानी हो सकती है।

source of @vary_on_headers में खोदने से patch_vary_headers() का उपयोग पता चलता है जो किसी साइट स्तर पर समान व्यवहार लागू करने के लिए मिडलवेयर में उपयोग करने में सक्षम हो सकता है। की तर्ज पर कुछ:

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

आप 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) 

में build_absolute_uri या आप एकाधिक के लिए थोड़ा बदल कैश मिडलवेयर के मालिक हैं बनाने के लिए get_full_path बदलने की जरूरत है। http://macrotoma.blogspot.com/2012/06/custom-multisite-caching-on-django.html

1

मुझे हाल ही में इस समस्या का सामना करना पड़ा। मैंने documentation पर आधारित क्या किया था, दृश्य आईडी को कैश करने के लिए उपयोग की जाने वाली कुंजी पर साइट आईडी जोड़ने के लिए एक कस्टम विधि बनाना था।

सेटिंग्स में।

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 
     } 
    } 
} 

और अपने कस्टम make_key विधि:

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() को 'अनुरोध' तर्क की आवश्यकता है। यह एक अच्छा विचार है, लेकिन अंत में काम नहीं करता है। – Florian

संबंधित मुद्दे