Web·þÎñÆ÷»áÖ´Ðи÷ÖÖ¼ÆËã--´ÓÊý¾Ý¿â²éѯµ½Ä£°åäÖȾµ½ÉÌÒµÂß¼--À´´´½¨ÄãµÄÕ¾µãµÄ·ÃÎÊÕß¿´µ½µÄÒ³Ãæ£¬´Ó´¦Àí¹ý¶ÈµÄ½Ç
¶ÈÀ´¿´£¬Õâ´ú¼Û·Ç³£°º¹ó
¶ÔÓÚ´ó¶àÊýWebÓ¦Ó㬹ý¶È²»ÊÇ´óÎÊÌ⣬´ó²¿·ÖWeb³ÌÐò²»ÊÇwashingtonpost.com»òÕßslashdot.org£¬ËüÃÇÖ»ÊǼòµ¥µÄСµÄ
µ½ÖеȴóСµÄÁ÷Á¿²»¹ýÈç´ËµÄÕ¾µã£¬µ«ÊǶÔÓÚÖеȵ½¸ßÁ÷Á¿µÄÕ¾µã£¬¾¡¿ÉÄܶàµÄÈ¥³ý¹ý¶È¾ÍºÜÖØÒª£¬ËùÒÔ»º´æÀ´ÁË
»º´æ¾ÍÊǰÑÒ»¸ö°º¹ó¼ÆËãµÄ½á¹û±£´æÆðÀ´£¬ÓÚÊÇÄãÏ´β»ÐèÒªÔÙ¼ÆËãÒ»´Î£¬ÕâÀïÊǽâÊÍËüÔõÑùΪ¶¯Ì¬ÍøÒ³¹¤×÷µÄα´úÂë:
- given a URL, try finding that page in the cache
- if the page is in the cache:
- return the cached page
- else:
- generate the page
- save the generated page in the cache (for next time)
- return the generated page
Django´øÓÐÒ»¸ö½¡×³µÄ»º´æÏµÍ³£¬ËüʹµÃÄã¿ÉÒÔ±£´æ¶¯Ì¬Ò³Ã棬ÓÚÊÇËüÃDz»ÐèÒª¶Ôÿ¸öÇëÇó¶¼¼ÆË㣬·½±ãÆð¼û£¬DjangoÌṩ
Á˲»Í¬¼¶±ðµÄ»º´æÁ£¶È£¬Äã¿ÉÒÔ»º´æÌØÊâÊÓͼµÄÊä³ö£¬¿ÉÒÔÖ»»º´æºÜÄÑÉú³ÉµÄ²¿·Ö£¬Ò²¿ÉÒÔ»º´æÄãµÄÕû¸öÕ¾µã
DjangoÒ²ºÍ"ÉÏÓÎ"»º´æ¹¤×÷µÄºÜºÃ£¬ÀýÈçSquid(http://www.squid-cache.org)ºÍ»ùÓÚä¯ÀÀÆ÷µÄ»º´æ£¬ÕâЩÀàÐÍ
µÄ»º´æÄã²»Ö±½Ó¿ØÖÆ£¬µ«ÊÇÄã¿ÉÒÔÌṩ¹ØÓÚÄãµÄÕ¾µãÄIJ¿·ÖÓ¦¸Ã±»»º´æºÍÔõÑù»º´æµÄÏßË÷(ͨ¹ýHTTPÍ·²¿)¸øËüÃÇ
É趨»º´æ
»º´æÏµÍ³ÐèҪһЩÉÙÁ¿µÄÉ趨¹¤×÷£¬¼´Äã±ØÐè¸æËßËüÄãµÄ»º´æÊý¾ÝÔÚÄÄÀï--ÔÚÊý¾Ý¿â£¬Îļþϵͳ»òÕßÖ±½ÓÔÚÄÚ´æÖУ¬ÕâÊÇÓ°
ÏìÄãµÄ»º´æÐÔÄܵÄÖØÒª¾ö¶¨£¬Êǵģ¬Ò»Ð©»º´æÀàÐÍÒª±ÈÆäËüµÄ¿ì£¬Äڴ滺´æÍ¨³£±ÈÎļþϵͳ»òÊý¾Ý¿â»º´æ¿ì£¬ÒòΪǰÕßûÓÐ
·ÃÎÊÎļþϵͳ»òÊý¾Ý¿âµÄ¹ý¶È
ÄãµÄ»º´æÑ¡ÔñÔÚÄãµÄsettingsÎļþµÄCACHE_BACKENDÉèÖÃÖУ¬Èç¹ûÄãʹÓûº´æµ«Ã»ÓÐÖ¸¶¨CACHE_BACKEND£¬Django½«Ä¬ÈÏʹÓÃ
simple:///£¬ÏÂÃæ½âÊÍÁËCACHE_BACKENDµÄËùÓпɵõ½µÄÖµ
Memcached
ĿǰΪֹDjango¿ÉµÃµ½µÄ×î¿ìµÄ×î¸ßЧµÄ»º´æÀàÐÍÊÇ»ùÓÚÄÚ´æµÄ»º´æ¿ò¼ÜMemcached£¬ËüÆð³õ¿ª·¢À´ÎªLiveJournal.com´¦Àí
¸ß¸ººÉ²¢Ëæºó±»Danga Interactive(http://www.danga.com)¿ªÔ´£¬Ëü±»SlashdotºÍWikipediaµÈÕ¾µãʹÓÃÀ´¼õÉÙ
Êý¾Ý¿â·ÃÎʺÍÏ·¾ç°ãµÄÔö¼ÓÕ¾µãÐÔÄÜ
Memcached¿ÉÒÔÔÚhttp://danga.com/memcached/Ãâ·ÑµÃµ½£¬Ëü×÷Ϊºǫ́½ø³ÌÔËÐв¢·ÖÅäÒ»¸öÖ¸¶¨ÊýÁ¿µÄRAM--Ϊ
ÔÚ»º´æÖÐÌí¼Ó£¬µÃµ½ºÍɾ³ýÈÎÒâÊý¾Ý£¬ËùÓеÄÊý¾ÝÖ±½Ó´æ´¢ÔÚÄÚ´æÖУ¬ËùÒÔûÓÐÊý¾Ý¿âºÍÎļþϵͳʹÓõĹý¶È
ÔÚ°²×°ÁËMemcached±¾ÉíÖ®ºó£¬Ä㽫ÐèÒª°²×°Memcached Python°ó¶¨£¬ËüûÓÐÖ±½ÓºÍDjango°ó¶¨£¬ÕâЩ°ó¶¨ÔÚÒ»¸öµ¥¶ÀµÄ
PythonÄ£¿éÖУ¬memcache.py£¬¿ÉÒÔÔÚhttp://www.djangoproject.com/thirdparty/python-memcachedµÃµ½
ÉèÖÃCACHE_BACKENDΪmemcached://ip:port/À´ÈÃDjangoʹÓÃMemcached£¬ÕâÀïµÄipÊÇMemcachedºǫ́½ø³ÌµÄIPµØÖ·£¬portÔòÊÇ
MemcachedÔËÐÐËùÔڵĶ˿Ú
ÔÚÕâ¸öÀý×ÓÖУ¬MemcachedÔËÐÐÔÚlocalhost(127.0.0.1)¶Ë¿Ú11211:
CACHE_BACKEND = 'memcached://127.0.0.1:11211/'
MemcachedµÄÒ»¸ö¼«ºÃµÄÌØÐÔÊÇËüÔÚ¶à¸ö·þÎñÆ÷·ÖÏí»º´æµÄÄÜÁ¦£¬ÕâÒâζ×ÅÄã¿ÉÒÔÔÚ¶ą̀»úÆ÷ÉÏÔËÐÐMemcached½ø³Ì£¬³ÌÐò½«
»á°ÑÕâ×é»úÆ÷µ±×÷Ò»¸öµ¥¶ÀµÄ»º´æ£¬¶ø²»ÐèÒªÔÚÿ̨»úÆ÷Éϸ´ÖÆ»º´æÖµ£¬ÎªÁËÈÃDjangoÀûÓôËÌØÐÔ£¬ÐèÒªÔÚCACHE_BACKEND
Àï°üº¬ËùÓеķþÎñÆ÷µØÖ·²¢Ó÷ֺŷָô
Õâ¸öÀý×ÓÖУ¬»º´æÔÚÔËÐÐÔÚ172.19.26.240ºÍ172.19.26.242µÄIPµØÖ·ºÍ11211¶Ë¿ÚµÄMemcachedʵÀý¼ä·ÖÏí:
CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11211/'
Õâ¸öÀý×ÓÖУ¬»º´æÔÚÔËÐÐÔÚ172.19.26.240(¶Ë¿Ú11211)£¬172.19.26.242(¶Ë¿Ú11212)£¬172.19.26.244(¶Ë¿Ú11213)µÄMemcach
edʵÀý¼ä·ÖÏí:
CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11212;172.19.26.244:11213/'
×îºó¹ØÓÚMemcachedµÄÊÇ»ùÓÚÄÚ´æµÄ»º´æÓÐÒ»¸öÖØ´óµÄȱµã£¬ÒòΪ»º´æÊý¾ÝÖ»´æ´¢ÔÚÄÚ´æÖУ¬ÔòÈç¹û·þÎñÆ÷ËÀ»úµÄ»°Êý¾Ý»á¶ª
ʧ£¬ÏÔÈ»ÄÚ´æ²»ÊÇΪ³Ö¾ÃÊý¾Ý´æ´¢×¼±¸µÄ£¬DjangoûÓÐÒ»¸ö»º´æºó¶ËÊÇÓÃÀ´×ö³Ö¾Ã´æ´¢µÄ£¬ËüÃǶ¼ÊÇ»º´æ·½°¸£¬¶ø²»ÊÇ´æ´¢
µ«ÊÇÎÒÃÇÔÚÕâÀïÖ¸³öÊÇÒòΪ»ùÓÚÄÚ´æµÄ»º´æÌرðµÄ¶ÌÔÝ
Êý¾Ý¿â»º´æ
ÔÚÄãµÄÊý¾Ý¿â´´½¨»º´æ±í²¢ÔÚ±íÀïÖ¸³öDjangoµÄ»º´æÏµÍ³À´Ê¹ÓÃÊý¾Ý¿â±í×÷Ϊ»º´æºó¶Ë£¬Ê×ÏÈÔËÐÐÕâ¸öÃüÁî´´½¨»º´æ±í:
python manage.py createcachetable [cache_table_name]
ÕâÀïµÄ[cache_table_name]ÊÇÒª´´½¨µÄÊý¾Ý¿â±íÃû£¬Ãû×Ö¿ÉÒÔÊÇÈκÎÄãÏëÒªµÄ£¬Ö»ÒªËüÊǺϷ¨µÄÔÚÄãµÄÊý¾Ý¿âÖÐûÓб»Ê¹ÓÃ
Õâ¸öÃüÁîÔÚÄãµÄÊý¾Ý¿â´´½¨Ò»¸ö×ñÑDjangoµÄÊý¾Ý¿â»º´æÏµÍ³ÆÚÍûÐÎʽµÄµ¥¶ÀµÄ±í
Ò»µ©Äã´´½¨ÁËÊý¾Ý¿â±í£¬ÉèÖÃÄãµÄCACHE_BACKENDÉèÖÃΪ"db://tablename"£¬ÕâÀïµÄtablenameÊÇÊý¾Ý¿â±íµÄÃû×Ö£¬ÔÚÕâ¸öÀý
×ÓÖУ¬»º´æ±íÃûΪmy_cache_table:
CACHE_BACKEND = 'db://my_cache_table'
Êý¾Ý¿â»º´æºó¶ËʹÓÃÄãµÄsettingsÎļþÖ¸¶¨µÄͬһÊý¾Ý¿â£¬Äã²»ÄÜΪÄãµÄ»º´æ±íʹÓò»Í¬µÄÊý¾Ý¿âºó¶Ë
Îļþϵͳ»º´æ
ʹÓÃ"file://"»º´æÀàÐÍ×÷ΪCACHE_BACKEND²¢Ö¸¶¨´æ´¢»º´æÊý¾ÝµÄÎļþϵͳĿ¼À´ÔÚÎļþϵͳ´æ´¢»º´æÌõÄ¿
ÀýÈ磬ʹÓÃÏÂÃæµÄÉèÖÃÀ´ÔÚ/var/tmp/django_cache´æ´¢»º´æÊý¾Ý:
CACHE_BACKEND = 'file:///var/tmp/django_cache'
×¢ÒâÀý×ÓÖпªÍ·ÓÐÈý¸öǰбÏߣ¬Ç°Á½¸öÊÇfile://£¬µÚÈý¸öÊÇĿ¼·¾¶µÄµÚÒ»¸ö×Ö·û£¬/var/tmp/django_cache£¬Èç¹ûÄãʹÓÃ
Windows£¬°ÑÅÌ·û×Öĸ·ÅÔÚfile://ºóÃæ£¬ÏñÕâÑù:file://c:/foo/bar
Ŀ¼·¾¶Ó¦¸ÃÊǾø¶Ô·¾¶£¬¼´Ó¦¸ÃÒÔÄãµÄÎļþϵͳµÄ¸ù¿ªÊ¼£¬ÄãÔÚÉèÖõĽáβ·ÅÖÃбÏßÓë·ñÎ޹ؽôÒª
È·ÈϸÃÉèÖÃÖ¸ÏòµÄĿ¼´æÔÚ²¢ÇÒÄãµÄWeb·þÎñÆ÷ÔËÐеÄϵͳµÄÓû§¿ÉÒÔ¶Áд¸ÃĿ¼£¬¼ÌÐøÉÏÃæµÄÀý×Ó£¬Èç¹ûÄãµÄ·þÎñÆ÷ÒÔÓû§
apacheÔËÐУ¬È·ÈÏ/var/tmp/django_cache´æÔÚ²¢ÇÒÓû§apache¿ÉÒÔ¶Áд/var/tmp/django_cacheĿ¼
ÿ¸ö»º´æÖµ½«±»´æ´¢Îªµ¥¶ÀµÄÎļþ£¬ÆäÄÚÈÝÊÇPythonµÄpickleÄ£¿éÒÔÐòÁл¯("pickled")ÐÎʽ±£´æµÄ»º´æÊý¾Ý£¬Ã¿¸öÎļþµÄ
ÎļþÃûÊÇ»º´æ¼ü£¬²¢escapeΪ°²È«µÄÎļþϵͳʹÓÃ
±¾µØ´æ´¢Æ÷»º´æ
Èç¹ûÄãÏëÒªÄڴ滺´æµÄËÙ¶ÈÓÅÊÆµ«Ã»ÓÐÄÜÁ¦ÔËÐÐMemcached£¬¿ÉÒÔ¿¼ÂÇʹÓñ¾µØ´æ´¢Æ÷»º´æºó¶Ë£¬¸Ã»º´æÊǶàÏ̺߳ÍḬ̈߳²È«
µÄ£¬µ«ÊÇÓÉÓÚÆä¼òµ¥µÄËøºÍÄÚ´æ·ÖÅä²ßÂÔËüûÓÐMemcached¸ßЧ
ÉèÖÃCACHE_BACKENDΪ'locmem:///'À´Ê¹ÓÃËü£¬ÀýÈç:
CACHE_BACKEND = 'locmem:///'
¼òµ¥»º´æ(¿ª·¢ÓÃ)
'simple:///'ÊÇÒ»¸ö¼òµ¥£¬µ¥Ï̵߳ÄÄڴ滺´æ£¬ËüÖ»ÔÚ³ÌÐòÖб£´æ»º´æÊý¾Ý£¬ÕâÒâζ×ÅËüÖ»ÄÜÔÚ¿ª·¢»ò²âÊÔ»·¾³ÏÂʹÓã¬Èç:
CACHE_BACKEND = 'simple:///'
¼Ù»º´æ(¿ª·¢ÓÃ)
×îºó£¬Django´øÓÐÒ»¸ö"¼Ù"»º´æ£¬ËüÊÂʵÉϲ»»º´æ--ËüÖ»ÊÇʵÏÖÁË»º´æ½Ó¿Úµ«²»×öÈκÎÊÂÇé
Èç¹ûÄãÓÐÒ»¸ö²úÆ·Õ¾µã£¬Õ¾µãÔÚ²»Í¬µÄµØ·½Ê¹ÓÃÖØÐÍ»º´æµ«¿ª·¢ºÍ²âÊÔ»·¾³ÖÐÄã²»ÏëʹÓûº´æ£¬ÔòËüÊǺÜÓÐÓõģ¬ÕâÖÖÇé¿ö
Ï£¬ÔÚsettingsÎļþÖÐÉèÖÃCACHE_BACKENDΪ'dummy:///'À´×ö¿ª·¢»·¾³£¬ÕâÑùÄãµÄ¿ª·¢»·¾³¾Í²»»áʹÓûº´æµ«ÄãµÄ²úÆ·»·¾³
ÈÔÈ»»áʹÓã¬ÀýÈç:
CACHE_BACKEND = 'dummy:///'
CACHE_BACKEND²ÎÊý
ÿ¸ö»º´æºó¶Ë¶¼¿ÉÄÜʹÓòÎÊý£¬ËüÃÇÔÚCACHE_BACKENDÉèÖÃÖÐÒÔ²éѯ×Ö·û´®ÐÎʽ¸ø³ö£¬ºÏ·¨µÄ²ÎÊýΪ:
1£¬timeout--»º´æÄ¬Èϵij¬Ê±ÏÞ¶¨£¬ÒÔÃëΪµ¥Î»£¬Ä¬ÈÏΪ300Ãë(5·ÖÖÓ)
2£¬max_entries--¼òµ¥ºó¶Ë£¬±¾µØ´æ´¢Æ÷ºó¶ËºÍÊý¾Ý¿âºó¶Ë»º´æÔÚ¾ÉÖµÇå³þǰÔÊÐíµÄ×î´óµÄÌõÄ¿£¬Ä¬ÈÏΪ300
3£¬cull_percentage--µ±µ½´ïmax_entriesʱѡÔñµÄÌõÄ¿µÄ±ÈÂÊ£¬×¼È·µÄ±ÈÂÊÊÇ1/cull_percentage£¬ËùÒÔÉèÖÃcull_percenta
ge=2Ôòµ±max_entriesµ½´ïʱ»áÑ¡Ôñ1/2µÄÌõÄ¿
cull_percentage=0±íʾµ±µ½´ïmax_entriesʱÌõÄ¿»º´æ½«±»Çå³ý£¬ÕâÒÔ¸ü¶àµÄ»º´æÈ±Ê§Îª´ú¼ÛÈÃÑ¡Ôñ¸ü¿ì£¬Ä¬ÈÏֵΪ3
Õâ¸öÀý×ÓÖУ¬timeoutÉèÖÃΪ60:
CACHE_BACKEND = "locmem:///?timeout=60"
Õâ¸öÀý×ÓÖУ¬timeoutΪ30²¢ÇÒmax_entriesΪ400:
CACHE_BACKEND = "locmem:///?timeout=30&max_entries=400"
²»ºÏ·¨µÄ²ÎÊý±»¾²¾²µÄºöÂÔ£¬×÷ΪÒÑÖª²ÎÊýµÄ·Ç·¨Öµ
ÕûÕ¾»º´æ
Ò»µ©ÄãÖ¸¶¨ÁËCACHE_BACKEND£¬Ê¹Óûº´æµÄ×î¼òµ¥µÄ·½Ê½ÊÇ»º´æÄãµÄÕû¸öÕ¾µã£¬ÕâÒâζ×Åÿ¸öûÓÐGET»òPOST²ÎÊýµÄÒ³ÃæµÚÒ»
´ÎÇëÇóʱ¶¼»á»º´æÒ»¶ÎÌØÓеÄʱ¼ä
°Ñ'django.middleware.cache.CacheMiddleware'Ìí¼Óµ½ÄãµÄMIDDLEWARE_CLASSESÉèÖÃÖÐÀ´¼¤»îÕûÕ¾»º´æ£¬ÀýÈç:
- MIDDLEWARE_CLASSES = (
- 'django.middleware.cache.CacheMiddleware',
- 'django.middleware.common.CommonMiddleware',
- )
(MIDDLEWARE_CLASSESµÄ˳ÐòÓйØÏµ£¬²Î¿¼ÏÂÃæµÄ"MIDDLEWARE_CLASSESµÄ˳Ðò")
È»ºó£¬ÔÚÄãµÄDjango settingsÎļþÖÐÌí¼ÓÏÂÁбØÐèÉèÖÃ:
1£¬CACHE_MIDDLEWARE_SECONDS--ÿ¸öÒ³ÃæÓ¦¸Ã±»»º´æµÄÃëÊý
2£¬CACHE_MIDDLEWARE_KEY_PREFIX--Èç¹ûÔÚͬһDjango°²×°µÄ¶à¸öÕ¾µã·ÖÏí»º´æ£¬ÉèÖÃËüΪվµãÃû£¬»òÕ߯äËüΨһ´ú±íµ±Ç°
DjangoʵÀýµÄ×Ö·û´®À´·ÀÖ¹¼ü³åÍ»£¬Èç¹ûÄã²»ÔÚÒâÔò¿ÉÒÔʹÓÿÕ×Ö·û´®
»º´æÖмä¼þ»º´æÃ¿¸öûÓÐGET»òÕßPOST²ÎÊýµÄÒ³Ãæ£¬¼´Èç¹ûÓû§ÇëÇóÒ³Ãæ²¢ÔÚ²éѯ×Ö·û´®Àï´«µÝGET²ÎÊý»òÕßPOST²ÎÊý£¬Öмä
¼þ½«²»»á³¢ÊԵõ½»º´æ°æ±¾µÄÒ³Ãæ£¬Èç¹ûÄã´òËãʹÓÃÕûÕ¾»º´æ£¬Éè¼ÆÄãµÄ³ÌÐòʱÀμÇÕâµã£¬ÀýÈ磬²»ÒªÊ¹ÓÃÓµÓвéѯ×Ö·û´®
µÄURLs£¬³ý·ÇÄÇÐ©Ò³Ãæ¿ÉÒÔ²»»º´æ
»º´æÖмä¼þÖ§³ÖÁíÒ»¸öÉèÖã¬CACHE_MIDDLEWARE_ANONYMOUS_ONLY£¬Èç¹ûÄ㶨ÒåÁËÕâ¸öÉèÖ㬲¢ÇÒÖµÉèΪTrue£¬Ôò»º´æÖмä¼þ
½«Ö»»º´æÄäÃûÇëÇ󣬼´ÄÇЩûÓеǼµÄÓû§µÄÇëÇó£¬ÕâÊǶÔÓû§ÌØÓеÄÒ³Ãæ½ûÖ¹»º´æµÄ¼òµ¥ºÍÓÐЧµÄ·½Ê½£¬ÈçDjangoµÄadmin
½çÃæ£¬×¢ÒâÈç¹ûÄãʹÓÃCACHE_MIDDLEWARE_ANONYMOUS_ONLY£¬ÄãÓ¦¸ÃÈ·ÈÏÄãÒѾ¼¤»îÁËAuthenticationMiddleware²¢ÇÒËüÔÚ
ÄãµÄMIDDLEWARE_CLASSESÖеÄCacheMiddleware֮ǰ
×îºó£¬×¢ÒâCacheMiddleware×Ô¶¯ÎªÃ¿¸öHttpResponseÉèÖÃһЩͷ²¿:
1£¬µ±Ò»¸öÐÂ(û»º´æµÄ)°æ±¾µÄÒ³Ãæ±»ÇëÇóʱÉèÖÃLast-ModifiedÍ·²¿Îªµ±Ç°ÈÕÆÚ/ʱ¼ä
2£¬ÉèÖÃExpiresÍ·²¿Îªµ±Ç°ÈÕÆÚ/ʱ¼ä¼ÓÉ϶¨ÒåµÄCACHE_MIDDLEWARE_SECONDS
3£¬ÉèÖÃCache-ControlÍ·²¿À´¸øÒ³ÃæÒ»¸ö×î´óµÄʱ¼ä--ÔÙÒ»´Î£¬¸ù¾ÝCACHE_MIDDLEWARE_SECONDSÉèÖÃ
ÊÓͼ»º´æ
Ò»¸ö¸üϸÁ£¶ÈµÄʹÓûº´æ¿ò¼ÜµÄ·½Ê½ÊÇ»º´æµ¥¶ÀÊÓͼµÄÊä³ö£¬ËüºÍÕûÕ¾»º´æÓÐÒ»ÑùµÄЧ¹û(°üÀ¨ºöÂÔÓÐGETºÍPOST²ÎÊýµÄÇëÇó)
ËüÊʺÏÈκÎÄãÖ¸¶¨µÄÊÓͼ£¬¶ø²»ÊÇÕû¸öÕ¾µã
ͨ¹ýʹÓÃÒ»¸ö×°ÊÎÆ÷--Ò»¸ö¸Ä±äÄãµÄÊÓͼ·½·¨µÄÐÐΪÀ´Ê¹Óûº´æµÄ·â×°Æ÷À´Ê¹ÓÃÊÓͼ»º´æ£¬ÊÓͼ»º´æ×°ÊÎÆ÷½Ðcache_page
ËüλÓÚdjango.views.decorators.cacheÄ£¿é£¬ÀýÈç:
- from django.views.decorators.cache import cache_page
- def my_view(request, param):
- # ...
- my_view = cache_page(my_view, 60 * 15)
Èç¹ûÄãʹÓÃPython2.4»ò¸ü¸ß£¬Äã¿ÉÒÔʹÓÃ×°ÊÎÆ÷Óï·¨£¬Õâ¸öÀý×ÓÊÇÏàͬµÄ:
- from django.views.decorators.cache import cache_page
- @cache_page(60 * 15)
- def my_view(request, param):
- # ...
cache_pageʹÓÃÒ»¸öµ¥¶ÀµÄ²ÎÊý:»º´æ³¬Ê±£¬ÒÔÃëΪµ¥Î»£¬ÔÚÉÏÃæµÄÀý×ÓÖУ¬my_view()ÊÓͼµÄ½á¹û½«±»»º´æ15·ÖÖÓ(×¢ÒâÎÒÃÇ
ΪÁ˿ɶÁÐÔ°ÑËüд³ÉÁË60 * 15£¬µÈÓÚ900£¬¼´15·ÖÖÓ³ËÒÔÿ·ÖÖÓ60Ãë)
ÀàËÆÓÚÕûÕ¾»º´æ£¬ÊÓͼ»º´æºÍURLÓйأ¬Èç¹û¶à¸öURLsÖ¸ÏòͬһÊÓͼ£¬Ôòÿ¸öURL½«±»µ¥¶À»º´æ£¬¼ÌÐømy_viewÀý×Ó£¬Èç¹ûÄãµÄ
URLÅäÖÃÏñÏÂÃæÕâÑù:
- urlpatterns = ('',
- (r'^foo/(\d{1,2})/$', my_view),
- )
Ôò¶Ô/foo/1/ºÍ/foo/23/µÄÇëÇó½«ÏñÄãÆÚÍûµÄÄÇÑù±»µ¥¶À»º´æ£¬µ«ÊÇÒ»µ©Ò»¸öÌØ±ðµÄURL(ÀýÈç/foo/23/)±»ÇëÇó£¬Ôò¸ÃURLºóÐø
µÄÇëÇó½«Ê¹Óûº´æ
ÔÚURLÅäÖÃÖ¸¶¨ÊÓͼ»º´æ
ÉÏÃæµÄÀý×ÓÓ²±àÂëÁËÊÓͼ±»»º´æµÄÊÂʵ£¬ÒòΪcache_pageÔÚÊʵ±µÄλÖøıäÁËmy_viewÊÓͼ£¬ÕâÖÖ·½Ê½ñîºÏÁËÄãµÄÊÓͼºÍ»º´æ
ϵͳ£¬ÔÚһЩ·½ÃæÕâÊDz»ÀíÏëµÄ£¬ÀýÈ磬Äã¿ÉÄÜÏëÖØÓÃÊÓͼ·½·¨µ½ÁíÒ»¸öºÜÉÙ»º´æµÄÕ¾µã£¬»òÕßÄã¿ÉÄÜÏë·¢²¼ÊÓͼ¸øÄÇЩ¿É
ÄÜÏë²»Óûº´æÀ´Ê¹ÓÃËüÃǵÄÈË£¬ÕâЩÎÊÌâµÄ½â¾ö·½°¸ÊÇÔÚURLÅäÖÃÀïÖ¸¶¨ÊÓͼ»º´æ¶ø²»ÊÇÔÚÊÓͼ·½·¨±¾Éí¸½½ü
ÕâºÜÈÝÒ××öµ½£¬µ±ÄãÔÚURLÅäÖÃÀïÒýÓÃËüµÄʱºò¼òµ¥µÄÓÃcache_page°ü×°ÊÓͼ·½·¨£¬ÕâÀïÊÇÉÏÃæ¾ÉµÄURLÅäÖÃ:
- urlpatterns = ('',
- (r'^foo/(\d{1,2})/$', my_view),
- )
ÕâÀïÊÇͬÑùµÄ¶«Î÷£¬µ«ÓÃcache_page°ü×°ÁËmy_view:
- from django.views.decorators.cache import cache_page
- urlpatterns = ('',
- (r'^foo/(\d{1,2})/$', cache_page(my_view, 60 * 15)),
- )
Èç¹ûÄãʹÓÃÕâÖÖ·½Ê½£¬±ðÍüÁËÔÚÄãµÄURLÅäÖÃÀïimport cache_page
µÍ¼¶»º´æAPI
ÓÐʱºò£¬»º´æÍêÕûäÖȾµÄÒ³Ãæ²»»áÈÃÄãÊÕ»ñºÜ¶à£¬ÊÂʵÉÏ£¬ÕâÓе㲻·½±ã£¬ÀýÈçÄãµÄÕ¾µã°üÀ¨Ò»¸ö½á¹ûÒÀÀµÓÚһЩ°º¹ó²éѯ
µÄ½á¹ûµÄÊÓͼ£¬¶øÇÒ½á¹ûÔÚÒ»¶Îʱ¼äºó»á¸ü¸Ä£¬ÕâÖÖÇé¿öÏ£¬Ê¹ÓÃÕûÕ¾»º´æ»òÊÓͼ»º´æ²ßÂÔÌṩµÄÈ«Ò³Ãæ»º´æ¾Í²»ÊǺÜÀíÏë
ÒòΪÄã²»Ï뻺´æÕû¸ö½á¹û(¼ÈÈ»ÓÐЩÊý¾ÝƵ·±¸ü¸ÄµÄ»°)£¬µ«ÊÇÄãÈÔÈ»Ï뻺´æºÜÉÙ¸ü¸ÄµÄ½á¹û
¶ÔÓÚÕâÖÖÇé¿ö£¬Django±©Â¶ÁËÒ»¸ö¼òµ¥µÍ¼¶µÄ»º´æAPI£¬ËüλÓÚdjango.core.cache£¬Äã¿ÉÒÔʹÓÃÈκÎÁ£¶ÈµÄµÍ¼¶»º´æAPIÀ´
ÔÚ»º´æÖд洢¶ÔÏó£¬Äã¿ÉÒÔ»º´æÈκοÉÒÔ±»°²È«"pickled"µÄPython¶ÔÏó--×Ö·û´®£¬×ֵ䣬ģÐͶÔÏóÁбíµÈµÈ(´ó²¿·Öͨ³£µÄ
Python¶ÔÏ󶼿ÉÒÔ±»pickled£¬²Î¿¼PythonÎĵµµÃµ½¸ü¶à¹ØÓÚpicklingµÄÐÅÏ¢)
ÕâÀïÊÇÔõÑùimportËü:
- >>> from django.core.cache import cache
»ù±¾½Ó¿ÚΪset(key, value, timeout_seconds)ºÍget(key):
- >>> cache.set('my_key', 'hello, world!', 30)
- >>> cache.get('my_key')
- 'hello, world!'
timeout_seconds²ÎÊý¿ÉÑ¡²¢ÇÒĬÈÏΪÉÏÃæ½âÊ͵ÄCACHE_BACKENDÉèÖÃÖеÄtimeout²ÎÊý
Èç¹û»º´æÖжÔÏó²»´æÔÚ£¬»òÕß»º´æºó¶Ë²»¿ÉµÃµ½£¬Ôòcache.get()·µ»ØNone:
- # Wait 30 seconds for 'my_key' to expire...
- >>> cache.get('my_key')
- None
- >>> cache.get('some_unset_key')
- None
ÎÒÃǽ¨Òé²»ÒªÔÚ»º´æÖд洢×ÖÃæÉϵÄNone£¬ÒòΪÄã²»ÄÜÇø±ðÄã´æ´¢µÄNoneÖµºÍͨ¹ý·µ»ØNoneÖµ±íʾµÄ»º´æÈ±Ê§
cache.get()¿ÉÒÔʹÓÃÒ»¸ödefault²ÎÊý£¬ËüÖ¸¶¨ÁËÈç¹û¶ÔÏóÔÚ»º´æÖв»´æÔÚʱµÄ·µ»ØÖµ:
- >>> cache.get('my_key', 'has expired')
- 'has expired'
ʹÓÃcache.get_many()À´Ò»´Î»ñµÃ¶à¸ö»º´æÖµ£¬¶ÔÓÚ¸ø¶¨µÄ»º´æºó¶Ë£¬Èç¹û¿ÉÄÜ£¬get_many()½«Ö»·ÃÎÊ»º´æÒ»´Î£¬¶ø²»ÊǶÔ
ÿ¸ö»º´æ¼ü·ÃÎÊÒ»´Î£¬get_many()·µ»ØÒ»¸ö°üº¬ËùÓÐÄãÇëÇóµÄÔÚ»º´æÖдæÔÚ²¢Ã»ÓйýÆÚµÄ¼üµÄ×Öµä:
- >>> cache.set('a', 1)
- >>> cache.set('b', 2)
- >>> cache.set('c', 3)
- >>> cache.get_many(['a', 'b', 'c'])
- {'a': 1, 'b': 2, 'c': 3}
Èç¹û»º´æ¼ü²»´æÔÚ»òÕßÒѹýÆÚ£¬Ëü½«²»°üº¬ÔÚÕâ¸ö×ÖµäÖУ¬¼ÌÐøÀý×Ó:
- >>> cache.get_many(['a', 'b', 'c', 'd'])
- {'a': 1, 'b': 2, 'c': 3}
×îºó£¬Äã¿ÉÒÔÓÃcache.delete()ÏÔʾµÄɾ³ý¼ü£¬ÕâÊÇÇå³ý»º´æÖÐÌØÊâ¶ÔÏóµÄ¼òÒ×·½Ê½:
- >>> cache.delete('a')
cache.delete()ûÓзµ»ØÖµ£¬²¢ÇÒËüͬ¸ø¶¨»º´æ¼üºÍ¶ÔÓ¦Öµ´æÔÚÓë·ñµÄ¹¤×÷·½Ê½Ò»Ñù
ÉÏÓλº´æ
µ½Ä¿Ç°ÎªÖ¹£¬±¾Õ¼¯ÖйØ×¢»º´æÄã×Ô¼ºµÄÊý¾Ý£¬µ«ÊÇÁíÒ»ÖÖÀàÐ͵Ļº´æÒ²ºÍWeb¿ª·¢Ïà¹Ø:ͨ¹ý"ÉÏÓÎ"»º´æÀ´Ö´Ðлº´æ£¬ÕâЩ
»º´æÊÇÔÚÇëÇóµ½´ïÄãµÄWebÕ¾µã֮ǰΪÓû§»º´æÒ³ÃæµÄϵͳ
ÕâÀïÊÇһЩÉÏÓλº´æµÄÀý×Ó:
1£¬ÄãµÄISP¿ÉÄÜ»ºÄ³Ð©Ò³Ã棬ËùÒÔÈç¹ûÄãÇëÇóexample.comµÄÒ»¸öÒ³Ãæ£¬ÄãµÄISP½«²»Ö±½Ó·ÃÎÊexample.com¶ø·¢Ë͸øÄãÄǸö
Ò³Ãæ£¬example.comµÄά»¤Õß²»ÖªµÀÕâ¸ö»º´æ£¬ISPλÓÚexample.comºÍÄãµÄWebä¯ÀÀÆ÷Ö®¼ä͸Ã÷µÄ´¦ÀíËùÓеĻº´æ
2£¬ÄãµÄDjangoÍøÕ¾¿ÉÄÜÔÚÒ»¸ö´úÀí»º´æºóÃæ£¬ÀýÈçSquid(http://www.squid-cache.org)£¬ËüΪÐÔÄܶø»º´æÒ³Ãæ
ÕâÖÖÇé¿öÏ£¬Ã¿¸öÇëÇóÊ×Ïȱ»´úÀí´¦Àí£¬È»ºóÈç¹ûÐèÒªµÄ»°²Å±»·¢Ë͵½ÄãµÄ³ÌÐò
3£¬ÄãµÄWebä¯ÀÀÆ÷Ò²»º´æÒ³Ã棬Èç¹ûÒ»¸öWebÒ³Ãæ·¢ËÍÊʵ±µÄÍ·²¿£¬ÄãµÄä¯ÀÀÆ÷½«ÎªºóÃæ¶Ô¸ÃÒ³ÃæµÄÇëÇóʹÓñ¾µØ»º´æ¿½±´
¶ø²»ÊÇÔÙÒ»´ÎÁ¬½ÓÍøÒ³À´¿´ËüÊÇ·ñ¸ü¸Ä
ÉÏÓλº´æÊǺܺõĹ¦Ð§Íƽø£¬µ«ÊÇËüÓÐÒ»¸öΣÏÕ£¬Ðí¶àÍøÒ³µÄÄÚÈÝ»ùÓÚÈÏÖ¤ºÍһЩÆäËü±äÁ¿¶ø²»Í¬£¬²¢ÇÒÍêÈ«»ùÓÚURLÀ´Ã¤Ä¿
µÄ±£´æÒ³ÃæµÄ»º´æÏµÍ³¿ÉÄܱ©Â¶²»ÕýÈ·µÄ»òÕßÃô¸ÐÊý¾Ý¸øºóÃæ·ÃÎÊÄÇÐ©Ò³ÃæµÄ·ÃÎÊÕß
ÀýÈ磬Äã²Ù×÷Ò»¸öWeb e-mailϵͳ£¬"ÊÕ¼þÏä"Ò³ÃæµÄÄÚÈÝÏÔÈ»ÒÀÀµÓڵǼµÄÓû§£¬Èç¹ûISPäĿµÄ»º´æÄãµÄÕ¾µã£¬ÔòµÚÒ»¸ö
ͨ¹ýISPµÇ¼µÄÓû§½«»áʹËûµÄÓû§×¨ÓеÄÊÕ¼þÏäÒ³Ãæ»º´æ¸øºóÃæ·ÃÎʸÃÕ¾µãµÄ·ÃÎÊÕߣ¬Õâ²»cool
ÐÒÔ˵ÄÊÇ£¬HTTPÌṩÁ˸ÃÎÊÌâµÄ½â¾ö·½°¸£¬´æÔÚһЩHTTPÍ·²¿À´¸æÖªÉÏÓλº´æ¸ù¾ÝÖ¸ÅɵıäÁ¿ÏÔʾ²»Í¬µÄ»º´æÄÚÈÝ£¬ÒÔ¼°¸æ
Ëß»º´æ»úÖÆ²»Òª»º´æÌØÊâµÄÒ³Ãæ
ʹÓÃVaryÍ·²¿
ÕâЩͷ²¿ÖеÄÒ»¸öΪVary£¬Ëü¶¨ÒåÁ˵±»º´æ»úÖÆ¹¹½¨ËüµÄ»º´æ¼üʱӦ¸Ã¿¼ÂÇÄĸöÇëÇóÍ·²¿£¬ÀýÈ磬Èç¹ûÒ»¸öÍøÒ³µÄÄÚÈÝÒÀÀµ
ÓÚÓû§µÄÓïÑÔÑ¡Ôñ£¬ÔòÕâ¸öÒ³Ãæ³ÆÎª"¸ù¾ÝÓïÑÔ¶ø²»Í¬"
DjangoµÄ»º´æÏµÍ³Ä¬ÈÏʹÓÃÇëÇó·¾¶À´´´½¨ËüµÄ»º´æ¼ü£¬ÀýÈç"/stories/2005/jun/23/bank_robbed/"£¬ÕâÒâζ×ŶԸÃURLµÄ
ÿ¸öÇëÇó½«Ê¹ÓÃͬÑùµÄ»º´æ°æ±¾£¬²»¹Üuser-agentÊÇ·ñ²»Í¬£¬Èçcookies»òÕßÓïÑÔÑ¡ÔñµÈµÈ£¬¾¡¹ÜÈç´Ë£¬Èç¹ûÒ³Ãæ¸ù¾ÝÇëÇó
Í·²¿µÄһЩ²»Í¬À´Êä³ö²»Í¬µÄÄÚÈÝ--Èçcookie£¬ÓïÑÔ£¬»òuser-agent--Ä㽫ÐèҪʹÓÃVaryÍ·²¿À´¸æËß»º´æ»úÖÆÒ³ÃæÊä³öÒÀÀµ
ÓÚÄÇЩ¶«Î÷£¬ÏñÕâÑùʹÓ÷½±ãµÄvary_on_headersÊÓͼװÊÎÆ÷À´ÔÚDjangoÖÐ×öÕâ¸ö:
- from django.views.decorators.vary import vary_on_headers
- # Python 2.3 syntax.
- def my_view(request):
- # ...
- my_view = vary_on_headers(my_view, 'User-Agent')
- # Python 2.4+ decorator syntax.
- @vary_on_headers('User-Agent')
- def my_view(request):
- # ...
ÕâÖÖÇé¿öÏ£¬»º´æ»úÖÆ(ÀýÈçDjango×Ô¼ºµÄ»º´æÖмä¼þ)½«¶Ôÿ¸öΨһµÄuser-agent»º´æµ¥¶À°æ±¾µÄÒ³Ãæ
ʹÓÃvary_on_headers×°ÊÎÆ÷¶ø²»ÊÇÊÖ¶¯ÉèÖÃVaryÍ·²¿(ʹÓÃÀàËÆÓÚresponse['Vary'] = 'user-agent')µÄÓÅÊÆÊÇ×°ÊÎÆ÷Ìí¼Ó
µ½VaryÍ·²¿(¿ÉÄÜÒѾ´æÔÚ)¶ø²»ÊÇ´ÓÁ㿪ʼÉèÖÃËü²¢Ç±Ôڵĸ²¸ÇÒѾÔÚÄÇÀïµÄ¶«Î÷
Äã¿ÉÒÔ´«µÝ¶à¸öÍ·²¿µ½vary_on_headers():
- @vary_on_headers('User-Agent', 'Cookie')
- def my_view(request):
- # ...
Õâ¸æËßÉÏÓλº´æ¶ÔÁ½Õß¶ø²»Í¬£¬¼´¶Ôÿ¸öuser-agentºÍcookieµÄ½áºÏµÃµ½Ëü×Ô¼ºµÄ»º´æÖµ£¬ÀýÈ磬ʹÓÃuser-agentΪMozilla
ºÍcookieÖµfoo=barµÄÇëÇ󽫱»ÈÏΪºÍuser-agentΪMozillaºÍcookieÖµfoo=hamµÄÇëÇó²»Í¬
ÒòΪ¶Ôcookie¶ø²»Í¬ÊÇÈç´Ë³£¼ûµÄÇéÐΣ¬ÓÐÒ»¸övary_on_cookie×°ÊÎÆ÷£¬ÕâÁ½¸öÊÓͼÊÇÏàµÈµÄ:
- @vary_on_cookie
- def my_view(request):
- # ...
- @vary_on_headers('Cookie')
- def my_view(request):
- # ...
Äã´«µÝ¸øvary_on_headersµÄÍ·²¿ÊÇ´óСд²»Ãô¸ÐµÄ£¬"User-Agent"ºÍ"user-agent"Ò»Ñù
ÄãÒ²¿ÉÒÔÖ±½ÓʹÓø¨Öú·½·¨django.utils.cache.patch_vary_headers£¬Õâ¸ö·½·¨ÉèÖûòÌí¼Óµ½VaryÍ·²¿£¬ÀýÈç:
- from django.utils.cache import patch_vary_headers
- def my_view(request):
- # ...
- response = render_to_response('template_name', context)
- patch_vary_headers(response, ['Cookie'])
- return response
patch_vary_headersʹÓÃHttpResponseʵÀý×÷ΪËüµÄµÚÒ»¸ö²ÎÊý£¬Ò»¸ö´óСд²»Ãô¸ÐµÄÍ·²¿ÃûµÄÁбí/Ôª×é×÷ΪËüµÄµÚ¶þ¸ö
²ÎÊý
¿ØÖÆ»º´æ:ʹÓÃÆäËüÍ·²¿
ÁíÒ»¸ö»º´æµÄÎÊÌâÊÇÊý¾ÝµÄ˽ÓÐÐÔºÍÊý¾ÝÓ¦¸Ã´æ´¢ÔÚ¼¶Áª»º´æµÄʲôλÖã¬Óû§Í¨³£Ãæ¶ÔÁ½ÖÖÀàÐ͵Ļº´æ:Ëü×Ô¼ºµÄä¯ÀÀÆ÷
»º´æ(˽Óлº´æ)ºÍËûµÄÌṩÕߵĻº´æ(¹«ÖÚ»º´æ)£¬¹«ÖÚ»º´æ±»¶à¸öÓû§Ê¹Óò¢ÇÒ±»ÆäËüµÄһЩÈË¿ØÖÆ£¬Õâ²úÉúÁËÃô¸ÐÊý¾ÝµÄ
ÎÊÌâ:Äã²»ÏëÈÃÄãµÄÒøÐÐÕʺŴ洢ÔÚ¹«ÖÚ»º´æÖУ¬ËùÒÔWeb³ÌÐòÐèÒªÒ»ÖÖ¸æËß»º´æÄÇЩÊý¾ÝÊÇ˽ÓкÍÄÇЩÊý¾ÝÊǹ«Öڵķ½Ê½
½â¾ö·½°¸ÊÇÖ¸³öÒ»¸öÒ³ÃæµÄ»º´æÓ¦¸ÃΪ"˽ÓÐ"£¬Ê¹ÓÃcache_controlÊÓͼװÊÎÆ÷À´ÔÚDjangoÖÐ×öÕâ¼þÊ£¬ÀýÈç:
- from django.views.decorators.cache import cache_control
- @cache_control(private=True)
- def my_view(request):
- # ...
Õâ¸ö×°ÊÎÆ÷ÔÚÄ»ºó´¦Àí·¢ËÍÊʵ±µÄHTTPÍ·²¿
ÓÐһЩÆäËü¿ØÖÆ»º´æ²ÎÊýµÄ·½Ê½£¬ÀýÈ磬HTTPÔÊÐí³ÌÐò×öÏÂÃæµÄÊÂÇé:
1£¬¶¨ÒåÒ»¸öÒ³Ãæ»º´æµÄ×î´óʱ¼ä
2£¬Ö¸¶¨Ò»¸ö»º´æÊÇ·ñÓ¦¸ÃÒ»Ö±¼ì²éеİ汾£¬Ö»ÓÐÔÚÄÚÈÝûÓиü¸Äʱ·¢ËÍ»º´æ(һЩ»º´æ¿ÉÄܼ´Ê¹·þÎñÆ÷Ò³Ãæ¸ü¸ÄÁËÒ²·¢ËÍ
»º´æÄÚÈÝ--¼òµ¥µÄÒòΪ»º´æ¿½±´Ã»ÓйýÆÚ)
ÔÚDjangoÖÐʹÓÃcache_controlÊÓͼװÊÎÆ÷À´Ö¸¶¨ÕâЩ»º´æ²ÎÊý£¬Õâ¸öÀý×ÓÖУ¬cache_control¸æËß»º´æ¶Ôÿ´Î·ÃÎʶ¼ÖØÐÂÑé
Ö¤»º´æ²¢×î¶à´æ´¢»º´æ°æ±¾3600Ãë:
- from django.views.decorators.cache import cache_control
- @cache_control(must_revalidate=True, max_age=3600)
- def my_view(request):
- ...
һЩºÏ·¨µÄCache-Control HTTPָʾÔÚcache_control()ÖÐÊǺϷ¨µÄ£¬ÕâÀïÊÇÍêÕûµÄÁбí:
1£¬public=True
2£¬private=True
3£¬no_cache=True
4£¬no_transform=True
5£¬must_revalidate=True
6£¬proxy_revalidate=True
7£¬max_age=num_seconds
8£¬s_maxage=num_seconds
²Î¿¼¹æ·¶http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9À´µÃµ½Cache-Control HTTPָʾ
µÄ½âÊÍ
(×¢Ò⣬»º´æÖмä¼þÒѾͨ¹ýCACHE_MIDDLEWARE_SETTINGSÉèÖÃÀ´ÉèÖÃÁË»º´æÍ·²¿µÄmax-age£¬Èç¹ûÄãÔÚcache_control×°ÊÎÆ÷
ÖÐʹÓÃ×Ô¶¨ÒåµÄmax_age£¬×°ÊÎÆ÷½«ÓÅÏȲÉÓ㬶øÍ·²¿µÄÖµ»á±»ÕýÈ·µÄºÏ²¢)
ÆäËüÓÅ»¯
DjangoһЩÆäËü¿ÉÒÔ°ïÄãÓÅ»¯ÄãµÄappsÐÔÄܵÄÖмä¼þ:
1£¬django.middleware.http.ConditionalGetMiddlewareÌí¼Ó¶ÔÏÖ´úä¯ÀÀÆ÷µÄ»ùÓÚETagºÍLast-ModifiedÍ·²¿µÄÓÐÌõ¼þµÄGET
Ó¦´ðµÄÖ§³Ö
2£¬django.middleware.gzip.GZipMiddlewareΪËùÓÐÏÖ´úä¯ÀÀÆ÷ѹËõÓ¦´ðÀ´½ÚÊ¡´ø¿íºÍ´«Êäʱ¼ä
MIDDLEWARE_CLASSESµÄ˳Ðò
Èç¹ûÄãʹÓÃCacheMiddleware£¬°ÑËü·ÅÔÚMIDDLEWARE_CLASSESÉèÖõÄÕýȷλÖúÜÖØÒª£¬ÒòΪ»º´æÖмä¼þÐèÒªÖªµÀ¸Ä±ä»º´æ´æ´¢
µÄÍ·²¿£¬°ÑCacheMiddleware·ÅÔÚÈκοÉÄÜÌí¼Ó¶«Î÷µ½VaryÍ·²¿µÄÖмä¼þºóÃæ£¬°üÀ¨:
1£¬SessionMiddleware£¬ËüÌí¼ÓCookie
2£¬GZipMiddleware£¬ËüÌí¼ÓAccept-Encoding
°²»ÕлªµçÄÔѧУרҵְҵ¹æ»®Ê¦ÎªÄãÌṩ¸ü¶à°ïÖú¡¾ÔÚÏß×Éѯ¡¿