django

2010-01-17 6 views
8

में कैशिंग साइटमैप मैंने django के डिफ़ॉल्ट साइटमैप ऐप का उपयोग करके एक सरल साइटमैप क्लास लागू किया।django

class ShortReviewsSitemap(Sitemap): 
    changefreq = "hourly" 
    priority = 0.7 

    def items(self): 
     # try to retrieve from cache 
     result = get_cache(CACHE_SITEMAP_SHORT_REVIEWS, "sitemap_short_reviews") 
     if result!=None: 
      return result 

     result = ShortReview.objects.all().order_by("-created_at") 

     # store in cache 
     set_cache(CACHE_SITEMAP_SHORT_REVIEWS, "sitemap_short_reviews", result) 

     return result 

    def lastmod(self, obj): 
     return obj.updated_at 

समस्या यह है कि मेम्कैश केवल अधिकतम 1 एमबी वस्तु की अनुमति देता है: जैसा कि यह एक लंबे समय निष्पादित करने के लिए ले जा रहा था, मैं मैनुअल कैशिंग गयी। यह एक बड़ा था कि 1 एमबी है, तो कैश में संग्रहीत करने में विफल रहा है:

>7 SERVER_ERROR object too large for cache 

समस्या Django निर्णय लेने से जब यह smalled लोगों में साइटमैप फ़ाइल को विभाजित करना चाहिए की एक स्वचालित तरीका होता है। डॉक्स (http://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/) के अनुसार:

आप एक सूचकांक फ़ाइल यदि आपके साइटमैप में से एक 50,000 से अधिक URL हैं बनाना चाहिए। इस मामले में, Django स्वचालित रूप से साइटमैप, पर अंकुश करेगा और सूचकांक इसे प्रतिबिंबित करेगा।

कैशिंग साइटमैप को सक्षम करने का सबसे अच्छा तरीका आपको क्या लगता है? - एकल साइटमैप आकार को प्रतिबंधित करने के लिए django साइटमैप ढांचे में हैकिंग, मान लीजिए, 10,000 रिकॉर्ड सबसे अच्छे विचार की तरह दिखते हैं। पहली जगह 50,000 क्यों चुना गया था? Google सलाह? यादृच्छिक संख्या? - या शायद memcached स्टोर बड़ी फ़ाइलों को अनुमति देने का एक तरीका है? - या शायद बचाया जा सकता है, साइटमैप स्थिर फाइलों के रूप में उपलब्ध कराया जाना चाहिए? इसका मतलब यह होगा कि memcached के साथ कैशिंग के बजाय मुझे परिणामों को मैन्युअल रूप से फाइल सिस्टम में संग्रहीत करना होगा और साइटमैप से अनुरोध होने पर उन्हें वहां से पुनर्प्राप्त करना होगा (शायद क्रॉन नौकरी में निर्देशिका को साफ करना)।

उन सभी

बहुत कम स्तर लगते हैं और मैं सोच रहा हूँ एक स्पष्ट समाधान मौजूद है अगर ...

+2

"परिणाम! = कोई नहीं" मत करो, हमेशा "परिणाम कोई नहीं है" – stefanw

+1

वह क्यों है? क्या फर्क पड़ता है? साइटमैप प्रोटोकॉल में – michuk

+0

50,000 दिया गया है। – webjunkie

उत्तर

13

50 यह एक कट्टर पैरामीटर नहीं है। :)

आप इस वर्ग का उपयोग कर सकते बजाय django.contrib.sitemaps.GenericSitemap

class LimitGenericSitemap(GenericSitemap): 
    limit = 2000 
+0

यह असाधारण रूप से सहायक था। इसके एक वर्किंग वर्जन के लिए, मेरा कोड यहां देखें: http://bitbucket.org/mlissner/legal-current-awareness/src/dc66d2268bec/alert/alertSystem/sitemap.py – mlissner

2

मान लिया जाये कि आप प्राप्त करने के लिए फ़ाइल आकार नीचे काम करेंगे तो सीमा को कम करने के अपने साइटमैप में उन सभी पृष्ठों की जरूरत नहीं है पिछले जवाब में वर्णित ठीक है।

यदि आप एक बहुत बड़ा साइटमैप चाहते हैं और memcached का उपयोग करना चाहते हैं तो आप सामग्री को कई हिस्सों में विभाजित कर सकते हैं, उन्हें अलग-अलग चाबियों के नीचे स्टोर कर सकते हैं और फिर उन्हें आउटपुट पर फिर से एक साथ रख सकते हैं। इसे और अधिक कुशल बनाने के लिए Memcached एक ही समय में एकाधिक कुंजी प्राप्त करने की क्षमता का समर्थन करता है, हालांकि मुझे यकीन नहीं है कि django क्लाइंट अभी तक इस क्षमता का समर्थन करता है या नहीं।

संदर्भ के लिए 1 एमबी सीमा memcached की एक विशेषता है कि यह कैसे डेटा संग्रहीत करता है के साथ क्या करना है: http://code.google.com/p/memcached/wiki/FAQ#What_is_the_maximum_data_size_you_can_store?_(1_megabyte)

1

मैं अपनी साइट पर लगभग 200,000 पृष्ठों है, इसलिए मैं कोई बात नहीं क्या सूचकांक पड़ा। मैं उपरोक्त हैक कर रहा हूं, साइटमैप को 250 लिंक तक सीमित कर रहा हूं, और फ़ाइल-आधारित कैश को भी कार्यान्वित कर रहा हूं।

बुनियादी एल्गोरिथ्म यह है: डिस्क पर एक फ़ाइल से साइटमैप लोड करने के लिए

  • कोशिश
  • अगर यह काम नहीं, साइटमैप उत्पन्न करते हैं, और
  • साइटमैप 250 लिंक (संख्या शामिल है ऊपर सेट करें), इसे डिस्क पर सहेजें और फिर इसे वापस करें।

अंतिम परिणाम यह है कि पहली बार साइटमैप का अनुरोध किया जाता है, अगर यह पूरा हो जाता है, तो यह उत्पन्न होता है और डिस्क में सहेजा जाता है। अगली बार अनुरोध किया गया है, यह बस डिस्क से परोसा जाता है। चूंकि मेरी सामग्री कभी नहीं बदली, यह बहुत अच्छी तरह से काम करता है। हालांकि, अगर मैं साइटमैप को बदलना चाहता हूं, तो डिस्क से फ़ाइल को हटाना उतना आसान है, और क्रॉलर चीजों को पुन: उत्पन्न करने की प्रतीक्षा कर रहा है।

पूरी बात के लिए कोड यहाँ है, अगर आप रुचि रखते हैं: http://bitbucket.org/mlissner/legal-current-awareness/src/tip/alert/alertSystem/sitemap.py

हो सकता है कि यह भी आप के लिए एक अच्छा समाधान हो जाएगा।

1

आप gzip प्रारूप में भी साइटमैप की सेवा कर सकते हैं, जो उन्हें बहुत छोटा बनाता है। एक्सएमएल पूरी तरह से gzip संपीड़न के लिए उपयुक्त है। मैं कभी-कभी क्या करता हूं: gzipped साइटमैप फ़ाइल को cronjob में बनाएं और जितनी बार आवश्यक हो उतनी बार प्रस्तुत करें। आमतौर पर, दिन में एक बार पर्याप्त होगा। इसके लिए कोड इस तरह दिख सकता है। बस अपने डोमेन जड़ से सेवा की अपनी sitemap.xml.gz है सुनिश्चित करें:

from django.contrib.sitemaps import GenericSitemap 
    from django.contrib.sitemaps.views import sitemap 
    from django.utils.encoding import smart_str 
    import gzip 
    sitemaps = { 
     'page': GenericSitemap({'queryset': MyModel.objects.all().order_by('-created'), 'date_field': 'created'}), 
    } 
    f = gzip.open(settings.STATIC_ROOT+'/sitemap.xml.gz', 'wb') 
    f.write(smart_str(sitemap(request, sitemaps=sitemaps).render().content)) 
    f.close() 

यह मिलना चाहिए आप शुरू कर दिया।