[{"data":1,"prerenderedAt":14341},["ShallowReactive",2],{"navigation":3,"/caching/deployment-level-caching-patterns":1016,"/caching/deployment-level-caching-patterns-surround":14336},[4,54,89,123,165,211,253,331,389,439,462,488,514,540,578,624,650,672,702,736,774,800,850,856,862,868,874,928],{"title":5,"path":6,"stem":7,"children":8},"Introduction and Foundations","/introduction-and-foundations","01.introduction-and-foundations/01.index",[9,10,14,18,22,26,30,34,38,42,46,50],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"What is Django","/introduction-and-foundations/what-is-django","01.introduction-and-foundations/02.what-is-django",{"title":15,"path":16,"stem":17},"Key Concepts and Philosophy","/introduction-and-foundations/key-concepts-and-philosophy","01.introduction-and-foundations/03.key-concepts-and-philosophy",{"title":19,"path":20,"stem":21},"MVC vs MVT: Understanding Django's Architecture","/introduction-and-foundations/mvc-vs-mvt","01.introduction-and-foundations/04.mvc-vs-mvt",{"title":23,"path":24,"stem":25},"Project Structure Overview","/introduction-and-foundations/project-structure-overview","01.introduction-and-foundations/05.project-structure-overview",{"title":27,"path":28,"stem":29},"Installing Django","/introduction-and-foundations/installing-django","01.introduction-and-foundations/06.installing-django",{"title":31,"path":32,"stem":33},"Creating Your First Django Project","/introduction-and-foundations/creating-first-project","01.introduction-and-foundations/07.creating-first-project",{"title":35,"path":36,"stem":37},"Creating Your First Django App","/introduction-and-foundations/creating-first-app","01.introduction-and-foundations/08.creating-first-app",{"title":39,"path":40,"stem":41},"Your First Django \"Hello World\"","/introduction-and-foundations/hello-world","01.introduction-and-foundations/09.hello-world",{"title":43,"path":44,"stem":45},"Django Quick Start Guide","/introduction-and-foundations/quick-start-guide","01.introduction-and-foundations/10.quick-start-guide",{"title":47,"path":48,"stem":49},"How Django Handles Requests","/introduction-and-foundations/how-django-handles-requests","01.introduction-and-foundations/11.how-django-handles-requests",{"title":51,"path":52,"stem":53},"Django Settings","/introduction-and-foundations/django-settings","01.introduction-and-foundations/12.django-settings",{"title":55,"path":56,"stem":57,"children":58},"The Development Environment","/development-environment","02.development-environment/1.index",[59,61,65,69,73,77,81,85],{"title":60,"path":56,"stem":57},"Development Environment",{"title":62,"path":63,"stem":64},"Recommended Tooling for Django Development","/development-environment/recommended-tooling","02.development-environment/2.recommended-tooling",{"title":66,"path":67,"stem":68},"Virtual Environments","/development-environment/virtual-environments","02.development-environment/3.virtual-environments",{"title":70,"path":71,"stem":72},"Django Admin and Management Commands","/development-environment/admin-and-management-commands","02.development-environment/4.admin-and-management-commands",{"title":74,"path":75,"stem":76},"Django Project Settings","/development-environment/project-settings","02.development-environment/5.project-settings",{"title":78,"path":79,"stem":80},"Managing Django Environments: Local, Staging, and Production","/development-environment/environments-local-staging-production","02.development-environment/6.environments-local-staging-production",{"title":82,"path":83,"stem":84},"Running Django Development Server","/development-environment/running-development-server","02.development-environment/7.running-development-server",{"title":86,"path":87,"stem":88},"Working with Django Shell","/development-environment/working-with-shell","02.development-environment/8.working-with-shell",{"title":90,"path":91,"stem":92,"children":93},"Templates and Presentation Layer","/templates-and-presentation","03.templates-and-presentation/1.index",[94,95,99,103,107,111,115,119],{"title":90,"path":91,"stem":92},{"title":96,"path":97,"stem":98},"Introduction to Django Templates","/templates-and-presentation/introduction-to-templates","03.templates-and-presentation/2.introduction-to-templates",{"title":100,"path":101,"stem":102},"The Django Template Language","/templates-and-presentation/django-template-language","03.templates-and-presentation/3.django-template-language",{"title":104,"path":105,"stem":106},"Template Inheritance","/templates-and-presentation/template-inheritance","03.templates-and-presentation/4.template-inheritance",{"title":108,"path":109,"stem":110},"Built-in Template Tags and Filters","/templates-and-presentation/built-in-template-tags-and-filters","03.templates-and-presentation/5.built-in-template-tags-and-filters",{"title":112,"path":113,"stem":114},"Including Static Files","/templates-and-presentation/including-static-files","03.templates-and-presentation/6.including-static-files",{"title":116,"path":117,"stem":118},"Working with Media Files","/templates-and-presentation/working-with-media-files","03.templates-and-presentation/7.working-with-media-files",{"title":120,"path":121,"stem":122},"Using Alternative Template Engines","/templates-and-presentation/using-alternative-template-engines","03.templates-and-presentation/8.using-alternative-template-engines",{"title":124,"path":125,"stem":126,"children":127},"URLs and Views","/urls-and-views","04.urls-and-views/01.index",[128,129,133,137,141,145,149,153,157,161],{"title":124,"path":125,"stem":126},{"title":130,"path":131,"stem":132},"The URL Dispatcher","/urls-and-views/the-url-dispatcher","04.urls-and-views/02.the-url-dispatcher",{"title":134,"path":135,"stem":136},"Writing Function-Based Views","/urls-and-views/writing-function-based-views","04.urls-and-views/03.writing-function-based-views",{"title":138,"path":139,"stem":140},"View Decorators","/urls-and-views/view-decorators","04.urls-and-views/04.view-decorators",{"title":142,"path":143,"stem":144},"Rendering Responses","/urls-and-views/rendering-responses","04.urls-and-views/05.rendering-responses",{"title":146,"path":147,"stem":148},"Redirects","/urls-and-views/redirects","04.urls-and-views/06.redirects",{"title":150,"path":151,"stem":152},"Handling HTTP Methods","/urls-and-views/handling-http-methods","04.urls-and-views/07.handling-http-methods",{"title":154,"path":155,"stem":156},"Conditional View Processing","/urls-and-views/conditional-view-processing","04.urls-and-views/08.conditional-view-processing",{"title":158,"path":159,"stem":160},"File Uploads","/urls-and-views/file-uploads","04.urls-and-views/09.file-uploads",{"title":162,"path":163,"stem":164},"Using Django Shortcut Functions","/urls-and-views/using-django-shortcut-functions","04.urls-and-views/10.using-django-shortcut-functions",{"title":166,"path":167,"stem":168,"children":169},"Class Based Views","/class-based-views","05.class-based-views/01.index",[170,171,175,179,183,187,191,195,199,203,207],{"title":166,"path":167,"stem":168},{"title":172,"path":173,"stem":174},"Introduction to Class-Based Views","/class-based-views/introduction-to-class-based-views","05.class-based-views/02.introduction-to-class-based-views",{"title":176,"path":177,"stem":178},"Common Base Classes","/class-based-views/common-base-classes","05.class-based-views/03.common-base-classes",{"title":180,"path":181,"stem":182},"Built-in Generic Views","/class-based-views/built-in-generic-views","05.class-based-views/04.built-in-generic-views",{"title":184,"path":185,"stem":186},"Views for CRUD Operations","/class-based-views/views-for-crud-operations","05.class-based-views/05.views-for-crud-operations",{"title":188,"path":189,"stem":190},"Handling Forms with Class-Based Views","/class-based-views/handling-forms-with-class-based-views","05.class-based-views/06.handling-forms-with-class-based-views",{"title":192,"path":193,"stem":194},"Using Mixins","/class-based-views/using-mixins","05.class-based-views/07.using-mixins",{"title":196,"path":197,"stem":198},"URL Configuration with Class-Based Views","/class-based-views/url-configuration-with-class-based-views","05.class-based-views/08.url-configuration-with-class-based-views",{"title":200,"path":201,"stem":202},"Subclassing Generic Views","/class-based-views/subclassing-generic-views","05.class-based-views/09.subclassing-generic-views",{"title":204,"path":205,"stem":206},"Asynchronous Class-Based Views","/class-based-views/asynchronous-class-based-views","05.class-based-views/10.asynchronous-class-based-views",{"title":208,"path":209,"stem":210},"Pagination","/class-based-views/pagination","05.class-based-views/11.pagination",{"title":212,"path":213,"stem":214,"children":215},"Forms and User Input","/forms-and-user-input","06.forms-and-user-input/01.index",[216,217,221,225,229,233,237,241,245,249],{"title":212,"path":213,"stem":214},{"title":218,"path":219,"stem":220},"Understanding HTML Forms","/forms-and-user-input/understanding-html-forms","06.forms-and-user-input/02.understanding-html-forms",{"title":222,"path":223,"stem":224},"Django's Role in Form Handling","/forms-and-user-input/djangos-role-in-form-handling","06.forms-and-user-input/03.djangos-role-in-form-handling",{"title":226,"path":227,"stem":228},"Creating Forms with Forms API","/forms-and-user-input/creating-forms-with-forms-api","06.forms-and-user-input/04.creating-forms-with-forms-api",{"title":230,"path":231,"stem":232},"Form Validation","/forms-and-user-input/form-validation","06.forms-and-user-input/05.form-validation",{"title":234,"path":235,"stem":236},"Built-in Fields and Widgets","/forms-and-user-input/built-in-fields-and-widgets","06.forms-and-user-input/06.built-in-fields-and-widgets",{"title":238,"path":239,"stem":240},"Form Rendering in Templates","/forms-and-user-input/form-rendering-in-templates","06.forms-and-user-input/07.form-rendering-in-templates",{"title":242,"path":243,"stem":244},"Model Forms","/forms-and-user-input/model-forms","06.forms-and-user-input/08.model-forms",{"title":246,"path":247,"stem":248},"Advanced Form Techniques","/forms-and-user-input/advanced-form-techniques","06.forms-and-user-input/09.advanced-form-techniques",{"title":250,"path":251,"stem":252},"Security Considerations for Forms","/forms-and-user-input/security-considerations-for-forms","06.forms-and-user-input/10.security-considerations-for-forms",{"title":254,"path":255,"stem":256,"children":257},"Models and Databases","/models-and-databases","07.models-and-databases/01.index",[258,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327],{"title":254,"path":255,"stem":256},{"title":260,"path":261,"stem":262},"Understanding Django Models","/models-and-databases/understanding-django-models","07.models-and-databases/02.understanding-django-models",{"title":264,"path":265,"stem":266},"Defining Fields","/models-and-databases/defining-fields","07.models-and-databases/03.defining-fields",{"title":268,"path":269,"stem":270},"Relationships and Foreign Keys","/models-and-databases/relationships-and-foreign-keys","07.models-and-databases/04.relationships-and-foreign-keys",{"title":272,"path":273,"stem":274},"Examples of Relationship Patterns","/models-and-databases/examples-of-relationship-patterns","07.models-and-databases/05.examples-of-relationship-patterns",{"title":276,"path":277,"stem":278},"Making Queries","/models-and-databases/making-queries","07.models-and-databases/06.making-queries",{"title":280,"path":281,"stem":282},"Filtering, Ordering, and Slicing","/models-and-databases/filtering-ordering-slicing","07.models-and-databases/07.filtering-ordering-slicing",{"title":284,"path":285,"stem":286},"Managers and QuerySets","/models-and-databases/managers-and-querysets","07.models-and-databases/08.managers-and-querysets",{"title":288,"path":289,"stem":290},"Aggregation","/models-and-databases/aggregation","07.models-and-databases/09.aggregation",{"title":292,"path":293,"stem":294},"Search","/models-and-databases/search","07.models-and-databases/10.search",{"title":296,"path":297,"stem":298},"Raw SQL Queries","/models-and-databases/raw-sql-queries","07.models-and-databases/11.raw-sql-queries",{"title":300,"path":301,"stem":302},"Transactions","/models-and-databases/transactions","07.models-and-databases/12.transactions",{"title":304,"path":305,"stem":306},"Multiple Databases","/models-and-databases/multiple-databases","07.models-and-databases/13.multiple-databases",{"title":308,"path":309,"stem":310},"Tablespaces","/models-and-databases/tablespaces","07.models-and-databases/14.tablespaces",{"title":312,"path":313,"stem":314},"Composite Primary Keys","/models-and-databases/composite-primary-keys","07.models-and-databases/15.composite-primary-keys",{"title":316,"path":317,"stem":318},"Database Instrumentation","/models-and-databases/database-instrumentation","07.models-and-databases/16.database-instrumentation",{"title":320,"path":321,"stem":322},"Database Optimization","/models-and-databases/database-optimization","07.models-and-databases/17.database-optimization",{"title":324,"path":325,"stem":326},"Fixtures","/models-and-databases/fixtures","07.models-and-databases/18.fixtures",{"title":328,"path":329,"stem":330},"Signals","/models-and-databases/signals","07.models-and-databases/19.signals",{"title":332,"path":333,"stem":334,"children":335},"Migrations","/migrations","08.migrations/01.index",[336,337,341,345,349,353,357,361,365,369,373,377,381,385],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"How Migrations Work","/migrations/how-migrations-work","08.migrations/02.how-migrations-work",{"title":342,"path":343,"stem":344},"Management Commands","/migrations/management-commands","08.migrations/03.management-commands",{"title":346,"path":347,"stem":348},"Dependencies and Workflow","/migrations/dependencies-and-workflow","08.migrations/04.dependencies-and-workflow",{"title":350,"path":351,"stem":352},"Transaction Handling","/migrations/transaction-handling","08.migrations/05.transaction-handling",{"title":354,"path":355,"stem":356},"Adding Migrations to Apps","/migrations/adding-migrations-to-apps","08.migrations/06.adding-migrations-to-apps",{"title":358,"path":359,"stem":360},"Reversing Migrations","/migrations/reversing-migrations","08.migrations/07.reversing-migrations",{"title":362,"path":363,"stem":364},"Historical Models","/migrations/historical-models","08.migrations/08.historical-models",{"title":366,"path":367,"stem":368},"Considerations When Removing Fields","/migrations/considerations-when-removing-fields","08.migrations/09.considerations-when-removing-fields",{"title":370,"path":371,"stem":372},"Data Migrations","/migrations/data-migrations","08.migrations/10.data-migrations",{"title":374,"path":375,"stem":376},"Squashing Migrations","/migrations/squashing-migrations","08.migrations/11.squashing-migrations",{"title":378,"path":379,"stem":380},"Serializing Values","/migrations/serializing-values","08.migrations/12.serializing-values",{"title":382,"path":383,"stem":384},"Supporting Multiple Django Versions","/migrations/supporting-multiple-django-versions","08.migrations/13.supporting-multiple-django-versions",{"title":386,"path":387,"stem":388},"Django Serialization Framework","/migrations/django-serialization-framework","08.migrations/14.django-serialization-framework",{"title":390,"path":391,"stem":392,"children":393},"Authentication and Authorization","/authentication-and-authorization","09.authentication-and-authorization/01.index",[394,395,399,403,407,411,415,419,423,427,431,435],{"title":390,"path":391,"stem":392},{"title":396,"path":397,"stem":398},"Overview of Django's Authentication System","/authentication-and-authorization/overview-of-django-authentication-system","09.authentication-and-authorization/02.overview-of-django-authentication-system",{"title":400,"path":401,"stem":402},"Users and Groups","/authentication-and-authorization/users-and-groups","09.authentication-and-authorization/03.users-and-groups",{"title":404,"path":405,"stem":406},"Permissions","/authentication-and-authorization/permissions","09.authentication-and-authorization/04.permissions",{"title":408,"path":409,"stem":410},"Password Management","/authentication-and-authorization/password-management","09.authentication-and-authorization/05.password-management",{"title":412,"path":413,"stem":414},"Authentication Views","/authentication-and-authorization/authentication-views","09.authentication-and-authorization/06.authentication-views",{"title":416,"path":417,"stem":418},"Login and Logout","/authentication-and-authorization/login-and-logout","09.authentication-and-authorization/07.login-and-logout",{"title":420,"path":421,"stem":422},"Custom User Models","/authentication-and-authorization/custom-user-models","09.authentication-and-authorization/08.custom-user-models",{"title":424,"path":425,"stem":426},"Middleware for Authentication","/authentication-and-authorization/middleware-for-authentication","09.authentication-and-authorization/09.middleware-for-authentication",{"title":428,"path":429,"stem":430},"Authorization in Views and Templates","/authentication-and-authorization/authorization-in-views-and-templates","09.authentication-and-authorization/10.authorization-in-views-and-templates",{"title":432,"path":433,"stem":434},"Integrating Social Authentication","/authentication-and-authorization/integrating-social-authentication","09.authentication-and-authorization/11.integrating-social-authentication",{"title":436,"path":437,"stem":438},"Security Best Practices","/authentication-and-authorization/security-best-practices","09.authentication-and-authorization/12.security-best-practices",{"title":440,"path":441,"stem":442,"children":443},"Sessions, Cookies, and State","/sessions-cookies-state","10.sessions-cookies-state/01.index",[444,446,450,454,458],{"title":445,"path":441,"stem":442},"Sessions, Cookies, and State Management",{"title":447,"path":448,"stem":449},"Introduction to Sessions","/sessions-cookies-state/introduction-to-sessions","10.sessions-cookies-state/02.introduction-to-sessions",{"title":451,"path":452,"stem":453},"Working with Cookies","/sessions-cookies-state/working-with-cookies","10.sessions-cookies-state/03.working-with-cookies",{"title":455,"path":456,"stem":457},"Server-Side Session Storage Options","/sessions-cookies-state/server-side-session-storage-options","10.sessions-cookies-state/04.server-side-session-storage-options",{"title":459,"path":460,"stem":461},"Session Security","/sessions-cookies-state/session-security","10.sessions-cookies-state/05.session-security",{"title":463,"path":464,"stem":465,"children":466},"Working with Files","/working-with-files","11.working-with-files/01.index",[467,468,472,476,480,484],{"title":463,"path":464,"stem":465},{"title":469,"path":470,"stem":471},"Files in Models","/working-with-files/files-in-models","11.working-with-files/02.files-in-models",{"title":473,"path":474,"stem":475},"The File Object","/working-with-files/the-file-object","11.working-with-files/03.the-file-object",{"title":477,"path":478,"stem":479},"Storage Backends","/working-with-files/storage-backends","11.working-with-files/04.storage-backends",{"title":481,"path":482,"stem":483},"Using Cloud Storage Providers","/working-with-files/using-cloud-storage-providers","11.working-with-files/05.using-cloud-storage-providers",{"title":485,"path":486,"stem":487},"Managing Media in Production","/working-with-files/managing-media-in-production","11.working-with-files/06.managing-media-in-production",{"title":489,"path":490,"stem":491,"children":492},"Admin Site","/admin-site","12.admin-site/01.index",[493,494,498,502,506,510],{"title":489,"path":490,"stem":491},{"title":495,"path":496,"stem":497},"Enabling the Admin","/admin-site/enabling-the-admin","12.admin-site/02.enabling-the-admin",{"title":499,"path":500,"stem":501},"Registering Models","/admin-site/registering-models","12.admin-site/03.registering-models",{"title":503,"path":504,"stem":505},"Customizing Admin Display","/admin-site/customizing-admin-display","12.admin-site/04.customizing-admin-display",{"title":507,"path":508,"stem":509},"Admin Actions","/admin-site/admin-actions","12.admin-site/05.admin-actions",{"title":511,"path":512,"stem":513},"Admin Security Best Practices","/admin-site/admin-security-best-practices","12.admin-site/06.admin-security-best-practices",{"title":515,"path":516,"stem":517,"children":518},"Middleware","/middleware","13.middleware/01.index",[519,520,524,528,532,536],{"title":515,"path":516,"stem":517},{"title":521,"path":522,"stem":523},"Middleware Overview","/middleware/middleware-overview","13.middleware/02.middleware-overview",{"title":525,"path":526,"stem":527},"Built-in Middleware","/middleware/built-in-middleware","13.middleware/03.built-in-middleware",{"title":529,"path":530,"stem":531},"Creating Custom Middleware","/middleware/creating-custom-middleware","13.middleware/04.creating-custom-middleware",{"title":533,"path":534,"stem":535},"Middleware Ordering","/middleware/middleware-ordering","13.middleware/05.middleware-ordering",{"title":537,"path":538,"stem":539},"Performance and Debugging","/middleware/performance-and-debugging","13.middleware/06.performance-and-debugging",{"title":541,"path":542,"stem":543,"children":544},"Security","/security","14.security/01.index",[545,546,550,554,558,562,566,570,574],{"title":541,"path":542,"stem":543},{"title":547,"path":548,"stem":549},"Django Security Philosophy","/security/django-security-philosophy","14.security/02.django-security-philosophy",{"title":551,"path":552,"stem":553},"Cross Site Request Forgery","/security/cross-site-request-forgery","14.security/03.cross-site-request-forgery",{"title":555,"path":556,"stem":557},"Cross Site Scripting","/security/cross-site-scripting","14.security/04.cross-site-scripting",{"title":559,"path":560,"stem":561},"SQL Injection Protection","/security/sql-injection-protection","14.security/05.sql-injection-protection",{"title":563,"path":564,"stem":565},"Clickjacking Protection","/security/clickjacking-protection","14.security/06.clickjacking-protection",{"title":567,"path":568,"stem":569},"HTTPS Setup and HSTS","/security/https-setup-and-hsts","14.security/07.https-setup-and-hsts",{"title":571,"path":572,"stem":573},"Password Storage and Cryptography","/security/password-storage-and-cryptography","14.security/08.password-storage-and-cryptography",{"title":575,"path":576,"stem":577},"Secure Deployment Checklist","/security/secure-deployment-checklist","14.security/09.secure-deployment-checklist",{"title":579,"path":580,"stem":581,"children":582},"Testing","/testing","15.testing/01.index",[583,584,588,592,596,600,604,608,612,616,620],{"title":579,"path":580,"stem":581},{"title":585,"path":586,"stem":587},"Introduction to Django Testing","/testing/introduction-to-django-testing","15.testing/02.introduction-to-django-testing",{"title":589,"path":590,"stem":591},"Writing and Running Tests","/testing/writing-and-running-tests","15.testing/03.writing-and-running-tests",{"title":593,"path":594,"stem":595},"Test Tools","/testing/test-tools","15.testing/04.test-tools",{"title":597,"path":598,"stem":599},"Testing Models","/testing/testing-models","15.testing/05.testing-models",{"title":601,"path":602,"stem":603},"Testing Views","/testing/testing-views","15.testing/06.testing-views",{"title":605,"path":606,"stem":607},"Testing Forms","/testing/testing-forms","15.testing/07.testing-forms",{"title":609,"path":610,"stem":611},"Testing Templates","/testing/testing-templates","15.testing/08.testing-templates",{"title":613,"path":614,"stem":615},"Testing Authentication","/testing/testing-authentication","15.testing/09.testing-authentication",{"title":617,"path":618,"stem":619},"Advanced Testing Topics","/testing/advanced-testing-topics","15.testing/10.advanced-testing-topics",{"title":621,"path":622,"stem":623},"Performance Testing","/testing/performance-testing","15.testing/11.performance-testing",{"title":625,"path":626,"stem":627,"children":628},"Static Assets and Frontend Integration","/static-assets-and-frontend-integration","16.static-assets-and-frontend-integration/01.index",[629,630,634,638,642,646],{"title":625,"path":626,"stem":627},{"title":631,"path":632,"stem":633},"Working with Static Files","/static-assets-and-frontend-integration/working-with-static-files","16.static-assets-and-frontend-integration/02.working-with-static-files",{"title":635,"path":636,"stem":637},"Integrating CSS and JavaScript","/static-assets-and-frontend-integration/integrating-css-and-javascript","16.static-assets-and-frontend-integration/03.integrating-css-and-javascript",{"title":639,"path":640,"stem":641},"Using Build Tools like Vite or Webpack","/static-assets-and-frontend-integration/using-build-tools-like-vite-or-webpack","16.static-assets-and-frontend-integration/04.using-build-tools-like-vite-or-webpack",{"title":643,"path":644,"stem":645},"Using React or Vue with Django","/static-assets-and-frontend-integration/using-react-or-vue-with-django","16.static-assets-and-frontend-integration/05.using-react-or-vue-with-django",{"title":647,"path":648,"stem":649},"Managing CORS","/static-assets-and-frontend-integration/managing-cors","16.static-assets-and-frontend-integration/06.managing-cors",{"title":651,"path":652,"stem":653,"children":654},"Internationalization and Localization","/internationalization-and-localization","17.internationalization-and-localization/01.index",[655,656,660,664,668],{"title":651,"path":652,"stem":653},{"title":657,"path":658,"stem":659},"Enabling Translation","/internationalization-and-localization/enabling-translation","17.internationalization-and-localization/02.enabling-translation",{"title":661,"path":662,"stem":663},"Translating Text in Code and Templates","/internationalization-and-localization/translating-text-in-code-and-templates","17.internationalization-and-localization/03.translating-text-in-code-and-templates",{"title":665,"path":666,"stem":667},"Timezone Support","/internationalization-and-localization/timezone-support","17.internationalization-and-localization/04.timezone-support",{"title":669,"path":670,"stem":671},"Locale Middleware","/internationalization-and-localization/locale-middleware","17.internationalization-and-localization/05.locale-middleware",{"title":673,"path":674,"stem":675,"children":676},"Caching","/caching","18.caching/01.index",[677,678,682,686,690,694,698],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681},"Introduction to Caching","/caching/introduction-to-caching","18.caching/02.introduction-to-caching",{"title":683,"path":684,"stem":685},"Cache Backends","/caching/cache-backends","18.caching/03.cache-backends",{"title":687,"path":688,"stem":689},"Per View Caching","/caching/per-view-caching","18.caching/04.per-view-caching",{"title":691,"path":692,"stem":693},"Low Level Cache API","/caching/low-level-cache-api","18.caching/05.low-level-cache-api",{"title":695,"path":696,"stem":697},"Template Fragment Caching","/caching/template-fragment-caching","18.caching/06.template-fragment-caching",{"title":699,"path":700,"stem":701},"Deployment Level Caching Patterns","/caching/deployment-level-caching-patterns","18.caching/07.deployment-level-caching-patterns",{"title":703,"path":704,"stem":705,"children":706},"Asynchronous Django","/asynchronous-django","19.asynchronous-django/01.index",[707,708,712,716,720,724,728,732],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711},"Introduction to ASGI","/asynchronous-django/introduction-to-asgi","19.asynchronous-django/02.introduction-to-asgi",{"title":713,"path":714,"stem":715},"Async Views","/asynchronous-django/async-views","19.asynchronous-django/03.async-views",{"title":717,"path":718,"stem":719},"Async ORM Status","/asynchronous-django/async-orm-status","19.asynchronous-django/04.async-orm-status",{"title":721,"path":722,"stem":723},"WebSockets with Channels","/asynchronous-django/websockets-with-channels","19.asynchronous-django/05.websockets-with-channels",{"title":725,"path":726,"stem":727},"Background Tasks with Celery or RQ","/asynchronous-django/background-tasks-with-celery-or-rq","19.asynchronous-django/06.background-tasks-with-celery-or-rq",{"title":729,"path":730,"stem":731},"Asynchronous Support","/asynchronous-django/asynchronous-support","19.asynchronous-django/07.asynchronous-support",{"title":733,"path":734,"stem":735},"Django's Tasks Framework","/asynchronous-django/django-tasks-framework","19.asynchronous-django/08.django-tasks-framework",{"title":737,"path":738,"stem":739,"children":740},"Deployment","/deployment","20.deployment/01.index",[741,742,746,750,754,758,762,766,770],{"title":737,"path":738,"stem":739},{"title":743,"path":744,"stem":745},"Preparing for Production","/deployment/preparing-for-production","20.deployment/02.preparing-for-production",{"title":747,"path":748,"stem":749},"Using WSGI and ASGI Servers","/deployment/using-wsgi-and-asgi-servers","20.deployment/03.using-wsgi-and-asgi-servers",{"title":751,"path":752,"stem":753},"Deploying on Linux Servers","/deployment/deploying-on-linux-servers","20.deployment/04.deploying-on-linux-servers",{"title":755,"path":756,"stem":757},"Using Docker","/deployment/using-docker","20.deployment/05.using-docker",{"title":759,"path":760,"stem":761},"Cloud Deployment Guides","/deployment/cloud-deployment-guides","20.deployment/06.cloud-deployment-guides",{"title":763,"path":764,"stem":765},"Scaling and Load Balancing","/deployment/scaling-and-load-balancing","20.deployment/07.scaling-and-load-balancing",{"title":767,"path":768,"stem":769},"Monitoring and Logging","/deployment/monitoring-and-logging","20.deployment/08.monitoring-and-logging",{"title":771,"path":772,"stem":773},"Backup Strategies","/deployment/backup-strategies","20.deployment/09.backup-strategies",{"title":775,"path":776,"stem":777,"children":778},"Performance and Optimization","/performance-and-optimization","21.performance-and-optimization/01.index",[779,780,784,788,792,796],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Query Optimization","/performance-and-optimization/query-optimization","21.performance-and-optimization/02.query-optimization",{"title":785,"path":786,"stem":787},"Template Rendering Optimization","/performance-and-optimization/template-rendering-optimization","21.performance-and-optimization/03.template-rendering-optimization",{"title":789,"path":790,"stem":791},"Using Select Related and Prefetch Related","/performance-and-optimization/using-select-related-and-prefetch-related","21.performance-and-optimization/04.using-select-related-and-prefetch-related",{"title":793,"path":794,"stem":795},"Caching Strategies","/performance-and-optimization/caching-strategies","21.performance-and-optimization/05.caching-strategies",{"title":797,"path":798,"stem":799},"Profiling Django Apps","/performance-and-optimization/profiling-django-apps","21.performance-and-optimization/06.profiling-django-apps",{"title":801,"path":802,"stem":803,"children":804},"Advanced and Expert Topics","/advanced-and-expert-topics","22.advanced-and-expert-topics/01.index",[805,806,810,814,818,822,826,830,834,838,842,846],{"title":801,"path":802,"stem":803},{"title":807,"path":808,"stem":809},"System Architecture Patterns","/advanced-and-expert-topics/system-architecture-patterns","22.advanced-and-expert-topics/02.system-architecture-patterns",{"title":811,"path":812,"stem":813},"Domain Driven Design with Django","/advanced-and-expert-topics/domain-driven-design-with-django","22.advanced-and-expert-topics/03.domain-driven-design-with-django",{"title":815,"path":816,"stem":817},"Building Large Scale Django Projects","/advanced-and-expert-topics/building-large-scale-django-projects","22.advanced-and-expert-topics/04.building-large-scale-django-projects",{"title":819,"path":820,"stem":821},"Plugin Architectures for Django Apps","/advanced-and-expert-topics/plugin-architectures-for-django-apps","22.advanced-and-expert-topics/05.plugin-architectures-for-django-apps",{"title":823,"path":824,"stem":825},"Extending Django's Core","/advanced-and-expert-topics/extending-djangos-core","22.advanced-and-expert-topics/06.extending-djangos-core",{"title":827,"path":828,"stem":829},"Custom ORM Expressions","/advanced-and-expert-topics/custom-orm-expressions","22.advanced-and-expert-topics/07.custom-orm-expressions",{"title":831,"path":832,"stem":833},"Custom Management Commands","/advanced-and-expert-topics/custom-management-commands","22.advanced-and-expert-topics/08.custom-management-commands",{"title":835,"path":836,"stem":837},"Working with Signals","/advanced-and-expert-topics/working-with-signals","22.advanced-and-expert-topics/09.working-with-signals",{"title":839,"path":840,"stem":841},"Building Reusable Django Packages","/advanced-and-expert-topics/building-reusable-django-packages","22.advanced-and-expert-topics/10.building-reusable-django-packages",{"title":843,"path":844,"stem":845},"Integrating Microservices","/advanced-and-expert-topics/integrating-microservices","22.advanced-and-expert-topics/11.integrating-microservices",{"title":847,"path":848,"stem":849},"Advanced Security Hardening","/advanced-and-expert-topics/advanced-security-hardening","22.advanced-and-expert-topics/12.advanced-security-hardening",{"title":851,"path":852,"stem":853,"children":854},"Logging in Django","/logging-in-django","23.logging-in-django/01.index",[855],{"title":851,"path":852,"stem":853},{"title":857,"path":858,"stem":859,"children":860},"FAQ and Troubleshooting","/faq-and-troubleshooting","24.faq-and-troubleshooting/01.index",[861],{"title":857,"path":858,"stem":859},{"title":863,"path":864,"stem":865,"children":866},"External Packages and Ecosystem","/external-packages-and-ecosystem","25.external-packages-and-ecosystem/01.index",[867],{"title":863,"path":864,"stem":865},{"title":869,"path":870,"stem":871,"children":872},"Django Internals and Contributing","/django-internals-and-contributing","26.django-internals-and-contributing/01.index",[873],{"title":869,"path":870,"stem":871},{"title":875,"path":876,"stem":877,"children":878},"Microservices with Django","/microservices-with-django","27.microservices-with-django/01.index",[879,880,884,888,892,896,900,904,908,912,916,920,924],{"title":875,"path":876,"stem":877},{"title":881,"path":882,"stem":883},"What Is a Microservice?","/microservices-with-django/what-is-a-microservice","27.microservices-with-django/02.what-is-a-microservice",{"title":885,"path":886,"stem":887},"Introducing the Django Microservices Architecture","/microservices-with-django/django-microservices-architecture","27.microservices-with-django/03.django-microservices-architecture",{"title":889,"path":890,"stem":891},"Setting Up the Development and Runtime Environment","/microservices-with-django/development-environment","27.microservices-with-django/04.development-environment",{"title":893,"path":894,"stem":895},"Cloud-native Data Processing with MongoDB","/microservices-with-django/cloud-native-data-processing","27.microservices-with-django/05.cloud-native-data-processing",{"title":897,"path":898,"stem":899},"Creating RESTful APIs for Microservices","/microservices-with-django/restful-apis","27.microservices-with-django/06.restful-apis",{"title":901,"path":902,"stem":903},"Orchestrating Microservices with Celery and RabbitMQ","/microservices-with-django/orchestrating-celery-rabbitmq","27.microservices-with-django/07.orchestrating-celery-rabbitmq",{"title":905,"path":906,"stem":907},"Testing Microservices","/microservices-with-django/testing-microservices","27.microservices-with-django/08.testing-microservices",{"title":909,"path":910,"stem":911},"Deploying Microservices","/microservices-with-django/deploying-microservices","27.microservices-with-django/09.deploying-microservices",{"title":913,"path":914,"stem":915},"Securing Microservices","/microservices-with-django/securing-microservices","27.microservices-with-django/10.securing-microservices",{"title":917,"path":918,"stem":919},"Improving Microservices Performance with Caching","/microservices-with-django/performance-caching","27.microservices-with-django/11.performance-caching",{"title":921,"path":922,"stem":923},"Best Practices","/microservices-with-django/best-practices","27.microservices-with-django/12.best-practices",{"title":925,"path":926,"stem":927},"Transforming a Monolithic Web App into a Microservice version","/microservices-with-django/monolith-to-microservices","27.microservices-with-django/13.monolith-to-microservices",{"title":929,"path":930,"stem":931,"children":932},"Releases","/releases","releases",[933,936,940,944,948,952,956,960,964,968,972,976,980,984,988,992,996,1000,1004,1008,1012],{"title":934,"path":930,"stem":935},"Django Releases","releases/index",{"title":937,"path":938,"stem":939},"Django 5.1.10 release notes","/releases/5.1.10","releases/5.1.10",{"title":941,"path":942,"stem":943},"Django 5.1.11 release notes","/releases/5.1.11","releases/5.1.11",{"title":945,"path":946,"stem":947},"Django 5.1.12 release notes","/releases/5.1.12","releases/5.1.12",{"title":949,"path":950,"stem":951},"Django 5.1.13 release notes","/releases/5.1.13","releases/5.1.13",{"title":953,"path":954,"stem":955},"Django 5.1.14 release notes","/releases/5.1.14","releases/5.1.14",{"title":957,"path":958,"stem":959},"Django 5.1.15 release notes","/releases/5.1.15","releases/5.1.15",{"title":961,"path":962,"stem":963},"Django 5.2 release notes","/releases/5.2","releases/5.2",{"title":965,"path":966,"stem":967},"Django 5.2.1 release notes","/releases/5.2.1","releases/5.2.1",{"title":969,"path":970,"stem":971},"Django 5.2.10 release notes","/releases/5.2.10","releases/5.2.10",{"title":973,"path":974,"stem":975},"Django 5.2.2 release notes","/releases/5.2.2","releases/5.2.2",{"title":977,"path":978,"stem":979},"Django 5.2.3 release notes","/releases/5.2.3","releases/5.2.3",{"title":981,"path":982,"stem":983},"Django 5.2.4 release notes","/releases/5.2.4","releases/5.2.4",{"title":985,"path":986,"stem":987},"Django 5.2.5 release notes","/releases/5.2.5","releases/5.2.5",{"title":989,"path":990,"stem":991},"Django 5.2.6 release notes","/releases/5.2.6","releases/5.2.6",{"title":993,"path":994,"stem":995},"Django 5.2.7 release notes","/releases/5.2.7","releases/5.2.7",{"title":997,"path":998,"stem":999},"Django 5.2.8 release notes","/releases/5.2.8","releases/5.2.8",{"title":1001,"path":1002,"stem":1003},"Django 5.2.9 release notes","/releases/5.2.9","releases/5.2.9",{"title":1005,"path":1006,"stem":1007},"Django 6.0 release notes","/releases/6.0","releases/6.0",{"title":1009,"path":1010,"stem":1011},"Django 6.0.1 release notes","/releases/6.0.1","releases/6.0.1",{"title":1013,"path":1014,"stem":1015},"Django 6.1 release notes - UNDER DEVELOPMENT","/releases/6.1","releases/6.1",{"id":1017,"title":699,"body":1018,"description":1028,"extension":14331,"links":14332,"meta":14333,"navigation":1100,"path":700,"seo":14334,"stem":701,"__hash__":14335},"docs/18.caching/07.deployment-level-caching-patterns.md",{"type":1019,"value":1020,"toc":14308},"minimark",[1021,1025,1029,1034,1039,1050,1054,2374,2378,2382,3859,3863,4914,4918,4922,5740,5744,6358,6362,6366,8403,8407,8411,12015,12019,12023,14302,14305],[1022,1023,699],"h1",{"id":1024},"deployment-level-caching-patterns",[1026,1027,1028],"p",{},"Production Django applications require sophisticated caching architectures that span multiple layers, from browser caches to CDNs, reverse proxies, and application-level caches. This chapter covers enterprise-grade caching patterns, multi-tier architectures, and deployment strategies that enable applications to handle massive scale while maintaining excellent performance and reliability.",[1030,1031,1033],"h2",{"id":1032},"multi-tier-caching-architecture","Multi-Tier Caching Architecture",[1035,1036,1038],"h3",{"id":1037},"complete-caching-stack","Complete Caching Stack",[1040,1041,1046],"pre",{"className":1042,"code":1044,"language":1045},[1043],"language-text","┌─────────────────┐\n│   Browser Cache │ ← HTTP Headers, Service Workers\n└─────────────────┘\n         ↓\n┌─────────────────┐\n│   CDN Cache     │ ← CloudFlare, AWS CloudFront, Fastly\n└─────────────────┘\n         ↓\n┌─────────────────┐\n│ Reverse Proxy   │ ← Nginx, Varnish, HAProxy\n└─────────────────┘\n         ↓\n┌─────────────────┐\n│ Load Balancer   │ ← Application-level load balancing\n└─────────────────┘\n         ↓\n┌─────────────────┐\n│ Django App      │ ← View caching, template fragments\n└─────────────────┘\n         ↓\n┌─────────────────┐\n│ Application     │ ← Redis, Memcached\n│ Cache           │\n└─────────────────┘\n         ↓\n┌─────────────────┐\n│ Database Cache  │ ← Query caching, connection pooling\n└─────────────────┘\n","text",[1047,1048,1044],"code",{"__ignoreMap":1049},"",[1035,1051,1053],{"id":1052},"django-configuration-for-multi-tier-caching","Django Configuration for Multi-Tier Caching",[1040,1055,1059],{"className":1056,"code":1057,"language":1058,"meta":1049,"style":1049},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# settings/production.py\nimport os\nfrom datetime import timedelta\n\n# Cache configuration for production\nCACHES = {\n    'default': {\n        'BACKEND': 'django_redis.cache.RedisCache',\n        'LOCATION': [\n            f\"redis://{os.environ['REDIS_PRIMARY_HOST']}:6379/1\",\n            f\"redis://{os.environ['REDIS_REPLICA_1_HOST']}:6379/1\",\n            f\"redis://{os.environ['REDIS_REPLICA_2_HOST']}:6379/1\",\n        ],\n        'OPTIONS': {\n            'CLIENT_CLASS': 'django_redis.client.ShardClient',\n            'CONNECTION_POOL_KWARGS': {\n                'max_connections': 100,\n                'retry_on_timeout': True,\n                'socket_keepalive': True,\n            },\n            'COMPRESSOR': 'django_redis.compressors.lz4.Lz4Compressor',\n            'SERIALIZER': 'django_redis.serializers.msgpack.MSGPackSerializer',\n            'IGNORE_EXCEPTIONS': True,  # Graceful degradation\n        },\n        'KEY_PREFIX': f\"{os.environ['APP_NAME']}_prod\",\n        'VERSION': int(os.environ.get('CACHE_VERSION', 1)),\n    },\n    \n    # Separate cache for sessions (high availability)\n    'sessions': {\n        'BACKEND': 'django_redis.cache.RedisCache',\n        'LOCATION': f\"redis://{os.environ['REDIS_SESSIONS_HOST']}:6379/2\",\n        'OPTIONS': {\n            'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n            'CONNECTION_POOL_KWARGS': {\n                'max_connections': 50,\n                'retry_on_timeout': True,\n            },\n        },\n        'TIMEOUT': 1800,  # 30 minutes\n    },\n    \n    # Cache for temporary data (can be volatile)\n    'temporary': {\n        'BACKEND': 'django_redis.cache.RedisCache',\n        'LOCATION': f\"redis://{os.environ['REDIS_TEMP_HOST']}:6379/3\",\n        'OPTIONS': {\n            'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n        },\n        'TIMEOUT': 300,  # 5 minutes\n    },\n    \n    # Local memory cache for hot data\n    'local': {\n        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',\n        'LOCATION': 'local-cache',\n        'TIMEOUT': 60,  # 1 minute\n        'OPTIONS': {\n            'MAX_ENTRIES': 10000,\n            'CULL_FREQUENCY': 3,\n        }\n    }\n}\n\n# Session configuration\nSESSION_ENGINE = 'django.contrib.sessions.backends.cache'\nSESSION_CACHE_ALIAS = 'sessions'\nSESSION_COOKIE_AGE = 1800  # 30 minutes\n\n# Cache middleware configuration\nCACHE_MIDDLEWARE_ALIAS = 'default'\nCACHE_MIDDLEWARE_SECONDS = 300  # 5 minutes\nCACHE_MIDDLEWARE_KEY_PREFIX = f\"{os.environ['APP_NAME']}_page\"\n\n# HTTP caching headers\nUSE_ETAGS = True\nUSE_LAST_MODIFIED = True\n\n# Static files caching\nSTATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'\nSTATIC_URL = f\"https://{os.environ['CDN_DOMAIN']}/static/\"\n\n# Media files caching (if using cloud storage)\nDEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'\nAWS_S3_CUSTOM_DOMAIN = os.environ['CDN_DOMAIN']\nAWS_S3_OBJECT_PARAMETERS = {\n    'CacheControl': 'max-age=86400',  # 24 hours\n}\n","python",[1047,1060,1061,1070,1081,1095,1102,1108,1122,1141,1165,1180,1225,1257,1289,1295,1309,1331,1345,1364,1382,1398,1404,1425,1446,1466,1472,1516,1564,1570,1576,1582,1596,1615,1656,1669,1689,1702,1718,1733,1738,1743,1763,1768,1773,1779,1793,1812,1853,1866,1885,1890,1909,1914,1919,1925,1939,1959,1979,1998,2011,2028,2045,2051,2057,2063,2068,2074,2090,2104,2116,2121,2127,2141,2153,2188,2193,2199,2210,2220,2225,2231,2246,2283,2288,2294,2309,2335,2345,2369],{"__ignoreMap":1049},[1062,1063,1066],"span",{"class":1064,"line":1065},"line",1,[1062,1067,1069],{"class":1068},"s9Tkl","# settings/production.py\n",[1062,1071,1073,1077],{"class":1064,"line":1072},2,[1062,1074,1076],{"class":1075},"siDh9","import",[1062,1078,1080],{"class":1079},"sftqT"," os\n",[1062,1082,1084,1087,1090,1092],{"class":1064,"line":1083},3,[1062,1085,1086],{"class":1075},"from",[1062,1088,1089],{"class":1079}," datetime ",[1062,1091,1076],{"class":1075},[1062,1093,1094],{"class":1079}," timedelta\n",[1062,1096,1098],{"class":1064,"line":1097},4,[1062,1099,1101],{"emptyLinePlaceholder":1100},true,"\n",[1062,1103,1105],{"class":1064,"line":1104},5,[1062,1106,1107],{"class":1068},"# Cache configuration for production\n",[1062,1109,1111,1115,1119],{"class":1064,"line":1110},6,[1062,1112,1114],{"class":1113},"se3Ec","CACHES",[1062,1116,1118],{"class":1117},"soVBu"," =",[1062,1120,1121],{"class":1117}," {\n",[1062,1123,1125,1129,1133,1136,1139],{"class":1064,"line":1124},7,[1062,1126,1128],{"class":1127},"sbYkP","    '",[1062,1130,1132],{"class":1131},"sTbE_","default",[1062,1134,1135],{"class":1127},"'",[1062,1137,1138],{"class":1117},":",[1062,1140,1121],{"class":1117},[1062,1142,1144,1147,1150,1152,1154,1157,1160,1162],{"class":1064,"line":1143},8,[1062,1145,1146],{"class":1127},"        '",[1062,1148,1149],{"class":1131},"BACKEND",[1062,1151,1135],{"class":1127},[1062,1153,1138],{"class":1117},[1062,1155,1156],{"class":1127}," '",[1062,1158,1159],{"class":1131},"django_redis.cache.RedisCache",[1062,1161,1135],{"class":1127},[1062,1163,1164],{"class":1117},",\n",[1062,1166,1168,1170,1173,1175,1177],{"class":1064,"line":1167},9,[1062,1169,1146],{"class":1127},[1062,1171,1172],{"class":1131},"LOCATION",[1062,1174,1135],{"class":1127},[1062,1176,1138],{"class":1117},[1062,1178,1179],{"class":1117}," [\n",[1062,1181,1183,1187,1190,1194,1197,1200,1204,1207,1209,1212,1214,1217,1220,1223],{"class":1064,"line":1182},10,[1062,1184,1186],{"class":1185},"s5Kfy","            f",[1062,1188,1189],{"class":1131},"\"redis://",[1062,1191,1193],{"class":1192},"s3h35","{",[1062,1195,1196],{"class":1079},"os",[1062,1198,1199],{"class":1117},".",[1062,1201,1203],{"class":1202},"sBPpx","environ",[1062,1205,1206],{"class":1117},"[",[1062,1208,1135],{"class":1127},[1062,1210,1211],{"class":1131},"REDIS_PRIMARY_HOST",[1062,1213,1135],{"class":1127},[1062,1215,1216],{"class":1117},"]",[1062,1218,1219],{"class":1192},"}",[1062,1221,1222],{"class":1131},":6379/1\"",[1062,1224,1164],{"class":1117},[1062,1226,1228,1230,1232,1234,1236,1238,1240,1242,1244,1247,1249,1251,1253,1255],{"class":1064,"line":1227},11,[1062,1229,1186],{"class":1185},[1062,1231,1189],{"class":1131},[1062,1233,1193],{"class":1192},[1062,1235,1196],{"class":1079},[1062,1237,1199],{"class":1117},[1062,1239,1203],{"class":1202},[1062,1241,1206],{"class":1117},[1062,1243,1135],{"class":1127},[1062,1245,1246],{"class":1131},"REDIS_REPLICA_1_HOST",[1062,1248,1135],{"class":1127},[1062,1250,1216],{"class":1117},[1062,1252,1219],{"class":1192},[1062,1254,1222],{"class":1131},[1062,1256,1164],{"class":1117},[1062,1258,1260,1262,1264,1266,1268,1270,1272,1274,1276,1279,1281,1283,1285,1287],{"class":1064,"line":1259},12,[1062,1261,1186],{"class":1185},[1062,1263,1189],{"class":1131},[1062,1265,1193],{"class":1192},[1062,1267,1196],{"class":1079},[1062,1269,1199],{"class":1117},[1062,1271,1203],{"class":1202},[1062,1273,1206],{"class":1117},[1062,1275,1135],{"class":1127},[1062,1277,1278],{"class":1131},"REDIS_REPLICA_2_HOST",[1062,1280,1135],{"class":1127},[1062,1282,1216],{"class":1117},[1062,1284,1219],{"class":1192},[1062,1286,1222],{"class":1131},[1062,1288,1164],{"class":1117},[1062,1290,1292],{"class":1064,"line":1291},13,[1062,1293,1294],{"class":1117},"        ],\n",[1062,1296,1298,1300,1303,1305,1307],{"class":1064,"line":1297},14,[1062,1299,1146],{"class":1127},[1062,1301,1302],{"class":1131},"OPTIONS",[1062,1304,1135],{"class":1127},[1062,1306,1138],{"class":1117},[1062,1308,1121],{"class":1117},[1062,1310,1312,1315,1318,1320,1322,1324,1327,1329],{"class":1064,"line":1311},15,[1062,1313,1314],{"class":1127},"            '",[1062,1316,1317],{"class":1131},"CLIENT_CLASS",[1062,1319,1135],{"class":1127},[1062,1321,1138],{"class":1117},[1062,1323,1156],{"class":1127},[1062,1325,1326],{"class":1131},"django_redis.client.ShardClient",[1062,1328,1135],{"class":1127},[1062,1330,1164],{"class":1117},[1062,1332,1334,1336,1339,1341,1343],{"class":1064,"line":1333},16,[1062,1335,1314],{"class":1127},[1062,1337,1338],{"class":1131},"CONNECTION_POOL_KWARGS",[1062,1340,1135],{"class":1127},[1062,1342,1138],{"class":1117},[1062,1344,1121],{"class":1117},[1062,1346,1348,1351,1354,1356,1358,1362],{"class":1064,"line":1347},17,[1062,1349,1350],{"class":1127},"                '",[1062,1352,1353],{"class":1131},"max_connections",[1062,1355,1135],{"class":1127},[1062,1357,1138],{"class":1117},[1062,1359,1361],{"class":1360},"s7CZa"," 100",[1062,1363,1164],{"class":1117},[1062,1365,1367,1369,1372,1374,1376,1380],{"class":1064,"line":1366},18,[1062,1368,1350],{"class":1127},[1062,1370,1371],{"class":1131},"retry_on_timeout",[1062,1373,1135],{"class":1127},[1062,1375,1138],{"class":1117},[1062,1377,1379],{"class":1378},"s8XtY"," True",[1062,1381,1164],{"class":1117},[1062,1383,1385,1387,1390,1392,1394,1396],{"class":1064,"line":1384},19,[1062,1386,1350],{"class":1127},[1062,1388,1389],{"class":1131},"socket_keepalive",[1062,1391,1135],{"class":1127},[1062,1393,1138],{"class":1117},[1062,1395,1379],{"class":1378},[1062,1397,1164],{"class":1117},[1062,1399,1401],{"class":1064,"line":1400},20,[1062,1402,1403],{"class":1117},"            },\n",[1062,1405,1407,1409,1412,1414,1416,1418,1421,1423],{"class":1064,"line":1406},21,[1062,1408,1314],{"class":1127},[1062,1410,1411],{"class":1131},"COMPRESSOR",[1062,1413,1135],{"class":1127},[1062,1415,1138],{"class":1117},[1062,1417,1156],{"class":1127},[1062,1419,1420],{"class":1131},"django_redis.compressors.lz4.Lz4Compressor",[1062,1422,1135],{"class":1127},[1062,1424,1164],{"class":1117},[1062,1426,1428,1430,1433,1435,1437,1439,1442,1444],{"class":1064,"line":1427},22,[1062,1429,1314],{"class":1127},[1062,1431,1432],{"class":1131},"SERIALIZER",[1062,1434,1135],{"class":1127},[1062,1436,1138],{"class":1117},[1062,1438,1156],{"class":1127},[1062,1440,1441],{"class":1131},"django_redis.serializers.msgpack.MSGPackSerializer",[1062,1443,1135],{"class":1127},[1062,1445,1164],{"class":1117},[1062,1447,1449,1451,1454,1456,1458,1460,1463],{"class":1064,"line":1448},23,[1062,1450,1314],{"class":1127},[1062,1452,1453],{"class":1131},"IGNORE_EXCEPTIONS",[1062,1455,1135],{"class":1127},[1062,1457,1138],{"class":1117},[1062,1459,1379],{"class":1378},[1062,1461,1462],{"class":1117},",",[1062,1464,1465],{"class":1068},"  # Graceful degradation\n",[1062,1467,1469],{"class":1064,"line":1468},24,[1062,1470,1471],{"class":1117},"        },\n",[1062,1473,1475,1477,1480,1482,1484,1487,1490,1492,1494,1496,1498,1500,1502,1505,1507,1509,1511,1514],{"class":1064,"line":1474},25,[1062,1476,1146],{"class":1127},[1062,1478,1479],{"class":1131},"KEY_PREFIX",[1062,1481,1135],{"class":1127},[1062,1483,1138],{"class":1117},[1062,1485,1486],{"class":1185}," f",[1062,1488,1489],{"class":1131},"\"",[1062,1491,1193],{"class":1192},[1062,1493,1196],{"class":1079},[1062,1495,1199],{"class":1117},[1062,1497,1203],{"class":1202},[1062,1499,1206],{"class":1117},[1062,1501,1135],{"class":1127},[1062,1503,1504],{"class":1131},"APP_NAME",[1062,1506,1135],{"class":1127},[1062,1508,1216],{"class":1117},[1062,1510,1219],{"class":1192},[1062,1512,1513],{"class":1131},"_prod\"",[1062,1515,1164],{"class":1117},[1062,1517,1519,1521,1524,1526,1528,1532,1535,1538,1540,1542,1544,1547,1549,1551,1554,1556,1558,1561],{"class":1064,"line":1518},26,[1062,1520,1146],{"class":1127},[1062,1522,1523],{"class":1131},"VERSION",[1062,1525,1135],{"class":1127},[1062,1527,1138],{"class":1117},[1062,1529,1531],{"class":1530},"sa2tF"," int",[1062,1533,1534],{"class":1117},"(",[1062,1536,1196],{"class":1537},"siWMO",[1062,1539,1199],{"class":1117},[1062,1541,1203],{"class":1202},[1062,1543,1199],{"class":1117},[1062,1545,1546],{"class":1537},"get",[1062,1548,1534],{"class":1117},[1062,1550,1135],{"class":1127},[1062,1552,1553],{"class":1131},"CACHE_VERSION",[1062,1555,1135],{"class":1127},[1062,1557,1462],{"class":1117},[1062,1559,1560],{"class":1360}," 1",[1062,1562,1563],{"class":1117},")),\n",[1062,1565,1567],{"class":1064,"line":1566},27,[1062,1568,1569],{"class":1117},"    },\n",[1062,1571,1573],{"class":1064,"line":1572},28,[1062,1574,1575],{"class":1079},"    \n",[1062,1577,1579],{"class":1064,"line":1578},29,[1062,1580,1581],{"class":1068},"    # Separate cache for sessions (high availability)\n",[1062,1583,1585,1587,1590,1592,1594],{"class":1064,"line":1584},30,[1062,1586,1128],{"class":1127},[1062,1588,1589],{"class":1131},"sessions",[1062,1591,1135],{"class":1127},[1062,1593,1138],{"class":1117},[1062,1595,1121],{"class":1117},[1062,1597,1599,1601,1603,1605,1607,1609,1611,1613],{"class":1064,"line":1598},31,[1062,1600,1146],{"class":1127},[1062,1602,1149],{"class":1131},[1062,1604,1135],{"class":1127},[1062,1606,1138],{"class":1117},[1062,1608,1156],{"class":1127},[1062,1610,1159],{"class":1131},[1062,1612,1135],{"class":1127},[1062,1614,1164],{"class":1117},[1062,1616,1618,1620,1622,1624,1626,1628,1630,1632,1634,1636,1638,1640,1642,1645,1647,1649,1651,1654],{"class":1064,"line":1617},32,[1062,1619,1146],{"class":1127},[1062,1621,1172],{"class":1131},[1062,1623,1135],{"class":1127},[1062,1625,1138],{"class":1117},[1062,1627,1486],{"class":1185},[1062,1629,1189],{"class":1131},[1062,1631,1193],{"class":1192},[1062,1633,1196],{"class":1079},[1062,1635,1199],{"class":1117},[1062,1637,1203],{"class":1202},[1062,1639,1206],{"class":1117},[1062,1641,1135],{"class":1127},[1062,1643,1644],{"class":1131},"REDIS_SESSIONS_HOST",[1062,1646,1135],{"class":1127},[1062,1648,1216],{"class":1117},[1062,1650,1219],{"class":1192},[1062,1652,1653],{"class":1131},":6379/2\"",[1062,1655,1164],{"class":1117},[1062,1657,1659,1661,1663,1665,1667],{"class":1064,"line":1658},33,[1062,1660,1146],{"class":1127},[1062,1662,1302],{"class":1131},[1062,1664,1135],{"class":1127},[1062,1666,1138],{"class":1117},[1062,1668,1121],{"class":1117},[1062,1670,1672,1674,1676,1678,1680,1682,1685,1687],{"class":1064,"line":1671},34,[1062,1673,1314],{"class":1127},[1062,1675,1317],{"class":1131},[1062,1677,1135],{"class":1127},[1062,1679,1138],{"class":1117},[1062,1681,1156],{"class":1127},[1062,1683,1684],{"class":1131},"django_redis.client.DefaultClient",[1062,1686,1135],{"class":1127},[1062,1688,1164],{"class":1117},[1062,1690,1692,1694,1696,1698,1700],{"class":1064,"line":1691},35,[1062,1693,1314],{"class":1127},[1062,1695,1338],{"class":1131},[1062,1697,1135],{"class":1127},[1062,1699,1138],{"class":1117},[1062,1701,1121],{"class":1117},[1062,1703,1705,1707,1709,1711,1713,1716],{"class":1064,"line":1704},36,[1062,1706,1350],{"class":1127},[1062,1708,1353],{"class":1131},[1062,1710,1135],{"class":1127},[1062,1712,1138],{"class":1117},[1062,1714,1715],{"class":1360}," 50",[1062,1717,1164],{"class":1117},[1062,1719,1721,1723,1725,1727,1729,1731],{"class":1064,"line":1720},37,[1062,1722,1350],{"class":1127},[1062,1724,1371],{"class":1131},[1062,1726,1135],{"class":1127},[1062,1728,1138],{"class":1117},[1062,1730,1379],{"class":1378},[1062,1732,1164],{"class":1117},[1062,1734,1736],{"class":1064,"line":1735},38,[1062,1737,1403],{"class":1117},[1062,1739,1741],{"class":1064,"line":1740},39,[1062,1742,1471],{"class":1117},[1062,1744,1746,1748,1751,1753,1755,1758,1760],{"class":1064,"line":1745},40,[1062,1747,1146],{"class":1127},[1062,1749,1750],{"class":1131},"TIMEOUT",[1062,1752,1135],{"class":1127},[1062,1754,1138],{"class":1117},[1062,1756,1757],{"class":1360}," 1800",[1062,1759,1462],{"class":1117},[1062,1761,1762],{"class":1068},"  # 30 minutes\n",[1062,1764,1766],{"class":1064,"line":1765},41,[1062,1767,1569],{"class":1117},[1062,1769,1771],{"class":1064,"line":1770},42,[1062,1772,1575],{"class":1079},[1062,1774,1776],{"class":1064,"line":1775},43,[1062,1777,1778],{"class":1068},"    # Cache for temporary data (can be volatile)\n",[1062,1780,1782,1784,1787,1789,1791],{"class":1064,"line":1781},44,[1062,1783,1128],{"class":1127},[1062,1785,1786],{"class":1131},"temporary",[1062,1788,1135],{"class":1127},[1062,1790,1138],{"class":1117},[1062,1792,1121],{"class":1117},[1062,1794,1796,1798,1800,1802,1804,1806,1808,1810],{"class":1064,"line":1795},45,[1062,1797,1146],{"class":1127},[1062,1799,1149],{"class":1131},[1062,1801,1135],{"class":1127},[1062,1803,1138],{"class":1117},[1062,1805,1156],{"class":1127},[1062,1807,1159],{"class":1131},[1062,1809,1135],{"class":1127},[1062,1811,1164],{"class":1117},[1062,1813,1815,1817,1819,1821,1823,1825,1827,1829,1831,1833,1835,1837,1839,1842,1844,1846,1848,1851],{"class":1064,"line":1814},46,[1062,1816,1146],{"class":1127},[1062,1818,1172],{"class":1131},[1062,1820,1135],{"class":1127},[1062,1822,1138],{"class":1117},[1062,1824,1486],{"class":1185},[1062,1826,1189],{"class":1131},[1062,1828,1193],{"class":1192},[1062,1830,1196],{"class":1079},[1062,1832,1199],{"class":1117},[1062,1834,1203],{"class":1202},[1062,1836,1206],{"class":1117},[1062,1838,1135],{"class":1127},[1062,1840,1841],{"class":1131},"REDIS_TEMP_HOST",[1062,1843,1135],{"class":1127},[1062,1845,1216],{"class":1117},[1062,1847,1219],{"class":1192},[1062,1849,1850],{"class":1131},":6379/3\"",[1062,1852,1164],{"class":1117},[1062,1854,1856,1858,1860,1862,1864],{"class":1064,"line":1855},47,[1062,1857,1146],{"class":1127},[1062,1859,1302],{"class":1131},[1062,1861,1135],{"class":1127},[1062,1863,1138],{"class":1117},[1062,1865,1121],{"class":1117},[1062,1867,1869,1871,1873,1875,1877,1879,1881,1883],{"class":1064,"line":1868},48,[1062,1870,1314],{"class":1127},[1062,1872,1317],{"class":1131},[1062,1874,1135],{"class":1127},[1062,1876,1138],{"class":1117},[1062,1878,1156],{"class":1127},[1062,1880,1684],{"class":1131},[1062,1882,1135],{"class":1127},[1062,1884,1164],{"class":1117},[1062,1886,1888],{"class":1064,"line":1887},49,[1062,1889,1471],{"class":1117},[1062,1891,1893,1895,1897,1899,1901,1904,1906],{"class":1064,"line":1892},50,[1062,1894,1146],{"class":1127},[1062,1896,1750],{"class":1131},[1062,1898,1135],{"class":1127},[1062,1900,1138],{"class":1117},[1062,1902,1903],{"class":1360}," 300",[1062,1905,1462],{"class":1117},[1062,1907,1908],{"class":1068},"  # 5 minutes\n",[1062,1910,1912],{"class":1064,"line":1911},51,[1062,1913,1569],{"class":1117},[1062,1915,1917],{"class":1064,"line":1916},52,[1062,1918,1575],{"class":1079},[1062,1920,1922],{"class":1064,"line":1921},53,[1062,1923,1924],{"class":1068},"    # Local memory cache for hot data\n",[1062,1926,1928,1930,1933,1935,1937],{"class":1064,"line":1927},54,[1062,1929,1128],{"class":1127},[1062,1931,1932],{"class":1131},"local",[1062,1934,1135],{"class":1127},[1062,1936,1138],{"class":1117},[1062,1938,1121],{"class":1117},[1062,1940,1942,1944,1946,1948,1950,1952,1955,1957],{"class":1064,"line":1941},55,[1062,1943,1146],{"class":1127},[1062,1945,1149],{"class":1131},[1062,1947,1135],{"class":1127},[1062,1949,1138],{"class":1117},[1062,1951,1156],{"class":1127},[1062,1953,1954],{"class":1131},"django.core.cache.backends.locmem.LocMemCache",[1062,1956,1135],{"class":1127},[1062,1958,1164],{"class":1117},[1062,1960,1962,1964,1966,1968,1970,1972,1975,1977],{"class":1064,"line":1961},56,[1062,1963,1146],{"class":1127},[1062,1965,1172],{"class":1131},[1062,1967,1135],{"class":1127},[1062,1969,1138],{"class":1117},[1062,1971,1156],{"class":1127},[1062,1973,1974],{"class":1131},"local-cache",[1062,1976,1135],{"class":1127},[1062,1978,1164],{"class":1117},[1062,1980,1982,1984,1986,1988,1990,1993,1995],{"class":1064,"line":1981},57,[1062,1983,1146],{"class":1127},[1062,1985,1750],{"class":1131},[1062,1987,1135],{"class":1127},[1062,1989,1138],{"class":1117},[1062,1991,1992],{"class":1360}," 60",[1062,1994,1462],{"class":1117},[1062,1996,1997],{"class":1068},"  # 1 minute\n",[1062,1999,2001,2003,2005,2007,2009],{"class":1064,"line":2000},58,[1062,2002,1146],{"class":1127},[1062,2004,1302],{"class":1131},[1062,2006,1135],{"class":1127},[1062,2008,1138],{"class":1117},[1062,2010,1121],{"class":1117},[1062,2012,2014,2016,2019,2021,2023,2026],{"class":1064,"line":2013},59,[1062,2015,1314],{"class":1127},[1062,2017,2018],{"class":1131},"MAX_ENTRIES",[1062,2020,1135],{"class":1127},[1062,2022,1138],{"class":1117},[1062,2024,2025],{"class":1360}," 10000",[1062,2027,1164],{"class":1117},[1062,2029,2031,2033,2036,2038,2040,2043],{"class":1064,"line":2030},60,[1062,2032,1314],{"class":1127},[1062,2034,2035],{"class":1131},"CULL_FREQUENCY",[1062,2037,1135],{"class":1127},[1062,2039,1138],{"class":1117},[1062,2041,2042],{"class":1360}," 3",[1062,2044,1164],{"class":1117},[1062,2046,2048],{"class":1064,"line":2047},61,[1062,2049,2050],{"class":1117},"        }\n",[1062,2052,2054],{"class":1064,"line":2053},62,[1062,2055,2056],{"class":1117},"    }\n",[1062,2058,2060],{"class":1064,"line":2059},63,[1062,2061,2062],{"class":1117},"}\n",[1062,2064,2066],{"class":1064,"line":2065},64,[1062,2067,1101],{"emptyLinePlaceholder":1100},[1062,2069,2071],{"class":1064,"line":2070},65,[1062,2072,2073],{"class":1068},"# Session configuration\n",[1062,2075,2077,2080,2082,2084,2087],{"class":1064,"line":2076},66,[1062,2078,2079],{"class":1113},"SESSION_ENGINE",[1062,2081,1118],{"class":1117},[1062,2083,1156],{"class":1127},[1062,2085,2086],{"class":1131},"django.contrib.sessions.backends.cache",[1062,2088,2089],{"class":1127},"'\n",[1062,2091,2093,2096,2098,2100,2102],{"class":1064,"line":2092},67,[1062,2094,2095],{"class":1113},"SESSION_CACHE_ALIAS",[1062,2097,1118],{"class":1117},[1062,2099,1156],{"class":1127},[1062,2101,1589],{"class":1131},[1062,2103,2089],{"class":1127},[1062,2105,2107,2110,2112,2114],{"class":1064,"line":2106},68,[1062,2108,2109],{"class":1113},"SESSION_COOKIE_AGE",[1062,2111,1118],{"class":1117},[1062,2113,1757],{"class":1360},[1062,2115,1762],{"class":1068},[1062,2117,2119],{"class":1064,"line":2118},69,[1062,2120,1101],{"emptyLinePlaceholder":1100},[1062,2122,2124],{"class":1064,"line":2123},70,[1062,2125,2126],{"class":1068},"# Cache middleware configuration\n",[1062,2128,2130,2133,2135,2137,2139],{"class":1064,"line":2129},71,[1062,2131,2132],{"class":1113},"CACHE_MIDDLEWARE_ALIAS",[1062,2134,1118],{"class":1117},[1062,2136,1156],{"class":1127},[1062,2138,1132],{"class":1131},[1062,2140,2089],{"class":1127},[1062,2142,2144,2147,2149,2151],{"class":1064,"line":2143},72,[1062,2145,2146],{"class":1113},"CACHE_MIDDLEWARE_SECONDS",[1062,2148,1118],{"class":1117},[1062,2150,1903],{"class":1360},[1062,2152,1908],{"class":1068},[1062,2154,2156,2159,2161,2163,2165,2167,2169,2171,2173,2175,2177,2179,2181,2183,2185],{"class":1064,"line":2155},73,[1062,2157,2158],{"class":1113},"CACHE_MIDDLEWARE_KEY_PREFIX",[1062,2160,1118],{"class":1117},[1062,2162,1486],{"class":1185},[1062,2164,1489],{"class":1131},[1062,2166,1193],{"class":1192},[1062,2168,1196],{"class":1079},[1062,2170,1199],{"class":1117},[1062,2172,1203],{"class":1202},[1062,2174,1206],{"class":1117},[1062,2176,1135],{"class":1127},[1062,2178,1504],{"class":1131},[1062,2180,1135],{"class":1127},[1062,2182,1216],{"class":1117},[1062,2184,1219],{"class":1192},[1062,2186,2187],{"class":1131},"_page\"\n",[1062,2189,2191],{"class":1064,"line":2190},74,[1062,2192,1101],{"emptyLinePlaceholder":1100},[1062,2194,2196],{"class":1064,"line":2195},75,[1062,2197,2198],{"class":1068},"# HTTP caching headers\n",[1062,2200,2202,2205,2207],{"class":1064,"line":2201},76,[1062,2203,2204],{"class":1113},"USE_ETAGS",[1062,2206,1118],{"class":1117},[1062,2208,2209],{"class":1378}," True\n",[1062,2211,2213,2216,2218],{"class":1064,"line":2212},77,[1062,2214,2215],{"class":1113},"USE_LAST_MODIFIED",[1062,2217,1118],{"class":1117},[1062,2219,2209],{"class":1378},[1062,2221,2223],{"class":1064,"line":2222},78,[1062,2224,1101],{"emptyLinePlaceholder":1100},[1062,2226,2228],{"class":1064,"line":2227},79,[1062,2229,2230],{"class":1068},"# Static files caching\n",[1062,2232,2234,2237,2239,2241,2244],{"class":1064,"line":2233},80,[1062,2235,2236],{"class":1113},"STATICFILES_STORAGE",[1062,2238,1118],{"class":1117},[1062,2240,1156],{"class":1127},[1062,2242,2243],{"class":1131},"whitenoise.storage.CompressedManifestStaticFilesStorage",[1062,2245,2089],{"class":1127},[1062,2247,2249,2252,2254,2256,2259,2261,2263,2265,2267,2269,2271,2274,2276,2278,2280],{"class":1064,"line":2248},81,[1062,2250,2251],{"class":1113},"STATIC_URL",[1062,2253,1118],{"class":1117},[1062,2255,1486],{"class":1185},[1062,2257,2258],{"class":1131},"\"https://",[1062,2260,1193],{"class":1192},[1062,2262,1196],{"class":1079},[1062,2264,1199],{"class":1117},[1062,2266,1203],{"class":1202},[1062,2268,1206],{"class":1117},[1062,2270,1135],{"class":1127},[1062,2272,2273],{"class":1131},"CDN_DOMAIN",[1062,2275,1135],{"class":1127},[1062,2277,1216],{"class":1117},[1062,2279,1219],{"class":1192},[1062,2281,2282],{"class":1131},"/static/\"\n",[1062,2284,2286],{"class":1064,"line":2285},82,[1062,2287,1101],{"emptyLinePlaceholder":1100},[1062,2289,2291],{"class":1064,"line":2290},83,[1062,2292,2293],{"class":1068},"# Media files caching (if using cloud storage)\n",[1062,2295,2297,2300,2302,2304,2307],{"class":1064,"line":2296},84,[1062,2298,2299],{"class":1113},"DEFAULT_FILE_STORAGE",[1062,2301,1118],{"class":1117},[1062,2303,1156],{"class":1127},[1062,2305,2306],{"class":1131},"storages.backends.s3boto3.S3Boto3Storage",[1062,2308,2089],{"class":1127},[1062,2310,2312,2315,2317,2320,2322,2324,2326,2328,2330,2332],{"class":1064,"line":2311},85,[1062,2313,2314],{"class":1113},"AWS_S3_CUSTOM_DOMAIN",[1062,2316,1118],{"class":1117},[1062,2318,2319],{"class":1079}," os",[1062,2321,1199],{"class":1117},[1062,2323,1203],{"class":1202},[1062,2325,1206],{"class":1117},[1062,2327,1135],{"class":1127},[1062,2329,2273],{"class":1131},[1062,2331,1135],{"class":1127},[1062,2333,2334],{"class":1117},"]\n",[1062,2336,2338,2341,2343],{"class":1064,"line":2337},86,[1062,2339,2340],{"class":1113},"AWS_S3_OBJECT_PARAMETERS",[1062,2342,1118],{"class":1117},[1062,2344,1121],{"class":1117},[1062,2346,2348,2350,2353,2355,2357,2359,2362,2364,2366],{"class":1064,"line":2347},87,[1062,2349,1128],{"class":1127},[1062,2351,2352],{"class":1131},"CacheControl",[1062,2354,1135],{"class":1127},[1062,2356,1138],{"class":1117},[1062,2358,1156],{"class":1127},[1062,2360,2361],{"class":1131},"max-age=86400",[1062,2363,1135],{"class":1127},[1062,2365,1462],{"class":1117},[1062,2367,2368],{"class":1068},"  # 24 hours\n",[1062,2370,2372],{"class":1064,"line":2371},88,[1062,2373,2062],{"class":1117},[1030,2375,2377],{"id":2376},"cdn-integration","CDN Integration",[1035,2379,2381],{"id":2380},"cloudflare-configuration","CloudFlare Configuration",[1040,2383,2385],{"className":1056,"code":2384,"language":1058,"meta":1049,"style":1049},"# utils/cdn.py\nimport requests\nimport os\nfrom django.conf import settings\nfrom django.core.cache import cache\n\nclass CloudFlareCache:\n    \"\"\"Manage CloudFlare cache operations.\"\"\"\n    \n    def __init__(self):\n        self.api_token = os.environ['CLOUDFLARE_API_TOKEN']\n        self.zone_id = os.environ['CLOUDFLARE_ZONE_ID']\n        self.base_url = 'https://api.cloudflare.com/client/v4'\n        \n    def purge_cache(self, urls=None, tags=None, purge_everything=False):\n        \"\"\"Purge CloudFlare cache.\"\"\"\n        headers = {\n            'Authorization': f'Bearer {self.api_token}',\n            'Content-Type': 'application/json',\n        }\n        \n        url = f\"{self.base_url}/zones/{self.zone_id}/purge_cache\"\n        \n        if purge_everything:\n            data = {'purge_everything': True}\n        elif urls:\n            data = {'files': urls}\n        elif tags:\n            data = {'tags': tags}\n        else:\n            raise ValueError(\"Must specify urls, tags, or purge_everything\")\n        \n        response = requests.post(url, json=data, headers=headers)\n        response.raise_for_status()\n        \n        return response.json()\n    \n    def purge_url(self, url):\n        \"\"\"Purge a specific URL from CloudFlare cache.\"\"\"\n        return self.purge_cache(urls=[url])\n    \n    def purge_tag(self, tag):\n        \"\"\"Purge all URLs with a specific cache tag.\"\"\"\n        return self.purge_cache(tags=[tag])\n    \n    def set_cache_rules(self, rules):\n        \"\"\"Set CloudFlare cache rules via API.\"\"\"\n        # Implementation for setting cache rules\n        pass\n\n# Django middleware for CDN cache headers\nclass CDNCacheMiddleware:\n    \"\"\"Add CDN-specific cache headers.\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n        self.cf_cache = CloudFlareCache()\n    \n    def __call__(self, request):\n        response = self.get_response(request)\n        \n        # Add cache tags for selective purging\n        if hasattr(request, 'cache_tags'):\n            cache_tags = ','.join(request.cache_tags)\n            response['Cache-Tag'] = cache_tags\n        \n        # Set appropriate cache headers based on content type\n        if request.path.startswith('/api/'):\n            # API responses - shorter cache times\n            response['Cache-Control'] = 'public, max-age=300, s-maxage=600'\n        elif request.path.startswith('/static/'):\n            # Static files - long cache times\n            response['Cache-Control'] = 'public, max-age=31536000, immutable'\n        elif request.path.startswith('/media/'):\n            # Media files - medium cache times\n            response['Cache-Control'] = 'public, max-age=86400'\n        else:\n            # HTML pages - moderate cache times\n            response['Cache-Control'] = 'public, max-age=300, s-maxage=1800'\n        \n        return response\n\n# Usage in views\nfrom django.views.decorators.cache import cache_control\nfrom django.views.decorators.vary import vary_on_headers\n\n@cache_control(public=True, max_age=3600, s_maxage=7200)\n@vary_on_headers('Accept-Language', 'Accept-Encoding')\ndef cached_blog_post(request, slug):\n    \"\"\"Blog post with CDN caching.\"\"\"\n    post = get_object_or_404(Post, slug=slug, published=True)\n    \n    # Add cache tags for selective purging\n    request.cache_tags = [\n        f'post_{post.id}',\n        f'category_{post.category.slug}',\n        f'author_{post.author.id}',\n    ]\n    \n    context = {'post': post}\n    return render(request, 'blog/post_detail.html', context)\n",[1047,2386,2387,2392,2399,2405,2422,2443,2447,2459,2472,2476,2494,2523,2551,2569,2574,2620,2630,2639,2669,2689,2693,2697,2734,2738,2747,2770,2779,2800,2808,2829,2836,2856,2860,2903,2916,2920,2935,2939,2957,2966,2991,2995,3013,3022,3043,3047,3065,3074,3079,3084,3088,3093,3102,3111,3115,3132,3146,3161,3165,3183,3202,3206,3211,3233,3261,3282,3286,3291,3318,3323,3347,3372,3377,3400,3425,3430,3453,3459,3464,3487,3491,3498,3502,3507,3532,3556,3560,3600,3627,3647,3657,3693,3698,3704,3718,3742,3769,3796,3802,3807,3830],{"__ignoreMap":1049},[1062,2388,2389],{"class":1064,"line":1065},[1062,2390,2391],{"class":1068},"# utils/cdn.py\n",[1062,2393,2394,2396],{"class":1064,"line":1072},[1062,2395,1076],{"class":1075},[1062,2397,2398],{"class":1079}," requests\n",[1062,2400,2401,2403],{"class":1064,"line":1083},[1062,2402,1076],{"class":1075},[1062,2404,1080],{"class":1079},[1062,2406,2407,2409,2412,2414,2417,2419],{"class":1064,"line":1097},[1062,2408,1086],{"class":1075},[1062,2410,2411],{"class":1079}," django",[1062,2413,1199],{"class":1117},[1062,2415,2416],{"class":1079},"conf ",[1062,2418,1076],{"class":1075},[1062,2420,2421],{"class":1079}," settings\n",[1062,2423,2424,2426,2428,2430,2433,2435,2438,2440],{"class":1064,"line":1104},[1062,2425,1086],{"class":1075},[1062,2427,2411],{"class":1079},[1062,2429,1199],{"class":1117},[1062,2431,2432],{"class":1079},"core",[1062,2434,1199],{"class":1117},[1062,2436,2437],{"class":1079},"cache ",[1062,2439,1076],{"class":1075},[1062,2441,2442],{"class":1079}," cache\n",[1062,2444,2445],{"class":1064,"line":1110},[1062,2446,1101],{"emptyLinePlaceholder":1100},[1062,2448,2449,2452,2456],{"class":1064,"line":1124},[1062,2450,2451],{"class":1185},"class",[1062,2453,2455],{"class":2454},"sD-vU"," CloudFlareCache",[1062,2457,2458],{"class":1117},":\n",[1062,2460,2461,2465,2469],{"class":1064,"line":1143},[1062,2462,2464],{"class":2463},"sm7ve","    \"\"\"",[1062,2466,2468],{"class":2467},"sVyVU","Manage CloudFlare cache operations.",[1062,2470,2471],{"class":2463},"\"\"\"\n",[1062,2473,2474],{"class":1064,"line":1167},[1062,2475,1575],{"class":1079},[1062,2477,2478,2481,2485,2487,2491],{"class":1064,"line":1182},[1062,2479,2480],{"class":1185},"    def",[1062,2482,2484],{"class":2483},"sJdAF"," __init__",[1062,2486,1534],{"class":1117},[1062,2488,2490],{"class":2489},"sRjD_","self",[1062,2492,2493],{"class":1117},"):\n",[1062,2495,2496,2499,2501,2504,2506,2508,2510,2512,2514,2516,2519,2521],{"class":1064,"line":1227},[1062,2497,2498],{"class":1113},"        self",[1062,2500,1199],{"class":1117},[1062,2502,2503],{"class":1202},"api_token",[1062,2505,1118],{"class":1117},[1062,2507,2319],{"class":1079},[1062,2509,1199],{"class":1117},[1062,2511,1203],{"class":1202},[1062,2513,1206],{"class":1117},[1062,2515,1135],{"class":1127},[1062,2517,2518],{"class":1131},"CLOUDFLARE_API_TOKEN",[1062,2520,1135],{"class":1127},[1062,2522,2334],{"class":1117},[1062,2524,2525,2527,2529,2532,2534,2536,2538,2540,2542,2544,2547,2549],{"class":1064,"line":1259},[1062,2526,2498],{"class":1113},[1062,2528,1199],{"class":1117},[1062,2530,2531],{"class":1202},"zone_id",[1062,2533,1118],{"class":1117},[1062,2535,2319],{"class":1079},[1062,2537,1199],{"class":1117},[1062,2539,1203],{"class":1202},[1062,2541,1206],{"class":1117},[1062,2543,1135],{"class":1127},[1062,2545,2546],{"class":1131},"CLOUDFLARE_ZONE_ID",[1062,2548,1135],{"class":1127},[1062,2550,2334],{"class":1117},[1062,2552,2553,2555,2557,2560,2562,2564,2567],{"class":1064,"line":1291},[1062,2554,2498],{"class":1113},[1062,2556,1199],{"class":1117},[1062,2558,2559],{"class":1202},"base_url",[1062,2561,1118],{"class":1117},[1062,2563,1156],{"class":1127},[1062,2565,2566],{"class":1131},"https://api.cloudflare.com/client/v4",[1062,2568,2089],{"class":1127},[1062,2570,2571],{"class":1064,"line":1297},[1062,2572,2573],{"class":1079},"        \n",[1062,2575,2576,2578,2582,2584,2586,2588,2592,2596,2599,2601,2604,2606,2608,2610,2613,2615,2618],{"class":1064,"line":1311},[1062,2577,2480],{"class":1185},[1062,2579,2581],{"class":2580},"sljsM"," purge_cache",[1062,2583,1534],{"class":1117},[1062,2585,2490],{"class":2489},[1062,2587,1462],{"class":1117},[1062,2589,2591],{"class":2590},"sCyAa"," urls",[1062,2593,2595],{"class":2594},"sVsLi","=",[1062,2597,2598],{"class":1378},"None",[1062,2600,1462],{"class":1117},[1062,2602,2603],{"class":2590}," tags",[1062,2605,2595],{"class":2594},[1062,2607,2598],{"class":1378},[1062,2609,1462],{"class":1117},[1062,2611,2612],{"class":2590}," purge_everything",[1062,2614,2595],{"class":2594},[1062,2616,2617],{"class":1378},"False",[1062,2619,2493],{"class":1117},[1062,2621,2622,2625,2628],{"class":1064,"line":1333},[1062,2623,2624],{"class":2463},"        \"\"\"",[1062,2626,2627],{"class":2467},"Purge CloudFlare cache.",[1062,2629,2471],{"class":2463},[1062,2631,2632,2635,2637],{"class":1064,"line":1347},[1062,2633,2634],{"class":1079},"        headers ",[1062,2636,2595],{"class":1117},[1062,2638,1121],{"class":1117},[1062,2640,2641,2643,2646,2648,2650,2652,2655,2657,2659,2661,2663,2665,2667],{"class":1064,"line":1366},[1062,2642,1314],{"class":1127},[1062,2644,2645],{"class":1131},"Authorization",[1062,2647,1135],{"class":1127},[1062,2649,1138],{"class":1117},[1062,2651,1486],{"class":1185},[1062,2653,2654],{"class":1131},"'Bearer ",[1062,2656,1193],{"class":1192},[1062,2658,2490],{"class":1113},[1062,2660,1199],{"class":1117},[1062,2662,2503],{"class":1202},[1062,2664,1219],{"class":1192},[1062,2666,1135],{"class":1131},[1062,2668,1164],{"class":1117},[1062,2670,2671,2673,2676,2678,2680,2682,2685,2687],{"class":1064,"line":1384},[1062,2672,1314],{"class":1127},[1062,2674,2675],{"class":1131},"Content-Type",[1062,2677,1135],{"class":1127},[1062,2679,1138],{"class":1117},[1062,2681,1156],{"class":1127},[1062,2683,2684],{"class":1131},"application/json",[1062,2686,1135],{"class":1127},[1062,2688,1164],{"class":1117},[1062,2690,2691],{"class":1064,"line":1400},[1062,2692,2050],{"class":1117},[1062,2694,2695],{"class":1064,"line":1406},[1062,2696,2573],{"class":1079},[1062,2698,2699,2702,2704,2706,2708,2710,2712,2714,2716,2718,2721,2723,2725,2727,2729,2731],{"class":1064,"line":1427},[1062,2700,2701],{"class":1079},"        url ",[1062,2703,2595],{"class":1117},[1062,2705,1486],{"class":1185},[1062,2707,1489],{"class":1131},[1062,2709,1193],{"class":1192},[1062,2711,2490],{"class":1113},[1062,2713,1199],{"class":1117},[1062,2715,2559],{"class":1202},[1062,2717,1219],{"class":1192},[1062,2719,2720],{"class":1131},"/zones/",[1062,2722,1193],{"class":1192},[1062,2724,2490],{"class":1113},[1062,2726,1199],{"class":1117},[1062,2728,2531],{"class":1202},[1062,2730,1219],{"class":1192},[1062,2732,2733],{"class":1131},"/purge_cache\"\n",[1062,2735,2736],{"class":1064,"line":1448},[1062,2737,2573],{"class":1079},[1062,2739,2740,2743,2745],{"class":1064,"line":1468},[1062,2741,2742],{"class":1075},"        if",[1062,2744,2612],{"class":1079},[1062,2746,2458],{"class":1117},[1062,2748,2749,2752,2754,2757,2759,2762,2764,2766,2768],{"class":1064,"line":1474},[1062,2750,2751],{"class":1079},"            data ",[1062,2753,2595],{"class":1117},[1062,2755,2756],{"class":1117}," {",[1062,2758,1135],{"class":1127},[1062,2760,2761],{"class":1131},"purge_everything",[1062,2763,1135],{"class":1127},[1062,2765,1138],{"class":1117},[1062,2767,1379],{"class":1378},[1062,2769,2062],{"class":1117},[1062,2771,2772,2775,2777],{"class":1064,"line":1518},[1062,2773,2774],{"class":1075},"        elif",[1062,2776,2591],{"class":1079},[1062,2778,2458],{"class":1117},[1062,2780,2781,2783,2785,2787,2789,2792,2794,2796,2798],{"class":1064,"line":1566},[1062,2782,2751],{"class":1079},[1062,2784,2595],{"class":1117},[1062,2786,2756],{"class":1117},[1062,2788,1135],{"class":1127},[1062,2790,2791],{"class":1131},"files",[1062,2793,1135],{"class":1127},[1062,2795,1138],{"class":1117},[1062,2797,2591],{"class":1079},[1062,2799,2062],{"class":1117},[1062,2801,2802,2804,2806],{"class":1064,"line":1572},[1062,2803,2774],{"class":1075},[1062,2805,2603],{"class":1079},[1062,2807,2458],{"class":1117},[1062,2809,2810,2812,2814,2816,2818,2821,2823,2825,2827],{"class":1064,"line":1578},[1062,2811,2751],{"class":1079},[1062,2813,2595],{"class":1117},[1062,2815,2756],{"class":1117},[1062,2817,1135],{"class":1127},[1062,2819,2820],{"class":1131},"tags",[1062,2822,1135],{"class":1127},[1062,2824,1138],{"class":1117},[1062,2826,2603],{"class":1079},[1062,2828,2062],{"class":1117},[1062,2830,2831,2834],{"class":1064,"line":1584},[1062,2832,2833],{"class":1075},"        else",[1062,2835,2458],{"class":1117},[1062,2837,2838,2841,2844,2846,2848,2851,2853],{"class":1064,"line":1598},[1062,2839,2840],{"class":1075},"            raise",[1062,2842,2843],{"class":1530}," ValueError",[1062,2845,1534],{"class":1117},[1062,2847,1489],{"class":1127},[1062,2849,2850],{"class":1131},"Must specify urls, tags, or purge_everything",[1062,2852,1489],{"class":1127},[1062,2854,2855],{"class":1117},")\n",[1062,2857,2858],{"class":1064,"line":1617},[1062,2859,2573],{"class":1079},[1062,2861,2862,2865,2867,2870,2872,2875,2877,2880,2882,2886,2888,2891,2893,2896,2898,2901],{"class":1064,"line":1658},[1062,2863,2864],{"class":1079},"        response ",[1062,2866,2595],{"class":1117},[1062,2868,2869],{"class":1079}," requests",[1062,2871,1199],{"class":1117},[1062,2873,2874],{"class":1537},"post",[1062,2876,1534],{"class":1117},[1062,2878,2879],{"class":1537},"url",[1062,2881,1462],{"class":1117},[1062,2883,2885],{"class":2884},"sqOPj"," json",[1062,2887,2595],{"class":1117},[1062,2889,2890],{"class":1537},"data",[1062,2892,1462],{"class":1117},[1062,2894,2895],{"class":2884}," headers",[1062,2897,2595],{"class":1117},[1062,2899,2900],{"class":1537},"headers",[1062,2902,2855],{"class":1117},[1062,2904,2905,2908,2910,2913],{"class":1064,"line":1671},[1062,2906,2907],{"class":1079},"        response",[1062,2909,1199],{"class":1117},[1062,2911,2912],{"class":1537},"raise_for_status",[1062,2914,2915],{"class":1117},"()\n",[1062,2917,2918],{"class":1064,"line":1691},[1062,2919,2573],{"class":1079},[1062,2921,2922,2925,2928,2930,2933],{"class":1064,"line":1704},[1062,2923,2924],{"class":1075},"        return",[1062,2926,2927],{"class":1079}," response",[1062,2929,1199],{"class":1117},[1062,2931,2932],{"class":1537},"json",[1062,2934,2915],{"class":1117},[1062,2936,2937],{"class":1064,"line":1720},[1062,2938,1575],{"class":1079},[1062,2940,2941,2943,2946,2948,2950,2952,2955],{"class":1064,"line":1735},[1062,2942,2480],{"class":1185},[1062,2944,2945],{"class":2580}," purge_url",[1062,2947,1534],{"class":1117},[1062,2949,2490],{"class":2489},[1062,2951,1462],{"class":1117},[1062,2953,2954],{"class":2590}," url",[1062,2956,2493],{"class":1117},[1062,2958,2959,2961,2964],{"class":1064,"line":1740},[1062,2960,2624],{"class":2463},[1062,2962,2963],{"class":2467},"Purge a specific URL from CloudFlare cache.",[1062,2965,2471],{"class":2463},[1062,2967,2968,2970,2973,2975,2978,2980,2983,2986,2988],{"class":1064,"line":1745},[1062,2969,2924],{"class":1075},[1062,2971,2972],{"class":1113}," self",[1062,2974,1199],{"class":1117},[1062,2976,2977],{"class":1537},"purge_cache",[1062,2979,1534],{"class":1117},[1062,2981,2982],{"class":2884},"urls",[1062,2984,2985],{"class":1117},"=[",[1062,2987,2879],{"class":1537},[1062,2989,2990],{"class":1117},"])\n",[1062,2992,2993],{"class":1064,"line":1765},[1062,2994,1575],{"class":1079},[1062,2996,2997,2999,3002,3004,3006,3008,3011],{"class":1064,"line":1770},[1062,2998,2480],{"class":1185},[1062,3000,3001],{"class":2580}," purge_tag",[1062,3003,1534],{"class":1117},[1062,3005,2490],{"class":2489},[1062,3007,1462],{"class":1117},[1062,3009,3010],{"class":2590}," tag",[1062,3012,2493],{"class":1117},[1062,3014,3015,3017,3020],{"class":1064,"line":1775},[1062,3016,2624],{"class":2463},[1062,3018,3019],{"class":2467},"Purge all URLs with a specific cache tag.",[1062,3021,2471],{"class":2463},[1062,3023,3024,3026,3028,3030,3032,3034,3036,3038,3041],{"class":1064,"line":1781},[1062,3025,2924],{"class":1075},[1062,3027,2972],{"class":1113},[1062,3029,1199],{"class":1117},[1062,3031,2977],{"class":1537},[1062,3033,1534],{"class":1117},[1062,3035,2820],{"class":2884},[1062,3037,2985],{"class":1117},[1062,3039,3040],{"class":1537},"tag",[1062,3042,2990],{"class":1117},[1062,3044,3045],{"class":1064,"line":1795},[1062,3046,1575],{"class":1079},[1062,3048,3049,3051,3054,3056,3058,3060,3063],{"class":1064,"line":1814},[1062,3050,2480],{"class":1185},[1062,3052,3053],{"class":2580}," set_cache_rules",[1062,3055,1534],{"class":1117},[1062,3057,2490],{"class":2489},[1062,3059,1462],{"class":1117},[1062,3061,3062],{"class":2590}," rules",[1062,3064,2493],{"class":1117},[1062,3066,3067,3069,3072],{"class":1064,"line":1855},[1062,3068,2624],{"class":2463},[1062,3070,3071],{"class":2467},"Set CloudFlare cache rules via API.",[1062,3073,2471],{"class":2463},[1062,3075,3076],{"class":1064,"line":1868},[1062,3077,3078],{"class":1068},"        # Implementation for setting cache rules\n",[1062,3080,3081],{"class":1064,"line":1887},[1062,3082,3083],{"class":1075},"        pass\n",[1062,3085,3086],{"class":1064,"line":1892},[1062,3087,1101],{"emptyLinePlaceholder":1100},[1062,3089,3090],{"class":1064,"line":1911},[1062,3091,3092],{"class":1068},"# Django middleware for CDN cache headers\n",[1062,3094,3095,3097,3100],{"class":1064,"line":1916},[1062,3096,2451],{"class":1185},[1062,3098,3099],{"class":2454}," CDNCacheMiddleware",[1062,3101,2458],{"class":1117},[1062,3103,3104,3106,3109],{"class":1064,"line":1921},[1062,3105,2464],{"class":2463},[1062,3107,3108],{"class":2467},"Add CDN-specific cache headers.",[1062,3110,2471],{"class":2463},[1062,3112,3113],{"class":1064,"line":1927},[1062,3114,1575],{"class":1079},[1062,3116,3117,3119,3121,3123,3125,3127,3130],{"class":1064,"line":1941},[1062,3118,2480],{"class":1185},[1062,3120,2484],{"class":2483},[1062,3122,1534],{"class":1117},[1062,3124,2490],{"class":2489},[1062,3126,1462],{"class":1117},[1062,3128,3129],{"class":2590}," get_response",[1062,3131,2493],{"class":1117},[1062,3133,3134,3136,3138,3141,3143],{"class":1064,"line":1961},[1062,3135,2498],{"class":1113},[1062,3137,1199],{"class":1117},[1062,3139,3140],{"class":1202},"get_response",[1062,3142,1118],{"class":1117},[1062,3144,3145],{"class":1079}," get_response\n",[1062,3147,3148,3150,3152,3155,3157,3159],{"class":1064,"line":1981},[1062,3149,2498],{"class":1113},[1062,3151,1199],{"class":1117},[1062,3153,3154],{"class":1202},"cf_cache",[1062,3156,1118],{"class":1117},[1062,3158,2455],{"class":1537},[1062,3160,2915],{"class":1117},[1062,3162,3163],{"class":1064,"line":2000},[1062,3164,1575],{"class":1079},[1062,3166,3167,3169,3172,3174,3176,3178,3181],{"class":1064,"line":2013},[1062,3168,2480],{"class":1185},[1062,3170,3171],{"class":2483}," __call__",[1062,3173,1534],{"class":1117},[1062,3175,2490],{"class":2489},[1062,3177,1462],{"class":1117},[1062,3179,3180],{"class":2590}," request",[1062,3182,2493],{"class":1117},[1062,3184,3185,3187,3189,3191,3193,3195,3197,3200],{"class":1064,"line":2030},[1062,3186,2864],{"class":1079},[1062,3188,2595],{"class":1117},[1062,3190,2972],{"class":1113},[1062,3192,1199],{"class":1117},[1062,3194,3140],{"class":1537},[1062,3196,1534],{"class":1117},[1062,3198,3199],{"class":1537},"request",[1062,3201,2855],{"class":1117},[1062,3203,3204],{"class":1064,"line":2047},[1062,3205,2573],{"class":1079},[1062,3207,3208],{"class":1064,"line":2053},[1062,3209,3210],{"class":1068},"        # Add cache tags for selective purging\n",[1062,3212,3213,3215,3218,3220,3222,3224,3226,3229,3231],{"class":1064,"line":2059},[1062,3214,2742],{"class":1075},[1062,3216,3217],{"class":2483}," hasattr",[1062,3219,1534],{"class":1117},[1062,3221,3199],{"class":1537},[1062,3223,1462],{"class":1117},[1062,3225,1156],{"class":1127},[1062,3227,3228],{"class":1131},"cache_tags",[1062,3230,1135],{"class":1127},[1062,3232,2493],{"class":1117},[1062,3234,3235,3238,3240,3242,3244,3246,3248,3251,3253,3255,3257,3259],{"class":1064,"line":2065},[1062,3236,3237],{"class":1079},"            cache_tags ",[1062,3239,2595],{"class":1117},[1062,3241,1156],{"class":1127},[1062,3243,1462],{"class":1131},[1062,3245,1135],{"class":1127},[1062,3247,1199],{"class":1117},[1062,3249,3250],{"class":1537},"join",[1062,3252,1534],{"class":1117},[1062,3254,3199],{"class":1537},[1062,3256,1199],{"class":1117},[1062,3258,3228],{"class":1202},[1062,3260,2855],{"class":1117},[1062,3262,3263,3266,3268,3270,3273,3275,3277,3279],{"class":1064,"line":2070},[1062,3264,3265],{"class":1079},"            response",[1062,3267,1206],{"class":1117},[1062,3269,1135],{"class":1127},[1062,3271,3272],{"class":1131},"Cache-Tag",[1062,3274,1135],{"class":1127},[1062,3276,1216],{"class":1117},[1062,3278,1118],{"class":1117},[1062,3280,3281],{"class":1079}," cache_tags\n",[1062,3283,3284],{"class":1064,"line":2076},[1062,3285,2573],{"class":1079},[1062,3287,3288],{"class":1064,"line":2092},[1062,3289,3290],{"class":1068},"        # Set appropriate cache headers based on content type\n",[1062,3292,3293,3295,3297,3299,3302,3304,3307,3309,3311,3314,3316],{"class":1064,"line":2106},[1062,3294,2742],{"class":1075},[1062,3296,3180],{"class":1079},[1062,3298,1199],{"class":1117},[1062,3300,3301],{"class":1202},"path",[1062,3303,1199],{"class":1117},[1062,3305,3306],{"class":1537},"startswith",[1062,3308,1534],{"class":1117},[1062,3310,1135],{"class":1127},[1062,3312,3313],{"class":1131},"/api/",[1062,3315,1135],{"class":1127},[1062,3317,2493],{"class":1117},[1062,3319,3320],{"class":1064,"line":2118},[1062,3321,3322],{"class":1068},"            # API responses - shorter cache times\n",[1062,3324,3325,3327,3329,3331,3334,3336,3338,3340,3342,3345],{"class":1064,"line":2123},[1062,3326,3265],{"class":1079},[1062,3328,1206],{"class":1117},[1062,3330,1135],{"class":1127},[1062,3332,3333],{"class":1131},"Cache-Control",[1062,3335,1135],{"class":1127},[1062,3337,1216],{"class":1117},[1062,3339,1118],{"class":1117},[1062,3341,1156],{"class":1127},[1062,3343,3344],{"class":1131},"public, max-age=300, s-maxage=600",[1062,3346,2089],{"class":1127},[1062,3348,3349,3351,3353,3355,3357,3359,3361,3363,3365,3368,3370],{"class":1064,"line":2129},[1062,3350,2774],{"class":1075},[1062,3352,3180],{"class":1079},[1062,3354,1199],{"class":1117},[1062,3356,3301],{"class":1202},[1062,3358,1199],{"class":1117},[1062,3360,3306],{"class":1537},[1062,3362,1534],{"class":1117},[1062,3364,1135],{"class":1127},[1062,3366,3367],{"class":1131},"/static/",[1062,3369,1135],{"class":1127},[1062,3371,2493],{"class":1117},[1062,3373,3374],{"class":1064,"line":2143},[1062,3375,3376],{"class":1068},"            # Static files - long cache times\n",[1062,3378,3379,3381,3383,3385,3387,3389,3391,3393,3395,3398],{"class":1064,"line":2155},[1062,3380,3265],{"class":1079},[1062,3382,1206],{"class":1117},[1062,3384,1135],{"class":1127},[1062,3386,3333],{"class":1131},[1062,3388,1135],{"class":1127},[1062,3390,1216],{"class":1117},[1062,3392,1118],{"class":1117},[1062,3394,1156],{"class":1127},[1062,3396,3397],{"class":1131},"public, max-age=31536000, immutable",[1062,3399,2089],{"class":1127},[1062,3401,3402,3404,3406,3408,3410,3412,3414,3416,3418,3421,3423],{"class":1064,"line":2190},[1062,3403,2774],{"class":1075},[1062,3405,3180],{"class":1079},[1062,3407,1199],{"class":1117},[1062,3409,3301],{"class":1202},[1062,3411,1199],{"class":1117},[1062,3413,3306],{"class":1537},[1062,3415,1534],{"class":1117},[1062,3417,1135],{"class":1127},[1062,3419,3420],{"class":1131},"/media/",[1062,3422,1135],{"class":1127},[1062,3424,2493],{"class":1117},[1062,3426,3427],{"class":1064,"line":2195},[1062,3428,3429],{"class":1068},"            # Media files - medium cache times\n",[1062,3431,3432,3434,3436,3438,3440,3442,3444,3446,3448,3451],{"class":1064,"line":2201},[1062,3433,3265],{"class":1079},[1062,3435,1206],{"class":1117},[1062,3437,1135],{"class":1127},[1062,3439,3333],{"class":1131},[1062,3441,1135],{"class":1127},[1062,3443,1216],{"class":1117},[1062,3445,1118],{"class":1117},[1062,3447,1156],{"class":1127},[1062,3449,3450],{"class":1131},"public, max-age=86400",[1062,3452,2089],{"class":1127},[1062,3454,3455,3457],{"class":1064,"line":2212},[1062,3456,2833],{"class":1075},[1062,3458,2458],{"class":1117},[1062,3460,3461],{"class":1064,"line":2222},[1062,3462,3463],{"class":1068},"            # HTML pages - moderate cache times\n",[1062,3465,3466,3468,3470,3472,3474,3476,3478,3480,3482,3485],{"class":1064,"line":2227},[1062,3467,3265],{"class":1079},[1062,3469,1206],{"class":1117},[1062,3471,1135],{"class":1127},[1062,3473,3333],{"class":1131},[1062,3475,1135],{"class":1127},[1062,3477,1216],{"class":1117},[1062,3479,1118],{"class":1117},[1062,3481,1156],{"class":1127},[1062,3483,3484],{"class":1131},"public, max-age=300, s-maxage=1800",[1062,3486,2089],{"class":1127},[1062,3488,3489],{"class":1064,"line":2233},[1062,3490,2573],{"class":1079},[1062,3492,3493,3495],{"class":1064,"line":2248},[1062,3494,2924],{"class":1075},[1062,3496,3497],{"class":1079}," response\n",[1062,3499,3500],{"class":1064,"line":2285},[1062,3501,1101],{"emptyLinePlaceholder":1100},[1062,3503,3504],{"class":1064,"line":2290},[1062,3505,3506],{"class":1068},"# Usage in views\n",[1062,3508,3509,3511,3513,3515,3518,3520,3523,3525,3527,3529],{"class":1064,"line":2296},[1062,3510,1086],{"class":1075},[1062,3512,2411],{"class":1079},[1062,3514,1199],{"class":1117},[1062,3516,3517],{"class":1079},"views",[1062,3519,1199],{"class":1117},[1062,3521,3522],{"class":1079},"decorators",[1062,3524,1199],{"class":1117},[1062,3526,2437],{"class":1079},[1062,3528,1076],{"class":1075},[1062,3530,3531],{"class":1079}," cache_control\n",[1062,3533,3534,3536,3538,3540,3542,3544,3546,3548,3551,3553],{"class":1064,"line":2311},[1062,3535,1086],{"class":1075},[1062,3537,2411],{"class":1079},[1062,3539,1199],{"class":1117},[1062,3541,3517],{"class":1079},[1062,3543,1199],{"class":1117},[1062,3545,3522],{"class":1079},[1062,3547,1199],{"class":1117},[1062,3549,3550],{"class":1079},"vary ",[1062,3552,1076],{"class":1075},[1062,3554,3555],{"class":1079}," vary_on_headers\n",[1062,3557,3558],{"class":1064,"line":2337},[1062,3559,1101],{"emptyLinePlaceholder":1100},[1062,3561,3562,3565,3568,3570,3573,3575,3578,3580,3583,3585,3588,3590,3593,3595,3598],{"class":1064,"line":2347},[1062,3563,3564],{"class":1117},"@",[1062,3566,3567],{"class":2580},"cache_control",[1062,3569,1534],{"class":1117},[1062,3571,3572],{"class":2884},"public",[1062,3574,2595],{"class":1117},[1062,3576,3577],{"class":1378},"True",[1062,3579,1462],{"class":1117},[1062,3581,3582],{"class":2884}," max_age",[1062,3584,2595],{"class":1117},[1062,3586,3587],{"class":1360},"3600",[1062,3589,1462],{"class":1117},[1062,3591,3592],{"class":2884}," s_maxage",[1062,3594,2595],{"class":1117},[1062,3596,3597],{"class":1360},"7200",[1062,3599,2855],{"class":1117},[1062,3601,3602,3604,3607,3609,3611,3614,3616,3618,3620,3623,3625],{"class":1064,"line":2371},[1062,3603,3564],{"class":1117},[1062,3605,3606],{"class":2580},"vary_on_headers",[1062,3608,1534],{"class":1117},[1062,3610,1135],{"class":1127},[1062,3612,3613],{"class":1131},"Accept-Language",[1062,3615,1135],{"class":1127},[1062,3617,1462],{"class":1117},[1062,3619,1156],{"class":1127},[1062,3621,3622],{"class":1131},"Accept-Encoding",[1062,3624,1135],{"class":1127},[1062,3626,2855],{"class":1117},[1062,3628,3630,3633,3636,3638,3640,3642,3645],{"class":1064,"line":3629},89,[1062,3631,3632],{"class":1185},"def",[1062,3634,3635],{"class":2580}," cached_blog_post",[1062,3637,1534],{"class":1117},[1062,3639,3199],{"class":2590},[1062,3641,1462],{"class":1117},[1062,3643,3644],{"class":2590}," slug",[1062,3646,2493],{"class":1117},[1062,3648,3650,3652,3655],{"class":1064,"line":3649},90,[1062,3651,2464],{"class":2463},[1062,3653,3654],{"class":2467},"Blog post with CDN caching.",[1062,3656,2471],{"class":2463},[1062,3658,3660,3663,3665,3668,3670,3673,3675,3677,3679,3682,3684,3687,3689,3691],{"class":1064,"line":3659},91,[1062,3661,3662],{"class":1079},"    post ",[1062,3664,2595],{"class":1117},[1062,3666,3667],{"class":1537}," get_object_or_404",[1062,3669,1534],{"class":1117},[1062,3671,3672],{"class":1537},"Post",[1062,3674,1462],{"class":1117},[1062,3676,3644],{"class":2884},[1062,3678,2595],{"class":1117},[1062,3680,3681],{"class":1537},"slug",[1062,3683,1462],{"class":1117},[1062,3685,3686],{"class":2884}," published",[1062,3688,2595],{"class":1117},[1062,3690,3577],{"class":1378},[1062,3692,2855],{"class":1117},[1062,3694,3696],{"class":1064,"line":3695},92,[1062,3697,1575],{"class":1079},[1062,3699,3701],{"class":1064,"line":3700},93,[1062,3702,3703],{"class":1068},"    # Add cache tags for selective purging\n",[1062,3705,3707,3710,3712,3714,3716],{"class":1064,"line":3706},94,[1062,3708,3709],{"class":1079},"    request",[1062,3711,1199],{"class":1117},[1062,3713,3228],{"class":1202},[1062,3715,1118],{"class":1117},[1062,3717,1179],{"class":1117},[1062,3719,3721,3724,3727,3729,3731,3733,3736,3738,3740],{"class":1064,"line":3720},95,[1062,3722,3723],{"class":1185},"        f",[1062,3725,3726],{"class":1131},"'post_",[1062,3728,1193],{"class":1192},[1062,3730,2874],{"class":1079},[1062,3732,1199],{"class":1117},[1062,3734,3735],{"class":1202},"id",[1062,3737,1219],{"class":1192},[1062,3739,1135],{"class":1131},[1062,3741,1164],{"class":1117},[1062,3743,3745,3747,3750,3752,3754,3756,3759,3761,3763,3765,3767],{"class":1064,"line":3744},96,[1062,3746,3723],{"class":1185},[1062,3748,3749],{"class":1131},"'category_",[1062,3751,1193],{"class":1192},[1062,3753,2874],{"class":1079},[1062,3755,1199],{"class":1117},[1062,3757,3758],{"class":1202},"category",[1062,3760,1199],{"class":1117},[1062,3762,3681],{"class":1202},[1062,3764,1219],{"class":1192},[1062,3766,1135],{"class":1131},[1062,3768,1164],{"class":1117},[1062,3770,3772,3774,3777,3779,3781,3783,3786,3788,3790,3792,3794],{"class":1064,"line":3771},97,[1062,3773,3723],{"class":1185},[1062,3775,3776],{"class":1131},"'author_",[1062,3778,1193],{"class":1192},[1062,3780,2874],{"class":1079},[1062,3782,1199],{"class":1117},[1062,3784,3785],{"class":1202},"author",[1062,3787,1199],{"class":1117},[1062,3789,3735],{"class":1202},[1062,3791,1219],{"class":1192},[1062,3793,1135],{"class":1131},[1062,3795,1164],{"class":1117},[1062,3797,3799],{"class":1064,"line":3798},98,[1062,3800,3801],{"class":1117},"    ]\n",[1062,3803,3805],{"class":1064,"line":3804},99,[1062,3806,1575],{"class":1079},[1062,3808,3810,3813,3815,3817,3819,3821,3823,3825,3828],{"class":1064,"line":3809},100,[1062,3811,3812],{"class":1079},"    context ",[1062,3814,2595],{"class":1117},[1062,3816,2756],{"class":1117},[1062,3818,1135],{"class":1127},[1062,3820,2874],{"class":1131},[1062,3822,1135],{"class":1127},[1062,3824,1138],{"class":1117},[1062,3826,3827],{"class":1079}," post",[1062,3829,2062],{"class":1117},[1062,3831,3833,3836,3839,3841,3843,3845,3847,3850,3852,3854,3857],{"class":1064,"line":3832},101,[1062,3834,3835],{"class":1075},"    return",[1062,3837,3838],{"class":1537}," render",[1062,3840,1534],{"class":1117},[1062,3842,3199],{"class":1537},[1062,3844,1462],{"class":1117},[1062,3846,1156],{"class":1127},[1062,3848,3849],{"class":1131},"blog/post_detail.html",[1062,3851,1135],{"class":1127},[1062,3853,1462],{"class":1117},[1062,3855,3856],{"class":1537}," context",[1062,3858,2855],{"class":1117},[1035,3860,3862],{"id":3861},"aws-cloudfront-configuration","AWS CloudFront Configuration",[1040,3864,3866],{"className":1056,"code":3865,"language":1058,"meta":1049,"style":1049},"# utils/cloudfront.py\nimport boto3\nimport json\nfrom django.conf import settings\n\nclass CloudFrontCache:\n    \"\"\"Manage AWS CloudFront cache operations.\"\"\"\n    \n    def __init__(self):\n        self.client = boto3.client(\n            'cloudfront',\n            aws_access_key_id=settings.AWS_ACCESS_KEY_ID,\n            aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY,\n            region_name='us-east-1'  # CloudFront is global but uses us-east-1\n        )\n        self.distribution_id = settings.CLOUDFRONT_DISTRIBUTION_ID\n    \n    def create_invalidation(self, paths):\n        \"\"\"Create CloudFront invalidation for specified paths.\"\"\"\n        if isinstance(paths, str):\n            paths = [paths]\n        \n        response = self.client.create_invalidation(\n            DistributionId=self.distribution_id,\n            InvalidationBatch={\n                'Paths': {\n                    'Quantity': len(paths),\n                    'Items': paths\n                },\n                'CallerReference': f\"django-invalidation-{int(time.time())}\"\n            }\n        )\n        \n        return response['Invalidation']['Id']\n    \n    def get_invalidation_status(self, invalidation_id):\n        \"\"\"Get status of CloudFront invalidation.\"\"\"\n        response = self.client.get_invalidation(\n            DistributionId=self.distribution_id,\n            Id=invalidation_id\n        )\n        \n        return response['Invalidation']['Status']\n    \n    def invalidate_post(self, post):\n        \"\"\"Invalidate CloudFront cache for a specific post.\"\"\"\n        paths = [\n            f'/blog/{post.slug}/',\n            f'/blog/category/{post.category.slug}/',\n            '/blog/',  # Blog list page\n            '/',       # Home page (if it includes recent posts)\n        ]\n        \n        return self.create_invalidation(paths)\n    \n    def invalidate_static_files(self, file_patterns):\n        \"\"\"Invalidate static files in CloudFront.\"\"\"\n        paths = [f'/static/{pattern}' for pattern in file_patterns]\n        return self.create_invalidation(paths)\n\n# Signal handlers for automatic CDN invalidation\nfrom django.db.models.signals import post_save, post_delete\nfrom django.dispatch import receiver\n\ncloudfront = CloudFrontCache()\n\n@receiver(post_save, sender=Post)\ndef invalidate_cdn_on_post_save(sender, instance, **kwargs):\n    \"\"\"Invalidate CDN cache when post is saved.\"\"\"\n    if instance.published:\n        try:\n            invalidation_id = cloudfront.invalidate_post(instance)\n            cache.set(f'invalidation_{instance.id}', invalidation_id, 3600)\n        except Exception as e:\n            # Log error but don't break the application\n            import logging\n            logger = logging.getLogger(__name__)\n            logger.error(f\"CDN invalidation failed: {e}\")\n",[1047,3867,3868,3873,3880,3887,3901,3905,3914,3923,3927,3939,3960,3971,3989,4005,4022,4027,4046,4050,4068,4077,4096,4110,4114,4133,4148,4156,4169,4191,4205,4210,4248,4253,4257,4261,4288,4292,4310,4319,4338,4352,4362,4366,4370,4395,4399,4416,4425,4434,4456,4481,4495,4509,4514,4518,4534,4538,4556,4565,4601,4617,4621,4626,4657,4673,4677,4688,4692,4715,4742,4751,4765,4772,4794,4834,4850,4855,4863,4886],{"__ignoreMap":1049},[1062,3869,3870],{"class":1064,"line":1065},[1062,3871,3872],{"class":1068},"# utils/cloudfront.py\n",[1062,3874,3875,3877],{"class":1064,"line":1072},[1062,3876,1076],{"class":1075},[1062,3878,3879],{"class":1079}," boto3\n",[1062,3881,3882,3884],{"class":1064,"line":1083},[1062,3883,1076],{"class":1075},[1062,3885,3886],{"class":1079}," json\n",[1062,3888,3889,3891,3893,3895,3897,3899],{"class":1064,"line":1097},[1062,3890,1086],{"class":1075},[1062,3892,2411],{"class":1079},[1062,3894,1199],{"class":1117},[1062,3896,2416],{"class":1079},[1062,3898,1076],{"class":1075},[1062,3900,2421],{"class":1079},[1062,3902,3903],{"class":1064,"line":1104},[1062,3904,1101],{"emptyLinePlaceholder":1100},[1062,3906,3907,3909,3912],{"class":1064,"line":1110},[1062,3908,2451],{"class":1185},[1062,3910,3911],{"class":2454}," CloudFrontCache",[1062,3913,2458],{"class":1117},[1062,3915,3916,3918,3921],{"class":1064,"line":1124},[1062,3917,2464],{"class":2463},[1062,3919,3920],{"class":2467},"Manage AWS CloudFront cache operations.",[1062,3922,2471],{"class":2463},[1062,3924,3925],{"class":1064,"line":1143},[1062,3926,1575],{"class":1079},[1062,3928,3929,3931,3933,3935,3937],{"class":1064,"line":1167},[1062,3930,2480],{"class":1185},[1062,3932,2484],{"class":2483},[1062,3934,1534],{"class":1117},[1062,3936,2490],{"class":2489},[1062,3938,2493],{"class":1117},[1062,3940,3941,3943,3945,3948,3950,3953,3955,3957],{"class":1064,"line":1182},[1062,3942,2498],{"class":1113},[1062,3944,1199],{"class":1117},[1062,3946,3947],{"class":1202},"client",[1062,3949,1118],{"class":1117},[1062,3951,3952],{"class":1079}," boto3",[1062,3954,1199],{"class":1117},[1062,3956,3947],{"class":1537},[1062,3958,3959],{"class":1117},"(\n",[1062,3961,3962,3964,3967,3969],{"class":1064,"line":1227},[1062,3963,1314],{"class":1127},[1062,3965,3966],{"class":1131},"cloudfront",[1062,3968,1135],{"class":1127},[1062,3970,1164],{"class":1117},[1062,3972,3973,3976,3978,3981,3983,3987],{"class":1064,"line":1259},[1062,3974,3975],{"class":2884},"            aws_access_key_id",[1062,3977,2595],{"class":1117},[1062,3979,3980],{"class":1537},"settings",[1062,3982,1199],{"class":1117},[1062,3984,3986],{"class":3985},"sFGJz","AWS_ACCESS_KEY_ID",[1062,3988,1164],{"class":1117},[1062,3990,3991,3994,3996,3998,4000,4003],{"class":1064,"line":1291},[1062,3992,3993],{"class":2884},"            aws_secret_access_key",[1062,3995,2595],{"class":1117},[1062,3997,3980],{"class":1537},[1062,3999,1199],{"class":1117},[1062,4001,4002],{"class":3985},"AWS_SECRET_ACCESS_KEY",[1062,4004,1164],{"class":1117},[1062,4006,4007,4010,4012,4014,4017,4019],{"class":1064,"line":1297},[1062,4008,4009],{"class":2884},"            region_name",[1062,4011,2595],{"class":1117},[1062,4013,1135],{"class":1127},[1062,4015,4016],{"class":1131},"us-east-1",[1062,4018,1135],{"class":1127},[1062,4020,4021],{"class":1068},"  # CloudFront is global but uses us-east-1\n",[1062,4023,4024],{"class":1064,"line":1311},[1062,4025,4026],{"class":1117},"        )\n",[1062,4028,4029,4031,4033,4036,4038,4041,4043],{"class":1064,"line":1333},[1062,4030,2498],{"class":1113},[1062,4032,1199],{"class":1117},[1062,4034,4035],{"class":1202},"distribution_id",[1062,4037,1118],{"class":1117},[1062,4039,4040],{"class":1079}," settings",[1062,4042,1199],{"class":1117},[1062,4044,4045],{"class":3985},"CLOUDFRONT_DISTRIBUTION_ID\n",[1062,4047,4048],{"class":1064,"line":1347},[1062,4049,1575],{"class":1079},[1062,4051,4052,4054,4057,4059,4061,4063,4066],{"class":1064,"line":1366},[1062,4053,2480],{"class":1185},[1062,4055,4056],{"class":2580}," create_invalidation",[1062,4058,1534],{"class":1117},[1062,4060,2490],{"class":2489},[1062,4062,1462],{"class":1117},[1062,4064,4065],{"class":2590}," paths",[1062,4067,2493],{"class":1117},[1062,4069,4070,4072,4075],{"class":1064,"line":1384},[1062,4071,2624],{"class":2463},[1062,4073,4074],{"class":2467},"Create CloudFront invalidation for specified paths.",[1062,4076,2471],{"class":2463},[1062,4078,4079,4081,4084,4086,4089,4091,4094],{"class":1064,"line":1400},[1062,4080,2742],{"class":1075},[1062,4082,4083],{"class":2483}," isinstance",[1062,4085,1534],{"class":1117},[1062,4087,4088],{"class":1537},"paths",[1062,4090,1462],{"class":1117},[1062,4092,4093],{"class":1530}," str",[1062,4095,2493],{"class":1117},[1062,4097,4098,4101,4103,4106,4108],{"class":1064,"line":1406},[1062,4099,4100],{"class":1079},"            paths ",[1062,4102,2595],{"class":1117},[1062,4104,4105],{"class":1117}," [",[1062,4107,4088],{"class":1079},[1062,4109,2334],{"class":1117},[1062,4111,4112],{"class":1064,"line":1427},[1062,4113,2573],{"class":1079},[1062,4115,4116,4118,4120,4122,4124,4126,4128,4131],{"class":1064,"line":1448},[1062,4117,2864],{"class":1079},[1062,4119,2595],{"class":1117},[1062,4121,2972],{"class":1113},[1062,4123,1199],{"class":1117},[1062,4125,3947],{"class":1202},[1062,4127,1199],{"class":1117},[1062,4129,4130],{"class":1537},"create_invalidation",[1062,4132,3959],{"class":1117},[1062,4134,4135,4138,4140,4142,4144,4146],{"class":1064,"line":1468},[1062,4136,4137],{"class":2884},"            DistributionId",[1062,4139,2595],{"class":1117},[1062,4141,2490],{"class":1113},[1062,4143,1199],{"class":1117},[1062,4145,4035],{"class":1202},[1062,4147,1164],{"class":1117},[1062,4149,4150,4153],{"class":1064,"line":1474},[1062,4151,4152],{"class":2884},"            InvalidationBatch",[1062,4154,4155],{"class":1117},"={\n",[1062,4157,4158,4160,4163,4165,4167],{"class":1064,"line":1518},[1062,4159,1350],{"class":1127},[1062,4161,4162],{"class":1131},"Paths",[1062,4164,1135],{"class":1127},[1062,4166,1138],{"class":1117},[1062,4168,1121],{"class":1117},[1062,4170,4171,4174,4177,4179,4181,4184,4186,4188],{"class":1064,"line":1566},[1062,4172,4173],{"class":1127},"                    '",[1062,4175,4176],{"class":1131},"Quantity",[1062,4178,1135],{"class":1127},[1062,4180,1138],{"class":1117},[1062,4182,4183],{"class":2483}," len",[1062,4185,1534],{"class":1117},[1062,4187,4088],{"class":1537},[1062,4189,4190],{"class":1117},"),\n",[1062,4192,4193,4195,4198,4200,4202],{"class":1064,"line":1572},[1062,4194,4173],{"class":1127},[1062,4196,4197],{"class":1131},"Items",[1062,4199,1135],{"class":1127},[1062,4201,1138],{"class":1117},[1062,4203,4204],{"class":1537}," paths\n",[1062,4206,4207],{"class":1064,"line":1578},[1062,4208,4209],{"class":1117},"                },\n",[1062,4211,4212,4214,4217,4219,4221,4223,4226,4228,4231,4233,4236,4238,4240,4243,4245],{"class":1064,"line":1584},[1062,4213,1350],{"class":1127},[1062,4215,4216],{"class":1131},"CallerReference",[1062,4218,1135],{"class":1127},[1062,4220,1138],{"class":1117},[1062,4222,1486],{"class":1185},[1062,4224,4225],{"class":1131},"\"django-invalidation-",[1062,4227,1193],{"class":1192},[1062,4229,4230],{"class":1530},"int",[1062,4232,1534],{"class":1117},[1062,4234,4235],{"class":1537},"time",[1062,4237,1199],{"class":1117},[1062,4239,4235],{"class":1537},[1062,4241,4242],{"class":1117},"())",[1062,4244,1219],{"class":1192},[1062,4246,4247],{"class":1131},"\"\n",[1062,4249,4250],{"class":1064,"line":1598},[1062,4251,4252],{"class":1117},"            }\n",[1062,4254,4255],{"class":1064,"line":1617},[1062,4256,4026],{"class":1117},[1062,4258,4259],{"class":1064,"line":1658},[1062,4260,2573],{"class":1079},[1062,4262,4263,4265,4267,4269,4271,4274,4276,4279,4281,4284,4286],{"class":1064,"line":1671},[1062,4264,2924],{"class":1075},[1062,4266,2927],{"class":1079},[1062,4268,1206],{"class":1117},[1062,4270,1135],{"class":1127},[1062,4272,4273],{"class":1131},"Invalidation",[1062,4275,1135],{"class":1127},[1062,4277,4278],{"class":1117},"][",[1062,4280,1135],{"class":1127},[1062,4282,4283],{"class":1131},"Id",[1062,4285,1135],{"class":1127},[1062,4287,2334],{"class":1117},[1062,4289,4290],{"class":1064,"line":1691},[1062,4291,1575],{"class":1079},[1062,4293,4294,4296,4299,4301,4303,4305,4308],{"class":1064,"line":1704},[1062,4295,2480],{"class":1185},[1062,4297,4298],{"class":2580}," get_invalidation_status",[1062,4300,1534],{"class":1117},[1062,4302,2490],{"class":2489},[1062,4304,1462],{"class":1117},[1062,4306,4307],{"class":2590}," invalidation_id",[1062,4309,2493],{"class":1117},[1062,4311,4312,4314,4317],{"class":1064,"line":1720},[1062,4313,2624],{"class":2463},[1062,4315,4316],{"class":2467},"Get status of CloudFront invalidation.",[1062,4318,2471],{"class":2463},[1062,4320,4321,4323,4325,4327,4329,4331,4333,4336],{"class":1064,"line":1735},[1062,4322,2864],{"class":1079},[1062,4324,2595],{"class":1117},[1062,4326,2972],{"class":1113},[1062,4328,1199],{"class":1117},[1062,4330,3947],{"class":1202},[1062,4332,1199],{"class":1117},[1062,4334,4335],{"class":1537},"get_invalidation",[1062,4337,3959],{"class":1117},[1062,4339,4340,4342,4344,4346,4348,4350],{"class":1064,"line":1740},[1062,4341,4137],{"class":2884},[1062,4343,2595],{"class":1117},[1062,4345,2490],{"class":1113},[1062,4347,1199],{"class":1117},[1062,4349,4035],{"class":1202},[1062,4351,1164],{"class":1117},[1062,4353,4354,4357,4359],{"class":1064,"line":1745},[1062,4355,4356],{"class":2884},"            Id",[1062,4358,2595],{"class":1117},[1062,4360,4361],{"class":1537},"invalidation_id\n",[1062,4363,4364],{"class":1064,"line":1765},[1062,4365,4026],{"class":1117},[1062,4367,4368],{"class":1064,"line":1770},[1062,4369,2573],{"class":1079},[1062,4371,4372,4374,4376,4378,4380,4382,4384,4386,4388,4391,4393],{"class":1064,"line":1775},[1062,4373,2924],{"class":1075},[1062,4375,2927],{"class":1079},[1062,4377,1206],{"class":1117},[1062,4379,1135],{"class":1127},[1062,4381,4273],{"class":1131},[1062,4383,1135],{"class":1127},[1062,4385,4278],{"class":1117},[1062,4387,1135],{"class":1127},[1062,4389,4390],{"class":1131},"Status",[1062,4392,1135],{"class":1127},[1062,4394,2334],{"class":1117},[1062,4396,4397],{"class":1064,"line":1781},[1062,4398,1575],{"class":1079},[1062,4400,4401,4403,4406,4408,4410,4412,4414],{"class":1064,"line":1795},[1062,4402,2480],{"class":1185},[1062,4404,4405],{"class":2580}," invalidate_post",[1062,4407,1534],{"class":1117},[1062,4409,2490],{"class":2489},[1062,4411,1462],{"class":1117},[1062,4413,3827],{"class":2590},[1062,4415,2493],{"class":1117},[1062,4417,4418,4420,4423],{"class":1064,"line":1814},[1062,4419,2624],{"class":2463},[1062,4421,4422],{"class":2467},"Invalidate CloudFront cache for a specific post.",[1062,4424,2471],{"class":2463},[1062,4426,4427,4430,4432],{"class":1064,"line":1855},[1062,4428,4429],{"class":1079},"        paths ",[1062,4431,2595],{"class":1117},[1062,4433,1179],{"class":1117},[1062,4435,4436,4438,4441,4443,4445,4447,4449,4451,4454],{"class":1064,"line":1868},[1062,4437,1186],{"class":1185},[1062,4439,4440],{"class":1131},"'/blog/",[1062,4442,1193],{"class":1192},[1062,4444,2874],{"class":1079},[1062,4446,1199],{"class":1117},[1062,4448,3681],{"class":1202},[1062,4450,1219],{"class":1192},[1062,4452,4453],{"class":1131},"/'",[1062,4455,1164],{"class":1117},[1062,4457,4458,4460,4463,4465,4467,4469,4471,4473,4475,4477,4479],{"class":1064,"line":1887},[1062,4459,1186],{"class":1185},[1062,4461,4462],{"class":1131},"'/blog/category/",[1062,4464,1193],{"class":1192},[1062,4466,2874],{"class":1079},[1062,4468,1199],{"class":1117},[1062,4470,3758],{"class":1202},[1062,4472,1199],{"class":1117},[1062,4474,3681],{"class":1202},[1062,4476,1219],{"class":1192},[1062,4478,4453],{"class":1131},[1062,4480,1164],{"class":1117},[1062,4482,4483,4485,4488,4490,4492],{"class":1064,"line":1892},[1062,4484,1314],{"class":1127},[1062,4486,4487],{"class":1131},"/blog/",[1062,4489,1135],{"class":1127},[1062,4491,1462],{"class":1117},[1062,4493,4494],{"class":1068},"  # Blog list page\n",[1062,4496,4497,4499,4502,4504,4506],{"class":1064,"line":1911},[1062,4498,1314],{"class":1127},[1062,4500,4501],{"class":1131},"/",[1062,4503,1135],{"class":1127},[1062,4505,1462],{"class":1117},[1062,4507,4508],{"class":1068},"       # Home page (if it includes recent posts)\n",[1062,4510,4511],{"class":1064,"line":1916},[1062,4512,4513],{"class":1117},"        ]\n",[1062,4515,4516],{"class":1064,"line":1921},[1062,4517,2573],{"class":1079},[1062,4519,4520,4522,4524,4526,4528,4530,4532],{"class":1064,"line":1927},[1062,4521,2924],{"class":1075},[1062,4523,2972],{"class":1113},[1062,4525,1199],{"class":1117},[1062,4527,4130],{"class":1537},[1062,4529,1534],{"class":1117},[1062,4531,4088],{"class":1537},[1062,4533,2855],{"class":1117},[1062,4535,4536],{"class":1064,"line":1941},[1062,4537,1575],{"class":1079},[1062,4539,4540,4542,4545,4547,4549,4551,4554],{"class":1064,"line":1961},[1062,4541,2480],{"class":1185},[1062,4543,4544],{"class":2580}," invalidate_static_files",[1062,4546,1534],{"class":1117},[1062,4548,2490],{"class":2489},[1062,4550,1462],{"class":1117},[1062,4552,4553],{"class":2590}," file_patterns",[1062,4555,2493],{"class":1117},[1062,4557,4558,4560,4563],{"class":1064,"line":1981},[1062,4559,2624],{"class":2463},[1062,4561,4562],{"class":2467},"Invalidate static files in CloudFront.",[1062,4564,2471],{"class":2463},[1062,4566,4567,4569,4571,4573,4576,4579,4581,4584,4586,4588,4591,4594,4597,4599],{"class":1064,"line":2000},[1062,4568,4429],{"class":1079},[1062,4570,2595],{"class":1117},[1062,4572,4105],{"class":1117},[1062,4574,4575],{"class":1185},"f",[1062,4577,4578],{"class":1131},"'/static/",[1062,4580,1193],{"class":1192},[1062,4582,4583],{"class":1079},"pattern",[1062,4585,1219],{"class":1192},[1062,4587,1135],{"class":1131},[1062,4589,4590],{"class":1075}," for",[1062,4592,4593],{"class":1079}," pattern ",[1062,4595,4596],{"class":1075},"in",[1062,4598,4553],{"class":1079},[1062,4600,2334],{"class":1117},[1062,4602,4603,4605,4607,4609,4611,4613,4615],{"class":1064,"line":2013},[1062,4604,2924],{"class":1075},[1062,4606,2972],{"class":1113},[1062,4608,1199],{"class":1117},[1062,4610,4130],{"class":1537},[1062,4612,1534],{"class":1117},[1062,4614,4088],{"class":1537},[1062,4616,2855],{"class":1117},[1062,4618,4619],{"class":1064,"line":2030},[1062,4620,1101],{"emptyLinePlaceholder":1100},[1062,4622,4623],{"class":1064,"line":2047},[1062,4624,4625],{"class":1068},"# Signal handlers for automatic CDN invalidation\n",[1062,4627,4628,4630,4632,4634,4637,4639,4642,4644,4647,4649,4652,4654],{"class":1064,"line":2053},[1062,4629,1086],{"class":1075},[1062,4631,2411],{"class":1079},[1062,4633,1199],{"class":1117},[1062,4635,4636],{"class":1079},"db",[1062,4638,1199],{"class":1117},[1062,4640,4641],{"class":1079},"models",[1062,4643,1199],{"class":1117},[1062,4645,4646],{"class":1079},"signals ",[1062,4648,1076],{"class":1075},[1062,4650,4651],{"class":1079}," post_save",[1062,4653,1462],{"class":1117},[1062,4655,4656],{"class":1079}," post_delete\n",[1062,4658,4659,4661,4663,4665,4668,4670],{"class":1064,"line":2059},[1062,4660,1086],{"class":1075},[1062,4662,2411],{"class":1079},[1062,4664,1199],{"class":1117},[1062,4666,4667],{"class":1079},"dispatch ",[1062,4669,1076],{"class":1075},[1062,4671,4672],{"class":1079}," receiver\n",[1062,4674,4675],{"class":1064,"line":2065},[1062,4676,1101],{"emptyLinePlaceholder":1100},[1062,4678,4679,4682,4684,4686],{"class":1064,"line":2070},[1062,4680,4681],{"class":1079},"cloudfront ",[1062,4683,2595],{"class":1117},[1062,4685,3911],{"class":1537},[1062,4687,2915],{"class":1117},[1062,4689,4690],{"class":1064,"line":2076},[1062,4691,1101],{"emptyLinePlaceholder":1100},[1062,4693,4694,4696,4699,4701,4704,4706,4709,4711,4713],{"class":1064,"line":2092},[1062,4695,3564],{"class":1117},[1062,4697,4698],{"class":2580},"receiver",[1062,4700,1534],{"class":1117},[1062,4702,4703],{"class":1537},"post_save",[1062,4705,1462],{"class":1117},[1062,4707,4708],{"class":2884}," sender",[1062,4710,2595],{"class":1117},[1062,4712,3672],{"class":1537},[1062,4714,2855],{"class":1117},[1062,4716,4717,4719,4722,4724,4727,4729,4732,4734,4737,4740],{"class":1064,"line":2106},[1062,4718,3632],{"class":1185},[1062,4720,4721],{"class":2580}," invalidate_cdn_on_post_save",[1062,4723,1534],{"class":1117},[1062,4725,4726],{"class":2590},"sender",[1062,4728,1462],{"class":1117},[1062,4730,4731],{"class":2590}," instance",[1062,4733,1462],{"class":1117},[1062,4735,4736],{"class":2594}," **",[1062,4738,4739],{"class":2590},"kwargs",[1062,4741,2493],{"class":1117},[1062,4743,4744,4746,4749],{"class":1064,"line":2118},[1062,4745,2464],{"class":2463},[1062,4747,4748],{"class":2467},"Invalidate CDN cache when post is saved.",[1062,4750,2471],{"class":2463},[1062,4752,4753,4756,4758,4760,4763],{"class":1064,"line":2123},[1062,4754,4755],{"class":1075},"    if",[1062,4757,4731],{"class":1079},[1062,4759,1199],{"class":1117},[1062,4761,4762],{"class":1202},"published",[1062,4764,2458],{"class":1117},[1062,4766,4767,4770],{"class":1064,"line":2129},[1062,4768,4769],{"class":1075},"        try",[1062,4771,2458],{"class":1117},[1062,4773,4774,4777,4779,4782,4784,4787,4789,4792],{"class":1064,"line":2143},[1062,4775,4776],{"class":1079},"            invalidation_id ",[1062,4778,2595],{"class":1117},[1062,4780,4781],{"class":1079}," cloudfront",[1062,4783,1199],{"class":1117},[1062,4785,4786],{"class":1537},"invalidate_post",[1062,4788,1534],{"class":1117},[1062,4790,4791],{"class":1537},"instance",[1062,4793,2855],{"class":1117},[1062,4795,4796,4799,4801,4804,4806,4808,4811,4813,4815,4817,4819,4821,4823,4825,4827,4829,4832],{"class":1064,"line":2155},[1062,4797,4798],{"class":1079},"            cache",[1062,4800,1199],{"class":1117},[1062,4802,4803],{"class":1537},"set",[1062,4805,1534],{"class":1117},[1062,4807,4575],{"class":1185},[1062,4809,4810],{"class":1131},"'invalidation_",[1062,4812,1193],{"class":1192},[1062,4814,4791],{"class":1537},[1062,4816,1199],{"class":1117},[1062,4818,3735],{"class":1202},[1062,4820,1219],{"class":1192},[1062,4822,1135],{"class":1131},[1062,4824,1462],{"class":1117},[1062,4826,4307],{"class":1537},[1062,4828,1462],{"class":1117},[1062,4830,4831],{"class":1360}," 3600",[1062,4833,2855],{"class":1117},[1062,4835,4836,4839,4842,4845,4848],{"class":1064,"line":2190},[1062,4837,4838],{"class":1075},"        except",[1062,4840,4841],{"class":1530}," Exception",[1062,4843,4844],{"class":1075}," as",[1062,4846,4847],{"class":1079}," e",[1062,4849,2458],{"class":1117},[1062,4851,4852],{"class":1064,"line":2195},[1062,4853,4854],{"class":1068},"            # Log error but don't break the application\n",[1062,4856,4857,4860],{"class":1064,"line":2201},[1062,4858,4859],{"class":1075},"            import",[1062,4861,4862],{"class":1079}," logging\n",[1062,4864,4865,4868,4870,4873,4875,4878,4880,4884],{"class":1064,"line":2212},[1062,4866,4867],{"class":1079},"            logger ",[1062,4869,2595],{"class":1117},[1062,4871,4872],{"class":1079}," logging",[1062,4874,1199],{"class":1117},[1062,4876,4877],{"class":1537},"getLogger",[1062,4879,1534],{"class":1117},[1062,4881,4883],{"class":4882},"s131V","__name__",[1062,4885,2855],{"class":1117},[1062,4887,4888,4891,4893,4896,4898,4900,4903,4905,4908,4910,4912],{"class":1064,"line":2222},[1062,4889,4890],{"class":1079},"            logger",[1062,4892,1199],{"class":1117},[1062,4894,4895],{"class":1537},"error",[1062,4897,1534],{"class":1117},[1062,4899,4575],{"class":1185},[1062,4901,4902],{"class":1131},"\"CDN invalidation failed: ",[1062,4904,1193],{"class":1192},[1062,4906,4907],{"class":1537},"e",[1062,4909,1219],{"class":1192},[1062,4911,1489],{"class":1131},[1062,4913,2855],{"class":1117},[1030,4915,4917],{"id":4916},"reverse-proxy-caching","Reverse Proxy Caching",[1035,4919,4921],{"id":4920},"nginx-configuration","Nginx Configuration",[1040,4923,4927],{"className":4924,"code":4925,"language":4926,"meta":1049,"style":1049},"language-nginx shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# /etc/nginx/sites-available/django-app\nupstream django_app {\n    server 127.0.0.1:8000;\n    server 127.0.0.1:8001;\n    server 127.0.0.1:8002;\n    keepalive 32;\n}\n\n# Cache configuration\nproxy_cache_path /var/cache/nginx/django \n                 levels=1:2 \n                 keys_zone=django_cache:100m \n                 max_size=10g \n                 inactive=60m \n                 use_temp_path=off;\n\n# Rate limiting\nlimit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;\nlimit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;\n\nserver {\n    listen 80;\n    server_name example.com www.example.com;\n    \n    # Security headers\n    add_header X-Frame-Options DENY;\n    add_header X-Content-Type-Options nosniff;\n    add_header X-XSS-Protection \"1; mode=block\";\n    add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains\";\n    \n    # Gzip compression\n    gzip on;\n    gzip_vary on;\n    gzip_min_length 1024;\n    gzip_types\n        text/plain\n        text/css\n        text/xml\n        text/javascript\n        application/javascript\n        application/xml+rss\n        application/json;\n    \n    # Static files with long cache times\n    location /static/ {\n        alias /app/staticfiles/;\n        expires 1y;\n        add_header Cache-Control \"public, immutable\";\n        \n        # Brotli compression for static files\n        location ~* \\.(js|css)$ {\n            add_header Content-Encoding br;\n            add_header Vary \"Accept-Encoding\";\n        }\n    }\n    \n    # Media files with moderate cache times\n    location /media/ {\n        alias /app/media/;\n        expires 30d;\n        add_header Cache-Control \"public\";\n    }\n    \n    # API endpoints with short cache times\n    location /api/ {\n        limit_req zone=api burst=20 nodelay;\n        \n        proxy_cache django_cache;\n        proxy_cache_key \"$scheme$request_method$host$request_uri\";\n        proxy_cache_valid 200 302 5m;\n        proxy_cache_valid 404 1m;\n        proxy_cache_bypass $http_cache_control;\n        \n        add_header X-Cache-Status $upstream_cache_status;\n        \n        proxy_pass http://django_app;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n    \n    # Authentication endpoints with rate limiting\n    location ~ ^/(login|register|password-reset)/ {\n        limit_req zone=login burst=5 nodelay;\n        \n        proxy_pass http://django_app;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n    \n    # Main application with caching\n    location / {\n        # Cache configuration\n        proxy_cache django_cache;\n        proxy_cache_key \"$scheme$request_method$host$request_uri$is_args$args\";\n        proxy_cache_valid 200 302 10m;\n        proxy_cache_valid 404 5m;\n        \n        # Cache bypass conditions\n        proxy_cache_bypass $cookie_sessionid;\n        proxy_cache_bypass $http_authorization;\n        proxy_cache_bypass $arg_nocache;\n        \n        # Don't cache if user is authenticated\n        proxy_no_cache $cookie_sessionid;\n        \n        add_header X-Cache-Status $upstream_cache_status;\n        \n        proxy_pass http://django_app;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n        \n        # Connection settings\n        proxy_connect_timeout 30s;\n        proxy_send_timeout 30s;\n        proxy_read_timeout 30s;\n        proxy_buffering on;\n        proxy_buffer_size 4k;\n        proxy_buffers 8 4k;\n    }\n    \n    # Health check endpoint (no caching)\n    location /health/ {\n        proxy_pass http://django_app;\n        proxy_set_header Host $host;\n        access_log off;\n    }\n    \n    # Cache purge endpoint (restricted access)\n    location ~ /purge(/.*) {\n        allow 127.0.0.1;\n        allow 10.0.0.0/8;\n        deny all;\n        \n        proxy_cache_purge django_cache \"$scheme$request_method$host$1\";\n    }\n}\n\n# SSL configuration (separate server block)\nserver {\n    listen 443 ssl http2;\n    server_name example.com www.example.com;\n    \n    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;\n    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;\n    \n    # SSL optimization\n    ssl_session_cache shared:SSL:10m;\n    ssl_session_timeout 10m;\n    ssl_protocols TLSv1.2 TLSv1.3;\n    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;\n    ssl_prefer_server_ciphers off;\n    \n    # Include the same location blocks as HTTP server\n    # ... (same as above)\n}\n","nginx",[1047,4928,4929,4934,4939,4944,4949,4954,4959,4963,4967,4972,4977,4982,4987,4992,4997,5002,5006,5011,5016,5021,5025,5030,5035,5040,5044,5049,5054,5059,5064,5069,5073,5078,5083,5088,5093,5098,5103,5108,5113,5118,5123,5128,5133,5137,5142,5147,5152,5157,5162,5166,5171,5176,5181,5186,5190,5194,5198,5203,5208,5213,5218,5223,5227,5231,5236,5241,5246,5250,5255,5260,5265,5270,5275,5279,5284,5288,5293,5298,5303,5308,5313,5317,5321,5326,5331,5336,5340,5344,5348,5352,5356,5360,5364,5368,5373,5378,5383,5387,5392,5397,5402,5406,5412,5418,5424,5430,5435,5441,5447,5452,5457,5462,5467,5472,5477,5482,5487,5492,5498,5504,5510,5516,5522,5528,5534,5539,5544,5550,5556,5561,5566,5572,5577,5582,5588,5594,5600,5606,5612,5617,5623,5628,5633,5638,5644,5649,5655,5660,5665,5671,5677,5682,5688,5694,5700,5706,5712,5718,5723,5729,5735],{"__ignoreMap":1049},[1062,4930,4931],{"class":1064,"line":1065},[1062,4932,4933],{},"# /etc/nginx/sites-available/django-app\n",[1062,4935,4936],{"class":1064,"line":1072},[1062,4937,4938],{},"upstream django_app {\n",[1062,4940,4941],{"class":1064,"line":1083},[1062,4942,4943],{},"    server 127.0.0.1:8000;\n",[1062,4945,4946],{"class":1064,"line":1097},[1062,4947,4948],{},"    server 127.0.0.1:8001;\n",[1062,4950,4951],{"class":1064,"line":1104},[1062,4952,4953],{},"    server 127.0.0.1:8002;\n",[1062,4955,4956],{"class":1064,"line":1110},[1062,4957,4958],{},"    keepalive 32;\n",[1062,4960,4961],{"class":1064,"line":1124},[1062,4962,2062],{},[1062,4964,4965],{"class":1064,"line":1143},[1062,4966,1101],{"emptyLinePlaceholder":1100},[1062,4968,4969],{"class":1064,"line":1167},[1062,4970,4971],{},"# Cache configuration\n",[1062,4973,4974],{"class":1064,"line":1182},[1062,4975,4976],{},"proxy_cache_path /var/cache/nginx/django \n",[1062,4978,4979],{"class":1064,"line":1227},[1062,4980,4981],{},"                 levels=1:2 \n",[1062,4983,4984],{"class":1064,"line":1259},[1062,4985,4986],{},"                 keys_zone=django_cache:100m \n",[1062,4988,4989],{"class":1064,"line":1291},[1062,4990,4991],{},"                 max_size=10g \n",[1062,4993,4994],{"class":1064,"line":1297},[1062,4995,4996],{},"                 inactive=60m \n",[1062,4998,4999],{"class":1064,"line":1311},[1062,5000,5001],{},"                 use_temp_path=off;\n",[1062,5003,5004],{"class":1064,"line":1333},[1062,5005,1101],{"emptyLinePlaceholder":1100},[1062,5007,5008],{"class":1064,"line":1347},[1062,5009,5010],{},"# Rate limiting\n",[1062,5012,5013],{"class":1064,"line":1366},[1062,5014,5015],{},"limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;\n",[1062,5017,5018],{"class":1064,"line":1384},[1062,5019,5020],{},"limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;\n",[1062,5022,5023],{"class":1064,"line":1400},[1062,5024,1101],{"emptyLinePlaceholder":1100},[1062,5026,5027],{"class":1064,"line":1406},[1062,5028,5029],{},"server {\n",[1062,5031,5032],{"class":1064,"line":1427},[1062,5033,5034],{},"    listen 80;\n",[1062,5036,5037],{"class":1064,"line":1448},[1062,5038,5039],{},"    server_name example.com www.example.com;\n",[1062,5041,5042],{"class":1064,"line":1468},[1062,5043,1575],{},[1062,5045,5046],{"class":1064,"line":1474},[1062,5047,5048],{},"    # Security headers\n",[1062,5050,5051],{"class":1064,"line":1518},[1062,5052,5053],{},"    add_header X-Frame-Options DENY;\n",[1062,5055,5056],{"class":1064,"line":1566},[1062,5057,5058],{},"    add_header X-Content-Type-Options nosniff;\n",[1062,5060,5061],{"class":1064,"line":1572},[1062,5062,5063],{},"    add_header X-XSS-Protection \"1; mode=block\";\n",[1062,5065,5066],{"class":1064,"line":1578},[1062,5067,5068],{},"    add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains\";\n",[1062,5070,5071],{"class":1064,"line":1584},[1062,5072,1575],{},[1062,5074,5075],{"class":1064,"line":1598},[1062,5076,5077],{},"    # Gzip compression\n",[1062,5079,5080],{"class":1064,"line":1617},[1062,5081,5082],{},"    gzip on;\n",[1062,5084,5085],{"class":1064,"line":1658},[1062,5086,5087],{},"    gzip_vary on;\n",[1062,5089,5090],{"class":1064,"line":1671},[1062,5091,5092],{},"    gzip_min_length 1024;\n",[1062,5094,5095],{"class":1064,"line":1691},[1062,5096,5097],{},"    gzip_types\n",[1062,5099,5100],{"class":1064,"line":1704},[1062,5101,5102],{},"        text/plain\n",[1062,5104,5105],{"class":1064,"line":1720},[1062,5106,5107],{},"        text/css\n",[1062,5109,5110],{"class":1064,"line":1735},[1062,5111,5112],{},"        text/xml\n",[1062,5114,5115],{"class":1064,"line":1740},[1062,5116,5117],{},"        text/javascript\n",[1062,5119,5120],{"class":1064,"line":1745},[1062,5121,5122],{},"        application/javascript\n",[1062,5124,5125],{"class":1064,"line":1765},[1062,5126,5127],{},"        application/xml+rss\n",[1062,5129,5130],{"class":1064,"line":1770},[1062,5131,5132],{},"        application/json;\n",[1062,5134,5135],{"class":1064,"line":1775},[1062,5136,1575],{},[1062,5138,5139],{"class":1064,"line":1781},[1062,5140,5141],{},"    # Static files with long cache times\n",[1062,5143,5144],{"class":1064,"line":1795},[1062,5145,5146],{},"    location /static/ {\n",[1062,5148,5149],{"class":1064,"line":1814},[1062,5150,5151],{},"        alias /app/staticfiles/;\n",[1062,5153,5154],{"class":1064,"line":1855},[1062,5155,5156],{},"        expires 1y;\n",[1062,5158,5159],{"class":1064,"line":1868},[1062,5160,5161],{},"        add_header Cache-Control \"public, immutable\";\n",[1062,5163,5164],{"class":1064,"line":1887},[1062,5165,2573],{},[1062,5167,5168],{"class":1064,"line":1892},[1062,5169,5170],{},"        # Brotli compression for static files\n",[1062,5172,5173],{"class":1064,"line":1911},[1062,5174,5175],{},"        location ~* \\.(js|css)$ {\n",[1062,5177,5178],{"class":1064,"line":1916},[1062,5179,5180],{},"            add_header Content-Encoding br;\n",[1062,5182,5183],{"class":1064,"line":1921},[1062,5184,5185],{},"            add_header Vary \"Accept-Encoding\";\n",[1062,5187,5188],{"class":1064,"line":1927},[1062,5189,2050],{},[1062,5191,5192],{"class":1064,"line":1941},[1062,5193,2056],{},[1062,5195,5196],{"class":1064,"line":1961},[1062,5197,1575],{},[1062,5199,5200],{"class":1064,"line":1981},[1062,5201,5202],{},"    # Media files with moderate cache times\n",[1062,5204,5205],{"class":1064,"line":2000},[1062,5206,5207],{},"    location /media/ {\n",[1062,5209,5210],{"class":1064,"line":2013},[1062,5211,5212],{},"        alias /app/media/;\n",[1062,5214,5215],{"class":1064,"line":2030},[1062,5216,5217],{},"        expires 30d;\n",[1062,5219,5220],{"class":1064,"line":2047},[1062,5221,5222],{},"        add_header Cache-Control \"public\";\n",[1062,5224,5225],{"class":1064,"line":2053},[1062,5226,2056],{},[1062,5228,5229],{"class":1064,"line":2059},[1062,5230,1575],{},[1062,5232,5233],{"class":1064,"line":2065},[1062,5234,5235],{},"    # API endpoints with short cache times\n",[1062,5237,5238],{"class":1064,"line":2070},[1062,5239,5240],{},"    location /api/ {\n",[1062,5242,5243],{"class":1064,"line":2076},[1062,5244,5245],{},"        limit_req zone=api burst=20 nodelay;\n",[1062,5247,5248],{"class":1064,"line":2092},[1062,5249,2573],{},[1062,5251,5252],{"class":1064,"line":2106},[1062,5253,5254],{},"        proxy_cache django_cache;\n",[1062,5256,5257],{"class":1064,"line":2118},[1062,5258,5259],{},"        proxy_cache_key \"$scheme$request_method$host$request_uri\";\n",[1062,5261,5262],{"class":1064,"line":2123},[1062,5263,5264],{},"        proxy_cache_valid 200 302 5m;\n",[1062,5266,5267],{"class":1064,"line":2129},[1062,5268,5269],{},"        proxy_cache_valid 404 1m;\n",[1062,5271,5272],{"class":1064,"line":2143},[1062,5273,5274],{},"        proxy_cache_bypass $http_cache_control;\n",[1062,5276,5277],{"class":1064,"line":2155},[1062,5278,2573],{},[1062,5280,5281],{"class":1064,"line":2190},[1062,5282,5283],{},"        add_header X-Cache-Status $upstream_cache_status;\n",[1062,5285,5286],{"class":1064,"line":2195},[1062,5287,2573],{},[1062,5289,5290],{"class":1064,"line":2201},[1062,5291,5292],{},"        proxy_pass http://django_app;\n",[1062,5294,5295],{"class":1064,"line":2212},[1062,5296,5297],{},"        proxy_set_header Host $host;\n",[1062,5299,5300],{"class":1064,"line":2222},[1062,5301,5302],{},"        proxy_set_header X-Real-IP $remote_addr;\n",[1062,5304,5305],{"class":1064,"line":2227},[1062,5306,5307],{},"        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n",[1062,5309,5310],{"class":1064,"line":2233},[1062,5311,5312],{},"        proxy_set_header X-Forwarded-Proto $scheme;\n",[1062,5314,5315],{"class":1064,"line":2248},[1062,5316,2056],{},[1062,5318,5319],{"class":1064,"line":2285},[1062,5320,1575],{},[1062,5322,5323],{"class":1064,"line":2290},[1062,5324,5325],{},"    # Authentication endpoints with rate limiting\n",[1062,5327,5328],{"class":1064,"line":2296},[1062,5329,5330],{},"    location ~ ^/(login|register|password-reset)/ {\n",[1062,5332,5333],{"class":1064,"line":2311},[1062,5334,5335],{},"        limit_req zone=login burst=5 nodelay;\n",[1062,5337,5338],{"class":1064,"line":2337},[1062,5339,2573],{},[1062,5341,5342],{"class":1064,"line":2347},[1062,5343,5292],{},[1062,5345,5346],{"class":1064,"line":2371},[1062,5347,5297],{},[1062,5349,5350],{"class":1064,"line":3629},[1062,5351,5302],{},[1062,5353,5354],{"class":1064,"line":3649},[1062,5355,5307],{},[1062,5357,5358],{"class":1064,"line":3659},[1062,5359,5312],{},[1062,5361,5362],{"class":1064,"line":3695},[1062,5363,2056],{},[1062,5365,5366],{"class":1064,"line":3700},[1062,5367,1575],{},[1062,5369,5370],{"class":1064,"line":3706},[1062,5371,5372],{},"    # Main application with caching\n",[1062,5374,5375],{"class":1064,"line":3720},[1062,5376,5377],{},"    location / {\n",[1062,5379,5380],{"class":1064,"line":3744},[1062,5381,5382],{},"        # Cache configuration\n",[1062,5384,5385],{"class":1064,"line":3771},[1062,5386,5254],{},[1062,5388,5389],{"class":1064,"line":3798},[1062,5390,5391],{},"        proxy_cache_key \"$scheme$request_method$host$request_uri$is_args$args\";\n",[1062,5393,5394],{"class":1064,"line":3804},[1062,5395,5396],{},"        proxy_cache_valid 200 302 10m;\n",[1062,5398,5399],{"class":1064,"line":3809},[1062,5400,5401],{},"        proxy_cache_valid 404 5m;\n",[1062,5403,5404],{"class":1064,"line":3832},[1062,5405,2573],{},[1062,5407,5409],{"class":1064,"line":5408},102,[1062,5410,5411],{},"        # Cache bypass conditions\n",[1062,5413,5415],{"class":1064,"line":5414},103,[1062,5416,5417],{},"        proxy_cache_bypass $cookie_sessionid;\n",[1062,5419,5421],{"class":1064,"line":5420},104,[1062,5422,5423],{},"        proxy_cache_bypass $http_authorization;\n",[1062,5425,5427],{"class":1064,"line":5426},105,[1062,5428,5429],{},"        proxy_cache_bypass $arg_nocache;\n",[1062,5431,5433],{"class":1064,"line":5432},106,[1062,5434,2573],{},[1062,5436,5438],{"class":1064,"line":5437},107,[1062,5439,5440],{},"        # Don't cache if user is authenticated\n",[1062,5442,5444],{"class":1064,"line":5443},108,[1062,5445,5446],{},"        proxy_no_cache $cookie_sessionid;\n",[1062,5448,5450],{"class":1064,"line":5449},109,[1062,5451,2573],{},[1062,5453,5455],{"class":1064,"line":5454},110,[1062,5456,5283],{},[1062,5458,5460],{"class":1064,"line":5459},111,[1062,5461,2573],{},[1062,5463,5465],{"class":1064,"line":5464},112,[1062,5466,5292],{},[1062,5468,5470],{"class":1064,"line":5469},113,[1062,5471,5297],{},[1062,5473,5475],{"class":1064,"line":5474},114,[1062,5476,5302],{},[1062,5478,5480],{"class":1064,"line":5479},115,[1062,5481,5307],{},[1062,5483,5485],{"class":1064,"line":5484},116,[1062,5486,5312],{},[1062,5488,5490],{"class":1064,"line":5489},117,[1062,5491,2573],{},[1062,5493,5495],{"class":1064,"line":5494},118,[1062,5496,5497],{},"        # Connection settings\n",[1062,5499,5501],{"class":1064,"line":5500},119,[1062,5502,5503],{},"        proxy_connect_timeout 30s;\n",[1062,5505,5507],{"class":1064,"line":5506},120,[1062,5508,5509],{},"        proxy_send_timeout 30s;\n",[1062,5511,5513],{"class":1064,"line":5512},121,[1062,5514,5515],{},"        proxy_read_timeout 30s;\n",[1062,5517,5519],{"class":1064,"line":5518},122,[1062,5520,5521],{},"        proxy_buffering on;\n",[1062,5523,5525],{"class":1064,"line":5524},123,[1062,5526,5527],{},"        proxy_buffer_size 4k;\n",[1062,5529,5531],{"class":1064,"line":5530},124,[1062,5532,5533],{},"        proxy_buffers 8 4k;\n",[1062,5535,5537],{"class":1064,"line":5536},125,[1062,5538,2056],{},[1062,5540,5542],{"class":1064,"line":5541},126,[1062,5543,1575],{},[1062,5545,5547],{"class":1064,"line":5546},127,[1062,5548,5549],{},"    # Health check endpoint (no caching)\n",[1062,5551,5553],{"class":1064,"line":5552},128,[1062,5554,5555],{},"    location /health/ {\n",[1062,5557,5559],{"class":1064,"line":5558},129,[1062,5560,5292],{},[1062,5562,5564],{"class":1064,"line":5563},130,[1062,5565,5297],{},[1062,5567,5569],{"class":1064,"line":5568},131,[1062,5570,5571],{},"        access_log off;\n",[1062,5573,5575],{"class":1064,"line":5574},132,[1062,5576,2056],{},[1062,5578,5580],{"class":1064,"line":5579},133,[1062,5581,1575],{},[1062,5583,5585],{"class":1064,"line":5584},134,[1062,5586,5587],{},"    # Cache purge endpoint (restricted access)\n",[1062,5589,5591],{"class":1064,"line":5590},135,[1062,5592,5593],{},"    location ~ /purge(/.*) {\n",[1062,5595,5597],{"class":1064,"line":5596},136,[1062,5598,5599],{},"        allow 127.0.0.1;\n",[1062,5601,5603],{"class":1064,"line":5602},137,[1062,5604,5605],{},"        allow 10.0.0.0/8;\n",[1062,5607,5609],{"class":1064,"line":5608},138,[1062,5610,5611],{},"        deny all;\n",[1062,5613,5615],{"class":1064,"line":5614},139,[1062,5616,2573],{},[1062,5618,5620],{"class":1064,"line":5619},140,[1062,5621,5622],{},"        proxy_cache_purge django_cache \"$scheme$request_method$host$1\";\n",[1062,5624,5626],{"class":1064,"line":5625},141,[1062,5627,2056],{},[1062,5629,5631],{"class":1064,"line":5630},142,[1062,5632,2062],{},[1062,5634,5636],{"class":1064,"line":5635},143,[1062,5637,1101],{"emptyLinePlaceholder":1100},[1062,5639,5641],{"class":1064,"line":5640},144,[1062,5642,5643],{},"# SSL configuration (separate server block)\n",[1062,5645,5647],{"class":1064,"line":5646},145,[1062,5648,5029],{},[1062,5650,5652],{"class":1064,"line":5651},146,[1062,5653,5654],{},"    listen 443 ssl http2;\n",[1062,5656,5658],{"class":1064,"line":5657},147,[1062,5659,5039],{},[1062,5661,5663],{"class":1064,"line":5662},148,[1062,5664,1575],{},[1062,5666,5668],{"class":1064,"line":5667},149,[1062,5669,5670],{},"    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;\n",[1062,5672,5674],{"class":1064,"line":5673},150,[1062,5675,5676],{},"    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;\n",[1062,5678,5680],{"class":1064,"line":5679},151,[1062,5681,1575],{},[1062,5683,5685],{"class":1064,"line":5684},152,[1062,5686,5687],{},"    # SSL optimization\n",[1062,5689,5691],{"class":1064,"line":5690},153,[1062,5692,5693],{},"    ssl_session_cache shared:SSL:10m;\n",[1062,5695,5697],{"class":1064,"line":5696},154,[1062,5698,5699],{},"    ssl_session_timeout 10m;\n",[1062,5701,5703],{"class":1064,"line":5702},155,[1062,5704,5705],{},"    ssl_protocols TLSv1.2 TLSv1.3;\n",[1062,5707,5709],{"class":1064,"line":5708},156,[1062,5710,5711],{},"    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;\n",[1062,5713,5715],{"class":1064,"line":5714},157,[1062,5716,5717],{},"    ssl_prefer_server_ciphers off;\n",[1062,5719,5721],{"class":1064,"line":5720},158,[1062,5722,1575],{},[1062,5724,5726],{"class":1064,"line":5725},159,[1062,5727,5728],{},"    # Include the same location blocks as HTTP server\n",[1062,5730,5732],{"class":1064,"line":5731},160,[1062,5733,5734],{},"    # ... (same as above)\n",[1062,5736,5738],{"class":1064,"line":5737},161,[1062,5739,2062],{},[1035,5741,5743],{"id":5742},"varnish-configuration","Varnish Configuration",[1040,5745,5749],{"className":5746,"code":5747,"language":5748,"meta":1049,"style":1049},"language-vcl shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# /etc/varnish/default.vcl\nvcl 4.1;\n\nimport directors;\nimport std;\n\n# Backend servers\nbackend django1 {\n    .host = \"127.0.0.1\";\n    .port = \"8000\";\n    .probe = {\n        .url = \"/health/\";\n        .timeout = 5s;\n        .interval = 10s;\n        .window = 5;\n        .threshold = 3;\n    }\n}\n\nbackend django2 {\n    .host = \"127.0.0.1\";\n    .port = \"8001\";\n    .probe = {\n        .url = \"/health/\";\n        .timeout = 5s;\n        .interval = 10s;\n        .window = 5;\n        .threshold = 3;\n    }\n}\n\n# Load balancer\nsub vcl_init {\n    new django_director = directors.round_robin();\n    django_director.add_backend(django1);\n    django_director.add_backend(django2);\n}\n\nsub vcl_recv {\n    # Set backend\n    set req.backend_hint = django_director.backend();\n    \n    # Remove Google Analytics cookies\n    set req.http.Cookie = regsuball(req.http.Cookie, \"(^|;\\s*)(_ga|_gid|_gat)=[^;]*\", \"\");\n    set req.http.Cookie = regsuball(req.http.Cookie, \"^;\\s*\", \"\");\n    \n    # Don't cache authenticated requests\n    if (req.http.Authorization || req.http.Cookie ~ \"sessionid\") {\n        return (pass);\n    }\n    \n    # Don't cache POST, PUT, DELETE requests\n    if (req.method != \"GET\" && req.method != \"HEAD\") {\n        return (pass);\n    }\n    \n    # Don't cache admin pages\n    if (req.url ~ \"^/admin/\") {\n        return (pass);\n    }\n    \n    # Cache static files for a long time\n    if (req.url ~ \"^/static/\") {\n        unset req.http.Cookie;\n        return (hash);\n    }\n    \n    # Cache API responses briefly\n    if (req.url ~ \"^/api/\") {\n        unset req.http.Cookie;\n        return (hash);\n    }\n    \n    # Handle cache purging\n    if (req.method == \"PURGE\") {\n        if (!client.ip ~ purge_acl) {\n            return (synth(405, \"Not allowed\"));\n        }\n        return (purge);\n    }\n    \n    return (hash);\n}\n\nsub vcl_backend_response {\n    # Set cache TTL based on response\n    if (bereq.url ~ \"^/static/\") {\n        set beresp.ttl = 1y;\n        set beresp.http.Cache-Control = \"public, max-age=31536000, immutable\";\n    } elsif (bereq.url ~ \"^/api/\") {\n        set beresp.ttl = 5m;\n        set beresp.http.Cache-Control = \"public, max-age=300\";\n    } elsif (beresp.status == 200) {\n        set beresp.ttl = 10m;\n        set beresp.http.Cache-Control = \"public, max-age=600\";\n    }\n    \n    # Don't cache errors for long\n    if (beresp.status >= 400) {\n        set beresp.ttl = 1m;\n    }\n    \n    # Enable ESI for dynamic content\n    if (beresp.http.Content-Type ~ \"text/html\") {\n        set beresp.do_esi = true;\n    }\n    \n    return (deliver);\n}\n\nsub vcl_deliver {\n    # Add cache status header\n    if (obj.hits > 0) {\n        set resp.http.X-Cache = \"HIT\";\n        set resp.http.X-Cache-Hits = obj.hits;\n    } else {\n        set resp.http.X-Cache = \"MISS\";\n    }\n    \n    # Remove backend information\n    unset resp.http.Server;\n    unset resp.http.X-Powered-By;\n    \n    return (deliver);\n}\n\n# ACL for cache purging\nacl purge_acl {\n    \"localhost\";\n    \"127.0.0.1\";\n    \"10.0.0.0\"/8;\n}\n","vcl",[1047,5750,5751,5756,5761,5765,5770,5775,5779,5784,5789,5794,5799,5804,5809,5814,5819,5824,5829,5833,5837,5841,5846,5850,5855,5859,5863,5867,5871,5875,5879,5883,5887,5891,5896,5901,5906,5911,5916,5920,5924,5929,5934,5939,5943,5948,5953,5958,5962,5967,5972,5977,5981,5985,5990,5995,5999,6003,6007,6012,6017,6021,6025,6029,6034,6039,6044,6049,6053,6057,6062,6067,6071,6075,6079,6083,6088,6093,6098,6103,6107,6112,6116,6120,6125,6129,6133,6138,6143,6148,6153,6158,6163,6168,6173,6178,6183,6188,6192,6196,6201,6206,6211,6215,6219,6224,6229,6234,6238,6242,6247,6251,6255,6260,6265,6270,6275,6280,6285,6290,6294,6298,6303,6308,6313,6317,6321,6325,6329,6334,6339,6344,6349,6354],{"__ignoreMap":1049},[1062,5752,5753],{"class":1064,"line":1065},[1062,5754,5755],{},"# /etc/varnish/default.vcl\n",[1062,5757,5758],{"class":1064,"line":1072},[1062,5759,5760],{},"vcl 4.1;\n",[1062,5762,5763],{"class":1064,"line":1083},[1062,5764,1101],{"emptyLinePlaceholder":1100},[1062,5766,5767],{"class":1064,"line":1097},[1062,5768,5769],{},"import directors;\n",[1062,5771,5772],{"class":1064,"line":1104},[1062,5773,5774],{},"import std;\n",[1062,5776,5777],{"class":1064,"line":1110},[1062,5778,1101],{"emptyLinePlaceholder":1100},[1062,5780,5781],{"class":1064,"line":1124},[1062,5782,5783],{},"# Backend servers\n",[1062,5785,5786],{"class":1064,"line":1143},[1062,5787,5788],{},"backend django1 {\n",[1062,5790,5791],{"class":1064,"line":1167},[1062,5792,5793],{},"    .host = \"127.0.0.1\";\n",[1062,5795,5796],{"class":1064,"line":1182},[1062,5797,5798],{},"    .port = \"8000\";\n",[1062,5800,5801],{"class":1064,"line":1227},[1062,5802,5803],{},"    .probe = {\n",[1062,5805,5806],{"class":1064,"line":1259},[1062,5807,5808],{},"        .url = \"/health/\";\n",[1062,5810,5811],{"class":1064,"line":1291},[1062,5812,5813],{},"        .timeout = 5s;\n",[1062,5815,5816],{"class":1064,"line":1297},[1062,5817,5818],{},"        .interval = 10s;\n",[1062,5820,5821],{"class":1064,"line":1311},[1062,5822,5823],{},"        .window = 5;\n",[1062,5825,5826],{"class":1064,"line":1333},[1062,5827,5828],{},"        .threshold = 3;\n",[1062,5830,5831],{"class":1064,"line":1347},[1062,5832,2056],{},[1062,5834,5835],{"class":1064,"line":1366},[1062,5836,2062],{},[1062,5838,5839],{"class":1064,"line":1384},[1062,5840,1101],{"emptyLinePlaceholder":1100},[1062,5842,5843],{"class":1064,"line":1400},[1062,5844,5845],{},"backend django2 {\n",[1062,5847,5848],{"class":1064,"line":1406},[1062,5849,5793],{},[1062,5851,5852],{"class":1064,"line":1427},[1062,5853,5854],{},"    .port = \"8001\";\n",[1062,5856,5857],{"class":1064,"line":1448},[1062,5858,5803],{},[1062,5860,5861],{"class":1064,"line":1468},[1062,5862,5808],{},[1062,5864,5865],{"class":1064,"line":1474},[1062,5866,5813],{},[1062,5868,5869],{"class":1064,"line":1518},[1062,5870,5818],{},[1062,5872,5873],{"class":1064,"line":1566},[1062,5874,5823],{},[1062,5876,5877],{"class":1064,"line":1572},[1062,5878,5828],{},[1062,5880,5881],{"class":1064,"line":1578},[1062,5882,2056],{},[1062,5884,5885],{"class":1064,"line":1584},[1062,5886,2062],{},[1062,5888,5889],{"class":1064,"line":1598},[1062,5890,1101],{"emptyLinePlaceholder":1100},[1062,5892,5893],{"class":1064,"line":1617},[1062,5894,5895],{},"# Load balancer\n",[1062,5897,5898],{"class":1064,"line":1658},[1062,5899,5900],{},"sub vcl_init {\n",[1062,5902,5903],{"class":1064,"line":1671},[1062,5904,5905],{},"    new django_director = directors.round_robin();\n",[1062,5907,5908],{"class":1064,"line":1691},[1062,5909,5910],{},"    django_director.add_backend(django1);\n",[1062,5912,5913],{"class":1064,"line":1704},[1062,5914,5915],{},"    django_director.add_backend(django2);\n",[1062,5917,5918],{"class":1064,"line":1720},[1062,5919,2062],{},[1062,5921,5922],{"class":1064,"line":1735},[1062,5923,1101],{"emptyLinePlaceholder":1100},[1062,5925,5926],{"class":1064,"line":1740},[1062,5927,5928],{},"sub vcl_recv {\n",[1062,5930,5931],{"class":1064,"line":1745},[1062,5932,5933],{},"    # Set backend\n",[1062,5935,5936],{"class":1064,"line":1765},[1062,5937,5938],{},"    set req.backend_hint = django_director.backend();\n",[1062,5940,5941],{"class":1064,"line":1770},[1062,5942,1575],{},[1062,5944,5945],{"class":1064,"line":1775},[1062,5946,5947],{},"    # Remove Google Analytics cookies\n",[1062,5949,5950],{"class":1064,"line":1781},[1062,5951,5952],{},"    set req.http.Cookie = regsuball(req.http.Cookie, \"(^|;\\s*)(_ga|_gid|_gat)=[^;]*\", \"\");\n",[1062,5954,5955],{"class":1064,"line":1795},[1062,5956,5957],{},"    set req.http.Cookie = regsuball(req.http.Cookie, \"^;\\s*\", \"\");\n",[1062,5959,5960],{"class":1064,"line":1814},[1062,5961,1575],{},[1062,5963,5964],{"class":1064,"line":1855},[1062,5965,5966],{},"    # Don't cache authenticated requests\n",[1062,5968,5969],{"class":1064,"line":1868},[1062,5970,5971],{},"    if (req.http.Authorization || req.http.Cookie ~ \"sessionid\") {\n",[1062,5973,5974],{"class":1064,"line":1887},[1062,5975,5976],{},"        return (pass);\n",[1062,5978,5979],{"class":1064,"line":1892},[1062,5980,2056],{},[1062,5982,5983],{"class":1064,"line":1911},[1062,5984,1575],{},[1062,5986,5987],{"class":1064,"line":1916},[1062,5988,5989],{},"    # Don't cache POST, PUT, DELETE requests\n",[1062,5991,5992],{"class":1064,"line":1921},[1062,5993,5994],{},"    if (req.method != \"GET\" && req.method != \"HEAD\") {\n",[1062,5996,5997],{"class":1064,"line":1927},[1062,5998,5976],{},[1062,6000,6001],{"class":1064,"line":1941},[1062,6002,2056],{},[1062,6004,6005],{"class":1064,"line":1961},[1062,6006,1575],{},[1062,6008,6009],{"class":1064,"line":1981},[1062,6010,6011],{},"    # Don't cache admin pages\n",[1062,6013,6014],{"class":1064,"line":2000},[1062,6015,6016],{},"    if (req.url ~ \"^/admin/\") {\n",[1062,6018,6019],{"class":1064,"line":2013},[1062,6020,5976],{},[1062,6022,6023],{"class":1064,"line":2030},[1062,6024,2056],{},[1062,6026,6027],{"class":1064,"line":2047},[1062,6028,1575],{},[1062,6030,6031],{"class":1064,"line":2053},[1062,6032,6033],{},"    # Cache static files for a long time\n",[1062,6035,6036],{"class":1064,"line":2059},[1062,6037,6038],{},"    if (req.url ~ \"^/static/\") {\n",[1062,6040,6041],{"class":1064,"line":2065},[1062,6042,6043],{},"        unset req.http.Cookie;\n",[1062,6045,6046],{"class":1064,"line":2070},[1062,6047,6048],{},"        return (hash);\n",[1062,6050,6051],{"class":1064,"line":2076},[1062,6052,2056],{},[1062,6054,6055],{"class":1064,"line":2092},[1062,6056,1575],{},[1062,6058,6059],{"class":1064,"line":2106},[1062,6060,6061],{},"    # Cache API responses briefly\n",[1062,6063,6064],{"class":1064,"line":2118},[1062,6065,6066],{},"    if (req.url ~ \"^/api/\") {\n",[1062,6068,6069],{"class":1064,"line":2123},[1062,6070,6043],{},[1062,6072,6073],{"class":1064,"line":2129},[1062,6074,6048],{},[1062,6076,6077],{"class":1064,"line":2143},[1062,6078,2056],{},[1062,6080,6081],{"class":1064,"line":2155},[1062,6082,1575],{},[1062,6084,6085],{"class":1064,"line":2190},[1062,6086,6087],{},"    # Handle cache purging\n",[1062,6089,6090],{"class":1064,"line":2195},[1062,6091,6092],{},"    if (req.method == \"PURGE\") {\n",[1062,6094,6095],{"class":1064,"line":2201},[1062,6096,6097],{},"        if (!client.ip ~ purge_acl) {\n",[1062,6099,6100],{"class":1064,"line":2212},[1062,6101,6102],{},"            return (synth(405, \"Not allowed\"));\n",[1062,6104,6105],{"class":1064,"line":2222},[1062,6106,2050],{},[1062,6108,6109],{"class":1064,"line":2227},[1062,6110,6111],{},"        return (purge);\n",[1062,6113,6114],{"class":1064,"line":2233},[1062,6115,2056],{},[1062,6117,6118],{"class":1064,"line":2248},[1062,6119,1575],{},[1062,6121,6122],{"class":1064,"line":2285},[1062,6123,6124],{},"    return (hash);\n",[1062,6126,6127],{"class":1064,"line":2290},[1062,6128,2062],{},[1062,6130,6131],{"class":1064,"line":2296},[1062,6132,1101],{"emptyLinePlaceholder":1100},[1062,6134,6135],{"class":1064,"line":2311},[1062,6136,6137],{},"sub vcl_backend_response {\n",[1062,6139,6140],{"class":1064,"line":2337},[1062,6141,6142],{},"    # Set cache TTL based on response\n",[1062,6144,6145],{"class":1064,"line":2347},[1062,6146,6147],{},"    if (bereq.url ~ \"^/static/\") {\n",[1062,6149,6150],{"class":1064,"line":2371},[1062,6151,6152],{},"        set beresp.ttl = 1y;\n",[1062,6154,6155],{"class":1064,"line":3629},[1062,6156,6157],{},"        set beresp.http.Cache-Control = \"public, max-age=31536000, immutable\";\n",[1062,6159,6160],{"class":1064,"line":3649},[1062,6161,6162],{},"    } elsif (bereq.url ~ \"^/api/\") {\n",[1062,6164,6165],{"class":1064,"line":3659},[1062,6166,6167],{},"        set beresp.ttl = 5m;\n",[1062,6169,6170],{"class":1064,"line":3695},[1062,6171,6172],{},"        set beresp.http.Cache-Control = \"public, max-age=300\";\n",[1062,6174,6175],{"class":1064,"line":3700},[1062,6176,6177],{},"    } elsif (beresp.status == 200) {\n",[1062,6179,6180],{"class":1064,"line":3706},[1062,6181,6182],{},"        set beresp.ttl = 10m;\n",[1062,6184,6185],{"class":1064,"line":3720},[1062,6186,6187],{},"        set beresp.http.Cache-Control = \"public, max-age=600\";\n",[1062,6189,6190],{"class":1064,"line":3744},[1062,6191,2056],{},[1062,6193,6194],{"class":1064,"line":3771},[1062,6195,1575],{},[1062,6197,6198],{"class":1064,"line":3798},[1062,6199,6200],{},"    # Don't cache errors for long\n",[1062,6202,6203],{"class":1064,"line":3804},[1062,6204,6205],{},"    if (beresp.status >= 400) {\n",[1062,6207,6208],{"class":1064,"line":3809},[1062,6209,6210],{},"        set beresp.ttl = 1m;\n",[1062,6212,6213],{"class":1064,"line":3832},[1062,6214,2056],{},[1062,6216,6217],{"class":1064,"line":5408},[1062,6218,1575],{},[1062,6220,6221],{"class":1064,"line":5414},[1062,6222,6223],{},"    # Enable ESI for dynamic content\n",[1062,6225,6226],{"class":1064,"line":5420},[1062,6227,6228],{},"    if (beresp.http.Content-Type ~ \"text/html\") {\n",[1062,6230,6231],{"class":1064,"line":5426},[1062,6232,6233],{},"        set beresp.do_esi = true;\n",[1062,6235,6236],{"class":1064,"line":5432},[1062,6237,2056],{},[1062,6239,6240],{"class":1064,"line":5437},[1062,6241,1575],{},[1062,6243,6244],{"class":1064,"line":5443},[1062,6245,6246],{},"    return (deliver);\n",[1062,6248,6249],{"class":1064,"line":5449},[1062,6250,2062],{},[1062,6252,6253],{"class":1064,"line":5454},[1062,6254,1101],{"emptyLinePlaceholder":1100},[1062,6256,6257],{"class":1064,"line":5459},[1062,6258,6259],{},"sub vcl_deliver {\n",[1062,6261,6262],{"class":1064,"line":5464},[1062,6263,6264],{},"    # Add cache status header\n",[1062,6266,6267],{"class":1064,"line":5469},[1062,6268,6269],{},"    if (obj.hits > 0) {\n",[1062,6271,6272],{"class":1064,"line":5474},[1062,6273,6274],{},"        set resp.http.X-Cache = \"HIT\";\n",[1062,6276,6277],{"class":1064,"line":5479},[1062,6278,6279],{},"        set resp.http.X-Cache-Hits = obj.hits;\n",[1062,6281,6282],{"class":1064,"line":5484},[1062,6283,6284],{},"    } else {\n",[1062,6286,6287],{"class":1064,"line":5489},[1062,6288,6289],{},"        set resp.http.X-Cache = \"MISS\";\n",[1062,6291,6292],{"class":1064,"line":5494},[1062,6293,2056],{},[1062,6295,6296],{"class":1064,"line":5500},[1062,6297,1575],{},[1062,6299,6300],{"class":1064,"line":5506},[1062,6301,6302],{},"    # Remove backend information\n",[1062,6304,6305],{"class":1064,"line":5512},[1062,6306,6307],{},"    unset resp.http.Server;\n",[1062,6309,6310],{"class":1064,"line":5518},[1062,6311,6312],{},"    unset resp.http.X-Powered-By;\n",[1062,6314,6315],{"class":1064,"line":5524},[1062,6316,1575],{},[1062,6318,6319],{"class":1064,"line":5530},[1062,6320,6246],{},[1062,6322,6323],{"class":1064,"line":5536},[1062,6324,2062],{},[1062,6326,6327],{"class":1064,"line":5541},[1062,6328,1101],{"emptyLinePlaceholder":1100},[1062,6330,6331],{"class":1064,"line":5546},[1062,6332,6333],{},"# ACL for cache purging\n",[1062,6335,6336],{"class":1064,"line":5552},[1062,6337,6338],{},"acl purge_acl {\n",[1062,6340,6341],{"class":1064,"line":5558},[1062,6342,6343],{},"    \"localhost\";\n",[1062,6345,6346],{"class":1064,"line":5563},[1062,6347,6348],{},"    \"127.0.0.1\";\n",[1062,6350,6351],{"class":1064,"line":5568},[1062,6352,6353],{},"    \"10.0.0.0\"/8;\n",[1062,6355,6356],{"class":1064,"line":5574},[1062,6357,2062],{},[1030,6359,6361],{"id":6360},"database-caching-strategies","Database Caching Strategies",[1035,6363,6365],{"id":6364},"query-optimization-and-caching","Query Optimization and Caching",[1040,6367,6369],{"className":1056,"code":6368,"language":1058,"meta":1049,"style":1049},"# utils/db_cache.py\nfrom django.core.cache import cache\nfrom django.db import models\nfrom django.db.models.signals import post_save, post_delete\nimport hashlib\nimport json\n\nclass QueryCacheManager:\n    \"\"\"Advanced database query caching.\"\"\"\n    \n    def __init__(self, timeout=3600):\n        self.timeout = timeout\n        self.cache = cache\n    \n    def cache_queryset(self, queryset, cache_key=None, timeout=None):\n        \"\"\"Cache queryset results with automatic invalidation.\"\"\"\n        if cache_key is None:\n            # Generate cache key from query\n            query_str = str(queryset.query)\n            cache_key = f\"queryset:{hashlib.md5(query_str.encode()).hexdigest()}\"\n        \n        if timeout is None:\n            timeout = self.timeout\n        \n        # Check cache first\n        cached_result = self.cache.get(cache_key)\n        if cached_result is not None:\n            return cached_result\n        \n        # Execute query and cache results\n        result = list(queryset)\n        \n        # Store with dependency tracking\n        self._store_with_dependencies(cache_key, result, queryset.model, timeout)\n        \n        return result\n    \n    def _store_with_dependencies(self, cache_key, result, model, timeout):\n        \"\"\"Store cached result with model dependency tracking.\"\"\"\n        # Store the actual result\n        self.cache.set(cache_key, result, timeout)\n        \n        # Track dependencies for invalidation\n        model_key = f\"model_deps:{model._meta.label_lower}\"\n        dependent_keys = self.cache.get(model_key, set())\n        dependent_keys.add(cache_key)\n        self.cache.set(model_key, dependent_keys, timeout)\n    \n    def invalidate_model_cache(self, model):\n        \"\"\"Invalidate all cached queries for a model.\"\"\"\n        model_key = f\"model_deps:{model._meta.label_lower}\"\n        dependent_keys = self.cache.get(model_key, set())\n        \n        if dependent_keys:\n            # Delete all dependent cache keys\n            self.cache.delete_many(list(dependent_keys))\n            # Clear the dependency tracking\n            self.cache.delete(model_key)\n\n# Global query cache manager\nquery_cache = QueryCacheManager()\n\n# Automatic cache invalidation\n@receiver([post_save, post_delete])\ndef invalidate_model_cache_on_change(sender, **kwargs):\n    \"\"\"Invalidate model cache when any instance changes.\"\"\"\n    query_cache.invalidate_model_cache(sender)\n\n# Enhanced model manager with caching\nclass CachedManager(models.Manager):\n    \"\"\"Model manager with built-in caching.\"\"\"\n    \n    def __init__(self, cache_timeout=3600):\n        super().__init__()\n        self.cache_timeout = cache_timeout\n    \n    def cached_filter(self, **kwargs):\n        \"\"\"Filter with automatic caching.\"\"\"\n        # Generate cache key from filter parameters\n        filter_str = json.dumps(kwargs, sort_keys=True)\n        cache_key = f\"{self.model._meta.label_lower}:filter:{hashlib.md5(filter_str.encode()).hexdigest()}\"\n        \n        queryset = self.filter(**kwargs)\n        return query_cache.cache_queryset(queryset, cache_key, self.cache_timeout)\n    \n    def cached_get(self, **kwargs):\n        \"\"\"Get with caching (use carefully - only for immutable lookups).\"\"\"\n        filter_str = json.dumps(kwargs, sort_keys=True)\n        cache_key = f\"{self.model._meta.label_lower}:get:{hashlib.md5(filter_str.encode()).hexdigest()}\"\n        \n        # Try cache first\n        cached_result = cache.get(cache_key)\n        if cached_result is not None:\n            return cached_result\n        \n        # Get from database\n        try:\n            result = self.get(**kwargs)\n            cache.set(cache_key, result, self.cache_timeout)\n            return result\n        except self.model.DoesNotExist:\n            # Cache negative results briefly\n            cache.set(cache_key, None, 300)\n            raise\n    \n    def cached_count(self, **kwargs):\n        \"\"\"Count with caching.\"\"\"\n        filter_str = json.dumps(kwargs, sort_keys=True)\n        cache_key = f\"{self.model._meta.label_lower}:count:{hashlib.md5(filter_str.encode()).hexdigest()}\"\n        \n        cached_count = cache.get(cache_key)\n        if cached_count is not None:\n            return cached_count\n        \n        count = self.filter(**kwargs).count()\n        cache.set(cache_key, count, self.cache_timeout)\n        \n        return count\n\n# Usage in models\nclass Post(models.Model):\n    title = models.CharField(max_length=200)\n    content = models.TextField()\n    published = models.BooleanField(default=False)\n    created_at = models.DateTimeField(auto_now_add=True)\n    \n    objects = models.Manager()  # Default manager\n    cached = CachedManager(cache_timeout=1800)  # Cached manager\n    \n    class Meta:\n        ordering = ['-created_at']\n\n# Usage examples\n# Cached filtering\npopular_posts = Post.cached.cached_filter(published=True, views__gte=100)\n\n# Cached counting\npublished_count = Post.cached.cached_count(published=True)\n\n# Regular queryset with manual caching\nrecent_posts = query_cache.cache_queryset(\n    Post.objects.filter(published=True)[:10],\n    cache_key='recent_posts',\n    timeout=900\n)\n",[1047,6370,6371,6376,6394,6410,6436,6443,6449,6453,6462,6471,6475,6496,6510,6523,6527,6562,6571,6586,6591,6612,6657,6661,6674,6688,6692,6697,6721,6737,6745,6749,6754,6770,6774,6779,6812,6816,6823,6827,6857,6866,6871,6897,6901,6906,6936,6966,6982,7009,7013,7030,7039,7065,7091,7095,7103,7108,7135,7140,7159,7163,7168,7179,7183,7188,7206,7225,7234,7250,7254,7259,7278,7287,7291,7312,7325,7339,7343,7362,7371,7376,7405,7464,7468,7491,7521,7525,7544,7553,7579,7636,7640,7645,7664,7678,7684,7688,7693,7699,7720,7746,7752,7769,7774,7796,7801,7805,7824,7833,7859,7916,7920,7939,7954,7961,7965,7992,8020,8024,8031,8035,8040,8058,8085,8101,8125,8150,8154,8172,8196,8200,8210,8228,8232,8237,8242,8281,8285,8290,8318,8322,8327,8342,8373,8389,8399],{"__ignoreMap":1049},[1062,6372,6373],{"class":1064,"line":1065},[1062,6374,6375],{"class":1068},"# utils/db_cache.py\n",[1062,6377,6378,6380,6382,6384,6386,6388,6390,6392],{"class":1064,"line":1072},[1062,6379,1086],{"class":1075},[1062,6381,2411],{"class":1079},[1062,6383,1199],{"class":1117},[1062,6385,2432],{"class":1079},[1062,6387,1199],{"class":1117},[1062,6389,2437],{"class":1079},[1062,6391,1076],{"class":1075},[1062,6393,2442],{"class":1079},[1062,6395,6396,6398,6400,6402,6405,6407],{"class":1064,"line":1083},[1062,6397,1086],{"class":1075},[1062,6399,2411],{"class":1079},[1062,6401,1199],{"class":1117},[1062,6403,6404],{"class":1079},"db ",[1062,6406,1076],{"class":1075},[1062,6408,6409],{"class":1079}," models\n",[1062,6411,6412,6414,6416,6418,6420,6422,6424,6426,6428,6430,6432,6434],{"class":1064,"line":1097},[1062,6413,1086],{"class":1075},[1062,6415,2411],{"class":1079},[1062,6417,1199],{"class":1117},[1062,6419,4636],{"class":1079},[1062,6421,1199],{"class":1117},[1062,6423,4641],{"class":1079},[1062,6425,1199],{"class":1117},[1062,6427,4646],{"class":1079},[1062,6429,1076],{"class":1075},[1062,6431,4651],{"class":1079},[1062,6433,1462],{"class":1117},[1062,6435,4656],{"class":1079},[1062,6437,6438,6440],{"class":1064,"line":1104},[1062,6439,1076],{"class":1075},[1062,6441,6442],{"class":1079}," hashlib\n",[1062,6444,6445,6447],{"class":1064,"line":1110},[1062,6446,1076],{"class":1075},[1062,6448,3886],{"class":1079},[1062,6450,6451],{"class":1064,"line":1124},[1062,6452,1101],{"emptyLinePlaceholder":1100},[1062,6454,6455,6457,6460],{"class":1064,"line":1143},[1062,6456,2451],{"class":1185},[1062,6458,6459],{"class":2454}," QueryCacheManager",[1062,6461,2458],{"class":1117},[1062,6463,6464,6466,6469],{"class":1064,"line":1167},[1062,6465,2464],{"class":2463},[1062,6467,6468],{"class":2467},"Advanced database query caching.",[1062,6470,2471],{"class":2463},[1062,6472,6473],{"class":1064,"line":1182},[1062,6474,1575],{"class":1079},[1062,6476,6477,6479,6481,6483,6485,6487,6490,6492,6494],{"class":1064,"line":1227},[1062,6478,2480],{"class":1185},[1062,6480,2484],{"class":2483},[1062,6482,1534],{"class":1117},[1062,6484,2490],{"class":2489},[1062,6486,1462],{"class":1117},[1062,6488,6489],{"class":2590}," timeout",[1062,6491,2595],{"class":2594},[1062,6493,3587],{"class":1360},[1062,6495,2493],{"class":1117},[1062,6497,6498,6500,6502,6505,6507],{"class":1064,"line":1259},[1062,6499,2498],{"class":1113},[1062,6501,1199],{"class":1117},[1062,6503,6504],{"class":1202},"timeout",[1062,6506,1118],{"class":1117},[1062,6508,6509],{"class":1079}," timeout\n",[1062,6511,6512,6514,6516,6519,6521],{"class":1064,"line":1291},[1062,6513,2498],{"class":1113},[1062,6515,1199],{"class":1117},[1062,6517,6518],{"class":1202},"cache",[1062,6520,1118],{"class":1117},[1062,6522,2442],{"class":1079},[1062,6524,6525],{"class":1064,"line":1297},[1062,6526,1575],{"class":1079},[1062,6528,6529,6531,6534,6536,6538,6540,6543,6545,6548,6550,6552,6554,6556,6558,6560],{"class":1064,"line":1311},[1062,6530,2480],{"class":1185},[1062,6532,6533],{"class":2580}," cache_queryset",[1062,6535,1534],{"class":1117},[1062,6537,2490],{"class":2489},[1062,6539,1462],{"class":1117},[1062,6541,6542],{"class":2590}," queryset",[1062,6544,1462],{"class":1117},[1062,6546,6547],{"class":2590}," cache_key",[1062,6549,2595],{"class":2594},[1062,6551,2598],{"class":1378},[1062,6553,1462],{"class":1117},[1062,6555,6489],{"class":2590},[1062,6557,2595],{"class":2594},[1062,6559,2598],{"class":1378},[1062,6561,2493],{"class":1117},[1062,6563,6564,6566,6569],{"class":1064,"line":1333},[1062,6565,2624],{"class":2463},[1062,6567,6568],{"class":2467},"Cache queryset results with automatic invalidation.",[1062,6570,2471],{"class":2463},[1062,6572,6573,6575,6578,6581,6584],{"class":1064,"line":1347},[1062,6574,2742],{"class":1075},[1062,6576,6577],{"class":1079}," cache_key ",[1062,6579,6580],{"class":2594},"is",[1062,6582,6583],{"class":1378}," None",[1062,6585,2458],{"class":1117},[1062,6587,6588],{"class":1064,"line":1366},[1062,6589,6590],{"class":1068},"            # Generate cache key from query\n",[1062,6592,6593,6596,6598,6600,6602,6605,6607,6610],{"class":1064,"line":1384},[1062,6594,6595],{"class":1079},"            query_str ",[1062,6597,2595],{"class":1117},[1062,6599,4093],{"class":1530},[1062,6601,1534],{"class":1117},[1062,6603,6604],{"class":1537},"queryset",[1062,6606,1199],{"class":1117},[1062,6608,6609],{"class":1202},"query",[1062,6611,2855],{"class":1117},[1062,6613,6614,6617,6619,6621,6624,6626,6629,6631,6634,6636,6639,6641,6644,6647,6650,6653,6655],{"class":1064,"line":1400},[1062,6615,6616],{"class":1079},"            cache_key ",[1062,6618,2595],{"class":1117},[1062,6620,1486],{"class":1185},[1062,6622,6623],{"class":1131},"\"queryset:",[1062,6625,1193],{"class":1192},[1062,6627,6628],{"class":1079},"hashlib",[1062,6630,1199],{"class":1117},[1062,6632,6633],{"class":1537},"md5",[1062,6635,1534],{"class":1117},[1062,6637,6638],{"class":1537},"query_str",[1062,6640,1199],{"class":1117},[1062,6642,6643],{"class":1537},"encode",[1062,6645,6646],{"class":1117},"()).",[1062,6648,6649],{"class":1537},"hexdigest",[1062,6651,6652],{"class":1117},"()",[1062,6654,1219],{"class":1192},[1062,6656,4247],{"class":1131},[1062,6658,6659],{"class":1064,"line":1406},[1062,6660,2573],{"class":1079},[1062,6662,6663,6665,6668,6670,6672],{"class":1064,"line":1427},[1062,6664,2742],{"class":1075},[1062,6666,6667],{"class":1079}," timeout ",[1062,6669,6580],{"class":2594},[1062,6671,6583],{"class":1378},[1062,6673,2458],{"class":1117},[1062,6675,6676,6679,6681,6683,6685],{"class":1064,"line":1448},[1062,6677,6678],{"class":1079},"            timeout ",[1062,6680,2595],{"class":1117},[1062,6682,2972],{"class":1113},[1062,6684,1199],{"class":1117},[1062,6686,6687],{"class":1202},"timeout\n",[1062,6689,6690],{"class":1064,"line":1468},[1062,6691,2573],{"class":1079},[1062,6693,6694],{"class":1064,"line":1474},[1062,6695,6696],{"class":1068},"        # Check cache first\n",[1062,6698,6699,6702,6704,6706,6708,6710,6712,6714,6716,6719],{"class":1064,"line":1518},[1062,6700,6701],{"class":1079},"        cached_result ",[1062,6703,2595],{"class":1117},[1062,6705,2972],{"class":1113},[1062,6707,1199],{"class":1117},[1062,6709,6518],{"class":1202},[1062,6711,1199],{"class":1117},[1062,6713,1546],{"class":1537},[1062,6715,1534],{"class":1117},[1062,6717,6718],{"class":1537},"cache_key",[1062,6720,2855],{"class":1117},[1062,6722,6723,6725,6728,6730,6733,6735],{"class":1064,"line":1566},[1062,6724,2742],{"class":1075},[1062,6726,6727],{"class":1079}," cached_result ",[1062,6729,6580],{"class":2594},[1062,6731,6732],{"class":2594}," not",[1062,6734,6583],{"class":1378},[1062,6736,2458],{"class":1117},[1062,6738,6739,6742],{"class":1064,"line":1572},[1062,6740,6741],{"class":1075},"            return",[1062,6743,6744],{"class":1079}," cached_result\n",[1062,6746,6747],{"class":1064,"line":1578},[1062,6748,2573],{"class":1079},[1062,6750,6751],{"class":1064,"line":1584},[1062,6752,6753],{"class":1068},"        # Execute query and cache results\n",[1062,6755,6756,6759,6761,6764,6766,6768],{"class":1064,"line":1598},[1062,6757,6758],{"class":1079},"        result ",[1062,6760,2595],{"class":1117},[1062,6762,6763],{"class":1530}," list",[1062,6765,1534],{"class":1117},[1062,6767,6604],{"class":1537},[1062,6769,2855],{"class":1117},[1062,6771,6772],{"class":1064,"line":1617},[1062,6773,2573],{"class":1079},[1062,6775,6776],{"class":1064,"line":1658},[1062,6777,6778],{"class":1068},"        # Store with dependency tracking\n",[1062,6780,6781,6783,6785,6788,6790,6792,6794,6797,6799,6801,6803,6806,6808,6810],{"class":1064,"line":1671},[1062,6782,2498],{"class":1113},[1062,6784,1199],{"class":1117},[1062,6786,6787],{"class":1537},"_store_with_dependencies",[1062,6789,1534],{"class":1117},[1062,6791,6718],{"class":1537},[1062,6793,1462],{"class":1117},[1062,6795,6796],{"class":1537}," result",[1062,6798,1462],{"class":1117},[1062,6800,6542],{"class":1537},[1062,6802,1199],{"class":1117},[1062,6804,6805],{"class":1202},"model",[1062,6807,1462],{"class":1117},[1062,6809,6489],{"class":1537},[1062,6811,2855],{"class":1117},[1062,6813,6814],{"class":1064,"line":1691},[1062,6815,2573],{"class":1079},[1062,6817,6818,6820],{"class":1064,"line":1704},[1062,6819,2924],{"class":1075},[1062,6821,6822],{"class":1079}," result\n",[1062,6824,6825],{"class":1064,"line":1720},[1062,6826,1575],{"class":1079},[1062,6828,6829,6831,6834,6836,6838,6840,6842,6844,6846,6848,6851,6853,6855],{"class":1064,"line":1735},[1062,6830,2480],{"class":1185},[1062,6832,6833],{"class":2580}," _store_with_dependencies",[1062,6835,1534],{"class":1117},[1062,6837,2490],{"class":2489},[1062,6839,1462],{"class":1117},[1062,6841,6547],{"class":2590},[1062,6843,1462],{"class":1117},[1062,6845,6796],{"class":2590},[1062,6847,1462],{"class":1117},[1062,6849,6850],{"class":2590}," model",[1062,6852,1462],{"class":1117},[1062,6854,6489],{"class":2590},[1062,6856,2493],{"class":1117},[1062,6858,6859,6861,6864],{"class":1064,"line":1740},[1062,6860,2624],{"class":2463},[1062,6862,6863],{"class":2467},"Store cached result with model dependency tracking.",[1062,6865,2471],{"class":2463},[1062,6867,6868],{"class":1064,"line":1745},[1062,6869,6870],{"class":1068},"        # Store the actual result\n",[1062,6872,6873,6875,6877,6879,6881,6883,6885,6887,6889,6891,6893,6895],{"class":1064,"line":1765},[1062,6874,2498],{"class":1113},[1062,6876,1199],{"class":1117},[1062,6878,6518],{"class":1202},[1062,6880,1199],{"class":1117},[1062,6882,4803],{"class":1537},[1062,6884,1534],{"class":1117},[1062,6886,6718],{"class":1537},[1062,6888,1462],{"class":1117},[1062,6890,6796],{"class":1537},[1062,6892,1462],{"class":1117},[1062,6894,6489],{"class":1537},[1062,6896,2855],{"class":1117},[1062,6898,6899],{"class":1064,"line":1770},[1062,6900,2573],{"class":1079},[1062,6902,6903],{"class":1064,"line":1775},[1062,6904,6905],{"class":1068},"        # Track dependencies for invalidation\n",[1062,6907,6908,6911,6913,6915,6918,6920,6922,6924,6927,6929,6932,6934],{"class":1064,"line":1781},[1062,6909,6910],{"class":1079},"        model_key ",[1062,6912,2595],{"class":1117},[1062,6914,1486],{"class":1185},[1062,6916,6917],{"class":1131},"\"model_deps:",[1062,6919,1193],{"class":1192},[1062,6921,6805],{"class":1079},[1062,6923,1199],{"class":1117},[1062,6925,6926],{"class":1202},"_meta",[1062,6928,1199],{"class":1117},[1062,6930,6931],{"class":1202},"label_lower",[1062,6933,1219],{"class":1192},[1062,6935,4247],{"class":1131},[1062,6937,6938,6941,6943,6945,6947,6949,6951,6953,6955,6958,6960,6963],{"class":1064,"line":1795},[1062,6939,6940],{"class":1079},"        dependent_keys ",[1062,6942,2595],{"class":1117},[1062,6944,2972],{"class":1113},[1062,6946,1199],{"class":1117},[1062,6948,6518],{"class":1202},[1062,6950,1199],{"class":1117},[1062,6952,1546],{"class":1537},[1062,6954,1534],{"class":1117},[1062,6956,6957],{"class":1537},"model_key",[1062,6959,1462],{"class":1117},[1062,6961,6962],{"class":1530}," set",[1062,6964,6965],{"class":1117},"())\n",[1062,6967,6968,6971,6973,6976,6978,6980],{"class":1064,"line":1814},[1062,6969,6970],{"class":1079},"        dependent_keys",[1062,6972,1199],{"class":1117},[1062,6974,6975],{"class":1537},"add",[1062,6977,1534],{"class":1117},[1062,6979,6718],{"class":1537},[1062,6981,2855],{"class":1117},[1062,6983,6984,6986,6988,6990,6992,6994,6996,6998,7000,7003,7005,7007],{"class":1064,"line":1855},[1062,6985,2498],{"class":1113},[1062,6987,1199],{"class":1117},[1062,6989,6518],{"class":1202},[1062,6991,1199],{"class":1117},[1062,6993,4803],{"class":1537},[1062,6995,1534],{"class":1117},[1062,6997,6957],{"class":1537},[1062,6999,1462],{"class":1117},[1062,7001,7002],{"class":1537}," dependent_keys",[1062,7004,1462],{"class":1117},[1062,7006,6489],{"class":1537},[1062,7008,2855],{"class":1117},[1062,7010,7011],{"class":1064,"line":1868},[1062,7012,1575],{"class":1079},[1062,7014,7015,7017,7020,7022,7024,7026,7028],{"class":1064,"line":1887},[1062,7016,2480],{"class":1185},[1062,7018,7019],{"class":2580}," invalidate_model_cache",[1062,7021,1534],{"class":1117},[1062,7023,2490],{"class":2489},[1062,7025,1462],{"class":1117},[1062,7027,6850],{"class":2590},[1062,7029,2493],{"class":1117},[1062,7031,7032,7034,7037],{"class":1064,"line":1892},[1062,7033,2624],{"class":2463},[1062,7035,7036],{"class":2467},"Invalidate all cached queries for a model.",[1062,7038,2471],{"class":2463},[1062,7040,7041,7043,7045,7047,7049,7051,7053,7055,7057,7059,7061,7063],{"class":1064,"line":1911},[1062,7042,6910],{"class":1079},[1062,7044,2595],{"class":1117},[1062,7046,1486],{"class":1185},[1062,7048,6917],{"class":1131},[1062,7050,1193],{"class":1192},[1062,7052,6805],{"class":1079},[1062,7054,1199],{"class":1117},[1062,7056,6926],{"class":1202},[1062,7058,1199],{"class":1117},[1062,7060,6931],{"class":1202},[1062,7062,1219],{"class":1192},[1062,7064,4247],{"class":1131},[1062,7066,7067,7069,7071,7073,7075,7077,7079,7081,7083,7085,7087,7089],{"class":1064,"line":1916},[1062,7068,6940],{"class":1079},[1062,7070,2595],{"class":1117},[1062,7072,2972],{"class":1113},[1062,7074,1199],{"class":1117},[1062,7076,6518],{"class":1202},[1062,7078,1199],{"class":1117},[1062,7080,1546],{"class":1537},[1062,7082,1534],{"class":1117},[1062,7084,6957],{"class":1537},[1062,7086,1462],{"class":1117},[1062,7088,6962],{"class":1530},[1062,7090,6965],{"class":1117},[1062,7092,7093],{"class":1064,"line":1921},[1062,7094,2573],{"class":1079},[1062,7096,7097,7099,7101],{"class":1064,"line":1927},[1062,7098,2742],{"class":1075},[1062,7100,7002],{"class":1079},[1062,7102,2458],{"class":1117},[1062,7104,7105],{"class":1064,"line":1941},[1062,7106,7107],{"class":1068},"            # Delete all dependent cache keys\n",[1062,7109,7110,7113,7115,7117,7119,7122,7124,7127,7129,7132],{"class":1064,"line":1961},[1062,7111,7112],{"class":1113},"            self",[1062,7114,1199],{"class":1117},[1062,7116,6518],{"class":1202},[1062,7118,1199],{"class":1117},[1062,7120,7121],{"class":1537},"delete_many",[1062,7123,1534],{"class":1117},[1062,7125,7126],{"class":1530},"list",[1062,7128,1534],{"class":1117},[1062,7130,7131],{"class":1537},"dependent_keys",[1062,7133,7134],{"class":1117},"))\n",[1062,7136,7137],{"class":1064,"line":1981},[1062,7138,7139],{"class":1068},"            # Clear the dependency tracking\n",[1062,7141,7142,7144,7146,7148,7150,7153,7155,7157],{"class":1064,"line":2000},[1062,7143,7112],{"class":1113},[1062,7145,1199],{"class":1117},[1062,7147,6518],{"class":1202},[1062,7149,1199],{"class":1117},[1062,7151,7152],{"class":1537},"delete",[1062,7154,1534],{"class":1117},[1062,7156,6957],{"class":1537},[1062,7158,2855],{"class":1117},[1062,7160,7161],{"class":1064,"line":2013},[1062,7162,1101],{"emptyLinePlaceholder":1100},[1062,7164,7165],{"class":1064,"line":2030},[1062,7166,7167],{"class":1068},"# Global query cache manager\n",[1062,7169,7170,7173,7175,7177],{"class":1064,"line":2047},[1062,7171,7172],{"class":1079},"query_cache ",[1062,7174,2595],{"class":1117},[1062,7176,6459],{"class":1537},[1062,7178,2915],{"class":1117},[1062,7180,7181],{"class":1064,"line":2053},[1062,7182,1101],{"emptyLinePlaceholder":1100},[1062,7184,7185],{"class":1064,"line":2059},[1062,7186,7187],{"class":1068},"# Automatic cache invalidation\n",[1062,7189,7190,7192,7194,7197,7199,7201,7204],{"class":1064,"line":2065},[1062,7191,3564],{"class":1117},[1062,7193,4698],{"class":2580},[1062,7195,7196],{"class":1117},"([",[1062,7198,4703],{"class":1537},[1062,7200,1462],{"class":1117},[1062,7202,7203],{"class":1537}," post_delete",[1062,7205,2990],{"class":1117},[1062,7207,7208,7210,7213,7215,7217,7219,7221,7223],{"class":1064,"line":2070},[1062,7209,3632],{"class":1185},[1062,7211,7212],{"class":2580}," invalidate_model_cache_on_change",[1062,7214,1534],{"class":1117},[1062,7216,4726],{"class":2590},[1062,7218,1462],{"class":1117},[1062,7220,4736],{"class":2594},[1062,7222,4739],{"class":2590},[1062,7224,2493],{"class":1117},[1062,7226,7227,7229,7232],{"class":1064,"line":2076},[1062,7228,2464],{"class":2463},[1062,7230,7231],{"class":2467},"Invalidate model cache when any instance changes.",[1062,7233,2471],{"class":2463},[1062,7235,7236,7239,7241,7244,7246,7248],{"class":1064,"line":2092},[1062,7237,7238],{"class":1079},"    query_cache",[1062,7240,1199],{"class":1117},[1062,7242,7243],{"class":1537},"invalidate_model_cache",[1062,7245,1534],{"class":1117},[1062,7247,4726],{"class":1537},[1062,7249,2855],{"class":1117},[1062,7251,7252],{"class":1064,"line":2106},[1062,7253,1101],{"emptyLinePlaceholder":1100},[1062,7255,7256],{"class":1064,"line":2118},[1062,7257,7258],{"class":1068},"# Enhanced model manager with caching\n",[1062,7260,7261,7263,7266,7268,7271,7273,7276],{"class":1064,"line":2123},[1062,7262,2451],{"class":1185},[1062,7264,7265],{"class":2454}," CachedManager",[1062,7267,1534],{"class":1117},[1062,7269,4641],{"class":7270},"sYn-s",[1062,7272,1199],{"class":1117},[1062,7274,7275],{"class":7270},"Manager",[1062,7277,2493],{"class":1117},[1062,7279,7280,7282,7285],{"class":1064,"line":2129},[1062,7281,2464],{"class":2463},[1062,7283,7284],{"class":2467},"Model manager with built-in caching.",[1062,7286,2471],{"class":2463},[1062,7288,7289],{"class":1064,"line":2143},[1062,7290,1575],{"class":1079},[1062,7292,7293,7295,7297,7299,7301,7303,7306,7308,7310],{"class":1064,"line":2155},[1062,7294,2480],{"class":1185},[1062,7296,2484],{"class":2483},[1062,7298,1534],{"class":1117},[1062,7300,2490],{"class":2489},[1062,7302,1462],{"class":1117},[1062,7304,7305],{"class":2590}," cache_timeout",[1062,7307,2595],{"class":2594},[1062,7309,3587],{"class":1360},[1062,7311,2493],{"class":1117},[1062,7313,7314,7317,7320,7323],{"class":1064,"line":2190},[1062,7315,7316],{"class":1530},"        super",[1062,7318,7319],{"class":1117},"().",[1062,7321,7322],{"class":2483},"__init__",[1062,7324,2915],{"class":1117},[1062,7326,7327,7329,7331,7334,7336],{"class":1064,"line":2195},[1062,7328,2498],{"class":1113},[1062,7330,1199],{"class":1117},[1062,7332,7333],{"class":1202},"cache_timeout",[1062,7335,1118],{"class":1117},[1062,7337,7338],{"class":1079}," cache_timeout\n",[1062,7340,7341],{"class":1064,"line":2201},[1062,7342,1575],{"class":1079},[1062,7344,7345,7347,7350,7352,7354,7356,7358,7360],{"class":1064,"line":2212},[1062,7346,2480],{"class":1185},[1062,7348,7349],{"class":2580}," cached_filter",[1062,7351,1534],{"class":1117},[1062,7353,2490],{"class":2489},[1062,7355,1462],{"class":1117},[1062,7357,4736],{"class":2594},[1062,7359,4739],{"class":2590},[1062,7361,2493],{"class":1117},[1062,7363,7364,7366,7369],{"class":1064,"line":2222},[1062,7365,2624],{"class":2463},[1062,7367,7368],{"class":2467},"Filter with automatic caching.",[1062,7370,2471],{"class":2463},[1062,7372,7373],{"class":1064,"line":2227},[1062,7374,7375],{"class":1068},"        # Generate cache key from filter parameters\n",[1062,7377,7378,7381,7383,7385,7387,7390,7392,7394,7396,7399,7401,7403],{"class":1064,"line":2233},[1062,7379,7380],{"class":1079},"        filter_str ",[1062,7382,2595],{"class":1117},[1062,7384,2885],{"class":1079},[1062,7386,1199],{"class":1117},[1062,7388,7389],{"class":1537},"dumps",[1062,7391,1534],{"class":1117},[1062,7393,4739],{"class":1537},[1062,7395,1462],{"class":1117},[1062,7397,7398],{"class":2884}," sort_keys",[1062,7400,2595],{"class":1117},[1062,7402,3577],{"class":1378},[1062,7404,2855],{"class":1117},[1062,7406,7407,7410,7412,7414,7416,7418,7420,7422,7424,7426,7428,7430,7432,7434,7437,7439,7441,7443,7445,7447,7450,7452,7454,7456,7458,7460,7462],{"class":1064,"line":2248},[1062,7408,7409],{"class":1079},"        cache_key ",[1062,7411,2595],{"class":1117},[1062,7413,1486],{"class":1185},[1062,7415,1489],{"class":1131},[1062,7417,1193],{"class":1192},[1062,7419,2490],{"class":1113},[1062,7421,1199],{"class":1117},[1062,7423,6805],{"class":1202},[1062,7425,1199],{"class":1117},[1062,7427,6926],{"class":1202},[1062,7429,1199],{"class":1117},[1062,7431,6931],{"class":1202},[1062,7433,1219],{"class":1192},[1062,7435,7436],{"class":1131},":filter:",[1062,7438,1193],{"class":1192},[1062,7440,6628],{"class":1079},[1062,7442,1199],{"class":1117},[1062,7444,6633],{"class":1537},[1062,7446,1534],{"class":1117},[1062,7448,7449],{"class":1537},"filter_str",[1062,7451,1199],{"class":1117},[1062,7453,6643],{"class":1537},[1062,7455,6646],{"class":1117},[1062,7457,6649],{"class":1537},[1062,7459,6652],{"class":1117},[1062,7461,1219],{"class":1192},[1062,7463,4247],{"class":1131},[1062,7465,7466],{"class":1064,"line":2285},[1062,7467,2573],{"class":1079},[1062,7469,7470,7473,7475,7477,7479,7482,7484,7487,7489],{"class":1064,"line":2290},[1062,7471,7472],{"class":1079},"        queryset ",[1062,7474,2595],{"class":1117},[1062,7476,2972],{"class":1113},[1062,7478,1199],{"class":1117},[1062,7480,7481],{"class":1537},"filter",[1062,7483,1534],{"class":1117},[1062,7485,7486],{"class":2594},"**",[1062,7488,4739],{"class":1537},[1062,7490,2855],{"class":1117},[1062,7492,7493,7495,7498,7500,7503,7505,7507,7509,7511,7513,7515,7517,7519],{"class":1064,"line":2296},[1062,7494,2924],{"class":1075},[1062,7496,7497],{"class":1079}," query_cache",[1062,7499,1199],{"class":1117},[1062,7501,7502],{"class":1537},"cache_queryset",[1062,7504,1534],{"class":1117},[1062,7506,6604],{"class":1537},[1062,7508,1462],{"class":1117},[1062,7510,6547],{"class":1537},[1062,7512,1462],{"class":1117},[1062,7514,2972],{"class":1113},[1062,7516,1199],{"class":1117},[1062,7518,7333],{"class":1202},[1062,7520,2855],{"class":1117},[1062,7522,7523],{"class":1064,"line":2311},[1062,7524,1575],{"class":1079},[1062,7526,7527,7529,7532,7534,7536,7538,7540,7542],{"class":1064,"line":2337},[1062,7528,2480],{"class":1185},[1062,7530,7531],{"class":2580}," cached_get",[1062,7533,1534],{"class":1117},[1062,7535,2490],{"class":2489},[1062,7537,1462],{"class":1117},[1062,7539,4736],{"class":2594},[1062,7541,4739],{"class":2590},[1062,7543,2493],{"class":1117},[1062,7545,7546,7548,7551],{"class":1064,"line":2347},[1062,7547,2624],{"class":2463},[1062,7549,7550],{"class":2467},"Get with caching (use carefully - only for immutable lookups).",[1062,7552,2471],{"class":2463},[1062,7554,7555,7557,7559,7561,7563,7565,7567,7569,7571,7573,7575,7577],{"class":1064,"line":2371},[1062,7556,7380],{"class":1079},[1062,7558,2595],{"class":1117},[1062,7560,2885],{"class":1079},[1062,7562,1199],{"class":1117},[1062,7564,7389],{"class":1537},[1062,7566,1534],{"class":1117},[1062,7568,4739],{"class":1537},[1062,7570,1462],{"class":1117},[1062,7572,7398],{"class":2884},[1062,7574,2595],{"class":1117},[1062,7576,3577],{"class":1378},[1062,7578,2855],{"class":1117},[1062,7580,7581,7583,7585,7587,7589,7591,7593,7595,7597,7599,7601,7603,7605,7607,7610,7612,7614,7616,7618,7620,7622,7624,7626,7628,7630,7632,7634],{"class":1064,"line":3629},[1062,7582,7409],{"class":1079},[1062,7584,2595],{"class":1117},[1062,7586,1486],{"class":1185},[1062,7588,1489],{"class":1131},[1062,7590,1193],{"class":1192},[1062,7592,2490],{"class":1113},[1062,7594,1199],{"class":1117},[1062,7596,6805],{"class":1202},[1062,7598,1199],{"class":1117},[1062,7600,6926],{"class":1202},[1062,7602,1199],{"class":1117},[1062,7604,6931],{"class":1202},[1062,7606,1219],{"class":1192},[1062,7608,7609],{"class":1131},":get:",[1062,7611,1193],{"class":1192},[1062,7613,6628],{"class":1079},[1062,7615,1199],{"class":1117},[1062,7617,6633],{"class":1537},[1062,7619,1534],{"class":1117},[1062,7621,7449],{"class":1537},[1062,7623,1199],{"class":1117},[1062,7625,6643],{"class":1537},[1062,7627,6646],{"class":1117},[1062,7629,6649],{"class":1537},[1062,7631,6652],{"class":1117},[1062,7633,1219],{"class":1192},[1062,7635,4247],{"class":1131},[1062,7637,7638],{"class":1064,"line":3649},[1062,7639,2573],{"class":1079},[1062,7641,7642],{"class":1064,"line":3659},[1062,7643,7644],{"class":1068},"        # Try cache first\n",[1062,7646,7647,7649,7651,7654,7656,7658,7660,7662],{"class":1064,"line":3695},[1062,7648,6701],{"class":1079},[1062,7650,2595],{"class":1117},[1062,7652,7653],{"class":1079}," cache",[1062,7655,1199],{"class":1117},[1062,7657,1546],{"class":1537},[1062,7659,1534],{"class":1117},[1062,7661,6718],{"class":1537},[1062,7663,2855],{"class":1117},[1062,7665,7666,7668,7670,7672,7674,7676],{"class":1064,"line":3700},[1062,7667,2742],{"class":1075},[1062,7669,6727],{"class":1079},[1062,7671,6580],{"class":2594},[1062,7673,6732],{"class":2594},[1062,7675,6583],{"class":1378},[1062,7677,2458],{"class":1117},[1062,7679,7680,7682],{"class":1064,"line":3706},[1062,7681,6741],{"class":1075},[1062,7683,6744],{"class":1079},[1062,7685,7686],{"class":1064,"line":3720},[1062,7687,2573],{"class":1079},[1062,7689,7690],{"class":1064,"line":3744},[1062,7691,7692],{"class":1068},"        # Get from database\n",[1062,7694,7695,7697],{"class":1064,"line":3771},[1062,7696,4769],{"class":1075},[1062,7698,2458],{"class":1117},[1062,7700,7701,7704,7706,7708,7710,7712,7714,7716,7718],{"class":1064,"line":3798},[1062,7702,7703],{"class":1079},"            result ",[1062,7705,2595],{"class":1117},[1062,7707,2972],{"class":1113},[1062,7709,1199],{"class":1117},[1062,7711,1546],{"class":1537},[1062,7713,1534],{"class":1117},[1062,7715,7486],{"class":2594},[1062,7717,4739],{"class":1537},[1062,7719,2855],{"class":1117},[1062,7721,7722,7724,7726,7728,7730,7732,7734,7736,7738,7740,7742,7744],{"class":1064,"line":3804},[1062,7723,4798],{"class":1079},[1062,7725,1199],{"class":1117},[1062,7727,4803],{"class":1537},[1062,7729,1534],{"class":1117},[1062,7731,6718],{"class":1537},[1062,7733,1462],{"class":1117},[1062,7735,6796],{"class":1537},[1062,7737,1462],{"class":1117},[1062,7739,2972],{"class":1113},[1062,7741,1199],{"class":1117},[1062,7743,7333],{"class":1202},[1062,7745,2855],{"class":1117},[1062,7747,7748,7750],{"class":1064,"line":3809},[1062,7749,6741],{"class":1075},[1062,7751,6822],{"class":1079},[1062,7753,7754,7756,7758,7760,7762,7764,7767],{"class":1064,"line":3832},[1062,7755,4838],{"class":1075},[1062,7757,2972],{"class":1113},[1062,7759,1199],{"class":1117},[1062,7761,6805],{"class":1202},[1062,7763,1199],{"class":1117},[1062,7765,7766],{"class":1202},"DoesNotExist",[1062,7768,2458],{"class":1117},[1062,7770,7771],{"class":1064,"line":5408},[1062,7772,7773],{"class":1068},"            # Cache negative results briefly\n",[1062,7775,7776,7778,7780,7782,7784,7786,7788,7790,7792,7794],{"class":1064,"line":5414},[1062,7777,4798],{"class":1079},[1062,7779,1199],{"class":1117},[1062,7781,4803],{"class":1537},[1062,7783,1534],{"class":1117},[1062,7785,6718],{"class":1537},[1062,7787,1462],{"class":1117},[1062,7789,6583],{"class":1378},[1062,7791,1462],{"class":1117},[1062,7793,1903],{"class":1360},[1062,7795,2855],{"class":1117},[1062,7797,7798],{"class":1064,"line":5420},[1062,7799,7800],{"class":1075},"            raise\n",[1062,7802,7803],{"class":1064,"line":5426},[1062,7804,1575],{"class":1079},[1062,7806,7807,7809,7812,7814,7816,7818,7820,7822],{"class":1064,"line":5432},[1062,7808,2480],{"class":1185},[1062,7810,7811],{"class":2580}," cached_count",[1062,7813,1534],{"class":1117},[1062,7815,2490],{"class":2489},[1062,7817,1462],{"class":1117},[1062,7819,4736],{"class":2594},[1062,7821,4739],{"class":2590},[1062,7823,2493],{"class":1117},[1062,7825,7826,7828,7831],{"class":1064,"line":5437},[1062,7827,2624],{"class":2463},[1062,7829,7830],{"class":2467},"Count with caching.",[1062,7832,2471],{"class":2463},[1062,7834,7835,7837,7839,7841,7843,7845,7847,7849,7851,7853,7855,7857],{"class":1064,"line":5443},[1062,7836,7380],{"class":1079},[1062,7838,2595],{"class":1117},[1062,7840,2885],{"class":1079},[1062,7842,1199],{"class":1117},[1062,7844,7389],{"class":1537},[1062,7846,1534],{"class":1117},[1062,7848,4739],{"class":1537},[1062,7850,1462],{"class":1117},[1062,7852,7398],{"class":2884},[1062,7854,2595],{"class":1117},[1062,7856,3577],{"class":1378},[1062,7858,2855],{"class":1117},[1062,7860,7861,7863,7865,7867,7869,7871,7873,7875,7877,7879,7881,7883,7885,7887,7890,7892,7894,7896,7898,7900,7902,7904,7906,7908,7910,7912,7914],{"class":1064,"line":5449},[1062,7862,7409],{"class":1079},[1062,7864,2595],{"class":1117},[1062,7866,1486],{"class":1185},[1062,7868,1489],{"class":1131},[1062,7870,1193],{"class":1192},[1062,7872,2490],{"class":1113},[1062,7874,1199],{"class":1117},[1062,7876,6805],{"class":1202},[1062,7878,1199],{"class":1117},[1062,7880,6926],{"class":1202},[1062,7882,1199],{"class":1117},[1062,7884,6931],{"class":1202},[1062,7886,1219],{"class":1192},[1062,7888,7889],{"class":1131},":count:",[1062,7891,1193],{"class":1192},[1062,7893,6628],{"class":1079},[1062,7895,1199],{"class":1117},[1062,7897,6633],{"class":1537},[1062,7899,1534],{"class":1117},[1062,7901,7449],{"class":1537},[1062,7903,1199],{"class":1117},[1062,7905,6643],{"class":1537},[1062,7907,6646],{"class":1117},[1062,7909,6649],{"class":1537},[1062,7911,6652],{"class":1117},[1062,7913,1219],{"class":1192},[1062,7915,4247],{"class":1131},[1062,7917,7918],{"class":1064,"line":5454},[1062,7919,2573],{"class":1079},[1062,7921,7922,7925,7927,7929,7931,7933,7935,7937],{"class":1064,"line":5459},[1062,7923,7924],{"class":1079},"        cached_count ",[1062,7926,2595],{"class":1117},[1062,7928,7653],{"class":1079},[1062,7930,1199],{"class":1117},[1062,7932,1546],{"class":1537},[1062,7934,1534],{"class":1117},[1062,7936,6718],{"class":1537},[1062,7938,2855],{"class":1117},[1062,7940,7941,7943,7946,7948,7950,7952],{"class":1064,"line":5464},[1062,7942,2742],{"class":1075},[1062,7944,7945],{"class":1079}," cached_count ",[1062,7947,6580],{"class":2594},[1062,7949,6732],{"class":2594},[1062,7951,6583],{"class":1378},[1062,7953,2458],{"class":1117},[1062,7955,7956,7958],{"class":1064,"line":5469},[1062,7957,6741],{"class":1075},[1062,7959,7960],{"class":1079}," cached_count\n",[1062,7962,7963],{"class":1064,"line":5474},[1062,7964,2573],{"class":1079},[1062,7966,7967,7970,7972,7974,7976,7978,7980,7982,7984,7987,7990],{"class":1064,"line":5479},[1062,7968,7969],{"class":1079},"        count ",[1062,7971,2595],{"class":1117},[1062,7973,2972],{"class":1113},[1062,7975,1199],{"class":1117},[1062,7977,7481],{"class":1537},[1062,7979,1534],{"class":1117},[1062,7981,7486],{"class":2594},[1062,7983,4739],{"class":1537},[1062,7985,7986],{"class":1117},").",[1062,7988,7989],{"class":1537},"count",[1062,7991,2915],{"class":1117},[1062,7993,7994,7997,7999,8001,8003,8005,8007,8010,8012,8014,8016,8018],{"class":1064,"line":5484},[1062,7995,7996],{"class":1079},"        cache",[1062,7998,1199],{"class":1117},[1062,8000,4803],{"class":1537},[1062,8002,1534],{"class":1117},[1062,8004,6718],{"class":1537},[1062,8006,1462],{"class":1117},[1062,8008,8009],{"class":1537}," count",[1062,8011,1462],{"class":1117},[1062,8013,2972],{"class":1113},[1062,8015,1199],{"class":1117},[1062,8017,7333],{"class":1202},[1062,8019,2855],{"class":1117},[1062,8021,8022],{"class":1064,"line":5489},[1062,8023,2573],{"class":1079},[1062,8025,8026,8028],{"class":1064,"line":5494},[1062,8027,2924],{"class":1075},[1062,8029,8030],{"class":1079}," count\n",[1062,8032,8033],{"class":1064,"line":5500},[1062,8034,1101],{"emptyLinePlaceholder":1100},[1062,8036,8037],{"class":1064,"line":5506},[1062,8038,8039],{"class":1068},"# Usage in models\n",[1062,8041,8042,8044,8047,8049,8051,8053,8056],{"class":1064,"line":5512},[1062,8043,2451],{"class":1185},[1062,8045,8046],{"class":2454}," Post",[1062,8048,1534],{"class":1117},[1062,8050,4641],{"class":7270},[1062,8052,1199],{"class":1117},[1062,8054,8055],{"class":7270},"Model",[1062,8057,2493],{"class":1117},[1062,8059,8060,8063,8065,8068,8070,8073,8075,8078,8080,8083],{"class":1064,"line":5518},[1062,8061,8062],{"class":1079},"    title ",[1062,8064,2595],{"class":1117},[1062,8066,8067],{"class":1079}," models",[1062,8069,1199],{"class":1117},[1062,8071,8072],{"class":1537},"CharField",[1062,8074,1534],{"class":1117},[1062,8076,8077],{"class":2884},"max_length",[1062,8079,2595],{"class":1117},[1062,8081,8082],{"class":1360},"200",[1062,8084,2855],{"class":1117},[1062,8086,8087,8090,8092,8094,8096,8099],{"class":1064,"line":5524},[1062,8088,8089],{"class":1079},"    content ",[1062,8091,2595],{"class":1117},[1062,8093,8067],{"class":1079},[1062,8095,1199],{"class":1117},[1062,8097,8098],{"class":1537},"TextField",[1062,8100,2915],{"class":1117},[1062,8102,8103,8106,8108,8110,8112,8115,8117,8119,8121,8123],{"class":1064,"line":5530},[1062,8104,8105],{"class":1079},"    published ",[1062,8107,2595],{"class":1117},[1062,8109,8067],{"class":1079},[1062,8111,1199],{"class":1117},[1062,8113,8114],{"class":1537},"BooleanField",[1062,8116,1534],{"class":1117},[1062,8118,1132],{"class":2884},[1062,8120,2595],{"class":1117},[1062,8122,2617],{"class":1378},[1062,8124,2855],{"class":1117},[1062,8126,8127,8130,8132,8134,8136,8139,8141,8144,8146,8148],{"class":1064,"line":5536},[1062,8128,8129],{"class":1079},"    created_at ",[1062,8131,2595],{"class":1117},[1062,8133,8067],{"class":1079},[1062,8135,1199],{"class":1117},[1062,8137,8138],{"class":1537},"DateTimeField",[1062,8140,1534],{"class":1117},[1062,8142,8143],{"class":2884},"auto_now_add",[1062,8145,2595],{"class":1117},[1062,8147,3577],{"class":1378},[1062,8149,2855],{"class":1117},[1062,8151,8152],{"class":1064,"line":5541},[1062,8153,1575],{"class":1079},[1062,8155,8156,8159,8161,8163,8165,8167,8169],{"class":1064,"line":5546},[1062,8157,8158],{"class":1079},"    objects ",[1062,8160,2595],{"class":1117},[1062,8162,8067],{"class":1079},[1062,8164,1199],{"class":1117},[1062,8166,7275],{"class":1537},[1062,8168,6652],{"class":1117},[1062,8170,8171],{"class":1068},"  # Default manager\n",[1062,8173,8174,8177,8179,8181,8183,8185,8187,8190,8193],{"class":1064,"line":5552},[1062,8175,8176],{"class":1079},"    cached ",[1062,8178,2595],{"class":1117},[1062,8180,7265],{"class":1537},[1062,8182,1534],{"class":1117},[1062,8184,7333],{"class":2884},[1062,8186,2595],{"class":1117},[1062,8188,8189],{"class":1360},"1800",[1062,8191,8192],{"class":1117},")",[1062,8194,8195],{"class":1068},"  # Cached manager\n",[1062,8197,8198],{"class":1064,"line":5558},[1062,8199,1575],{"class":1079},[1062,8201,8202,8205,8208],{"class":1064,"line":5563},[1062,8203,8204],{"class":1185},"    class",[1062,8206,8207],{"class":2454}," Meta",[1062,8209,2458],{"class":1117},[1062,8211,8212,8215,8217,8219,8221,8224,8226],{"class":1064,"line":5568},[1062,8213,8214],{"class":1079},"        ordering ",[1062,8216,2595],{"class":1117},[1062,8218,4105],{"class":1117},[1062,8220,1135],{"class":1127},[1062,8222,8223],{"class":1131},"-created_at",[1062,8225,1135],{"class":1127},[1062,8227,2334],{"class":1117},[1062,8229,8230],{"class":1064,"line":5574},[1062,8231,1101],{"emptyLinePlaceholder":1100},[1062,8233,8234],{"class":1064,"line":5579},[1062,8235,8236],{"class":1068},"# Usage examples\n",[1062,8238,8239],{"class":1064,"line":5584},[1062,8240,8241],{"class":1068},"# Cached filtering\n",[1062,8243,8244,8247,8249,8251,8253,8256,8258,8261,8263,8265,8267,8269,8271,8274,8276,8279],{"class":1064,"line":5590},[1062,8245,8246],{"class":1079},"popular_posts ",[1062,8248,2595],{"class":1117},[1062,8250,8046],{"class":1079},[1062,8252,1199],{"class":1117},[1062,8254,8255],{"class":1202},"cached",[1062,8257,1199],{"class":1117},[1062,8259,8260],{"class":1537},"cached_filter",[1062,8262,1534],{"class":1117},[1062,8264,4762],{"class":2884},[1062,8266,2595],{"class":1117},[1062,8268,3577],{"class":1378},[1062,8270,1462],{"class":1117},[1062,8272,8273],{"class":2884}," views__gte",[1062,8275,2595],{"class":1117},[1062,8277,8278],{"class":1360},"100",[1062,8280,2855],{"class":1117},[1062,8282,8283],{"class":1064,"line":5596},[1062,8284,1101],{"emptyLinePlaceholder":1100},[1062,8286,8287],{"class":1064,"line":5602},[1062,8288,8289],{"class":1068},"# Cached counting\n",[1062,8291,8292,8295,8297,8299,8301,8303,8305,8308,8310,8312,8314,8316],{"class":1064,"line":5608},[1062,8293,8294],{"class":1079},"published_count ",[1062,8296,2595],{"class":1117},[1062,8298,8046],{"class":1079},[1062,8300,1199],{"class":1117},[1062,8302,8255],{"class":1202},[1062,8304,1199],{"class":1117},[1062,8306,8307],{"class":1537},"cached_count",[1062,8309,1534],{"class":1117},[1062,8311,4762],{"class":2884},[1062,8313,2595],{"class":1117},[1062,8315,3577],{"class":1378},[1062,8317,2855],{"class":1117},[1062,8319,8320],{"class":1064,"line":5614},[1062,8321,1101],{"emptyLinePlaceholder":1100},[1062,8323,8324],{"class":1064,"line":5619},[1062,8325,8326],{"class":1068},"# Regular queryset with manual caching\n",[1062,8328,8329,8332,8334,8336,8338,8340],{"class":1064,"line":5625},[1062,8330,8331],{"class":1079},"recent_posts ",[1062,8333,2595],{"class":1117},[1062,8335,7497],{"class":1079},[1062,8337,1199],{"class":1117},[1062,8339,7502],{"class":1537},[1062,8341,3959],{"class":1117},[1062,8343,8344,8347,8349,8352,8354,8356,8358,8360,8362,8364,8367,8370],{"class":1064,"line":5630},[1062,8345,8346],{"class":1537},"    Post",[1062,8348,1199],{"class":1117},[1062,8350,8351],{"class":1202},"objects",[1062,8353,1199],{"class":1117},[1062,8355,7481],{"class":1537},[1062,8357,1534],{"class":1117},[1062,8359,4762],{"class":2884},[1062,8361,2595],{"class":1117},[1062,8363,3577],{"class":1378},[1062,8365,8366],{"class":1117},")[:",[1062,8368,8369],{"class":1360},"10",[1062,8371,8372],{"class":1117},"],\n",[1062,8374,8375,8378,8380,8382,8385,8387],{"class":1064,"line":5635},[1062,8376,8377],{"class":2884},"    cache_key",[1062,8379,2595],{"class":1117},[1062,8381,1135],{"class":1127},[1062,8383,8384],{"class":1131},"recent_posts",[1062,8386,1135],{"class":1127},[1062,8388,1164],{"class":1117},[1062,8390,8391,8394,8396],{"class":1064,"line":5640},[1062,8392,8393],{"class":2884},"    timeout",[1062,8395,2595],{"class":1117},[1062,8397,8398],{"class":1360},"900\n",[1062,8400,8401],{"class":1064,"line":5646},[1062,8402,2855],{"class":1117},[1030,8404,8406],{"id":8405},"cache-monitoring-and-analytics","Cache Monitoring and Analytics",[1035,8408,8410],{"id":8409},"production-cache-monitoring","Production Cache Monitoring",[1040,8412,8414],{"className":1056,"code":8413,"language":1058,"meta":1049,"style":1049},"# monitoring/cache_monitor.py\nimport time\nimport json\nfrom django.core.cache import cache, caches\nfrom django.core.management.base import BaseCommand\nfrom django.conf import settings\nimport logging\n\nlogger = logging.getLogger('cache_monitor')\n\nclass CacheMonitor:\n    \"\"\"Monitor cache performance across all backends.\"\"\"\n    \n    def __init__(self):\n        self.backends = {}\n        for alias, config in settings.CACHES.items():\n            self.backends[alias] = caches[alias]\n    \n    def get_cache_stats(self):\n        \"\"\"Get statistics for all cache backends.\"\"\"\n        stats = {}\n        \n        for alias, cache_backend in self.backends.items():\n            try:\n                backend_stats = self._get_backend_stats(alias, cache_backend)\n                stats[alias] = backend_stats\n            except Exception as e:\n                logger.error(f\"Failed to get stats for {alias}: {e}\")\n                stats[alias] = {'error': str(e)}\n        \n        return stats\n    \n    def _get_backend_stats(self, alias, cache_backend):\n        \"\"\"Get statistics for a specific cache backend.\"\"\"\n        stats = {\n            'backend_type': cache_backend.__class__.__name__,\n            'alias': alias,\n        }\n        \n        # Redis-specific stats\n        if 'redis' in cache_backend.__class__.__module__.lower():\n            try:\n                from django_redis import get_redis_connection\n                redis_conn = get_redis_connection(alias)\n                \n                info = redis_conn.info()\n                stats.update({\n                    'connected_clients': info.get('connected_clients', 0),\n                    'used_memory': info.get('used_memory', 0),\n                    'used_memory_human': info.get('used_memory_human', '0B'),\n                    'keyspace_hits': info.get('keyspace_hits', 0),\n                    'keyspace_misses': info.get('keyspace_misses', 0),\n                    'total_commands_processed': info.get('total_commands_processed', 0),\n                })\n                \n                # Calculate hit rate\n                hits = stats['keyspace_hits']\n                misses = stats['keyspace_misses']\n                total = hits + misses\n                stats['hit_rate'] = (hits / total * 100) if total > 0 else 0\n                \n            except Exception as e:\n                stats['redis_error'] = str(e)\n        \n        # Memcached-specific stats\n        elif 'memcached' in cache_backend.__class__.__module__.lower():\n            try:\n                # This would require additional implementation\n                # depending on the memcached client\n                pass\n            except Exception as e:\n                stats['memcached_error'] = str(e)\n        \n        return stats\n    \n    def check_cache_health(self):\n        \"\"\"Check health of all cache backends.\"\"\"\n        health_status = {}\n        \n        for alias, cache_backend in self.backends.items():\n            try:\n                # Test basic operations\n                test_key = f\"health_check_{alias}_{int(time.time())}\"\n                test_value = \"health_check_value\"\n                \n                # Test set\n                cache_backend.set(test_key, test_value, 60)\n                \n                # Test get\n                retrieved_value = cache_backend.get(test_key)\n                \n                # Test delete\n                cache_backend.delete(test_key)\n                \n                health_status[alias] = {\n                    'status': 'healthy' if retrieved_value == test_value else 'unhealthy',\n                    'response_time': self._measure_response_time(cache_backend),\n                }\n                \n            except Exception as e:\n                health_status[alias] = {\n                    'status': 'error',\n                    'error': str(e),\n                    'response_time': None,\n                }\n        \n        return health_status\n    \n    def _measure_response_time(self, cache_backend):\n        \"\"\"Measure cache response time.\"\"\"\n        test_key = f\"perf_test_{int(time.time())}\"\n        test_value = \"performance_test\"\n        \n        # Measure set operation\n        start_time = time.time()\n        cache_backend.set(test_key, test_value, 60)\n        set_time = time.time() - start_time\n        \n        # Measure get operation\n        start_time = time.time()\n        cache_backend.get(test_key)\n        get_time = time.time() - start_time\n        \n        # Cleanup\n        cache_backend.delete(test_key)\n        \n        return {\n            'set_time': set_time,\n            'get_time': get_time,\n            'avg_time': (set_time + get_time) / 2,\n        }\n    \n    def generate_report(self):\n        \"\"\"Generate comprehensive cache monitoring report.\"\"\"\n        report = {\n            'timestamp': time.time(),\n            'stats': self.get_cache_stats(),\n            'health': self.check_cache_health(),\n        }\n        \n        return report\n\n# Management command for cache monitoring\nclass Command(BaseCommand):\n    help = 'Monitor cache performance and health'\n    \n    def add_arguments(self, parser):\n        parser.add_argument(\n            '--format',\n            choices=['json', 'table'],\n            default='table',\n            help='Output format'\n        )\n        parser.add_argument(\n            '--continuous',\n            action='store_true',\n            help='Run continuous monitoring'\n        )\n        parser.add_argument(\n            '--interval',\n            type=int,\n            default=60,\n            help='Monitoring interval in seconds'\n        )\n    \n    def handle(self, *args, **options):\n        monitor = CacheMonitor()\n        \n        if options['continuous']:\n            self.run_continuous_monitoring(monitor, options)\n        else:\n            self.run_single_report(monitor, options)\n    \n    def run_single_report(self, monitor, options):\n        \"\"\"Run a single monitoring report.\"\"\"\n        report = monitor.generate_report()\n        \n        if options['format'] == 'json':\n            self.stdout.write(json.dumps(report, indent=2))\n        else:\n            self.print_table_report(report)\n    \n    def run_continuous_monitoring(self, monitor, options):\n        \"\"\"Run continuous monitoring.\"\"\"\n        interval = options['interval']\n        \n        self.stdout.write(f'Starting continuous monitoring (interval: {interval}s)')\n        \n        try:\n            while True:\n                report = monitor.generate_report()\n                \n                if options['format'] == 'json':\n                    self.stdout.write(json.dumps(report, indent=2))\n                else:\n                    self.print_table_report(report)\n                \n                time.sleep(interval)\n        \n        except KeyboardInterrupt:\n            self.stdout.write('\\nMonitoring stopped')\n    \n    def print_table_report(self, report):\n        \"\"\"Print report in table format.\"\"\"\n        self.stdout.write('\\n' + '='*80)\n        self.stdout.write(f\"Cache Monitoring Report - {time.ctime(report['timestamp'])}\")\n        self.stdout.write('='*80)\n        \n        # Health status\n        self.stdout.write('\\nHealth Status:')\n        for alias, health in report['health'].items():\n            status = health['status']\n            color = self.style.SUCCESS if status == 'healthy' else self.style.ERROR\n            self.stdout.write(f\"  {alias}: {color(status.upper())}\")\n            \n            if health.get('response_time'):\n                rt = health['response_time']\n                self.stdout.write(f\"    Response time: {rt['avg_time']:.4f}s\")\n        \n        # Cache statistics\n        self.stdout.write('\\nCache Statistics:')\n        for alias, stats in report['stats'].items():\n            if 'error' in stats:\n                self.stdout.write(f\"  {alias}: {self.style.ERROR('ERROR')} - {stats['error']}\")\n                continue\n            \n            self.stdout.write(f\"  {alias} ({stats['backend_type']}):\")\n            \n            if 'hit_rate' in stats:\n                hit_rate = stats['hit_rate']\n                color = self.style.SUCCESS if hit_rate > 80 else self.style.WARNING\n                self.stdout.write(f\"    Hit rate: {color(f'{hit_rate:.1f}%')}\")\n            \n            if 'used_memory_human' in stats:\n                self.stdout.write(f\"    Memory usage: {stats['used_memory_human']}\")\n            \n            if 'connected_clients' in stats:\n                self.stdout.write(f\"    Connected clients: {stats['connected_clients']}\")\n",[1047,8415,8416,8421,8428,8434,8457,8482,8496,8502,8506,8530,8534,8543,8552,8556,8568,8582,8611,8637,8641,8654,8663,8672,8676,8701,8708,8733,8749,8762,8797,8828,8832,8839,8843,8864,8873,8881,8905,8919,8923,8927,8932,8964,8970,8983,8999,9004,9021,9033,9066,9097,9133,9164,9195,9226,9231,9235,9240,9260,9279,9295,9346,9350,9362,9387,9391,9396,9425,9431,9436,9441,9446,9458,9483,9487,9493,9497,9510,9519,9528,9532,9556,9562,9567,9606,9621,9625,9630,9655,9659,9664,9683,9687,9692,9706,9710,9725,9766,9791,9796,9800,9812,9826,9844,9862,9876,9880,9884,9891,9895,9912,9921,9951,9965,9969,9974,9990,10013,10034,10038,10043,10057,10071,10090,10094,10099,10113,10117,10123,10139,10155,10185,10189,10193,10206,10215,10224,10244,10264,10284,10288,10292,10299,10303,10308,10322,10336,10340,10358,10370,10381,10405,10420,10434,10438,10448,10459,10475,10488,10492,10502,10513,10524,10536,10550,10555,10560,10589,10601,10606,10626,10647,10654,10674,10679,10702,10712,10728,10733,10762,10802,10809,10825,10830,10852,10862,10883,10888,10919,10924,10931,10941,10957,10962,10990,11026,11034,11049,11054,11071,11076,11086,11113,11118,11137,11147,11184,11234,11261,11266,11272,11298,11329,11350,11396,11446,11452,11474,11494,11540,11545,11551,11577,11607,11624,11699,11705,11710,11758,11763,11780,11800,11841,11891,11896,11913,11953,11958,11975],{"__ignoreMap":1049},[1062,8417,8418],{"class":1064,"line":1065},[1062,8419,8420],{"class":1068},"# monitoring/cache_monitor.py\n",[1062,8422,8423,8425],{"class":1064,"line":1072},[1062,8424,1076],{"class":1075},[1062,8426,8427],{"class":1079}," time\n",[1062,8429,8430,8432],{"class":1064,"line":1083},[1062,8431,1076],{"class":1075},[1062,8433,3886],{"class":1079},[1062,8435,8436,8438,8440,8442,8444,8446,8448,8450,8452,8454],{"class":1064,"line":1097},[1062,8437,1086],{"class":1075},[1062,8439,2411],{"class":1079},[1062,8441,1199],{"class":1117},[1062,8443,2432],{"class":1079},[1062,8445,1199],{"class":1117},[1062,8447,2437],{"class":1079},[1062,8449,1076],{"class":1075},[1062,8451,7653],{"class":1079},[1062,8453,1462],{"class":1117},[1062,8455,8456],{"class":1079}," caches\n",[1062,8458,8459,8461,8463,8465,8467,8469,8472,8474,8477,8479],{"class":1064,"line":1104},[1062,8460,1086],{"class":1075},[1062,8462,2411],{"class":1079},[1062,8464,1199],{"class":1117},[1062,8466,2432],{"class":1079},[1062,8468,1199],{"class":1117},[1062,8470,8471],{"class":1079},"management",[1062,8473,1199],{"class":1117},[1062,8475,8476],{"class":1079},"base ",[1062,8478,1076],{"class":1075},[1062,8480,8481],{"class":1079}," BaseCommand\n",[1062,8483,8484,8486,8488,8490,8492,8494],{"class":1064,"line":1110},[1062,8485,1086],{"class":1075},[1062,8487,2411],{"class":1079},[1062,8489,1199],{"class":1117},[1062,8491,2416],{"class":1079},[1062,8493,1076],{"class":1075},[1062,8495,2421],{"class":1079},[1062,8497,8498,8500],{"class":1064,"line":1124},[1062,8499,1076],{"class":1075},[1062,8501,4862],{"class":1079},[1062,8503,8504],{"class":1064,"line":1143},[1062,8505,1101],{"emptyLinePlaceholder":1100},[1062,8507,8508,8511,8513,8515,8517,8519,8521,8523,8526,8528],{"class":1064,"line":1167},[1062,8509,8510],{"class":1079},"logger ",[1062,8512,2595],{"class":1117},[1062,8514,4872],{"class":1079},[1062,8516,1199],{"class":1117},[1062,8518,4877],{"class":1537},[1062,8520,1534],{"class":1117},[1062,8522,1135],{"class":1127},[1062,8524,8525],{"class":1131},"cache_monitor",[1062,8527,1135],{"class":1127},[1062,8529,2855],{"class":1117},[1062,8531,8532],{"class":1064,"line":1182},[1062,8533,1101],{"emptyLinePlaceholder":1100},[1062,8535,8536,8538,8541],{"class":1064,"line":1227},[1062,8537,2451],{"class":1185},[1062,8539,8540],{"class":2454}," CacheMonitor",[1062,8542,2458],{"class":1117},[1062,8544,8545,8547,8550],{"class":1064,"line":1259},[1062,8546,2464],{"class":2463},[1062,8548,8549],{"class":2467},"Monitor cache performance across all backends.",[1062,8551,2471],{"class":2463},[1062,8553,8554],{"class":1064,"line":1291},[1062,8555,1575],{"class":1079},[1062,8557,8558,8560,8562,8564,8566],{"class":1064,"line":1297},[1062,8559,2480],{"class":1185},[1062,8561,2484],{"class":2483},[1062,8563,1534],{"class":1117},[1062,8565,2490],{"class":2489},[1062,8567,2493],{"class":1117},[1062,8569,8570,8572,8574,8577,8579],{"class":1064,"line":1311},[1062,8571,2498],{"class":1113},[1062,8573,1199],{"class":1117},[1062,8575,8576],{"class":1202},"backends",[1062,8578,1118],{"class":1117},[1062,8580,8581],{"class":1117}," {}\n",[1062,8583,8584,8587,8590,8592,8595,8597,8599,8601,8603,8605,8608],{"class":1064,"line":1333},[1062,8585,8586],{"class":1075},"        for",[1062,8588,8589],{"class":1079}," alias",[1062,8591,1462],{"class":1117},[1062,8593,8594],{"class":1079}," config ",[1062,8596,4596],{"class":1075},[1062,8598,4040],{"class":1079},[1062,8600,1199],{"class":1117},[1062,8602,1114],{"class":3985},[1062,8604,1199],{"class":1117},[1062,8606,8607],{"class":1537},"items",[1062,8609,8610],{"class":1117},"():\n",[1062,8612,8613,8615,8617,8619,8621,8624,8626,8628,8631,8633,8635],{"class":1064,"line":1347},[1062,8614,7112],{"class":1113},[1062,8616,1199],{"class":1117},[1062,8618,8576],{"class":1202},[1062,8620,1206],{"class":1117},[1062,8622,8623],{"class":1202},"alias",[1062,8625,1216],{"class":1117},[1062,8627,1118],{"class":1117},[1062,8629,8630],{"class":1079}," caches",[1062,8632,1206],{"class":1117},[1062,8634,8623],{"class":1079},[1062,8636,2334],{"class":1117},[1062,8638,8639],{"class":1064,"line":1366},[1062,8640,1575],{"class":1079},[1062,8642,8643,8645,8648,8650,8652],{"class":1064,"line":1384},[1062,8644,2480],{"class":1185},[1062,8646,8647],{"class":2580}," get_cache_stats",[1062,8649,1534],{"class":1117},[1062,8651,2490],{"class":2489},[1062,8653,2493],{"class":1117},[1062,8655,8656,8658,8661],{"class":1064,"line":1400},[1062,8657,2624],{"class":2463},[1062,8659,8660],{"class":2467},"Get statistics for all cache backends.",[1062,8662,2471],{"class":2463},[1062,8664,8665,8668,8670],{"class":1064,"line":1406},[1062,8666,8667],{"class":1079},"        stats ",[1062,8669,2595],{"class":1117},[1062,8671,8581],{"class":1117},[1062,8673,8674],{"class":1064,"line":1427},[1062,8675,2573],{"class":1079},[1062,8677,8678,8680,8682,8684,8687,8689,8691,8693,8695,8697,8699],{"class":1064,"line":1448},[1062,8679,8586],{"class":1075},[1062,8681,8589],{"class":1079},[1062,8683,1462],{"class":1117},[1062,8685,8686],{"class":1079}," cache_backend ",[1062,8688,4596],{"class":1075},[1062,8690,2972],{"class":1113},[1062,8692,1199],{"class":1117},[1062,8694,8576],{"class":1202},[1062,8696,1199],{"class":1117},[1062,8698,8607],{"class":1537},[1062,8700,8610],{"class":1117},[1062,8702,8703,8706],{"class":1064,"line":1468},[1062,8704,8705],{"class":1075},"            try",[1062,8707,2458],{"class":1117},[1062,8709,8710,8713,8715,8717,8719,8722,8724,8726,8728,8731],{"class":1064,"line":1474},[1062,8711,8712],{"class":1079},"                backend_stats ",[1062,8714,2595],{"class":1117},[1062,8716,2972],{"class":1113},[1062,8718,1199],{"class":1117},[1062,8720,8721],{"class":1537},"_get_backend_stats",[1062,8723,1534],{"class":1117},[1062,8725,8623],{"class":1537},[1062,8727,1462],{"class":1117},[1062,8729,8730],{"class":1537}," cache_backend",[1062,8732,2855],{"class":1117},[1062,8734,8735,8738,8740,8742,8744,8746],{"class":1064,"line":1518},[1062,8736,8737],{"class":1079},"                stats",[1062,8739,1206],{"class":1117},[1062,8741,8623],{"class":1079},[1062,8743,1216],{"class":1117},[1062,8745,1118],{"class":1117},[1062,8747,8748],{"class":1079}," backend_stats\n",[1062,8750,8751,8754,8756,8758,8760],{"class":1064,"line":1566},[1062,8752,8753],{"class":1075},"            except",[1062,8755,4841],{"class":1530},[1062,8757,4844],{"class":1075},[1062,8759,4847],{"class":1079},[1062,8761,2458],{"class":1117},[1062,8763,8764,8767,8769,8771,8773,8775,8778,8780,8782,8784,8787,8789,8791,8793,8795],{"class":1064,"line":1572},[1062,8765,8766],{"class":1079},"                logger",[1062,8768,1199],{"class":1117},[1062,8770,4895],{"class":1537},[1062,8772,1534],{"class":1117},[1062,8774,4575],{"class":1185},[1062,8776,8777],{"class":1131},"\"Failed to get stats for ",[1062,8779,1193],{"class":1192},[1062,8781,8623],{"class":1537},[1062,8783,1219],{"class":1192},[1062,8785,8786],{"class":1131},": ",[1062,8788,1193],{"class":1192},[1062,8790,4907],{"class":1537},[1062,8792,1219],{"class":1192},[1062,8794,1489],{"class":1131},[1062,8796,2855],{"class":1117},[1062,8798,8799,8801,8803,8805,8807,8809,8811,8813,8815,8817,8819,8821,8823,8825],{"class":1064,"line":1578},[1062,8800,8737],{"class":1079},[1062,8802,1206],{"class":1117},[1062,8804,8623],{"class":1079},[1062,8806,1216],{"class":1117},[1062,8808,1118],{"class":1117},[1062,8810,2756],{"class":1117},[1062,8812,1135],{"class":1127},[1062,8814,4895],{"class":1131},[1062,8816,1135],{"class":1127},[1062,8818,1138],{"class":1117},[1062,8820,4093],{"class":1530},[1062,8822,1534],{"class":1117},[1062,8824,4907],{"class":1537},[1062,8826,8827],{"class":1117},")}\n",[1062,8829,8830],{"class":1064,"line":1584},[1062,8831,2573],{"class":1079},[1062,8833,8834,8836],{"class":1064,"line":1598},[1062,8835,2924],{"class":1075},[1062,8837,8838],{"class":1079}," stats\n",[1062,8840,8841],{"class":1064,"line":1617},[1062,8842,1575],{"class":1079},[1062,8844,8845,8847,8850,8852,8854,8856,8858,8860,8862],{"class":1064,"line":1658},[1062,8846,2480],{"class":1185},[1062,8848,8849],{"class":2580}," _get_backend_stats",[1062,8851,1534],{"class":1117},[1062,8853,2490],{"class":2489},[1062,8855,1462],{"class":1117},[1062,8857,8589],{"class":2590},[1062,8859,1462],{"class":1117},[1062,8861,8730],{"class":2590},[1062,8863,2493],{"class":1117},[1062,8865,8866,8868,8871],{"class":1064,"line":1671},[1062,8867,2624],{"class":2463},[1062,8869,8870],{"class":2467},"Get statistics for a specific cache backend.",[1062,8872,2471],{"class":2463},[1062,8874,8875,8877,8879],{"class":1064,"line":1691},[1062,8876,8667],{"class":1079},[1062,8878,2595],{"class":1117},[1062,8880,1121],{"class":1117},[1062,8882,8883,8885,8888,8890,8892,8894,8896,8899,8901,8903],{"class":1064,"line":1704},[1062,8884,1314],{"class":1127},[1062,8886,8887],{"class":1131},"backend_type",[1062,8889,1135],{"class":1127},[1062,8891,1138],{"class":1117},[1062,8893,8730],{"class":1079},[1062,8895,1199],{"class":1117},[1062,8897,8898],{"class":4882},"__class__",[1062,8900,1199],{"class":1117},[1062,8902,4883],{"class":4882},[1062,8904,1164],{"class":1117},[1062,8906,8907,8909,8911,8913,8915,8917],{"class":1064,"line":1720},[1062,8908,1314],{"class":1127},[1062,8910,8623],{"class":1131},[1062,8912,1135],{"class":1127},[1062,8914,1138],{"class":1117},[1062,8916,8589],{"class":1079},[1062,8918,1164],{"class":1117},[1062,8920,8921],{"class":1064,"line":1735},[1062,8922,2050],{"class":1117},[1062,8924,8925],{"class":1064,"line":1740},[1062,8926,2573],{"class":1079},[1062,8928,8929],{"class":1064,"line":1745},[1062,8930,8931],{"class":1068},"        # Redis-specific stats\n",[1062,8933,8934,8936,8938,8941,8943,8946,8948,8950,8952,8954,8957,8959,8962],{"class":1064,"line":1765},[1062,8935,2742],{"class":1075},[1062,8937,1156],{"class":1127},[1062,8939,8940],{"class":1131},"redis",[1062,8942,1135],{"class":1127},[1062,8944,8945],{"class":2594}," in",[1062,8947,8730],{"class":1079},[1062,8949,1199],{"class":1117},[1062,8951,8898],{"class":4882},[1062,8953,1199],{"class":1117},[1062,8955,8956],{"class":4882},"__module__",[1062,8958,1199],{"class":1117},[1062,8960,8961],{"class":1537},"lower",[1062,8963,8610],{"class":1117},[1062,8965,8966,8968],{"class":1064,"line":1770},[1062,8967,8705],{"class":1075},[1062,8969,2458],{"class":1117},[1062,8971,8972,8975,8978,8980],{"class":1064,"line":1775},[1062,8973,8974],{"class":1075},"                from",[1062,8976,8977],{"class":1079}," django_redis ",[1062,8979,1076],{"class":1075},[1062,8981,8982],{"class":1079}," get_redis_connection\n",[1062,8984,8985,8988,8990,8993,8995,8997],{"class":1064,"line":1781},[1062,8986,8987],{"class":1079},"                redis_conn ",[1062,8989,2595],{"class":1117},[1062,8991,8992],{"class":1537}," get_redis_connection",[1062,8994,1534],{"class":1117},[1062,8996,8623],{"class":1537},[1062,8998,2855],{"class":1117},[1062,9000,9001],{"class":1064,"line":1795},[1062,9002,9003],{"class":1079},"                \n",[1062,9005,9006,9009,9011,9014,9016,9019],{"class":1064,"line":1814},[1062,9007,9008],{"class":1079},"                info ",[1062,9010,2595],{"class":1117},[1062,9012,9013],{"class":1079}," redis_conn",[1062,9015,1199],{"class":1117},[1062,9017,9018],{"class":1537},"info",[1062,9020,2915],{"class":1117},[1062,9022,9023,9025,9027,9030],{"class":1064,"line":1855},[1062,9024,8737],{"class":1079},[1062,9026,1199],{"class":1117},[1062,9028,9029],{"class":1537},"update",[1062,9031,9032],{"class":1117},"({\n",[1062,9034,9035,9037,9040,9042,9044,9047,9049,9051,9053,9055,9057,9059,9061,9064],{"class":1064,"line":1868},[1062,9036,4173],{"class":1127},[1062,9038,9039],{"class":1131},"connected_clients",[1062,9041,1135],{"class":1127},[1062,9043,1138],{"class":1117},[1062,9045,9046],{"class":1537}," info",[1062,9048,1199],{"class":1117},[1062,9050,1546],{"class":1537},[1062,9052,1534],{"class":1117},[1062,9054,1135],{"class":1127},[1062,9056,9039],{"class":1131},[1062,9058,1135],{"class":1127},[1062,9060,1462],{"class":1117},[1062,9062,9063],{"class":1360}," 0",[1062,9065,4190],{"class":1117},[1062,9067,9068,9070,9073,9075,9077,9079,9081,9083,9085,9087,9089,9091,9093,9095],{"class":1064,"line":1887},[1062,9069,4173],{"class":1127},[1062,9071,9072],{"class":1131},"used_memory",[1062,9074,1135],{"class":1127},[1062,9076,1138],{"class":1117},[1062,9078,9046],{"class":1537},[1062,9080,1199],{"class":1117},[1062,9082,1546],{"class":1537},[1062,9084,1534],{"class":1117},[1062,9086,1135],{"class":1127},[1062,9088,9072],{"class":1131},[1062,9090,1135],{"class":1127},[1062,9092,1462],{"class":1117},[1062,9094,9063],{"class":1360},[1062,9096,4190],{"class":1117},[1062,9098,9099,9101,9104,9106,9108,9110,9112,9114,9116,9118,9120,9122,9124,9126,9129,9131],{"class":1064,"line":1892},[1062,9100,4173],{"class":1127},[1062,9102,9103],{"class":1131},"used_memory_human",[1062,9105,1135],{"class":1127},[1062,9107,1138],{"class":1117},[1062,9109,9046],{"class":1537},[1062,9111,1199],{"class":1117},[1062,9113,1546],{"class":1537},[1062,9115,1534],{"class":1117},[1062,9117,1135],{"class":1127},[1062,9119,9103],{"class":1131},[1062,9121,1135],{"class":1127},[1062,9123,1462],{"class":1117},[1062,9125,1156],{"class":1127},[1062,9127,9128],{"class":1131},"0B",[1062,9130,1135],{"class":1127},[1062,9132,4190],{"class":1117},[1062,9134,9135,9137,9140,9142,9144,9146,9148,9150,9152,9154,9156,9158,9160,9162],{"class":1064,"line":1911},[1062,9136,4173],{"class":1127},[1062,9138,9139],{"class":1131},"keyspace_hits",[1062,9141,1135],{"class":1127},[1062,9143,1138],{"class":1117},[1062,9145,9046],{"class":1537},[1062,9147,1199],{"class":1117},[1062,9149,1546],{"class":1537},[1062,9151,1534],{"class":1117},[1062,9153,1135],{"class":1127},[1062,9155,9139],{"class":1131},[1062,9157,1135],{"class":1127},[1062,9159,1462],{"class":1117},[1062,9161,9063],{"class":1360},[1062,9163,4190],{"class":1117},[1062,9165,9166,9168,9171,9173,9175,9177,9179,9181,9183,9185,9187,9189,9191,9193],{"class":1064,"line":1916},[1062,9167,4173],{"class":1127},[1062,9169,9170],{"class":1131},"keyspace_misses",[1062,9172,1135],{"class":1127},[1062,9174,1138],{"class":1117},[1062,9176,9046],{"class":1537},[1062,9178,1199],{"class":1117},[1062,9180,1546],{"class":1537},[1062,9182,1534],{"class":1117},[1062,9184,1135],{"class":1127},[1062,9186,9170],{"class":1131},[1062,9188,1135],{"class":1127},[1062,9190,1462],{"class":1117},[1062,9192,9063],{"class":1360},[1062,9194,4190],{"class":1117},[1062,9196,9197,9199,9202,9204,9206,9208,9210,9212,9214,9216,9218,9220,9222,9224],{"class":1064,"line":1921},[1062,9198,4173],{"class":1127},[1062,9200,9201],{"class":1131},"total_commands_processed",[1062,9203,1135],{"class":1127},[1062,9205,1138],{"class":1117},[1062,9207,9046],{"class":1537},[1062,9209,1199],{"class":1117},[1062,9211,1546],{"class":1537},[1062,9213,1534],{"class":1117},[1062,9215,1135],{"class":1127},[1062,9217,9201],{"class":1131},[1062,9219,1135],{"class":1127},[1062,9221,1462],{"class":1117},[1062,9223,9063],{"class":1360},[1062,9225,4190],{"class":1117},[1062,9227,9228],{"class":1064,"line":1927},[1062,9229,9230],{"class":1117},"                })\n",[1062,9232,9233],{"class":1064,"line":1941},[1062,9234,9003],{"class":1079},[1062,9236,9237],{"class":1064,"line":1961},[1062,9238,9239],{"class":1068},"                # Calculate hit rate\n",[1062,9241,9242,9245,9247,9250,9252,9254,9256,9258],{"class":1064,"line":1981},[1062,9243,9244],{"class":1079},"                hits ",[1062,9246,2595],{"class":1117},[1062,9248,9249],{"class":1079}," stats",[1062,9251,1206],{"class":1117},[1062,9253,1135],{"class":1127},[1062,9255,9139],{"class":1131},[1062,9257,1135],{"class":1127},[1062,9259,2334],{"class":1117},[1062,9261,9262,9265,9267,9269,9271,9273,9275,9277],{"class":1064,"line":2000},[1062,9263,9264],{"class":1079},"                misses ",[1062,9266,2595],{"class":1117},[1062,9268,9249],{"class":1079},[1062,9270,1206],{"class":1117},[1062,9272,1135],{"class":1127},[1062,9274,9170],{"class":1131},[1062,9276,1135],{"class":1127},[1062,9278,2334],{"class":1117},[1062,9280,9281,9284,9286,9289,9292],{"class":1064,"line":2013},[1062,9282,9283],{"class":1079},"                total ",[1062,9285,2595],{"class":1117},[1062,9287,9288],{"class":1079}," hits ",[1062,9290,9291],{"class":2594},"+",[1062,9293,9294],{"class":1079}," misses\n",[1062,9296,9297,9299,9301,9303,9306,9308,9310,9312,9315,9318,9320,9323,9326,9328,9330,9333,9335,9338,9340,9343],{"class":1064,"line":2030},[1062,9298,8737],{"class":1079},[1062,9300,1206],{"class":1117},[1062,9302,1135],{"class":1127},[1062,9304,9305],{"class":1131},"hit_rate",[1062,9307,1135],{"class":1127},[1062,9309,1216],{"class":1117},[1062,9311,1118],{"class":1117},[1062,9313,9314],{"class":1117}," (",[1062,9316,9317],{"class":1079},"hits ",[1062,9319,4501],{"class":2594},[1062,9321,9322],{"class":1079}," total ",[1062,9324,9325],{"class":2594},"*",[1062,9327,1361],{"class":1360},[1062,9329,8192],{"class":1117},[1062,9331,9332],{"class":1075}," if",[1062,9334,9322],{"class":1079},[1062,9336,9337],{"class":2594},">",[1062,9339,9063],{"class":1360},[1062,9341,9342],{"class":1075}," else",[1062,9344,9345],{"class":1360}," 0\n",[1062,9347,9348],{"class":1064,"line":2047},[1062,9349,9003],{"class":1079},[1062,9351,9352,9354,9356,9358,9360],{"class":1064,"line":2053},[1062,9353,8753],{"class":1075},[1062,9355,4841],{"class":1530},[1062,9357,4844],{"class":1075},[1062,9359,4847],{"class":1079},[1062,9361,2458],{"class":1117},[1062,9363,9364,9366,9368,9370,9373,9375,9377,9379,9381,9383,9385],{"class":1064,"line":2059},[1062,9365,8737],{"class":1079},[1062,9367,1206],{"class":1117},[1062,9369,1135],{"class":1127},[1062,9371,9372],{"class":1131},"redis_error",[1062,9374,1135],{"class":1127},[1062,9376,1216],{"class":1117},[1062,9378,1118],{"class":1117},[1062,9380,4093],{"class":1530},[1062,9382,1534],{"class":1117},[1062,9384,4907],{"class":1537},[1062,9386,2855],{"class":1117},[1062,9388,9389],{"class":1064,"line":2065},[1062,9390,2573],{"class":1079},[1062,9392,9393],{"class":1064,"line":2070},[1062,9394,9395],{"class":1068},"        # Memcached-specific stats\n",[1062,9397,9398,9400,9402,9405,9407,9409,9411,9413,9415,9417,9419,9421,9423],{"class":1064,"line":2076},[1062,9399,2774],{"class":1075},[1062,9401,1156],{"class":1127},[1062,9403,9404],{"class":1131},"memcached",[1062,9406,1135],{"class":1127},[1062,9408,8945],{"class":2594},[1062,9410,8730],{"class":1079},[1062,9412,1199],{"class":1117},[1062,9414,8898],{"class":4882},[1062,9416,1199],{"class":1117},[1062,9418,8956],{"class":4882},[1062,9420,1199],{"class":1117},[1062,9422,8961],{"class":1537},[1062,9424,8610],{"class":1117},[1062,9426,9427,9429],{"class":1064,"line":2092},[1062,9428,8705],{"class":1075},[1062,9430,2458],{"class":1117},[1062,9432,9433],{"class":1064,"line":2106},[1062,9434,9435],{"class":1068},"                # This would require additional implementation\n",[1062,9437,9438],{"class":1064,"line":2118},[1062,9439,9440],{"class":1068},"                # depending on the memcached client\n",[1062,9442,9443],{"class":1064,"line":2123},[1062,9444,9445],{"class":1075},"                pass\n",[1062,9447,9448,9450,9452,9454,9456],{"class":1064,"line":2129},[1062,9449,8753],{"class":1075},[1062,9451,4841],{"class":1530},[1062,9453,4844],{"class":1075},[1062,9455,4847],{"class":1079},[1062,9457,2458],{"class":1117},[1062,9459,9460,9462,9464,9466,9469,9471,9473,9475,9477,9479,9481],{"class":1064,"line":2143},[1062,9461,8737],{"class":1079},[1062,9463,1206],{"class":1117},[1062,9465,1135],{"class":1127},[1062,9467,9468],{"class":1131},"memcached_error",[1062,9470,1135],{"class":1127},[1062,9472,1216],{"class":1117},[1062,9474,1118],{"class":1117},[1062,9476,4093],{"class":1530},[1062,9478,1534],{"class":1117},[1062,9480,4907],{"class":1537},[1062,9482,2855],{"class":1117},[1062,9484,9485],{"class":1064,"line":2155},[1062,9486,2573],{"class":1079},[1062,9488,9489,9491],{"class":1064,"line":2190},[1062,9490,2924],{"class":1075},[1062,9492,8838],{"class":1079},[1062,9494,9495],{"class":1064,"line":2195},[1062,9496,1575],{"class":1079},[1062,9498,9499,9501,9504,9506,9508],{"class":1064,"line":2201},[1062,9500,2480],{"class":1185},[1062,9502,9503],{"class":2580}," check_cache_health",[1062,9505,1534],{"class":1117},[1062,9507,2490],{"class":2489},[1062,9509,2493],{"class":1117},[1062,9511,9512,9514,9517],{"class":1064,"line":2212},[1062,9513,2624],{"class":2463},[1062,9515,9516],{"class":2467},"Check health of all cache backends.",[1062,9518,2471],{"class":2463},[1062,9520,9521,9524,9526],{"class":1064,"line":2222},[1062,9522,9523],{"class":1079},"        health_status ",[1062,9525,2595],{"class":1117},[1062,9527,8581],{"class":1117},[1062,9529,9530],{"class":1064,"line":2227},[1062,9531,2573],{"class":1079},[1062,9533,9534,9536,9538,9540,9542,9544,9546,9548,9550,9552,9554],{"class":1064,"line":2233},[1062,9535,8586],{"class":1075},[1062,9537,8589],{"class":1079},[1062,9539,1462],{"class":1117},[1062,9541,8686],{"class":1079},[1062,9543,4596],{"class":1075},[1062,9545,2972],{"class":1113},[1062,9547,1199],{"class":1117},[1062,9549,8576],{"class":1202},[1062,9551,1199],{"class":1117},[1062,9553,8607],{"class":1537},[1062,9555,8610],{"class":1117},[1062,9557,9558,9560],{"class":1064,"line":2248},[1062,9559,8705],{"class":1075},[1062,9561,2458],{"class":1117},[1062,9563,9564],{"class":1064,"line":2285},[1062,9565,9566],{"class":1068},"                # Test basic operations\n",[1062,9568,9569,9572,9574,9576,9579,9581,9583,9585,9588,9590,9592,9594,9596,9598,9600,9602,9604],{"class":1064,"line":2290},[1062,9570,9571],{"class":1079},"                test_key ",[1062,9573,2595],{"class":1117},[1062,9575,1486],{"class":1185},[1062,9577,9578],{"class":1131},"\"health_check_",[1062,9580,1193],{"class":1192},[1062,9582,8623],{"class":1079},[1062,9584,1219],{"class":1192},[1062,9586,9587],{"class":1131},"_",[1062,9589,1193],{"class":1192},[1062,9591,4230],{"class":1530},[1062,9593,1534],{"class":1117},[1062,9595,4235],{"class":1537},[1062,9597,1199],{"class":1117},[1062,9599,4235],{"class":1537},[1062,9601,4242],{"class":1117},[1062,9603,1219],{"class":1192},[1062,9605,4247],{"class":1131},[1062,9607,9608,9611,9613,9616,9619],{"class":1064,"line":2296},[1062,9609,9610],{"class":1079},"                test_value ",[1062,9612,2595],{"class":1117},[1062,9614,9615],{"class":1127}," \"",[1062,9617,9618],{"class":1131},"health_check_value",[1062,9620,4247],{"class":1127},[1062,9622,9623],{"class":1064,"line":2311},[1062,9624,9003],{"class":1079},[1062,9626,9627],{"class":1064,"line":2337},[1062,9628,9629],{"class":1068},"                # Test set\n",[1062,9631,9632,9635,9637,9639,9641,9644,9646,9649,9651,9653],{"class":1064,"line":2347},[1062,9633,9634],{"class":1079},"                cache_backend",[1062,9636,1199],{"class":1117},[1062,9638,4803],{"class":1537},[1062,9640,1534],{"class":1117},[1062,9642,9643],{"class":1537},"test_key",[1062,9645,1462],{"class":1117},[1062,9647,9648],{"class":1537}," test_value",[1062,9650,1462],{"class":1117},[1062,9652,1992],{"class":1360},[1062,9654,2855],{"class":1117},[1062,9656,9657],{"class":1064,"line":2371},[1062,9658,9003],{"class":1079},[1062,9660,9661],{"class":1064,"line":3629},[1062,9662,9663],{"class":1068},"                # Test get\n",[1062,9665,9666,9669,9671,9673,9675,9677,9679,9681],{"class":1064,"line":3649},[1062,9667,9668],{"class":1079},"                retrieved_value ",[1062,9670,2595],{"class":1117},[1062,9672,8730],{"class":1079},[1062,9674,1199],{"class":1117},[1062,9676,1546],{"class":1537},[1062,9678,1534],{"class":1117},[1062,9680,9643],{"class":1537},[1062,9682,2855],{"class":1117},[1062,9684,9685],{"class":1064,"line":3659},[1062,9686,9003],{"class":1079},[1062,9688,9689],{"class":1064,"line":3695},[1062,9690,9691],{"class":1068},"                # Test delete\n",[1062,9693,9694,9696,9698,9700,9702,9704],{"class":1064,"line":3700},[1062,9695,9634],{"class":1079},[1062,9697,1199],{"class":1117},[1062,9699,7152],{"class":1537},[1062,9701,1534],{"class":1117},[1062,9703,9643],{"class":1537},[1062,9705,2855],{"class":1117},[1062,9707,9708],{"class":1064,"line":3706},[1062,9709,9003],{"class":1079},[1062,9711,9712,9715,9717,9719,9721,9723],{"class":1064,"line":3720},[1062,9713,9714],{"class":1079},"                health_status",[1062,9716,1206],{"class":1117},[1062,9718,8623],{"class":1079},[1062,9720,1216],{"class":1117},[1062,9722,1118],{"class":1117},[1062,9724,1121],{"class":1117},[1062,9726,9727,9729,9732,9734,9736,9738,9741,9743,9745,9748,9751,9754,9757,9759,9762,9764],{"class":1064,"line":3744},[1062,9728,4173],{"class":1127},[1062,9730,9731],{"class":1131},"status",[1062,9733,1135],{"class":1127},[1062,9735,1138],{"class":1117},[1062,9737,1156],{"class":1127},[1062,9739,9740],{"class":1131},"healthy",[1062,9742,1135],{"class":1127},[1062,9744,9332],{"class":1075},[1062,9746,9747],{"class":1079}," retrieved_value ",[1062,9749,9750],{"class":2594},"==",[1062,9752,9753],{"class":1079}," test_value ",[1062,9755,9756],{"class":1075},"else",[1062,9758,1156],{"class":1127},[1062,9760,9761],{"class":1131},"unhealthy",[1062,9763,1135],{"class":1127},[1062,9765,1164],{"class":1117},[1062,9767,9768,9770,9773,9775,9777,9779,9781,9784,9786,9789],{"class":1064,"line":3771},[1062,9769,4173],{"class":1127},[1062,9771,9772],{"class":1131},"response_time",[1062,9774,1135],{"class":1127},[1062,9776,1138],{"class":1117},[1062,9778,2972],{"class":1113},[1062,9780,1199],{"class":1117},[1062,9782,9783],{"class":1537},"_measure_response_time",[1062,9785,1534],{"class":1117},[1062,9787,9788],{"class":1537},"cache_backend",[1062,9790,4190],{"class":1117},[1062,9792,9793],{"class":1064,"line":3798},[1062,9794,9795],{"class":1117},"                }\n",[1062,9797,9798],{"class":1064,"line":3804},[1062,9799,9003],{"class":1079},[1062,9801,9802,9804,9806,9808,9810],{"class":1064,"line":3809},[1062,9803,8753],{"class":1075},[1062,9805,4841],{"class":1530},[1062,9807,4844],{"class":1075},[1062,9809,4847],{"class":1079},[1062,9811,2458],{"class":1117},[1062,9813,9814,9816,9818,9820,9822,9824],{"class":1064,"line":3832},[1062,9815,9714],{"class":1079},[1062,9817,1206],{"class":1117},[1062,9819,8623],{"class":1079},[1062,9821,1216],{"class":1117},[1062,9823,1118],{"class":1117},[1062,9825,1121],{"class":1117},[1062,9827,9828,9830,9832,9834,9836,9838,9840,9842],{"class":1064,"line":5408},[1062,9829,4173],{"class":1127},[1062,9831,9731],{"class":1131},[1062,9833,1135],{"class":1127},[1062,9835,1138],{"class":1117},[1062,9837,1156],{"class":1127},[1062,9839,4895],{"class":1131},[1062,9841,1135],{"class":1127},[1062,9843,1164],{"class":1117},[1062,9845,9846,9848,9850,9852,9854,9856,9858,9860],{"class":1064,"line":5414},[1062,9847,4173],{"class":1127},[1062,9849,4895],{"class":1131},[1062,9851,1135],{"class":1127},[1062,9853,1138],{"class":1117},[1062,9855,4093],{"class":1530},[1062,9857,1534],{"class":1117},[1062,9859,4907],{"class":1537},[1062,9861,4190],{"class":1117},[1062,9863,9864,9866,9868,9870,9872,9874],{"class":1064,"line":5420},[1062,9865,4173],{"class":1127},[1062,9867,9772],{"class":1131},[1062,9869,1135],{"class":1127},[1062,9871,1138],{"class":1117},[1062,9873,6583],{"class":1378},[1062,9875,1164],{"class":1117},[1062,9877,9878],{"class":1064,"line":5426},[1062,9879,9795],{"class":1117},[1062,9881,9882],{"class":1064,"line":5432},[1062,9883,2573],{"class":1079},[1062,9885,9886,9888],{"class":1064,"line":5437},[1062,9887,2924],{"class":1075},[1062,9889,9890],{"class":1079}," health_status\n",[1062,9892,9893],{"class":1064,"line":5443},[1062,9894,1575],{"class":1079},[1062,9896,9897,9899,9902,9904,9906,9908,9910],{"class":1064,"line":5449},[1062,9898,2480],{"class":1185},[1062,9900,9901],{"class":2580}," _measure_response_time",[1062,9903,1534],{"class":1117},[1062,9905,2490],{"class":2489},[1062,9907,1462],{"class":1117},[1062,9909,8730],{"class":2590},[1062,9911,2493],{"class":1117},[1062,9913,9914,9916,9919],{"class":1064,"line":5454},[1062,9915,2624],{"class":2463},[1062,9917,9918],{"class":2467},"Measure cache response time.",[1062,9920,2471],{"class":2463},[1062,9922,9923,9926,9928,9930,9933,9935,9937,9939,9941,9943,9945,9947,9949],{"class":1064,"line":5459},[1062,9924,9925],{"class":1079},"        test_key ",[1062,9927,2595],{"class":1117},[1062,9929,1486],{"class":1185},[1062,9931,9932],{"class":1131},"\"perf_test_",[1062,9934,1193],{"class":1192},[1062,9936,4230],{"class":1530},[1062,9938,1534],{"class":1117},[1062,9940,4235],{"class":1537},[1062,9942,1199],{"class":1117},[1062,9944,4235],{"class":1537},[1062,9946,4242],{"class":1117},[1062,9948,1219],{"class":1192},[1062,9950,4247],{"class":1131},[1062,9952,9953,9956,9958,9960,9963],{"class":1064,"line":5464},[1062,9954,9955],{"class":1079},"        test_value ",[1062,9957,2595],{"class":1117},[1062,9959,9615],{"class":1127},[1062,9961,9962],{"class":1131},"performance_test",[1062,9964,4247],{"class":1127},[1062,9966,9967],{"class":1064,"line":5469},[1062,9968,2573],{"class":1079},[1062,9970,9971],{"class":1064,"line":5474},[1062,9972,9973],{"class":1068},"        # Measure set operation\n",[1062,9975,9976,9979,9981,9984,9986,9988],{"class":1064,"line":5479},[1062,9977,9978],{"class":1079},"        start_time ",[1062,9980,2595],{"class":1117},[1062,9982,9983],{"class":1079}," time",[1062,9985,1199],{"class":1117},[1062,9987,4235],{"class":1537},[1062,9989,2915],{"class":1117},[1062,9991,9992,9995,9997,9999,10001,10003,10005,10007,10009,10011],{"class":1064,"line":5484},[1062,9993,9994],{"class":1079},"        cache_backend",[1062,9996,1199],{"class":1117},[1062,9998,4803],{"class":1537},[1062,10000,1534],{"class":1117},[1062,10002,9643],{"class":1537},[1062,10004,1462],{"class":1117},[1062,10006,9648],{"class":1537},[1062,10008,1462],{"class":1117},[1062,10010,1992],{"class":1360},[1062,10012,2855],{"class":1117},[1062,10014,10015,10018,10020,10022,10024,10026,10028,10031],{"class":1064,"line":5489},[1062,10016,10017],{"class":1079},"        set_time ",[1062,10019,2595],{"class":1117},[1062,10021,9983],{"class":1079},[1062,10023,1199],{"class":1117},[1062,10025,4235],{"class":1537},[1062,10027,6652],{"class":1117},[1062,10029,10030],{"class":2594}," -",[1062,10032,10033],{"class":1079}," start_time\n",[1062,10035,10036],{"class":1064,"line":5494},[1062,10037,2573],{"class":1079},[1062,10039,10040],{"class":1064,"line":5500},[1062,10041,10042],{"class":1068},"        # Measure get operation\n",[1062,10044,10045,10047,10049,10051,10053,10055],{"class":1064,"line":5506},[1062,10046,9978],{"class":1079},[1062,10048,2595],{"class":1117},[1062,10050,9983],{"class":1079},[1062,10052,1199],{"class":1117},[1062,10054,4235],{"class":1537},[1062,10056,2915],{"class":1117},[1062,10058,10059,10061,10063,10065,10067,10069],{"class":1064,"line":5512},[1062,10060,9994],{"class":1079},[1062,10062,1199],{"class":1117},[1062,10064,1546],{"class":1537},[1062,10066,1534],{"class":1117},[1062,10068,9643],{"class":1537},[1062,10070,2855],{"class":1117},[1062,10072,10073,10076,10078,10080,10082,10084,10086,10088],{"class":1064,"line":5518},[1062,10074,10075],{"class":1079},"        get_time ",[1062,10077,2595],{"class":1117},[1062,10079,9983],{"class":1079},[1062,10081,1199],{"class":1117},[1062,10083,4235],{"class":1537},[1062,10085,6652],{"class":1117},[1062,10087,10030],{"class":2594},[1062,10089,10033],{"class":1079},[1062,10091,10092],{"class":1064,"line":5524},[1062,10093,2573],{"class":1079},[1062,10095,10096],{"class":1064,"line":5530},[1062,10097,10098],{"class":1068},"        # Cleanup\n",[1062,10100,10101,10103,10105,10107,10109,10111],{"class":1064,"line":5536},[1062,10102,9994],{"class":1079},[1062,10104,1199],{"class":1117},[1062,10106,7152],{"class":1537},[1062,10108,1534],{"class":1117},[1062,10110,9643],{"class":1537},[1062,10112,2855],{"class":1117},[1062,10114,10115],{"class":1064,"line":5541},[1062,10116,2573],{"class":1079},[1062,10118,10119,10121],{"class":1064,"line":5546},[1062,10120,2924],{"class":1075},[1062,10122,1121],{"class":1117},[1062,10124,10125,10127,10130,10132,10134,10137],{"class":1064,"line":5552},[1062,10126,1314],{"class":1127},[1062,10128,10129],{"class":1131},"set_time",[1062,10131,1135],{"class":1127},[1062,10133,1138],{"class":1117},[1062,10135,10136],{"class":1079}," set_time",[1062,10138,1164],{"class":1117},[1062,10140,10141,10143,10146,10148,10150,10153],{"class":1064,"line":5558},[1062,10142,1314],{"class":1127},[1062,10144,10145],{"class":1131},"get_time",[1062,10147,1135],{"class":1127},[1062,10149,1138],{"class":1117},[1062,10151,10152],{"class":1079}," get_time",[1062,10154,1164],{"class":1117},[1062,10156,10157,10159,10162,10164,10166,10168,10171,10173,10175,10177,10180,10183],{"class":1064,"line":5563},[1062,10158,1314],{"class":1127},[1062,10160,10161],{"class":1131},"avg_time",[1062,10163,1135],{"class":1127},[1062,10165,1138],{"class":1117},[1062,10167,9314],{"class":1117},[1062,10169,10170],{"class":1079},"set_time ",[1062,10172,9291],{"class":2594},[1062,10174,10152],{"class":1079},[1062,10176,8192],{"class":1117},[1062,10178,10179],{"class":2594}," /",[1062,10181,10182],{"class":1360}," 2",[1062,10184,1164],{"class":1117},[1062,10186,10187],{"class":1064,"line":5568},[1062,10188,2050],{"class":1117},[1062,10190,10191],{"class":1064,"line":5574},[1062,10192,1575],{"class":1079},[1062,10194,10195,10197,10200,10202,10204],{"class":1064,"line":5579},[1062,10196,2480],{"class":1185},[1062,10198,10199],{"class":2580}," generate_report",[1062,10201,1534],{"class":1117},[1062,10203,2490],{"class":2489},[1062,10205,2493],{"class":1117},[1062,10207,10208,10210,10213],{"class":1064,"line":5584},[1062,10209,2624],{"class":2463},[1062,10211,10212],{"class":2467},"Generate comprehensive cache monitoring report.",[1062,10214,2471],{"class":2463},[1062,10216,10217,10220,10222],{"class":1064,"line":5590},[1062,10218,10219],{"class":1079},"        report ",[1062,10221,2595],{"class":1117},[1062,10223,1121],{"class":1117},[1062,10225,10226,10228,10231,10233,10235,10237,10239,10241],{"class":1064,"line":5596},[1062,10227,1314],{"class":1127},[1062,10229,10230],{"class":1131},"timestamp",[1062,10232,1135],{"class":1127},[1062,10234,1138],{"class":1117},[1062,10236,9983],{"class":1079},[1062,10238,1199],{"class":1117},[1062,10240,4235],{"class":1537},[1062,10242,10243],{"class":1117},"(),\n",[1062,10245,10246,10248,10251,10253,10255,10257,10259,10262],{"class":1064,"line":5602},[1062,10247,1314],{"class":1127},[1062,10249,10250],{"class":1131},"stats",[1062,10252,1135],{"class":1127},[1062,10254,1138],{"class":1117},[1062,10256,2972],{"class":1113},[1062,10258,1199],{"class":1117},[1062,10260,10261],{"class":1537},"get_cache_stats",[1062,10263,10243],{"class":1117},[1062,10265,10266,10268,10271,10273,10275,10277,10279,10282],{"class":1064,"line":5608},[1062,10267,1314],{"class":1127},[1062,10269,10270],{"class":1131},"health",[1062,10272,1135],{"class":1127},[1062,10274,1138],{"class":1117},[1062,10276,2972],{"class":1113},[1062,10278,1199],{"class":1117},[1062,10280,10281],{"class":1537},"check_cache_health",[1062,10283,10243],{"class":1117},[1062,10285,10286],{"class":1064,"line":5614},[1062,10287,2050],{"class":1117},[1062,10289,10290],{"class":1064,"line":5619},[1062,10291,2573],{"class":1079},[1062,10293,10294,10296],{"class":1064,"line":5625},[1062,10295,2924],{"class":1075},[1062,10297,10298],{"class":1079}," report\n",[1062,10300,10301],{"class":1064,"line":5630},[1062,10302,1101],{"emptyLinePlaceholder":1100},[1062,10304,10305],{"class":1064,"line":5635},[1062,10306,10307],{"class":1068},"# Management command for cache monitoring\n",[1062,10309,10310,10312,10315,10317,10320],{"class":1064,"line":5640},[1062,10311,2451],{"class":1185},[1062,10313,10314],{"class":2454}," Command",[1062,10316,1534],{"class":1117},[1062,10318,10319],{"class":7270},"BaseCommand",[1062,10321,2493],{"class":1117},[1062,10323,10324,10327,10329,10331,10334],{"class":1064,"line":5646},[1062,10325,10326],{"class":2483},"    help",[1062,10328,1118],{"class":1117},[1062,10330,1156],{"class":1127},[1062,10332,10333],{"class":1131},"Monitor cache performance and health",[1062,10335,2089],{"class":1127},[1062,10337,10338],{"class":1064,"line":5651},[1062,10339,1575],{"class":1079},[1062,10341,10342,10344,10347,10349,10351,10353,10356],{"class":1064,"line":5657},[1062,10343,2480],{"class":1185},[1062,10345,10346],{"class":2580}," add_arguments",[1062,10348,1534],{"class":1117},[1062,10350,2490],{"class":2489},[1062,10352,1462],{"class":1117},[1062,10354,10355],{"class":2590}," parser",[1062,10357,2493],{"class":1117},[1062,10359,10360,10363,10365,10368],{"class":1064,"line":5662},[1062,10361,10362],{"class":1079},"        parser",[1062,10364,1199],{"class":1117},[1062,10366,10367],{"class":1537},"add_argument",[1062,10369,3959],{"class":1117},[1062,10371,10372,10374,10377,10379],{"class":1064,"line":5667},[1062,10373,1314],{"class":1127},[1062,10375,10376],{"class":1131},"--format",[1062,10378,1135],{"class":1127},[1062,10380,1164],{"class":1117},[1062,10382,10383,10386,10388,10390,10392,10394,10396,10398,10401,10403],{"class":1064,"line":5673},[1062,10384,10385],{"class":2884},"            choices",[1062,10387,2985],{"class":1117},[1062,10389,1135],{"class":1127},[1062,10391,2932],{"class":1131},[1062,10393,1135],{"class":1127},[1062,10395,1462],{"class":1117},[1062,10397,1156],{"class":1127},[1062,10399,10400],{"class":1131},"table",[1062,10402,1135],{"class":1127},[1062,10404,8372],{"class":1117},[1062,10406,10407,10410,10412,10414,10416,10418],{"class":1064,"line":5679},[1062,10408,10409],{"class":2884},"            default",[1062,10411,2595],{"class":1117},[1062,10413,1135],{"class":1127},[1062,10415,10400],{"class":1131},[1062,10417,1135],{"class":1127},[1062,10419,1164],{"class":1117},[1062,10421,10422,10425,10427,10429,10432],{"class":1064,"line":5684},[1062,10423,10424],{"class":2884},"            help",[1062,10426,2595],{"class":1117},[1062,10428,1135],{"class":1127},[1062,10430,10431],{"class":1131},"Output format",[1062,10433,2089],{"class":1127},[1062,10435,10436],{"class":1064,"line":5690},[1062,10437,4026],{"class":1117},[1062,10439,10440,10442,10444,10446],{"class":1064,"line":5696},[1062,10441,10362],{"class":1079},[1062,10443,1199],{"class":1117},[1062,10445,10367],{"class":1537},[1062,10447,3959],{"class":1117},[1062,10449,10450,10452,10455,10457],{"class":1064,"line":5702},[1062,10451,1314],{"class":1127},[1062,10453,10454],{"class":1131},"--continuous",[1062,10456,1135],{"class":1127},[1062,10458,1164],{"class":1117},[1062,10460,10461,10464,10466,10468,10471,10473],{"class":1064,"line":5708},[1062,10462,10463],{"class":2884},"            action",[1062,10465,2595],{"class":1117},[1062,10467,1135],{"class":1127},[1062,10469,10470],{"class":1131},"store_true",[1062,10472,1135],{"class":1127},[1062,10474,1164],{"class":1117},[1062,10476,10477,10479,10481,10483,10486],{"class":1064,"line":5714},[1062,10478,10424],{"class":2884},[1062,10480,2595],{"class":1117},[1062,10482,1135],{"class":1127},[1062,10484,10485],{"class":1131},"Run continuous monitoring",[1062,10487,2089],{"class":1127},[1062,10489,10490],{"class":1064,"line":5720},[1062,10491,4026],{"class":1117},[1062,10493,10494,10496,10498,10500],{"class":1064,"line":5725},[1062,10495,10362],{"class":1079},[1062,10497,1199],{"class":1117},[1062,10499,10367],{"class":1537},[1062,10501,3959],{"class":1117},[1062,10503,10504,10506,10509,10511],{"class":1064,"line":5731},[1062,10505,1314],{"class":1127},[1062,10507,10508],{"class":1131},"--interval",[1062,10510,1135],{"class":1127},[1062,10512,1164],{"class":1117},[1062,10514,10515,10518,10520,10522],{"class":1064,"line":5737},[1062,10516,10517],{"class":2884},"            type",[1062,10519,2595],{"class":1117},[1062,10521,4230],{"class":1530},[1062,10523,1164],{"class":1117},[1062,10525,10527,10529,10531,10534],{"class":1064,"line":10526},162,[1062,10528,10409],{"class":2884},[1062,10530,2595],{"class":1117},[1062,10532,10533],{"class":1360},"60",[1062,10535,1164],{"class":1117},[1062,10537,10539,10541,10543,10545,10548],{"class":1064,"line":10538},163,[1062,10540,10424],{"class":2884},[1062,10542,2595],{"class":1117},[1062,10544,1135],{"class":1127},[1062,10546,10547],{"class":1131},"Monitoring interval in seconds",[1062,10549,2089],{"class":1127},[1062,10551,10553],{"class":1064,"line":10552},164,[1062,10554,4026],{"class":1117},[1062,10556,10558],{"class":1064,"line":10557},165,[1062,10559,1575],{"class":1079},[1062,10561,10563,10565,10568,10570,10572,10574,10577,10580,10582,10584,10587],{"class":1064,"line":10562},166,[1062,10564,2480],{"class":1185},[1062,10566,10567],{"class":2580}," handle",[1062,10569,1534],{"class":1117},[1062,10571,2490],{"class":2489},[1062,10573,1462],{"class":1117},[1062,10575,10576],{"class":2594}," *",[1062,10578,10579],{"class":2590},"args",[1062,10581,1462],{"class":1117},[1062,10583,4736],{"class":2594},[1062,10585,10586],{"class":2590},"options",[1062,10588,2493],{"class":1117},[1062,10590,10592,10595,10597,10599],{"class":1064,"line":10591},167,[1062,10593,10594],{"class":1079},"        monitor ",[1062,10596,2595],{"class":1117},[1062,10598,8540],{"class":1537},[1062,10600,2915],{"class":1117},[1062,10602,10604],{"class":1064,"line":10603},168,[1062,10605,2573],{"class":1079},[1062,10607,10609,10611,10614,10616,10618,10621,10623],{"class":1064,"line":10608},169,[1062,10610,2742],{"class":1075},[1062,10612,10613],{"class":1079}," options",[1062,10615,1206],{"class":1117},[1062,10617,1135],{"class":1127},[1062,10619,10620],{"class":1131},"continuous",[1062,10622,1135],{"class":1127},[1062,10624,10625],{"class":1117},"]:\n",[1062,10627,10629,10631,10633,10636,10638,10641,10643,10645],{"class":1064,"line":10628},170,[1062,10630,7112],{"class":1113},[1062,10632,1199],{"class":1117},[1062,10634,10635],{"class":1537},"run_continuous_monitoring",[1062,10637,1534],{"class":1117},[1062,10639,10640],{"class":1537},"monitor",[1062,10642,1462],{"class":1117},[1062,10644,10613],{"class":1537},[1062,10646,2855],{"class":1117},[1062,10648,10650,10652],{"class":1064,"line":10649},171,[1062,10651,2833],{"class":1075},[1062,10653,2458],{"class":1117},[1062,10655,10657,10659,10661,10664,10666,10668,10670,10672],{"class":1064,"line":10656},172,[1062,10658,7112],{"class":1113},[1062,10660,1199],{"class":1117},[1062,10662,10663],{"class":1537},"run_single_report",[1062,10665,1534],{"class":1117},[1062,10667,10640],{"class":1537},[1062,10669,1462],{"class":1117},[1062,10671,10613],{"class":1537},[1062,10673,2855],{"class":1117},[1062,10675,10677],{"class":1064,"line":10676},173,[1062,10678,1575],{"class":1079},[1062,10680,10682,10684,10687,10689,10691,10693,10696,10698,10700],{"class":1064,"line":10681},174,[1062,10683,2480],{"class":1185},[1062,10685,10686],{"class":2580}," run_single_report",[1062,10688,1534],{"class":1117},[1062,10690,2490],{"class":2489},[1062,10692,1462],{"class":1117},[1062,10694,10695],{"class":2590}," monitor",[1062,10697,1462],{"class":1117},[1062,10699,10613],{"class":2590},[1062,10701,2493],{"class":1117},[1062,10703,10705,10707,10710],{"class":1064,"line":10704},175,[1062,10706,2624],{"class":2463},[1062,10708,10709],{"class":2467},"Run a single monitoring report.",[1062,10711,2471],{"class":2463},[1062,10713,10715,10717,10719,10721,10723,10726],{"class":1064,"line":10714},176,[1062,10716,10219],{"class":1079},[1062,10718,2595],{"class":1117},[1062,10720,10695],{"class":1079},[1062,10722,1199],{"class":1117},[1062,10724,10725],{"class":1537},"generate_report",[1062,10727,2915],{"class":1117},[1062,10729,10731],{"class":1064,"line":10730},177,[1062,10732,2573],{"class":1079},[1062,10734,10736,10738,10740,10742,10744,10747,10749,10751,10754,10756,10758,10760],{"class":1064,"line":10735},178,[1062,10737,2742],{"class":1075},[1062,10739,10613],{"class":1079},[1062,10741,1206],{"class":1117},[1062,10743,1135],{"class":1127},[1062,10745,10746],{"class":1131},"format",[1062,10748,1135],{"class":1127},[1062,10750,1216],{"class":1117},[1062,10752,10753],{"class":2594}," ==",[1062,10755,1156],{"class":1127},[1062,10757,2932],{"class":1131},[1062,10759,1135],{"class":1127},[1062,10761,2458],{"class":1117},[1062,10763,10765,10767,10769,10772,10774,10777,10779,10781,10783,10785,10787,10790,10792,10795,10797,10800],{"class":1064,"line":10764},179,[1062,10766,7112],{"class":1113},[1062,10768,1199],{"class":1117},[1062,10770,10771],{"class":1202},"stdout",[1062,10773,1199],{"class":1117},[1062,10775,10776],{"class":1537},"write",[1062,10778,1534],{"class":1117},[1062,10780,2932],{"class":1537},[1062,10782,1199],{"class":1117},[1062,10784,7389],{"class":1537},[1062,10786,1534],{"class":1117},[1062,10788,10789],{"class":1537},"report",[1062,10791,1462],{"class":1117},[1062,10793,10794],{"class":2884}," indent",[1062,10796,2595],{"class":1117},[1062,10798,10799],{"class":1360},"2",[1062,10801,7134],{"class":1117},[1062,10803,10805,10807],{"class":1064,"line":10804},180,[1062,10806,2833],{"class":1075},[1062,10808,2458],{"class":1117},[1062,10810,10812,10814,10816,10819,10821,10823],{"class":1064,"line":10811},181,[1062,10813,7112],{"class":1113},[1062,10815,1199],{"class":1117},[1062,10817,10818],{"class":1537},"print_table_report",[1062,10820,1534],{"class":1117},[1062,10822,10789],{"class":1537},[1062,10824,2855],{"class":1117},[1062,10826,10828],{"class":1064,"line":10827},182,[1062,10829,1575],{"class":1079},[1062,10831,10833,10835,10838,10840,10842,10844,10846,10848,10850],{"class":1064,"line":10832},183,[1062,10834,2480],{"class":1185},[1062,10836,10837],{"class":2580}," run_continuous_monitoring",[1062,10839,1534],{"class":1117},[1062,10841,2490],{"class":2489},[1062,10843,1462],{"class":1117},[1062,10845,10695],{"class":2590},[1062,10847,1462],{"class":1117},[1062,10849,10613],{"class":2590},[1062,10851,2493],{"class":1117},[1062,10853,10855,10857,10860],{"class":1064,"line":10854},184,[1062,10856,2624],{"class":2463},[1062,10858,10859],{"class":2467},"Run continuous monitoring.",[1062,10861,2471],{"class":2463},[1062,10863,10865,10868,10870,10872,10874,10876,10879,10881],{"class":1064,"line":10864},185,[1062,10866,10867],{"class":1079},"        interval ",[1062,10869,2595],{"class":1117},[1062,10871,10613],{"class":1079},[1062,10873,1206],{"class":1117},[1062,10875,1135],{"class":1127},[1062,10877,10878],{"class":1131},"interval",[1062,10880,1135],{"class":1127},[1062,10882,2334],{"class":1117},[1062,10884,10886],{"class":1064,"line":10885},186,[1062,10887,2573],{"class":1079},[1062,10889,10891,10893,10895,10897,10899,10901,10903,10905,10908,10910,10912,10914,10917],{"class":1064,"line":10890},187,[1062,10892,2498],{"class":1113},[1062,10894,1199],{"class":1117},[1062,10896,10771],{"class":1202},[1062,10898,1199],{"class":1117},[1062,10900,10776],{"class":1537},[1062,10902,1534],{"class":1117},[1062,10904,4575],{"class":1185},[1062,10906,10907],{"class":1131},"'Starting continuous monitoring (interval: ",[1062,10909,1193],{"class":1192},[1062,10911,10878],{"class":1537},[1062,10913,1219],{"class":1192},[1062,10915,10916],{"class":1131},"s)'",[1062,10918,2855],{"class":1117},[1062,10920,10922],{"class":1064,"line":10921},188,[1062,10923,2573],{"class":1079},[1062,10925,10927,10929],{"class":1064,"line":10926},189,[1062,10928,4769],{"class":1075},[1062,10930,2458],{"class":1117},[1062,10932,10934,10937,10939],{"class":1064,"line":10933},190,[1062,10935,10936],{"class":1075},"            while",[1062,10938,1379],{"class":1378},[1062,10940,2458],{"class":1117},[1062,10942,10944,10947,10949,10951,10953,10955],{"class":1064,"line":10943},191,[1062,10945,10946],{"class":1079},"                report ",[1062,10948,2595],{"class":1117},[1062,10950,10695],{"class":1079},[1062,10952,1199],{"class":1117},[1062,10954,10725],{"class":1537},[1062,10956,2915],{"class":1117},[1062,10958,10960],{"class":1064,"line":10959},192,[1062,10961,9003],{"class":1079},[1062,10963,10965,10968,10970,10972,10974,10976,10978,10980,10982,10984,10986,10988],{"class":1064,"line":10964},193,[1062,10966,10967],{"class":1075},"                if",[1062,10969,10613],{"class":1079},[1062,10971,1206],{"class":1117},[1062,10973,1135],{"class":1127},[1062,10975,10746],{"class":1131},[1062,10977,1135],{"class":1127},[1062,10979,1216],{"class":1117},[1062,10981,10753],{"class":2594},[1062,10983,1156],{"class":1127},[1062,10985,2932],{"class":1131},[1062,10987,1135],{"class":1127},[1062,10989,2458],{"class":1117},[1062,10991,10993,10996,10998,11000,11002,11004,11006,11008,11010,11012,11014,11016,11018,11020,11022,11024],{"class":1064,"line":10992},194,[1062,10994,10995],{"class":1113},"                    self",[1062,10997,1199],{"class":1117},[1062,10999,10771],{"class":1202},[1062,11001,1199],{"class":1117},[1062,11003,10776],{"class":1537},[1062,11005,1534],{"class":1117},[1062,11007,2932],{"class":1537},[1062,11009,1199],{"class":1117},[1062,11011,7389],{"class":1537},[1062,11013,1534],{"class":1117},[1062,11015,10789],{"class":1537},[1062,11017,1462],{"class":1117},[1062,11019,10794],{"class":2884},[1062,11021,2595],{"class":1117},[1062,11023,10799],{"class":1360},[1062,11025,7134],{"class":1117},[1062,11027,11029,11032],{"class":1064,"line":11028},195,[1062,11030,11031],{"class":1075},"                else",[1062,11033,2458],{"class":1117},[1062,11035,11037,11039,11041,11043,11045,11047],{"class":1064,"line":11036},196,[1062,11038,10995],{"class":1113},[1062,11040,1199],{"class":1117},[1062,11042,10818],{"class":1537},[1062,11044,1534],{"class":1117},[1062,11046,10789],{"class":1537},[1062,11048,2855],{"class":1117},[1062,11050,11052],{"class":1064,"line":11051},197,[1062,11053,9003],{"class":1079},[1062,11055,11057,11060,11062,11065,11067,11069],{"class":1064,"line":11056},198,[1062,11058,11059],{"class":1079},"                time",[1062,11061,1199],{"class":1117},[1062,11063,11064],{"class":1537},"sleep",[1062,11066,1534],{"class":1117},[1062,11068,10878],{"class":1537},[1062,11070,2855],{"class":1117},[1062,11072,11074],{"class":1064,"line":11073},199,[1062,11075,2573],{"class":1079},[1062,11077,11079,11081,11084],{"class":1064,"line":11078},200,[1062,11080,4838],{"class":1075},[1062,11082,11083],{"class":1530}," KeyboardInterrupt",[1062,11085,2458],{"class":1117},[1062,11087,11089,11091,11093,11095,11097,11099,11101,11103,11106,11109,11111],{"class":1064,"line":11088},201,[1062,11090,7112],{"class":1113},[1062,11092,1199],{"class":1117},[1062,11094,10771],{"class":1202},[1062,11096,1199],{"class":1117},[1062,11098,10776],{"class":1537},[1062,11100,1534],{"class":1117},[1062,11102,1135],{"class":1127},[1062,11104,11105],{"class":1113},"\\n",[1062,11107,11108],{"class":1131},"Monitoring stopped",[1062,11110,1135],{"class":1127},[1062,11112,2855],{"class":1117},[1062,11114,11116],{"class":1064,"line":11115},202,[1062,11117,1575],{"class":1079},[1062,11119,11121,11123,11126,11128,11130,11132,11135],{"class":1064,"line":11120},203,[1062,11122,2480],{"class":1185},[1062,11124,11125],{"class":2580}," print_table_report",[1062,11127,1534],{"class":1117},[1062,11129,2490],{"class":2489},[1062,11131,1462],{"class":1117},[1062,11133,11134],{"class":2590}," report",[1062,11136,2493],{"class":1117},[1062,11138,11140,11142,11145],{"class":1064,"line":11139},204,[1062,11141,2624],{"class":2463},[1062,11143,11144],{"class":2467},"Print report in table format.",[1062,11146,2471],{"class":2463},[1062,11148,11150,11152,11154,11156,11158,11160,11162,11164,11166,11168,11171,11173,11175,11177,11179,11182],{"class":1064,"line":11149},205,[1062,11151,2498],{"class":1113},[1062,11153,1199],{"class":1117},[1062,11155,10771],{"class":1202},[1062,11157,1199],{"class":1117},[1062,11159,10776],{"class":1537},[1062,11161,1534],{"class":1117},[1062,11163,1135],{"class":1127},[1062,11165,11105],{"class":1113},[1062,11167,1135],{"class":1127},[1062,11169,11170],{"class":2594}," +",[1062,11172,1156],{"class":1127},[1062,11174,2595],{"class":1131},[1062,11176,1135],{"class":1127},[1062,11178,9325],{"class":2594},[1062,11180,11181],{"class":1360},"80",[1062,11183,2855],{"class":1117},[1062,11185,11187,11189,11191,11193,11195,11197,11199,11201,11204,11206,11208,11210,11213,11215,11217,11219,11221,11223,11225,11228,11230,11232],{"class":1064,"line":11186},206,[1062,11188,2498],{"class":1113},[1062,11190,1199],{"class":1117},[1062,11192,10771],{"class":1202},[1062,11194,1199],{"class":1117},[1062,11196,10776],{"class":1537},[1062,11198,1534],{"class":1117},[1062,11200,4575],{"class":1185},[1062,11202,11203],{"class":1131},"\"Cache Monitoring Report - ",[1062,11205,1193],{"class":1192},[1062,11207,4235],{"class":1537},[1062,11209,1199],{"class":1117},[1062,11211,11212],{"class":1537},"ctime",[1062,11214,1534],{"class":1117},[1062,11216,10789],{"class":1537},[1062,11218,1206],{"class":1117},[1062,11220,1135],{"class":1127},[1062,11222,10230],{"class":1131},[1062,11224,1135],{"class":1127},[1062,11226,11227],{"class":1117},"])",[1062,11229,1219],{"class":1192},[1062,11231,1489],{"class":1131},[1062,11233,2855],{"class":1117},[1062,11235,11237,11239,11241,11243,11245,11247,11249,11251,11253,11255,11257,11259],{"class":1064,"line":11236},207,[1062,11238,2498],{"class":1113},[1062,11240,1199],{"class":1117},[1062,11242,10771],{"class":1202},[1062,11244,1199],{"class":1117},[1062,11246,10776],{"class":1537},[1062,11248,1534],{"class":1117},[1062,11250,1135],{"class":1127},[1062,11252,2595],{"class":1131},[1062,11254,1135],{"class":1127},[1062,11256,9325],{"class":2594},[1062,11258,11181],{"class":1360},[1062,11260,2855],{"class":1117},[1062,11262,11264],{"class":1064,"line":11263},208,[1062,11265,2573],{"class":1079},[1062,11267,11269],{"class":1064,"line":11268},209,[1062,11270,11271],{"class":1068},"        # Health status\n",[1062,11273,11275,11277,11279,11281,11283,11285,11287,11289,11291,11294,11296],{"class":1064,"line":11274},210,[1062,11276,2498],{"class":1113},[1062,11278,1199],{"class":1117},[1062,11280,10771],{"class":1202},[1062,11282,1199],{"class":1117},[1062,11284,10776],{"class":1537},[1062,11286,1534],{"class":1117},[1062,11288,1135],{"class":1127},[1062,11290,11105],{"class":1113},[1062,11292,11293],{"class":1131},"Health Status:",[1062,11295,1135],{"class":1127},[1062,11297,2855],{"class":1117},[1062,11299,11301,11303,11305,11307,11310,11312,11314,11316,11318,11320,11322,11325,11327],{"class":1064,"line":11300},211,[1062,11302,8586],{"class":1075},[1062,11304,8589],{"class":1079},[1062,11306,1462],{"class":1117},[1062,11308,11309],{"class":1079}," health ",[1062,11311,4596],{"class":1075},[1062,11313,11134],{"class":1079},[1062,11315,1206],{"class":1117},[1062,11317,1135],{"class":1127},[1062,11319,10270],{"class":1131},[1062,11321,1135],{"class":1127},[1062,11323,11324],{"class":1117},"].",[1062,11326,8607],{"class":1537},[1062,11328,8610],{"class":1117},[1062,11330,11332,11335,11337,11340,11342,11344,11346,11348],{"class":1064,"line":11331},212,[1062,11333,11334],{"class":1079},"            status ",[1062,11336,2595],{"class":1117},[1062,11338,11339],{"class":1079}," health",[1062,11341,1206],{"class":1117},[1062,11343,1135],{"class":1127},[1062,11345,9731],{"class":1131},[1062,11347,1135],{"class":1127},[1062,11349,2334],{"class":1117},[1062,11351,11353,11356,11358,11360,11362,11365,11367,11370,11372,11375,11377,11379,11381,11383,11385,11387,11389,11391,11393],{"class":1064,"line":11352},213,[1062,11354,11355],{"class":1079},"            color ",[1062,11357,2595],{"class":1117},[1062,11359,2972],{"class":1113},[1062,11361,1199],{"class":1117},[1062,11363,11364],{"class":1202},"style",[1062,11366,1199],{"class":1117},[1062,11368,11369],{"class":3985},"SUCCESS",[1062,11371,9332],{"class":1075},[1062,11373,11374],{"class":1079}," status ",[1062,11376,9750],{"class":2594},[1062,11378,1156],{"class":1127},[1062,11380,9740],{"class":1131},[1062,11382,1135],{"class":1127},[1062,11384,9342],{"class":1075},[1062,11386,2972],{"class":1113},[1062,11388,1199],{"class":1117},[1062,11390,11364],{"class":1202},[1062,11392,1199],{"class":1117},[1062,11394,11395],{"class":3985},"ERROR\n",[1062,11397,11399,11401,11403,11405,11407,11409,11411,11413,11416,11418,11420,11422,11424,11426,11429,11431,11433,11435,11438,11440,11442,11444],{"class":1064,"line":11398},214,[1062,11400,7112],{"class":1113},[1062,11402,1199],{"class":1117},[1062,11404,10771],{"class":1202},[1062,11406,1199],{"class":1117},[1062,11408,10776],{"class":1537},[1062,11410,1534],{"class":1117},[1062,11412,4575],{"class":1185},[1062,11414,11415],{"class":1131},"\"  ",[1062,11417,1193],{"class":1192},[1062,11419,8623],{"class":1537},[1062,11421,1219],{"class":1192},[1062,11423,8786],{"class":1131},[1062,11425,1193],{"class":1192},[1062,11427,11428],{"class":1537},"color",[1062,11430,1534],{"class":1117},[1062,11432,9731],{"class":1537},[1062,11434,1199],{"class":1117},[1062,11436,11437],{"class":1537},"upper",[1062,11439,4242],{"class":1117},[1062,11441,1219],{"class":1192},[1062,11443,1489],{"class":1131},[1062,11445,2855],{"class":1117},[1062,11447,11449],{"class":1064,"line":11448},215,[1062,11450,11451],{"class":1079},"            \n",[1062,11453,11455,11458,11460,11462,11464,11466,11468,11470,11472],{"class":1064,"line":11454},216,[1062,11456,11457],{"class":1075},"            if",[1062,11459,11339],{"class":1079},[1062,11461,1199],{"class":1117},[1062,11463,1546],{"class":1537},[1062,11465,1534],{"class":1117},[1062,11467,1135],{"class":1127},[1062,11469,9772],{"class":1131},[1062,11471,1135],{"class":1127},[1062,11473,2493],{"class":1117},[1062,11475,11477,11480,11482,11484,11486,11488,11490,11492],{"class":1064,"line":11476},217,[1062,11478,11479],{"class":1079},"                rt ",[1062,11481,2595],{"class":1117},[1062,11483,11339],{"class":1079},[1062,11485,1206],{"class":1117},[1062,11487,1135],{"class":1127},[1062,11489,9772],{"class":1131},[1062,11491,1135],{"class":1127},[1062,11493,2334],{"class":1117},[1062,11495,11497,11500,11502,11504,11506,11508,11510,11512,11515,11517,11520,11522,11524,11526,11528,11530,11533,11535,11538],{"class":1064,"line":11496},218,[1062,11498,11499],{"class":1113},"                self",[1062,11501,1199],{"class":1117},[1062,11503,10771],{"class":1202},[1062,11505,1199],{"class":1117},[1062,11507,10776],{"class":1537},[1062,11509,1534],{"class":1117},[1062,11511,4575],{"class":1185},[1062,11513,11514],{"class":1131},"\"    Response time: ",[1062,11516,1193],{"class":1192},[1062,11518,11519],{"class":1537},"rt",[1062,11521,1206],{"class":1117},[1062,11523,1135],{"class":1127},[1062,11525,10161],{"class":1131},[1062,11527,1135],{"class":1127},[1062,11529,1216],{"class":1117},[1062,11531,11532],{"class":1185},":.4f",[1062,11534,1219],{"class":1192},[1062,11536,11537],{"class":1131},"s\"",[1062,11539,2855],{"class":1117},[1062,11541,11543],{"class":1064,"line":11542},219,[1062,11544,2573],{"class":1079},[1062,11546,11548],{"class":1064,"line":11547},220,[1062,11549,11550],{"class":1068},"        # Cache statistics\n",[1062,11552,11554,11556,11558,11560,11562,11564,11566,11568,11570,11573,11575],{"class":1064,"line":11553},221,[1062,11555,2498],{"class":1113},[1062,11557,1199],{"class":1117},[1062,11559,10771],{"class":1202},[1062,11561,1199],{"class":1117},[1062,11563,10776],{"class":1537},[1062,11565,1534],{"class":1117},[1062,11567,1135],{"class":1127},[1062,11569,11105],{"class":1113},[1062,11571,11572],{"class":1131},"Cache Statistics:",[1062,11574,1135],{"class":1127},[1062,11576,2855],{"class":1117},[1062,11578,11580,11582,11584,11586,11589,11591,11593,11595,11597,11599,11601,11603,11605],{"class":1064,"line":11579},222,[1062,11581,8586],{"class":1075},[1062,11583,8589],{"class":1079},[1062,11585,1462],{"class":1117},[1062,11587,11588],{"class":1079}," stats ",[1062,11590,4596],{"class":1075},[1062,11592,11134],{"class":1079},[1062,11594,1206],{"class":1117},[1062,11596,1135],{"class":1127},[1062,11598,10250],{"class":1131},[1062,11600,1135],{"class":1127},[1062,11602,11324],{"class":1117},[1062,11604,8607],{"class":1537},[1062,11606,8610],{"class":1117},[1062,11608,11610,11612,11614,11616,11618,11620,11622],{"class":1064,"line":11609},223,[1062,11611,11457],{"class":1075},[1062,11613,1156],{"class":1127},[1062,11615,4895],{"class":1131},[1062,11617,1135],{"class":1127},[1062,11619,8945],{"class":2594},[1062,11621,9249],{"class":1079},[1062,11623,2458],{"class":1117},[1062,11625,11627,11629,11631,11633,11635,11637,11639,11641,11643,11645,11647,11649,11651,11653,11655,11657,11659,11661,11664,11666,11668,11670,11672,11674,11676,11679,11681,11683,11685,11687,11689,11691,11693,11695,11697],{"class":1064,"line":11626},224,[1062,11628,11499],{"class":1113},[1062,11630,1199],{"class":1117},[1062,11632,10771],{"class":1202},[1062,11634,1199],{"class":1117},[1062,11636,10776],{"class":1537},[1062,11638,1534],{"class":1117},[1062,11640,4575],{"class":1185},[1062,11642,11415],{"class":1131},[1062,11644,1193],{"class":1192},[1062,11646,8623],{"class":1537},[1062,11648,1219],{"class":1192},[1062,11650,8786],{"class":1131},[1062,11652,1193],{"class":1192},[1062,11654,2490],{"class":1113},[1062,11656,1199],{"class":1117},[1062,11658,11364],{"class":1202},[1062,11660,1199],{"class":1117},[1062,11662,11663],{"class":1537},"ERROR",[1062,11665,1534],{"class":1117},[1062,11667,1135],{"class":1127},[1062,11669,11663],{"class":1131},[1062,11671,1135],{"class":1127},[1062,11673,8192],{"class":1117},[1062,11675,1219],{"class":1192},[1062,11677,11678],{"class":1131}," - ",[1062,11680,1193],{"class":1192},[1062,11682,10250],{"class":1537},[1062,11684,1206],{"class":1117},[1062,11686,1135],{"class":1127},[1062,11688,4895],{"class":1131},[1062,11690,1135],{"class":1127},[1062,11692,1216],{"class":1117},[1062,11694,1219],{"class":1192},[1062,11696,1489],{"class":1131},[1062,11698,2855],{"class":1117},[1062,11700,11702],{"class":1064,"line":11701},225,[1062,11703,11704],{"class":1075},"                continue\n",[1062,11706,11708],{"class":1064,"line":11707},226,[1062,11709,11451],{"class":1079},[1062,11711,11713,11715,11717,11719,11721,11723,11725,11727,11729,11731,11733,11735,11737,11739,11741,11743,11745,11747,11749,11751,11753,11756],{"class":1064,"line":11712},227,[1062,11714,7112],{"class":1113},[1062,11716,1199],{"class":1117},[1062,11718,10771],{"class":1202},[1062,11720,1199],{"class":1117},[1062,11722,10776],{"class":1537},[1062,11724,1534],{"class":1117},[1062,11726,4575],{"class":1185},[1062,11728,11415],{"class":1131},[1062,11730,1193],{"class":1192},[1062,11732,8623],{"class":1537},[1062,11734,1219],{"class":1192},[1062,11736,9314],{"class":1131},[1062,11738,1193],{"class":1192},[1062,11740,10250],{"class":1537},[1062,11742,1206],{"class":1117},[1062,11744,1135],{"class":1127},[1062,11746,8887],{"class":1131},[1062,11748,1135],{"class":1127},[1062,11750,1216],{"class":1117},[1062,11752,1219],{"class":1192},[1062,11754,11755],{"class":1131},"):\"",[1062,11757,2855],{"class":1117},[1062,11759,11761],{"class":1064,"line":11760},228,[1062,11762,11451],{"class":1079},[1062,11764,11766,11768,11770,11772,11774,11776,11778],{"class":1064,"line":11765},229,[1062,11767,11457],{"class":1075},[1062,11769,1156],{"class":1127},[1062,11771,9305],{"class":1131},[1062,11773,1135],{"class":1127},[1062,11775,8945],{"class":2594},[1062,11777,9249],{"class":1079},[1062,11779,2458],{"class":1117},[1062,11781,11783,11786,11788,11790,11792,11794,11796,11798],{"class":1064,"line":11782},230,[1062,11784,11785],{"class":1079},"                hit_rate ",[1062,11787,2595],{"class":1117},[1062,11789,9249],{"class":1079},[1062,11791,1206],{"class":1117},[1062,11793,1135],{"class":1127},[1062,11795,9305],{"class":1131},[1062,11797,1135],{"class":1127},[1062,11799,2334],{"class":1117},[1062,11801,11803,11806,11808,11810,11812,11814,11816,11818,11820,11823,11825,11828,11830,11832,11834,11836,11838],{"class":1064,"line":11802},231,[1062,11804,11805],{"class":1079},"                color ",[1062,11807,2595],{"class":1117},[1062,11809,2972],{"class":1113},[1062,11811,1199],{"class":1117},[1062,11813,11364],{"class":1202},[1062,11815,1199],{"class":1117},[1062,11817,11369],{"class":3985},[1062,11819,9332],{"class":1075},[1062,11821,11822],{"class":1079}," hit_rate ",[1062,11824,9337],{"class":2594},[1062,11826,11827],{"class":1360}," 80",[1062,11829,9342],{"class":1075},[1062,11831,2972],{"class":1113},[1062,11833,1199],{"class":1117},[1062,11835,11364],{"class":1202},[1062,11837,1199],{"class":1117},[1062,11839,11840],{"class":3985},"WARNING\n",[1062,11842,11844,11846,11848,11850,11852,11854,11856,11858,11861,11863,11865,11867,11869,11871,11873,11875,11878,11880,11883,11885,11887,11889],{"class":1064,"line":11843},232,[1062,11845,11499],{"class":1113},[1062,11847,1199],{"class":1117},[1062,11849,10771],{"class":1202},[1062,11851,1199],{"class":1117},[1062,11853,10776],{"class":1537},[1062,11855,1534],{"class":1117},[1062,11857,4575],{"class":1185},[1062,11859,11860],{"class":1131},"\"    Hit rate: ",[1062,11862,1193],{"class":1192},[1062,11864,11428],{"class":1537},[1062,11866,1534],{"class":1117},[1062,11868,4575],{"class":1185},[1062,11870,1135],{"class":1131},[1062,11872,1193],{"class":1192},[1062,11874,9305],{"class":1537},[1062,11876,11877],{"class":1185},":.1f",[1062,11879,1219],{"class":1192},[1062,11881,11882],{"class":1131},"%'",[1062,11884,8192],{"class":1117},[1062,11886,1219],{"class":1192},[1062,11888,1489],{"class":1131},[1062,11890,2855],{"class":1117},[1062,11892,11894],{"class":1064,"line":11893},233,[1062,11895,11451],{"class":1079},[1062,11897,11899,11901,11903,11905,11907,11909,11911],{"class":1064,"line":11898},234,[1062,11900,11457],{"class":1075},[1062,11902,1156],{"class":1127},[1062,11904,9103],{"class":1131},[1062,11906,1135],{"class":1127},[1062,11908,8945],{"class":2594},[1062,11910,9249],{"class":1079},[1062,11912,2458],{"class":1117},[1062,11914,11916,11918,11920,11922,11924,11926,11928,11930,11933,11935,11937,11939,11941,11943,11945,11947,11949,11951],{"class":1064,"line":11915},235,[1062,11917,11499],{"class":1113},[1062,11919,1199],{"class":1117},[1062,11921,10771],{"class":1202},[1062,11923,1199],{"class":1117},[1062,11925,10776],{"class":1537},[1062,11927,1534],{"class":1117},[1062,11929,4575],{"class":1185},[1062,11931,11932],{"class":1131},"\"    Memory usage: ",[1062,11934,1193],{"class":1192},[1062,11936,10250],{"class":1537},[1062,11938,1206],{"class":1117},[1062,11940,1135],{"class":1127},[1062,11942,9103],{"class":1131},[1062,11944,1135],{"class":1127},[1062,11946,1216],{"class":1117},[1062,11948,1219],{"class":1192},[1062,11950,1489],{"class":1131},[1062,11952,2855],{"class":1117},[1062,11954,11956],{"class":1064,"line":11955},236,[1062,11957,11451],{"class":1079},[1062,11959,11961,11963,11965,11967,11969,11971,11973],{"class":1064,"line":11960},237,[1062,11962,11457],{"class":1075},[1062,11964,1156],{"class":1127},[1062,11966,9039],{"class":1131},[1062,11968,1135],{"class":1127},[1062,11970,8945],{"class":2594},[1062,11972,9249],{"class":1079},[1062,11974,2458],{"class":1117},[1062,11976,11978,11980,11982,11984,11986,11988,11990,11992,11995,11997,11999,12001,12003,12005,12007,12009,12011,12013],{"class":1064,"line":11977},238,[1062,11979,11499],{"class":1113},[1062,11981,1199],{"class":1117},[1062,11983,10771],{"class":1202},[1062,11985,1199],{"class":1117},[1062,11987,10776],{"class":1537},[1062,11989,1534],{"class":1117},[1062,11991,4575],{"class":1185},[1062,11993,11994],{"class":1131},"\"    Connected clients: ",[1062,11996,1193],{"class":1192},[1062,11998,10250],{"class":1537},[1062,12000,1206],{"class":1117},[1062,12002,1135],{"class":1127},[1062,12004,9039],{"class":1131},[1062,12006,1135],{"class":1127},[1062,12008,1216],{"class":1117},[1062,12010,1219],{"class":1192},[1062,12012,1489],{"class":1131},[1062,12014,2855],{"class":1117},[1030,12016,12018],{"id":12017},"deployment-automation","Deployment Automation",[1035,12020,12022],{"id":12021},"cache-deployment-scripts","Cache Deployment Scripts",[1040,12024,12026],{"className":1056,"code":12025,"language":1058,"meta":1049,"style":1049},"# deploy/cache_deployment.py\nimport subprocess\nimport time\nimport requests\nfrom django.core.management.base import BaseCommand\nfrom django.conf import settings\n\nclass CacheDeploymentManager:\n    \"\"\"Manage cache operations during deployment.\"\"\"\n    \n    def __init__(self):\n        self.redis_hosts = settings.REDIS_HOSTS\n        self.cdn_config = settings.CDN_CONFIG\n    \n    def pre_deployment_cache_warm(self):\n        \"\"\"Warm cache before deployment.\"\"\"\n        self.stdout.write('Starting pre-deployment cache warming...')\n        \n        # Warm critical pages\n        critical_urls = [\n            '/',\n            '/blog/',\n            '/api/posts/',\n            '/about/',\n        ]\n        \n        for url in critical_urls:\n            try:\n                response = requests.get(f\"https://{settings.DOMAIN}{url}\")\n                if response.status_code == 200:\n                    self.stdout.write(f\"Warmed: {url}\")\n                else:\n                    self.stdout.write(f\"Failed to warm: {url} ({response.status_code})\")\n            except Exception as e:\n                self.stdout.write(f\"Error warming {url}: {e}\")\n    \n    def deployment_cache_strategy(self):\n        \"\"\"Execute cache strategy during deployment.\"\"\"\n        # 1. Increment cache version to invalidate old cache\n        self.increment_cache_version()\n        \n        # 2. Clear specific cache patterns\n        self.clear_deployment_cache()\n        \n        # 3. Warm critical cache entries\n        self.warm_critical_cache()\n        \n        # 4. Update CDN cache\n        self.update_cdn_cache()\n    \n    def increment_cache_version(self):\n        \"\"\"Increment cache version for cache invalidation.\"\"\"\n        from django.core.cache import cache\n        \n        current_version = cache.get('cache_version', 1)\n        new_version = current_version + 1\n        \n        cache.set('cache_version', new_version, timeout=None)\n        \n        self.stdout.write(f'Cache version incremented: {current_version} -> {new_version}')\n    \n    def clear_deployment_cache(self):\n        \"\"\"Clear cache entries that should be refreshed on deployment.\"\"\"\n        from django.core.cache import cache\n        \n        # Clear template fragment cache\n        patterns_to_clear = [\n            'template.cache.*',\n            'view_cache.*',\n            'api_cache.*',\n        ]\n        \n        # Redis-specific cache clearing\n        try:\n            from django_redis import get_redis_connection\n            redis_conn = get_redis_connection(\"default\")\n            \n            for pattern in patterns_to_clear:\n                keys = redis_conn.keys(pattern)\n                if keys:\n                    redis_conn.delete(*keys)\n                    self.stdout.write(f'Cleared {len(keys)} keys matching {pattern}')\n        \n        except ImportError:\n            # Fallback for non-Redis backends\n            cache.clear()\n            self.stdout.write('Cleared entire cache (non-Redis backend)')\n    \n    def warm_critical_cache(self):\n        \"\"\"Warm critical cache entries after deployment.\"\"\"\n        # Import here to avoid circular imports\n        from django.core.management import call_command\n        \n        try:\n            call_command('warm_cache', '--critical-only')\n            self.stdout.write('Critical cache warming completed')\n        except Exception as e:\n            self.stdout.write(f'Cache warming failed: {e}')\n    \n    def update_cdn_cache(self):\n        \"\"\"Update CDN cache after deployment.\"\"\"\n        try:\n            # Purge CDN cache for updated assets\n            from utils.cdn import CloudFlareCache\n            \n            cf_cache = CloudFlareCache()\n            \n            # Purge static files\n            cf_cache.purge_cache(tags=['static-assets'])\n            \n            # Purge main pages\n            cf_cache.purge_cache(urls=[\n                f\"https://{settings.DOMAIN}/\",\n                f\"https://{settings.DOMAIN}/blog/\",\n            ])\n            \n            self.stdout.write('CDN cache purged successfully')\n        \n        except Exception as e:\n            self.stdout.write(f'CDN cache purge failed: {e}')\n    \n    def post_deployment_verification(self):\n        \"\"\"Verify cache is working correctly after deployment.\"\"\"\n        verification_urls = [\n            ('/', 'Home page'),\n            ('/blog/', 'Blog list'),\n            ('/api/health/', 'Health check'),\n        ]\n        \n        for url, description in verification_urls:\n            try:\n                # First request (should be cache miss)\n                start_time = time.time()\n                response1 = requests.get(f\"https://{settings.DOMAIN}{url}\")\n                first_time = time.time() - start_time\n                \n                # Second request (should be cache hit)\n                start_time = time.time()\n                response2 = requests.get(f\"https://{settings.DOMAIN}{url}\")\n                second_time = time.time() - start_time\n                \n                if response1.status_code == 200 and response2.status_code == 200:\n                    cache_improvement = ((first_time - second_time) / first_time) * 100\n                    self.stdout.write(\n                        f\"{description}: OK (Cache improvement: {cache_improvement:.1f}%)\"\n                    )\n                else:\n                    self.stdout.write(f\"{description}: FAILED\")\n            \n            except Exception as e:\n                self.stdout.write(f\"{description}: ERROR - {e}\")\n\n# Management command for deployment\nclass Command(BaseCommand):\n    help = 'Manage cache during deployment'\n    \n    def add_arguments(self, parser):\n        parser.add_argument(\n            '--phase',\n            choices=['pre', 'deploy', 'post'],\n            required=True,\n            help='Deployment phase'\n        )\n    \n    def handle(self, *args, **options):\n        manager = CacheDeploymentManager()\n        manager.stdout = self.stdout\n        \n        phase = options['phase']\n        \n        if phase == 'pre':\n            manager.pre_deployment_cache_warm()\n        elif phase == 'deploy':\n            manager.deployment_cache_strategy()\n        elif phase == 'post':\n            manager.post_deployment_verification()\n        \n        self.stdout.write(\n            self.style.SUCCESS(f'Deployment phase \"{phase}\" completed')\n        )\n",[1047,12027,12028,12033,12040,12046,12052,12074,12088,12092,12101,12110,12114,12126,12144,12162,12166,12179,12188,12211,12215,12220,12229,12239,12249,12260,12271,12275,12279,12293,12299,12338,12356,12385,12391,12434,12446,12483,12487,12500,12509,12514,12525,12529,12534,12545,12549,12554,12565,12569,12574,12585,12589,12602,12611,12630,12634,12662,12677,12681,12712,12716,12756,12760,12773,12782,12800,12804,12809,12818,12829,12840,12851,12855,12859,12864,12870,12881,12900,12904,12918,12938,12947,12964,13009,13013,13022,13027,13038,13061,13065,13078,13087,13092,13112,13116,13122,13147,13170,13182,13211,13215,13228,13237,13243,13248,13265,13269,13280,13284,13289,13313,13317,13322,13337,13359,13380,13385,13389,13412,13416,13428,13457,13461,13474,13483,13492,13514,13535,13557,13561,13565,13583,13589,13594,13609,13646,13665,13669,13674,13688,13725,13744,13748,13779,13812,13826,13855,13860,13866,13895,13899,13911,13948,13952,13957,13969,13982,13986,14002,14012,14023,14054,14065,14078,14082,14086,14110,14121,14139,14143,14163,14167,14184,14196,14212,14223,14239,14250,14254,14268,14298],{"__ignoreMap":1049},[1062,12029,12030],{"class":1064,"line":1065},[1062,12031,12032],{"class":1068},"# deploy/cache_deployment.py\n",[1062,12034,12035,12037],{"class":1064,"line":1072},[1062,12036,1076],{"class":1075},[1062,12038,12039],{"class":1079}," subprocess\n",[1062,12041,12042,12044],{"class":1064,"line":1083},[1062,12043,1076],{"class":1075},[1062,12045,8427],{"class":1079},[1062,12047,12048,12050],{"class":1064,"line":1097},[1062,12049,1076],{"class":1075},[1062,12051,2398],{"class":1079},[1062,12053,12054,12056,12058,12060,12062,12064,12066,12068,12070,12072],{"class":1064,"line":1104},[1062,12055,1086],{"class":1075},[1062,12057,2411],{"class":1079},[1062,12059,1199],{"class":1117},[1062,12061,2432],{"class":1079},[1062,12063,1199],{"class":1117},[1062,12065,8471],{"class":1079},[1062,12067,1199],{"class":1117},[1062,12069,8476],{"class":1079},[1062,12071,1076],{"class":1075},[1062,12073,8481],{"class":1079},[1062,12075,12076,12078,12080,12082,12084,12086],{"class":1064,"line":1110},[1062,12077,1086],{"class":1075},[1062,12079,2411],{"class":1079},[1062,12081,1199],{"class":1117},[1062,12083,2416],{"class":1079},[1062,12085,1076],{"class":1075},[1062,12087,2421],{"class":1079},[1062,12089,12090],{"class":1064,"line":1124},[1062,12091,1101],{"emptyLinePlaceholder":1100},[1062,12093,12094,12096,12099],{"class":1064,"line":1143},[1062,12095,2451],{"class":1185},[1062,12097,12098],{"class":2454}," CacheDeploymentManager",[1062,12100,2458],{"class":1117},[1062,12102,12103,12105,12108],{"class":1064,"line":1167},[1062,12104,2464],{"class":2463},[1062,12106,12107],{"class":2467},"Manage cache operations during deployment.",[1062,12109,2471],{"class":2463},[1062,12111,12112],{"class":1064,"line":1182},[1062,12113,1575],{"class":1079},[1062,12115,12116,12118,12120,12122,12124],{"class":1064,"line":1227},[1062,12117,2480],{"class":1185},[1062,12119,2484],{"class":2483},[1062,12121,1534],{"class":1117},[1062,12123,2490],{"class":2489},[1062,12125,2493],{"class":1117},[1062,12127,12128,12130,12132,12135,12137,12139,12141],{"class":1064,"line":1259},[1062,12129,2498],{"class":1113},[1062,12131,1199],{"class":1117},[1062,12133,12134],{"class":1202},"redis_hosts",[1062,12136,1118],{"class":1117},[1062,12138,4040],{"class":1079},[1062,12140,1199],{"class":1117},[1062,12142,12143],{"class":3985},"REDIS_HOSTS\n",[1062,12145,12146,12148,12150,12153,12155,12157,12159],{"class":1064,"line":1291},[1062,12147,2498],{"class":1113},[1062,12149,1199],{"class":1117},[1062,12151,12152],{"class":1202},"cdn_config",[1062,12154,1118],{"class":1117},[1062,12156,4040],{"class":1079},[1062,12158,1199],{"class":1117},[1062,12160,12161],{"class":3985},"CDN_CONFIG\n",[1062,12163,12164],{"class":1064,"line":1297},[1062,12165,1575],{"class":1079},[1062,12167,12168,12170,12173,12175,12177],{"class":1064,"line":1311},[1062,12169,2480],{"class":1185},[1062,12171,12172],{"class":2580}," pre_deployment_cache_warm",[1062,12174,1534],{"class":1117},[1062,12176,2490],{"class":2489},[1062,12178,2493],{"class":1117},[1062,12180,12181,12183,12186],{"class":1064,"line":1333},[1062,12182,2624],{"class":2463},[1062,12184,12185],{"class":2467},"Warm cache before deployment.",[1062,12187,2471],{"class":2463},[1062,12189,12190,12192,12194,12196,12198,12200,12202,12204,12207,12209],{"class":1064,"line":1347},[1062,12191,2498],{"class":1113},[1062,12193,1199],{"class":1117},[1062,12195,10771],{"class":1202},[1062,12197,1199],{"class":1117},[1062,12199,10776],{"class":1537},[1062,12201,1534],{"class":1117},[1062,12203,1135],{"class":1127},[1062,12205,12206],{"class":1131},"Starting pre-deployment cache warming...",[1062,12208,1135],{"class":1127},[1062,12210,2855],{"class":1117},[1062,12212,12213],{"class":1064,"line":1366},[1062,12214,2573],{"class":1079},[1062,12216,12217],{"class":1064,"line":1384},[1062,12218,12219],{"class":1068},"        # Warm critical pages\n",[1062,12221,12222,12225,12227],{"class":1064,"line":1400},[1062,12223,12224],{"class":1079},"        critical_urls ",[1062,12226,2595],{"class":1117},[1062,12228,1179],{"class":1117},[1062,12230,12231,12233,12235,12237],{"class":1064,"line":1406},[1062,12232,1314],{"class":1127},[1062,12234,4501],{"class":1131},[1062,12236,1135],{"class":1127},[1062,12238,1164],{"class":1117},[1062,12240,12241,12243,12245,12247],{"class":1064,"line":1427},[1062,12242,1314],{"class":1127},[1062,12244,4487],{"class":1131},[1062,12246,1135],{"class":1127},[1062,12248,1164],{"class":1117},[1062,12250,12251,12253,12256,12258],{"class":1064,"line":1448},[1062,12252,1314],{"class":1127},[1062,12254,12255],{"class":1131},"/api/posts/",[1062,12257,1135],{"class":1127},[1062,12259,1164],{"class":1117},[1062,12261,12262,12264,12267,12269],{"class":1064,"line":1468},[1062,12263,1314],{"class":1127},[1062,12265,12266],{"class":1131},"/about/",[1062,12268,1135],{"class":1127},[1062,12270,1164],{"class":1117},[1062,12272,12273],{"class":1064,"line":1474},[1062,12274,4513],{"class":1117},[1062,12276,12277],{"class":1064,"line":1518},[1062,12278,2573],{"class":1079},[1062,12280,12281,12283,12286,12288,12291],{"class":1064,"line":1566},[1062,12282,8586],{"class":1075},[1062,12284,12285],{"class":1079}," url ",[1062,12287,4596],{"class":1075},[1062,12289,12290],{"class":1079}," critical_urls",[1062,12292,2458],{"class":1117},[1062,12294,12295,12297],{"class":1064,"line":1572},[1062,12296,8705],{"class":1075},[1062,12298,2458],{"class":1117},[1062,12300,12301,12304,12306,12308,12310,12312,12314,12316,12318,12320,12322,12324,12327,12330,12332,12334,12336],{"class":1064,"line":1578},[1062,12302,12303],{"class":1079},"                response ",[1062,12305,2595],{"class":1117},[1062,12307,2869],{"class":1079},[1062,12309,1199],{"class":1117},[1062,12311,1546],{"class":1537},[1062,12313,1534],{"class":1117},[1062,12315,4575],{"class":1185},[1062,12317,2258],{"class":1131},[1062,12319,1193],{"class":1192},[1062,12321,3980],{"class":1537},[1062,12323,1199],{"class":1117},[1062,12325,12326],{"class":3985},"DOMAIN",[1062,12328,12329],{"class":1192},"}{",[1062,12331,2879],{"class":1537},[1062,12333,1219],{"class":1192},[1062,12335,1489],{"class":1131},[1062,12337,2855],{"class":1117},[1062,12339,12340,12342,12344,12346,12349,12351,12354],{"class":1064,"line":1584},[1062,12341,10967],{"class":1075},[1062,12343,2927],{"class":1079},[1062,12345,1199],{"class":1117},[1062,12347,12348],{"class":1202},"status_code",[1062,12350,10753],{"class":2594},[1062,12352,12353],{"class":1360}," 200",[1062,12355,2458],{"class":1117},[1062,12357,12358,12360,12362,12364,12366,12368,12370,12372,12375,12377,12379,12381,12383],{"class":1064,"line":1598},[1062,12359,10995],{"class":1113},[1062,12361,1199],{"class":1117},[1062,12363,10771],{"class":1202},[1062,12365,1199],{"class":1117},[1062,12367,10776],{"class":1537},[1062,12369,1534],{"class":1117},[1062,12371,4575],{"class":1185},[1062,12373,12374],{"class":1131},"\"Warmed: ",[1062,12376,1193],{"class":1192},[1062,12378,2879],{"class":1537},[1062,12380,1219],{"class":1192},[1062,12382,1489],{"class":1131},[1062,12384,2855],{"class":1117},[1062,12386,12387,12389],{"class":1064,"line":1617},[1062,12388,11031],{"class":1075},[1062,12390,2458],{"class":1117},[1062,12392,12393,12395,12397,12399,12401,12403,12405,12407,12410,12412,12414,12416,12418,12420,12423,12425,12427,12429,12432],{"class":1064,"line":1658},[1062,12394,10995],{"class":1113},[1062,12396,1199],{"class":1117},[1062,12398,10771],{"class":1202},[1062,12400,1199],{"class":1117},[1062,12402,10776],{"class":1537},[1062,12404,1534],{"class":1117},[1062,12406,4575],{"class":1185},[1062,12408,12409],{"class":1131},"\"Failed to warm: ",[1062,12411,1193],{"class":1192},[1062,12413,2879],{"class":1537},[1062,12415,1219],{"class":1192},[1062,12417,9314],{"class":1131},[1062,12419,1193],{"class":1192},[1062,12421,12422],{"class":1537},"response",[1062,12424,1199],{"class":1117},[1062,12426,12348],{"class":1202},[1062,12428,1219],{"class":1192},[1062,12430,12431],{"class":1131},")\"",[1062,12433,2855],{"class":1117},[1062,12435,12436,12438,12440,12442,12444],{"class":1064,"line":1671},[1062,12437,8753],{"class":1075},[1062,12439,4841],{"class":1530},[1062,12441,4844],{"class":1075},[1062,12443,4847],{"class":1079},[1062,12445,2458],{"class":1117},[1062,12447,12448,12450,12452,12454,12456,12458,12460,12462,12465,12467,12469,12471,12473,12475,12477,12479,12481],{"class":1064,"line":1691},[1062,12449,11499],{"class":1113},[1062,12451,1199],{"class":1117},[1062,12453,10771],{"class":1202},[1062,12455,1199],{"class":1117},[1062,12457,10776],{"class":1537},[1062,12459,1534],{"class":1117},[1062,12461,4575],{"class":1185},[1062,12463,12464],{"class":1131},"\"Error warming ",[1062,12466,1193],{"class":1192},[1062,12468,2879],{"class":1537},[1062,12470,1219],{"class":1192},[1062,12472,8786],{"class":1131},[1062,12474,1193],{"class":1192},[1062,12476,4907],{"class":1537},[1062,12478,1219],{"class":1192},[1062,12480,1489],{"class":1131},[1062,12482,2855],{"class":1117},[1062,12484,12485],{"class":1064,"line":1704},[1062,12486,1575],{"class":1079},[1062,12488,12489,12491,12494,12496,12498],{"class":1064,"line":1720},[1062,12490,2480],{"class":1185},[1062,12492,12493],{"class":2580}," deployment_cache_strategy",[1062,12495,1534],{"class":1117},[1062,12497,2490],{"class":2489},[1062,12499,2493],{"class":1117},[1062,12501,12502,12504,12507],{"class":1064,"line":1735},[1062,12503,2624],{"class":2463},[1062,12505,12506],{"class":2467},"Execute cache strategy during deployment.",[1062,12508,2471],{"class":2463},[1062,12510,12511],{"class":1064,"line":1740},[1062,12512,12513],{"class":1068},"        # 1. Increment cache version to invalidate old cache\n",[1062,12515,12516,12518,12520,12523],{"class":1064,"line":1745},[1062,12517,2498],{"class":1113},[1062,12519,1199],{"class":1117},[1062,12521,12522],{"class":1537},"increment_cache_version",[1062,12524,2915],{"class":1117},[1062,12526,12527],{"class":1064,"line":1765},[1062,12528,2573],{"class":1079},[1062,12530,12531],{"class":1064,"line":1770},[1062,12532,12533],{"class":1068},"        # 2. Clear specific cache patterns\n",[1062,12535,12536,12538,12540,12543],{"class":1064,"line":1775},[1062,12537,2498],{"class":1113},[1062,12539,1199],{"class":1117},[1062,12541,12542],{"class":1537},"clear_deployment_cache",[1062,12544,2915],{"class":1117},[1062,12546,12547],{"class":1064,"line":1781},[1062,12548,2573],{"class":1079},[1062,12550,12551],{"class":1064,"line":1795},[1062,12552,12553],{"class":1068},"        # 3. Warm critical cache entries\n",[1062,12555,12556,12558,12560,12563],{"class":1064,"line":1814},[1062,12557,2498],{"class":1113},[1062,12559,1199],{"class":1117},[1062,12561,12562],{"class":1537},"warm_critical_cache",[1062,12564,2915],{"class":1117},[1062,12566,12567],{"class":1064,"line":1855},[1062,12568,2573],{"class":1079},[1062,12570,12571],{"class":1064,"line":1868},[1062,12572,12573],{"class":1068},"        # 4. Update CDN cache\n",[1062,12575,12576,12578,12580,12583],{"class":1064,"line":1887},[1062,12577,2498],{"class":1113},[1062,12579,1199],{"class":1117},[1062,12581,12582],{"class":1537},"update_cdn_cache",[1062,12584,2915],{"class":1117},[1062,12586,12587],{"class":1064,"line":1892},[1062,12588,1575],{"class":1079},[1062,12590,12591,12593,12596,12598,12600],{"class":1064,"line":1911},[1062,12592,2480],{"class":1185},[1062,12594,12595],{"class":2580}," increment_cache_version",[1062,12597,1534],{"class":1117},[1062,12599,2490],{"class":2489},[1062,12601,2493],{"class":1117},[1062,12603,12604,12606,12609],{"class":1064,"line":1916},[1062,12605,2624],{"class":2463},[1062,12607,12608],{"class":2467},"Increment cache version for cache invalidation.",[1062,12610,2471],{"class":2463},[1062,12612,12613,12616,12618,12620,12622,12624,12626,12628],{"class":1064,"line":1921},[1062,12614,12615],{"class":1075},"        from",[1062,12617,2411],{"class":1079},[1062,12619,1199],{"class":1117},[1062,12621,2432],{"class":1079},[1062,12623,1199],{"class":1117},[1062,12625,2437],{"class":1079},[1062,12627,1076],{"class":1075},[1062,12629,2442],{"class":1079},[1062,12631,12632],{"class":1064,"line":1927},[1062,12633,2573],{"class":1079},[1062,12635,12636,12639,12641,12643,12645,12647,12649,12651,12654,12656,12658,12660],{"class":1064,"line":1941},[1062,12637,12638],{"class":1079},"        current_version ",[1062,12640,2595],{"class":1117},[1062,12642,7653],{"class":1079},[1062,12644,1199],{"class":1117},[1062,12646,1546],{"class":1537},[1062,12648,1534],{"class":1117},[1062,12650,1135],{"class":1127},[1062,12652,12653],{"class":1131},"cache_version",[1062,12655,1135],{"class":1127},[1062,12657,1462],{"class":1117},[1062,12659,1560],{"class":1360},[1062,12661,2855],{"class":1117},[1062,12663,12664,12667,12669,12672,12674],{"class":1064,"line":1961},[1062,12665,12666],{"class":1079},"        new_version ",[1062,12668,2595],{"class":1117},[1062,12670,12671],{"class":1079}," current_version ",[1062,12673,9291],{"class":2594},[1062,12675,12676],{"class":1360}," 1\n",[1062,12678,12679],{"class":1064,"line":1981},[1062,12680,2573],{"class":1079},[1062,12682,12683,12685,12687,12689,12691,12693,12695,12697,12699,12702,12704,12706,12708,12710],{"class":1064,"line":2000},[1062,12684,7996],{"class":1079},[1062,12686,1199],{"class":1117},[1062,12688,4803],{"class":1537},[1062,12690,1534],{"class":1117},[1062,12692,1135],{"class":1127},[1062,12694,12653],{"class":1131},[1062,12696,1135],{"class":1127},[1062,12698,1462],{"class":1117},[1062,12700,12701],{"class":1537}," new_version",[1062,12703,1462],{"class":1117},[1062,12705,6489],{"class":2884},[1062,12707,2595],{"class":1117},[1062,12709,2598],{"class":1378},[1062,12711,2855],{"class":1117},[1062,12713,12714],{"class":1064,"line":2013},[1062,12715,2573],{"class":1079},[1062,12717,12718,12720,12722,12724,12726,12728,12730,12732,12735,12737,12740,12742,12745,12747,12750,12752,12754],{"class":1064,"line":2030},[1062,12719,2498],{"class":1113},[1062,12721,1199],{"class":1117},[1062,12723,10771],{"class":1202},[1062,12725,1199],{"class":1117},[1062,12727,10776],{"class":1537},[1062,12729,1534],{"class":1117},[1062,12731,4575],{"class":1185},[1062,12733,12734],{"class":1131},"'Cache version incremented: ",[1062,12736,1193],{"class":1192},[1062,12738,12739],{"class":1537},"current_version",[1062,12741,1219],{"class":1192},[1062,12743,12744],{"class":1131}," -> ",[1062,12746,1193],{"class":1192},[1062,12748,12749],{"class":1537},"new_version",[1062,12751,1219],{"class":1192},[1062,12753,1135],{"class":1131},[1062,12755,2855],{"class":1117},[1062,12757,12758],{"class":1064,"line":2047},[1062,12759,1575],{"class":1079},[1062,12761,12762,12764,12767,12769,12771],{"class":1064,"line":2053},[1062,12763,2480],{"class":1185},[1062,12765,12766],{"class":2580}," clear_deployment_cache",[1062,12768,1534],{"class":1117},[1062,12770,2490],{"class":2489},[1062,12772,2493],{"class":1117},[1062,12774,12775,12777,12780],{"class":1064,"line":2059},[1062,12776,2624],{"class":2463},[1062,12778,12779],{"class":2467},"Clear cache entries that should be refreshed on deployment.",[1062,12781,2471],{"class":2463},[1062,12783,12784,12786,12788,12790,12792,12794,12796,12798],{"class":1064,"line":2065},[1062,12785,12615],{"class":1075},[1062,12787,2411],{"class":1079},[1062,12789,1199],{"class":1117},[1062,12791,2432],{"class":1079},[1062,12793,1199],{"class":1117},[1062,12795,2437],{"class":1079},[1062,12797,1076],{"class":1075},[1062,12799,2442],{"class":1079},[1062,12801,12802],{"class":1064,"line":2070},[1062,12803,2573],{"class":1079},[1062,12805,12806],{"class":1064,"line":2076},[1062,12807,12808],{"class":1068},"        # Clear template fragment cache\n",[1062,12810,12811,12814,12816],{"class":1064,"line":2092},[1062,12812,12813],{"class":1079},"        patterns_to_clear ",[1062,12815,2595],{"class":1117},[1062,12817,1179],{"class":1117},[1062,12819,12820,12822,12825,12827],{"class":1064,"line":2106},[1062,12821,1314],{"class":1127},[1062,12823,12824],{"class":1131},"template.cache.*",[1062,12826,1135],{"class":1127},[1062,12828,1164],{"class":1117},[1062,12830,12831,12833,12836,12838],{"class":1064,"line":2118},[1062,12832,1314],{"class":1127},[1062,12834,12835],{"class":1131},"view_cache.*",[1062,12837,1135],{"class":1127},[1062,12839,1164],{"class":1117},[1062,12841,12842,12844,12847,12849],{"class":1064,"line":2123},[1062,12843,1314],{"class":1127},[1062,12845,12846],{"class":1131},"api_cache.*",[1062,12848,1135],{"class":1127},[1062,12850,1164],{"class":1117},[1062,12852,12853],{"class":1064,"line":2129},[1062,12854,4513],{"class":1117},[1062,12856,12857],{"class":1064,"line":2143},[1062,12858,2573],{"class":1079},[1062,12860,12861],{"class":1064,"line":2155},[1062,12862,12863],{"class":1068},"        # Redis-specific cache clearing\n",[1062,12865,12866,12868],{"class":1064,"line":2190},[1062,12867,4769],{"class":1075},[1062,12869,2458],{"class":1117},[1062,12871,12872,12875,12877,12879],{"class":1064,"line":2195},[1062,12873,12874],{"class":1075},"            from",[1062,12876,8977],{"class":1079},[1062,12878,1076],{"class":1075},[1062,12880,8982],{"class":1079},[1062,12882,12883,12886,12888,12890,12892,12894,12896,12898],{"class":1064,"line":2201},[1062,12884,12885],{"class":1079},"            redis_conn ",[1062,12887,2595],{"class":1117},[1062,12889,8992],{"class":1537},[1062,12891,1534],{"class":1117},[1062,12893,1489],{"class":1127},[1062,12895,1132],{"class":1131},[1062,12897,1489],{"class":1127},[1062,12899,2855],{"class":1117},[1062,12901,12902],{"class":1064,"line":2212},[1062,12903,11451],{"class":1079},[1062,12905,12906,12909,12911,12913,12916],{"class":1064,"line":2222},[1062,12907,12908],{"class":1075},"            for",[1062,12910,4593],{"class":1079},[1062,12912,4596],{"class":1075},[1062,12914,12915],{"class":1079}," patterns_to_clear",[1062,12917,2458],{"class":1117},[1062,12919,12920,12923,12925,12927,12929,12932,12934,12936],{"class":1064,"line":2227},[1062,12921,12922],{"class":1079},"                keys ",[1062,12924,2595],{"class":1117},[1062,12926,9013],{"class":1079},[1062,12928,1199],{"class":1117},[1062,12930,12931],{"class":1537},"keys",[1062,12933,1534],{"class":1117},[1062,12935,4583],{"class":1537},[1062,12937,2855],{"class":1117},[1062,12939,12940,12942,12945],{"class":1064,"line":2233},[1062,12941,10967],{"class":1075},[1062,12943,12944],{"class":1079}," keys",[1062,12946,2458],{"class":1117},[1062,12948,12949,12952,12954,12956,12958,12960,12962],{"class":1064,"line":2248},[1062,12950,12951],{"class":1079},"                    redis_conn",[1062,12953,1199],{"class":1117},[1062,12955,7152],{"class":1537},[1062,12957,1534],{"class":1117},[1062,12959,9325],{"class":2594},[1062,12961,12931],{"class":1537},[1062,12963,2855],{"class":1117},[1062,12965,12966,12968,12970,12972,12974,12976,12978,12980,12983,12985,12988,12990,12992,12994,12996,12999,13001,13003,13005,13007],{"class":1064,"line":2285},[1062,12967,10995],{"class":1113},[1062,12969,1199],{"class":1117},[1062,12971,10771],{"class":1202},[1062,12973,1199],{"class":1117},[1062,12975,10776],{"class":1537},[1062,12977,1534],{"class":1117},[1062,12979,4575],{"class":1185},[1062,12981,12982],{"class":1131},"'Cleared ",[1062,12984,1193],{"class":1192},[1062,12986,12987],{"class":2483},"len",[1062,12989,1534],{"class":1117},[1062,12991,12931],{"class":1537},[1062,12993,8192],{"class":1117},[1062,12995,1219],{"class":1192},[1062,12997,12998],{"class":1131}," keys matching ",[1062,13000,1193],{"class":1192},[1062,13002,4583],{"class":1537},[1062,13004,1219],{"class":1192},[1062,13006,1135],{"class":1131},[1062,13008,2855],{"class":1117},[1062,13010,13011],{"class":1064,"line":2290},[1062,13012,2573],{"class":1079},[1062,13014,13015,13017,13020],{"class":1064,"line":2296},[1062,13016,4838],{"class":1075},[1062,13018,13019],{"class":1530}," ImportError",[1062,13021,2458],{"class":1117},[1062,13023,13024],{"class":1064,"line":2311},[1062,13025,13026],{"class":1068},"            # Fallback for non-Redis backends\n",[1062,13028,13029,13031,13033,13036],{"class":1064,"line":2337},[1062,13030,4798],{"class":1079},[1062,13032,1199],{"class":1117},[1062,13034,13035],{"class":1537},"clear",[1062,13037,2915],{"class":1117},[1062,13039,13040,13042,13044,13046,13048,13050,13052,13054,13057,13059],{"class":1064,"line":2347},[1062,13041,7112],{"class":1113},[1062,13043,1199],{"class":1117},[1062,13045,10771],{"class":1202},[1062,13047,1199],{"class":1117},[1062,13049,10776],{"class":1537},[1062,13051,1534],{"class":1117},[1062,13053,1135],{"class":1127},[1062,13055,13056],{"class":1131},"Cleared entire cache (non-Redis backend)",[1062,13058,1135],{"class":1127},[1062,13060,2855],{"class":1117},[1062,13062,13063],{"class":1064,"line":2371},[1062,13064,1575],{"class":1079},[1062,13066,13067,13069,13072,13074,13076],{"class":1064,"line":3629},[1062,13068,2480],{"class":1185},[1062,13070,13071],{"class":2580}," warm_critical_cache",[1062,13073,1534],{"class":1117},[1062,13075,2490],{"class":2489},[1062,13077,2493],{"class":1117},[1062,13079,13080,13082,13085],{"class":1064,"line":3649},[1062,13081,2624],{"class":2463},[1062,13083,13084],{"class":2467},"Warm critical cache entries after deployment.",[1062,13086,2471],{"class":2463},[1062,13088,13089],{"class":1064,"line":3659},[1062,13090,13091],{"class":1068},"        # Import here to avoid circular imports\n",[1062,13093,13094,13096,13098,13100,13102,13104,13107,13109],{"class":1064,"line":3695},[1062,13095,12615],{"class":1075},[1062,13097,2411],{"class":1079},[1062,13099,1199],{"class":1117},[1062,13101,2432],{"class":1079},[1062,13103,1199],{"class":1117},[1062,13105,13106],{"class":1079},"management ",[1062,13108,1076],{"class":1075},[1062,13110,13111],{"class":1079}," call_command\n",[1062,13113,13114],{"class":1064,"line":3700},[1062,13115,2573],{"class":1079},[1062,13117,13118,13120],{"class":1064,"line":3706},[1062,13119,4769],{"class":1075},[1062,13121,2458],{"class":1117},[1062,13123,13124,13127,13129,13131,13134,13136,13138,13140,13143,13145],{"class":1064,"line":3720},[1062,13125,13126],{"class":1537},"            call_command",[1062,13128,1534],{"class":1117},[1062,13130,1135],{"class":1127},[1062,13132,13133],{"class":1131},"warm_cache",[1062,13135,1135],{"class":1127},[1062,13137,1462],{"class":1117},[1062,13139,1156],{"class":1127},[1062,13141,13142],{"class":1131},"--critical-only",[1062,13144,1135],{"class":1127},[1062,13146,2855],{"class":1117},[1062,13148,13149,13151,13153,13155,13157,13159,13161,13163,13166,13168],{"class":1064,"line":3744},[1062,13150,7112],{"class":1113},[1062,13152,1199],{"class":1117},[1062,13154,10771],{"class":1202},[1062,13156,1199],{"class":1117},[1062,13158,10776],{"class":1537},[1062,13160,1534],{"class":1117},[1062,13162,1135],{"class":1127},[1062,13164,13165],{"class":1131},"Critical cache warming completed",[1062,13167,1135],{"class":1127},[1062,13169,2855],{"class":1117},[1062,13171,13172,13174,13176,13178,13180],{"class":1064,"line":3771},[1062,13173,4838],{"class":1075},[1062,13175,4841],{"class":1530},[1062,13177,4844],{"class":1075},[1062,13179,4847],{"class":1079},[1062,13181,2458],{"class":1117},[1062,13183,13184,13186,13188,13190,13192,13194,13196,13198,13201,13203,13205,13207,13209],{"class":1064,"line":3798},[1062,13185,7112],{"class":1113},[1062,13187,1199],{"class":1117},[1062,13189,10771],{"class":1202},[1062,13191,1199],{"class":1117},[1062,13193,10776],{"class":1537},[1062,13195,1534],{"class":1117},[1062,13197,4575],{"class":1185},[1062,13199,13200],{"class":1131},"'Cache warming failed: ",[1062,13202,1193],{"class":1192},[1062,13204,4907],{"class":1537},[1062,13206,1219],{"class":1192},[1062,13208,1135],{"class":1131},[1062,13210,2855],{"class":1117},[1062,13212,13213],{"class":1064,"line":3804},[1062,13214,1575],{"class":1079},[1062,13216,13217,13219,13222,13224,13226],{"class":1064,"line":3809},[1062,13218,2480],{"class":1185},[1062,13220,13221],{"class":2580}," update_cdn_cache",[1062,13223,1534],{"class":1117},[1062,13225,2490],{"class":2489},[1062,13227,2493],{"class":1117},[1062,13229,13230,13232,13235],{"class":1064,"line":3832},[1062,13231,2624],{"class":2463},[1062,13233,13234],{"class":2467},"Update CDN cache after deployment.",[1062,13236,2471],{"class":2463},[1062,13238,13239,13241],{"class":1064,"line":5408},[1062,13240,4769],{"class":1075},[1062,13242,2458],{"class":1117},[1062,13244,13245],{"class":1064,"line":5414},[1062,13246,13247],{"class":1068},"            # Purge CDN cache for updated assets\n",[1062,13249,13250,13252,13255,13257,13260,13262],{"class":1064,"line":5420},[1062,13251,12874],{"class":1075},[1062,13253,13254],{"class":1079}," utils",[1062,13256,1199],{"class":1117},[1062,13258,13259],{"class":1079},"cdn ",[1062,13261,1076],{"class":1075},[1062,13263,13264],{"class":1079}," CloudFlareCache\n",[1062,13266,13267],{"class":1064,"line":5426},[1062,13268,11451],{"class":1079},[1062,13270,13271,13274,13276,13278],{"class":1064,"line":5432},[1062,13272,13273],{"class":1079},"            cf_cache ",[1062,13275,2595],{"class":1117},[1062,13277,2455],{"class":1537},[1062,13279,2915],{"class":1117},[1062,13281,13282],{"class":1064,"line":5437},[1062,13283,11451],{"class":1079},[1062,13285,13286],{"class":1064,"line":5443},[1062,13287,13288],{"class":1068},"            # Purge static files\n",[1062,13290,13291,13294,13296,13298,13300,13302,13304,13306,13309,13311],{"class":1064,"line":5449},[1062,13292,13293],{"class":1079},"            cf_cache",[1062,13295,1199],{"class":1117},[1062,13297,2977],{"class":1537},[1062,13299,1534],{"class":1117},[1062,13301,2820],{"class":2884},[1062,13303,2985],{"class":1117},[1062,13305,1135],{"class":1127},[1062,13307,13308],{"class":1131},"static-assets",[1062,13310,1135],{"class":1127},[1062,13312,2990],{"class":1117},[1062,13314,13315],{"class":1064,"line":5454},[1062,13316,11451],{"class":1079},[1062,13318,13319],{"class":1064,"line":5459},[1062,13320,13321],{"class":1068},"            # Purge main pages\n",[1062,13323,13324,13326,13328,13330,13332,13334],{"class":1064,"line":5464},[1062,13325,13293],{"class":1079},[1062,13327,1199],{"class":1117},[1062,13329,2977],{"class":1537},[1062,13331,1534],{"class":1117},[1062,13333,2982],{"class":2884},[1062,13335,13336],{"class":1117},"=[\n",[1062,13338,13339,13342,13344,13346,13348,13350,13352,13354,13357],{"class":1064,"line":5469},[1062,13340,13341],{"class":1185},"                f",[1062,13343,2258],{"class":1131},[1062,13345,1193],{"class":1192},[1062,13347,3980],{"class":1537},[1062,13349,1199],{"class":1117},[1062,13351,12326],{"class":3985},[1062,13353,1219],{"class":1192},[1062,13355,13356],{"class":1131},"/\"",[1062,13358,1164],{"class":1117},[1062,13360,13361,13363,13365,13367,13369,13371,13373,13375,13378],{"class":1064,"line":5474},[1062,13362,13341],{"class":1185},[1062,13364,2258],{"class":1131},[1062,13366,1193],{"class":1192},[1062,13368,3980],{"class":1537},[1062,13370,1199],{"class":1117},[1062,13372,12326],{"class":3985},[1062,13374,1219],{"class":1192},[1062,13376,13377],{"class":1131},"/blog/\"",[1062,13379,1164],{"class":1117},[1062,13381,13382],{"class":1064,"line":5479},[1062,13383,13384],{"class":1117},"            ])\n",[1062,13386,13387],{"class":1064,"line":5484},[1062,13388,11451],{"class":1079},[1062,13390,13391,13393,13395,13397,13399,13401,13403,13405,13408,13410],{"class":1064,"line":5489},[1062,13392,7112],{"class":1113},[1062,13394,1199],{"class":1117},[1062,13396,10771],{"class":1202},[1062,13398,1199],{"class":1117},[1062,13400,10776],{"class":1537},[1062,13402,1534],{"class":1117},[1062,13404,1135],{"class":1127},[1062,13406,13407],{"class":1131},"CDN cache purged successfully",[1062,13409,1135],{"class":1127},[1062,13411,2855],{"class":1117},[1062,13413,13414],{"class":1064,"line":5494},[1062,13415,2573],{"class":1079},[1062,13417,13418,13420,13422,13424,13426],{"class":1064,"line":5500},[1062,13419,4838],{"class":1075},[1062,13421,4841],{"class":1530},[1062,13423,4844],{"class":1075},[1062,13425,4847],{"class":1079},[1062,13427,2458],{"class":1117},[1062,13429,13430,13432,13434,13436,13438,13440,13442,13444,13447,13449,13451,13453,13455],{"class":1064,"line":5506},[1062,13431,7112],{"class":1113},[1062,13433,1199],{"class":1117},[1062,13435,10771],{"class":1202},[1062,13437,1199],{"class":1117},[1062,13439,10776],{"class":1537},[1062,13441,1534],{"class":1117},[1062,13443,4575],{"class":1185},[1062,13445,13446],{"class":1131},"'CDN cache purge failed: ",[1062,13448,1193],{"class":1192},[1062,13450,4907],{"class":1537},[1062,13452,1219],{"class":1192},[1062,13454,1135],{"class":1131},[1062,13456,2855],{"class":1117},[1062,13458,13459],{"class":1064,"line":5512},[1062,13460,1575],{"class":1079},[1062,13462,13463,13465,13468,13470,13472],{"class":1064,"line":5518},[1062,13464,2480],{"class":1185},[1062,13466,13467],{"class":2580}," post_deployment_verification",[1062,13469,1534],{"class":1117},[1062,13471,2490],{"class":2489},[1062,13473,2493],{"class":1117},[1062,13475,13476,13478,13481],{"class":1064,"line":5524},[1062,13477,2624],{"class":2463},[1062,13479,13480],{"class":2467},"Verify cache is working correctly after deployment.",[1062,13482,2471],{"class":2463},[1062,13484,13485,13488,13490],{"class":1064,"line":5530},[1062,13486,13487],{"class":1079},"        verification_urls ",[1062,13489,2595],{"class":1117},[1062,13491,1179],{"class":1117},[1062,13493,13494,13497,13499,13501,13503,13505,13507,13510,13512],{"class":1064,"line":5536},[1062,13495,13496],{"class":1117},"            (",[1062,13498,1135],{"class":1127},[1062,13500,4501],{"class":1131},[1062,13502,1135],{"class":1127},[1062,13504,1462],{"class":1117},[1062,13506,1156],{"class":1127},[1062,13508,13509],{"class":1131},"Home page",[1062,13511,1135],{"class":1127},[1062,13513,4190],{"class":1117},[1062,13515,13516,13518,13520,13522,13524,13526,13528,13531,13533],{"class":1064,"line":5541},[1062,13517,13496],{"class":1117},[1062,13519,1135],{"class":1127},[1062,13521,4487],{"class":1131},[1062,13523,1135],{"class":1127},[1062,13525,1462],{"class":1117},[1062,13527,1156],{"class":1127},[1062,13529,13530],{"class":1131},"Blog list",[1062,13532,1135],{"class":1127},[1062,13534,4190],{"class":1117},[1062,13536,13537,13539,13541,13544,13546,13548,13550,13553,13555],{"class":1064,"line":5546},[1062,13538,13496],{"class":1117},[1062,13540,1135],{"class":1127},[1062,13542,13543],{"class":1131},"/api/health/",[1062,13545,1135],{"class":1127},[1062,13547,1462],{"class":1117},[1062,13549,1156],{"class":1127},[1062,13551,13552],{"class":1131},"Health check",[1062,13554,1135],{"class":1127},[1062,13556,4190],{"class":1117},[1062,13558,13559],{"class":1064,"line":5552},[1062,13560,4513],{"class":1117},[1062,13562,13563],{"class":1064,"line":5558},[1062,13564,2573],{"class":1079},[1062,13566,13567,13569,13571,13573,13576,13578,13581],{"class":1064,"line":5563},[1062,13568,8586],{"class":1075},[1062,13570,2954],{"class":1079},[1062,13572,1462],{"class":1117},[1062,13574,13575],{"class":1079}," description ",[1062,13577,4596],{"class":1075},[1062,13579,13580],{"class":1079}," verification_urls",[1062,13582,2458],{"class":1117},[1062,13584,13585,13587],{"class":1064,"line":5568},[1062,13586,8705],{"class":1075},[1062,13588,2458],{"class":1117},[1062,13590,13591],{"class":1064,"line":5574},[1062,13592,13593],{"class":1068},"                # First request (should be cache miss)\n",[1062,13595,13596,13599,13601,13603,13605,13607],{"class":1064,"line":5579},[1062,13597,13598],{"class":1079},"                start_time ",[1062,13600,2595],{"class":1117},[1062,13602,9983],{"class":1079},[1062,13604,1199],{"class":1117},[1062,13606,4235],{"class":1537},[1062,13608,2915],{"class":1117},[1062,13610,13611,13614,13616,13618,13620,13622,13624,13626,13628,13630,13632,13634,13636,13638,13640,13642,13644],{"class":1064,"line":5584},[1062,13612,13613],{"class":1079},"                response1 ",[1062,13615,2595],{"class":1117},[1062,13617,2869],{"class":1079},[1062,13619,1199],{"class":1117},[1062,13621,1546],{"class":1537},[1062,13623,1534],{"class":1117},[1062,13625,4575],{"class":1185},[1062,13627,2258],{"class":1131},[1062,13629,1193],{"class":1192},[1062,13631,3980],{"class":1537},[1062,13633,1199],{"class":1117},[1062,13635,12326],{"class":3985},[1062,13637,12329],{"class":1192},[1062,13639,2879],{"class":1537},[1062,13641,1219],{"class":1192},[1062,13643,1489],{"class":1131},[1062,13645,2855],{"class":1117},[1062,13647,13648,13651,13653,13655,13657,13659,13661,13663],{"class":1064,"line":5590},[1062,13649,13650],{"class":1079},"                first_time ",[1062,13652,2595],{"class":1117},[1062,13654,9983],{"class":1079},[1062,13656,1199],{"class":1117},[1062,13658,4235],{"class":1537},[1062,13660,6652],{"class":1117},[1062,13662,10030],{"class":2594},[1062,13664,10033],{"class":1079},[1062,13666,13667],{"class":1064,"line":5596},[1062,13668,9003],{"class":1079},[1062,13670,13671],{"class":1064,"line":5602},[1062,13672,13673],{"class":1068},"                # Second request (should be cache hit)\n",[1062,13675,13676,13678,13680,13682,13684,13686],{"class":1064,"line":5608},[1062,13677,13598],{"class":1079},[1062,13679,2595],{"class":1117},[1062,13681,9983],{"class":1079},[1062,13683,1199],{"class":1117},[1062,13685,4235],{"class":1537},[1062,13687,2915],{"class":1117},[1062,13689,13690,13693,13695,13697,13699,13701,13703,13705,13707,13709,13711,13713,13715,13717,13719,13721,13723],{"class":1064,"line":5614},[1062,13691,13692],{"class":1079},"                response2 ",[1062,13694,2595],{"class":1117},[1062,13696,2869],{"class":1079},[1062,13698,1199],{"class":1117},[1062,13700,1546],{"class":1537},[1062,13702,1534],{"class":1117},[1062,13704,4575],{"class":1185},[1062,13706,2258],{"class":1131},[1062,13708,1193],{"class":1192},[1062,13710,3980],{"class":1537},[1062,13712,1199],{"class":1117},[1062,13714,12326],{"class":3985},[1062,13716,12329],{"class":1192},[1062,13718,2879],{"class":1537},[1062,13720,1219],{"class":1192},[1062,13722,1489],{"class":1131},[1062,13724,2855],{"class":1117},[1062,13726,13727,13730,13732,13734,13736,13738,13740,13742],{"class":1064,"line":5619},[1062,13728,13729],{"class":1079},"                second_time ",[1062,13731,2595],{"class":1117},[1062,13733,9983],{"class":1079},[1062,13735,1199],{"class":1117},[1062,13737,4235],{"class":1537},[1062,13739,6652],{"class":1117},[1062,13741,10030],{"class":2594},[1062,13743,10033],{"class":1079},[1062,13745,13746],{"class":1064,"line":5625},[1062,13747,9003],{"class":1079},[1062,13749,13750,13752,13755,13757,13759,13761,13763,13766,13769,13771,13773,13775,13777],{"class":1064,"line":5630},[1062,13751,10967],{"class":1075},[1062,13753,13754],{"class":1079}," response1",[1062,13756,1199],{"class":1117},[1062,13758,12348],{"class":1202},[1062,13760,10753],{"class":2594},[1062,13762,12353],{"class":1360},[1062,13764,13765],{"class":2594}," and",[1062,13767,13768],{"class":1079}," response2",[1062,13770,1199],{"class":1117},[1062,13772,12348],{"class":1202},[1062,13774,10753],{"class":2594},[1062,13776,12353],{"class":1360},[1062,13778,2458],{"class":1117},[1062,13780,13781,13784,13786,13789,13792,13795,13798,13800,13802,13805,13807,13809],{"class":1064,"line":5635},[1062,13782,13783],{"class":1079},"                    cache_improvement ",[1062,13785,2595],{"class":1117},[1062,13787,13788],{"class":1117}," ((",[1062,13790,13791],{"class":1079},"first_time ",[1062,13793,13794],{"class":2594},"-",[1062,13796,13797],{"class":1079}," second_time",[1062,13799,8192],{"class":1117},[1062,13801,10179],{"class":2594},[1062,13803,13804],{"class":1079}," first_time",[1062,13806,8192],{"class":1117},[1062,13808,10576],{"class":2594},[1062,13810,13811],{"class":1360}," 100\n",[1062,13813,13814,13816,13818,13820,13822,13824],{"class":1064,"line":5640},[1062,13815,10995],{"class":1113},[1062,13817,1199],{"class":1117},[1062,13819,10771],{"class":1202},[1062,13821,1199],{"class":1117},[1062,13823,10776],{"class":1537},[1062,13825,3959],{"class":1117},[1062,13827,13828,13831,13833,13835,13838,13840,13843,13845,13848,13850,13852],{"class":1064,"line":5646},[1062,13829,13830],{"class":1185},"                        f",[1062,13832,1489],{"class":1131},[1062,13834,1193],{"class":1192},[1062,13836,13837],{"class":1537},"description",[1062,13839,1219],{"class":1192},[1062,13841,13842],{"class":1131},": OK (Cache improvement: ",[1062,13844,1193],{"class":1192},[1062,13846,13847],{"class":1537},"cache_improvement",[1062,13849,11877],{"class":1185},[1062,13851,1219],{"class":1192},[1062,13853,13854],{"class":1131},"%)\"\n",[1062,13856,13857],{"class":1064,"line":5651},[1062,13858,13859],{"class":1117},"                    )\n",[1062,13861,13862,13864],{"class":1064,"line":5657},[1062,13863,11031],{"class":1075},[1062,13865,2458],{"class":1117},[1062,13867,13868,13870,13872,13874,13876,13878,13880,13882,13884,13886,13888,13890,13893],{"class":1064,"line":5662},[1062,13869,10995],{"class":1113},[1062,13871,1199],{"class":1117},[1062,13873,10771],{"class":1202},[1062,13875,1199],{"class":1117},[1062,13877,10776],{"class":1537},[1062,13879,1534],{"class":1117},[1062,13881,4575],{"class":1185},[1062,13883,1489],{"class":1131},[1062,13885,1193],{"class":1192},[1062,13887,13837],{"class":1537},[1062,13889,1219],{"class":1192},[1062,13891,13892],{"class":1131},": FAILED\"",[1062,13894,2855],{"class":1117},[1062,13896,13897],{"class":1064,"line":5667},[1062,13898,11451],{"class":1079},[1062,13900,13901,13903,13905,13907,13909],{"class":1064,"line":5673},[1062,13902,8753],{"class":1075},[1062,13904,4841],{"class":1530},[1062,13906,4844],{"class":1075},[1062,13908,4847],{"class":1079},[1062,13910,2458],{"class":1117},[1062,13912,13913,13915,13917,13919,13921,13923,13925,13927,13929,13931,13933,13935,13938,13940,13942,13944,13946],{"class":1064,"line":5679},[1062,13914,11499],{"class":1113},[1062,13916,1199],{"class":1117},[1062,13918,10771],{"class":1202},[1062,13920,1199],{"class":1117},[1062,13922,10776],{"class":1537},[1062,13924,1534],{"class":1117},[1062,13926,4575],{"class":1185},[1062,13928,1489],{"class":1131},[1062,13930,1193],{"class":1192},[1062,13932,13837],{"class":1537},[1062,13934,1219],{"class":1192},[1062,13936,13937],{"class":1131},": ERROR - ",[1062,13939,1193],{"class":1192},[1062,13941,4907],{"class":1537},[1062,13943,1219],{"class":1192},[1062,13945,1489],{"class":1131},[1062,13947,2855],{"class":1117},[1062,13949,13950],{"class":1064,"line":5684},[1062,13951,1101],{"emptyLinePlaceholder":1100},[1062,13953,13954],{"class":1064,"line":5690},[1062,13955,13956],{"class":1068},"# Management command for deployment\n",[1062,13958,13959,13961,13963,13965,13967],{"class":1064,"line":5696},[1062,13960,2451],{"class":1185},[1062,13962,10314],{"class":2454},[1062,13964,1534],{"class":1117},[1062,13966,10319],{"class":7270},[1062,13968,2493],{"class":1117},[1062,13970,13971,13973,13975,13977,13980],{"class":1064,"line":5702},[1062,13972,10326],{"class":2483},[1062,13974,1118],{"class":1117},[1062,13976,1156],{"class":1127},[1062,13978,13979],{"class":1131},"Manage cache during deployment",[1062,13981,2089],{"class":1127},[1062,13983,13984],{"class":1064,"line":5708},[1062,13985,1575],{"class":1079},[1062,13987,13988,13990,13992,13994,13996,13998,14000],{"class":1064,"line":5714},[1062,13989,2480],{"class":1185},[1062,13991,10346],{"class":2580},[1062,13993,1534],{"class":1117},[1062,13995,2490],{"class":2489},[1062,13997,1462],{"class":1117},[1062,13999,10355],{"class":2590},[1062,14001,2493],{"class":1117},[1062,14003,14004,14006,14008,14010],{"class":1064,"line":5720},[1062,14005,10362],{"class":1079},[1062,14007,1199],{"class":1117},[1062,14009,10367],{"class":1537},[1062,14011,3959],{"class":1117},[1062,14013,14014,14016,14019,14021],{"class":1064,"line":5725},[1062,14015,1314],{"class":1127},[1062,14017,14018],{"class":1131},"--phase",[1062,14020,1135],{"class":1127},[1062,14022,1164],{"class":1117},[1062,14024,14025,14027,14029,14031,14033,14035,14037,14039,14042,14044,14046,14048,14050,14052],{"class":1064,"line":5731},[1062,14026,10385],{"class":2884},[1062,14028,2985],{"class":1117},[1062,14030,1135],{"class":1127},[1062,14032,1040],{"class":1131},[1062,14034,1135],{"class":1127},[1062,14036,1462],{"class":1117},[1062,14038,1156],{"class":1127},[1062,14040,14041],{"class":1131},"deploy",[1062,14043,1135],{"class":1127},[1062,14045,1462],{"class":1117},[1062,14047,1156],{"class":1127},[1062,14049,2874],{"class":1131},[1062,14051,1135],{"class":1127},[1062,14053,8372],{"class":1117},[1062,14055,14056,14059,14061,14063],{"class":1064,"line":5737},[1062,14057,14058],{"class":2884},"            required",[1062,14060,2595],{"class":1117},[1062,14062,3577],{"class":1378},[1062,14064,1164],{"class":1117},[1062,14066,14067,14069,14071,14073,14076],{"class":1064,"line":10526},[1062,14068,10424],{"class":2884},[1062,14070,2595],{"class":1117},[1062,14072,1135],{"class":1127},[1062,14074,14075],{"class":1131},"Deployment phase",[1062,14077,2089],{"class":1127},[1062,14079,14080],{"class":1064,"line":10538},[1062,14081,4026],{"class":1117},[1062,14083,14084],{"class":1064,"line":10552},[1062,14085,1575],{"class":1079},[1062,14087,14088,14090,14092,14094,14096,14098,14100,14102,14104,14106,14108],{"class":1064,"line":10557},[1062,14089,2480],{"class":1185},[1062,14091,10567],{"class":2580},[1062,14093,1534],{"class":1117},[1062,14095,2490],{"class":2489},[1062,14097,1462],{"class":1117},[1062,14099,10576],{"class":2594},[1062,14101,10579],{"class":2590},[1062,14103,1462],{"class":1117},[1062,14105,4736],{"class":2594},[1062,14107,10586],{"class":2590},[1062,14109,2493],{"class":1117},[1062,14111,14112,14115,14117,14119],{"class":1064,"line":10562},[1062,14113,14114],{"class":1079},"        manager ",[1062,14116,2595],{"class":1117},[1062,14118,12098],{"class":1537},[1062,14120,2915],{"class":1117},[1062,14122,14123,14126,14128,14130,14132,14134,14136],{"class":1064,"line":10591},[1062,14124,14125],{"class":1079},"        manager",[1062,14127,1199],{"class":1117},[1062,14129,10771],{"class":1202},[1062,14131,1118],{"class":1117},[1062,14133,2972],{"class":1113},[1062,14135,1199],{"class":1117},[1062,14137,14138],{"class":1202},"stdout\n",[1062,14140,14141],{"class":1064,"line":10603},[1062,14142,2573],{"class":1079},[1062,14144,14145,14148,14150,14152,14154,14156,14159,14161],{"class":1064,"line":10608},[1062,14146,14147],{"class":1079},"        phase ",[1062,14149,2595],{"class":1117},[1062,14151,10613],{"class":1079},[1062,14153,1206],{"class":1117},[1062,14155,1135],{"class":1127},[1062,14157,14158],{"class":1131},"phase",[1062,14160,1135],{"class":1127},[1062,14162,2334],{"class":1117},[1062,14164,14165],{"class":1064,"line":10628},[1062,14166,2573],{"class":1079},[1062,14168,14169,14171,14174,14176,14178,14180,14182],{"class":1064,"line":10649},[1062,14170,2742],{"class":1075},[1062,14172,14173],{"class":1079}," phase ",[1062,14175,9750],{"class":2594},[1062,14177,1156],{"class":1127},[1062,14179,1040],{"class":1131},[1062,14181,1135],{"class":1127},[1062,14183,2458],{"class":1117},[1062,14185,14186,14189,14191,14194],{"class":1064,"line":10656},[1062,14187,14188],{"class":1079},"            manager",[1062,14190,1199],{"class":1117},[1062,14192,14193],{"class":1537},"pre_deployment_cache_warm",[1062,14195,2915],{"class":1117},[1062,14197,14198,14200,14202,14204,14206,14208,14210],{"class":1064,"line":10676},[1062,14199,2774],{"class":1075},[1062,14201,14173],{"class":1079},[1062,14203,9750],{"class":2594},[1062,14205,1156],{"class":1127},[1062,14207,14041],{"class":1131},[1062,14209,1135],{"class":1127},[1062,14211,2458],{"class":1117},[1062,14213,14214,14216,14218,14221],{"class":1064,"line":10681},[1062,14215,14188],{"class":1079},[1062,14217,1199],{"class":1117},[1062,14219,14220],{"class":1537},"deployment_cache_strategy",[1062,14222,2915],{"class":1117},[1062,14224,14225,14227,14229,14231,14233,14235,14237],{"class":1064,"line":10704},[1062,14226,2774],{"class":1075},[1062,14228,14173],{"class":1079},[1062,14230,9750],{"class":2594},[1062,14232,1156],{"class":1127},[1062,14234,2874],{"class":1131},[1062,14236,1135],{"class":1127},[1062,14238,2458],{"class":1117},[1062,14240,14241,14243,14245,14248],{"class":1064,"line":10714},[1062,14242,14188],{"class":1079},[1062,14244,1199],{"class":1117},[1062,14246,14247],{"class":1537},"post_deployment_verification",[1062,14249,2915],{"class":1117},[1062,14251,14252],{"class":1064,"line":10730},[1062,14253,2573],{"class":1079},[1062,14255,14256,14258,14260,14262,14264,14266],{"class":1064,"line":10735},[1062,14257,2498],{"class":1113},[1062,14259,1199],{"class":1117},[1062,14261,10771],{"class":1202},[1062,14263,1199],{"class":1117},[1062,14265,10776],{"class":1537},[1062,14267,3959],{"class":1117},[1062,14269,14270,14272,14274,14276,14278,14280,14282,14284,14287,14289,14291,14293,14296],{"class":1064,"line":10764},[1062,14271,7112],{"class":1113},[1062,14273,1199],{"class":1117},[1062,14275,11364],{"class":1202},[1062,14277,1199],{"class":1117},[1062,14279,11369],{"class":1537},[1062,14281,1534],{"class":1117},[1062,14283,4575],{"class":1185},[1062,14285,14286],{"class":1131},"'Deployment phase \"",[1062,14288,1193],{"class":1192},[1062,14290,14158],{"class":1537},[1062,14292,1219],{"class":1192},[1062,14294,14295],{"class":1131},"\" completed'",[1062,14297,2855],{"class":1117},[1062,14299,14300],{"class":1064,"line":10804},[1062,14301,4026],{"class":1117},[1026,14303,14304],{},"Deployment-level caching requires careful orchestration of multiple caching layers, from browser caches to CDNs and reverse proxies. The key is implementing a coherent strategy that maximizes performance while maintaining cache consistency and providing graceful degradation when cache systems fail. Start with basic HTTP caching headers and gradually implement more sophisticated patterns like CDN integration and multi-tier cache architectures as your application scales.",[11364,14306,14307],{},"html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}",{"title":1049,"searchDepth":1065,"depth":1072,"links":14309},[14310,14314,14318,14322,14325,14328],{"id":1032,"depth":1072,"text":1033,"children":14311},[14312,14313],{"id":1037,"depth":1083,"text":1038},{"id":1052,"depth":1083,"text":1053},{"id":2376,"depth":1072,"text":2377,"children":14315},[14316,14317],{"id":2380,"depth":1083,"text":2381},{"id":3861,"depth":1083,"text":3862},{"id":4916,"depth":1072,"text":4917,"children":14319},[14320,14321],{"id":4920,"depth":1083,"text":4921},{"id":5742,"depth":1083,"text":5743},{"id":6360,"depth":1072,"text":6361,"children":14323},[14324],{"id":6364,"depth":1083,"text":6365},{"id":8405,"depth":1072,"text":8406,"children":14326},[14327],{"id":8409,"depth":1083,"text":8410},{"id":12017,"depth":1072,"text":12018,"children":14329},[14330],{"id":12021,"depth":1083,"text":12022},"md",null,{},{"title":699,"description":1028},"CDNYlptwvxwuUr98on_vqBef3PuLA_Wit2K7p7tR4uA",[14337,14339],{"title":695,"path":696,"stem":697,"description":14338,"children":-1},"Template fragment caching allows you to cache specific portions of templates rather than entire pages, providing fine-grained control over what gets cached and when. This approach is particularly effective for templates with mixed dynamic and static content, enabling you to cache expensive template fragments while keeping other parts dynamic and personalized.",{"title":703,"path":704,"stem":705,"description":14340,"children":-1},"Modern web applications demand high concurrency, real-time features, and efficient resource utilization. Django's asynchronous capabilities enable building applications that handle thousands of concurrent connections, provide real-time updates, and process background tasks efficiently. This comprehensive guide covers Django's async ecosystem, from ASGI and async views to WebSockets and background task processing.",1772474948450]