[{"data":1,"prerenderedAt":5067},["ShallowReactive",2],{"navigation":3,"/urls-and-views/conditional-view-processing":1016,"/urls-and-views/conditional-view-processing-surround":5062},[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":154,"body":1018,"description":1028,"extension":5057,"links":5058,"meta":5059,"navigation":1131,"path":155,"seo":5060,"stem":156,"__hash__":5061},"docs/04.urls-and-views/08.conditional-view-processing.md",{"type":1019,"value":1020,"toc":5038},"minimark",[1021,1025,1029,1034,1037,1042,1045,1418,1422,1621,1625,1908,1912,2309,2313,2317,2634,2638,2917,2921,2924,3123,3127,3409,3413,3774,3778,4188,4192,4953,4957,4960,4995,4998,5031,5034],[1022,1023,154],"h1",{"id":1024},"conditional-view-processing",[1026,1027,1028],"p",{},"Conditional view processing allows Django to handle HTTP conditional requests efficiently, reducing bandwidth and improving performance by serving cached content when appropriate. This includes ETags, Last-Modified headers, and conditional GET/HEAD requests.",[1030,1031,1033],"h2",{"id":1032},"http-conditional-processing","HTTP Conditional Processing",[1026,1035,1036],{},"HTTP conditional processing uses headers to determine if content has changed since the last request, allowing browsers and proxies to use cached versions when appropriate.",[1038,1039,1041],"h3",{"id":1040},"etags-entity-tags","ETags (Entity Tags)",[1026,1043,1044],{},"ETags are unique identifiers for specific versions of resources:",[1046,1047,1052],"pre",{"className":1048,"code":1049,"language":1050,"meta":1051,"style":1051},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","from django.views.decorators.http import condition, etag\nfrom django.utils.http import http_date\nimport hashlib\n\n# Using etag decorator\ndef generate_etag(request, article_id):\n    article = Article.objects.get(pk=article_id)\n    content = f\"{article.title}{article.updated_at}\"\n    return hashlib.md5(content.encode()).hexdigest()\n\n@etag(generate_etag)\ndef article_detail(request, article_id):\n    article = get_object_or_404(Article, pk=article_id)\n    return render(request, 'article_detail.html', {'article': article})\n\n# Django automatically handles:\n# - If-None-Match header from client\n# - Returns 304 Not Modified if ETag matches\n# - Returns full response with ETag header if changed\n","python","",[1053,1054,1055,1097,1118,1126,1133,1140,1166,1204,1247,1280,1285,1301,1319,1345,1389,1394,1400,1406,1412],"code",{"__ignoreMap":1051},[1056,1057,1060,1064,1068,1072,1075,1077,1080,1082,1085,1088,1091,1094],"span",{"class":1058,"line":1059},"line",1,[1056,1061,1063],{"class":1062},"siDh9","from",[1056,1065,1067],{"class":1066},"sftqT"," django",[1056,1069,1071],{"class":1070},"soVBu",".",[1056,1073,1074],{"class":1066},"views",[1056,1076,1071],{"class":1070},[1056,1078,1079],{"class":1066},"decorators",[1056,1081,1071],{"class":1070},[1056,1083,1084],{"class":1066},"http ",[1056,1086,1087],{"class":1062},"import",[1056,1089,1090],{"class":1066}," condition",[1056,1092,1093],{"class":1070},",",[1056,1095,1096],{"class":1066}," etag\n",[1056,1098,1100,1102,1104,1106,1109,1111,1113,1115],{"class":1058,"line":1099},2,[1056,1101,1063],{"class":1062},[1056,1103,1067],{"class":1066},[1056,1105,1071],{"class":1070},[1056,1107,1108],{"class":1066},"utils",[1056,1110,1071],{"class":1070},[1056,1112,1084],{"class":1066},[1056,1114,1087],{"class":1062},[1056,1116,1117],{"class":1066}," http_date\n",[1056,1119,1121,1123],{"class":1058,"line":1120},3,[1056,1122,1087],{"class":1062},[1056,1124,1125],{"class":1066}," hashlib\n",[1056,1127,1129],{"class":1058,"line":1128},4,[1056,1130,1132],{"emptyLinePlaceholder":1131},true,"\n",[1056,1134,1136],{"class":1058,"line":1135},5,[1056,1137,1139],{"class":1138},"s9Tkl","# Using etag decorator\n",[1056,1141,1143,1147,1151,1154,1158,1160,1163],{"class":1058,"line":1142},6,[1056,1144,1146],{"class":1145},"s5Kfy","def",[1056,1148,1150],{"class":1149},"sljsM"," generate_etag",[1056,1152,1153],{"class":1070},"(",[1056,1155,1157],{"class":1156},"sCyAa","request",[1056,1159,1093],{"class":1070},[1056,1161,1162],{"class":1156}," article_id",[1056,1164,1165],{"class":1070},"):\n",[1056,1167,1169,1172,1175,1178,1180,1184,1186,1190,1192,1196,1198,1201],{"class":1058,"line":1168},7,[1056,1170,1171],{"class":1066},"    article ",[1056,1173,1174],{"class":1070},"=",[1056,1176,1177],{"class":1066}," Article",[1056,1179,1071],{"class":1070},[1056,1181,1183],{"class":1182},"sBPpx","objects",[1056,1185,1071],{"class":1070},[1056,1187,1189],{"class":1188},"siWMO","get",[1056,1191,1153],{"class":1070},[1056,1193,1195],{"class":1194},"sqOPj","pk",[1056,1197,1174],{"class":1070},[1056,1199,1200],{"class":1188},"article_id",[1056,1202,1203],{"class":1070},")\n",[1056,1205,1207,1210,1212,1215,1219,1223,1226,1228,1231,1234,1236,1238,1241,1244],{"class":1058,"line":1206},8,[1056,1208,1209],{"class":1066},"    content ",[1056,1211,1174],{"class":1070},[1056,1213,1214],{"class":1145}," f",[1056,1216,1218],{"class":1217},"sTbE_","\"",[1056,1220,1222],{"class":1221},"s3h35","{",[1056,1224,1225],{"class":1066},"article",[1056,1227,1071],{"class":1070},[1056,1229,1230],{"class":1182},"title",[1056,1232,1233],{"class":1221},"}{",[1056,1235,1225],{"class":1066},[1056,1237,1071],{"class":1070},[1056,1239,1240],{"class":1182},"updated_at",[1056,1242,1243],{"class":1221},"}",[1056,1245,1246],{"class":1217},"\"\n",[1056,1248,1250,1253,1256,1258,1261,1263,1266,1268,1271,1274,1277],{"class":1058,"line":1249},9,[1056,1251,1252],{"class":1062},"    return",[1056,1254,1255],{"class":1066}," hashlib",[1056,1257,1071],{"class":1070},[1056,1259,1260],{"class":1188},"md5",[1056,1262,1153],{"class":1070},[1056,1264,1265],{"class":1188},"content",[1056,1267,1071],{"class":1070},[1056,1269,1270],{"class":1188},"encode",[1056,1272,1273],{"class":1070},"()).",[1056,1275,1276],{"class":1188},"hexdigest",[1056,1278,1279],{"class":1070},"()\n",[1056,1281,1283],{"class":1058,"line":1282},10,[1056,1284,1132],{"emptyLinePlaceholder":1131},[1056,1286,1288,1291,1294,1296,1299],{"class":1058,"line":1287},11,[1056,1289,1290],{"class":1070},"@",[1056,1292,1293],{"class":1149},"etag",[1056,1295,1153],{"class":1070},[1056,1297,1298],{"class":1188},"generate_etag",[1056,1300,1203],{"class":1070},[1056,1302,1304,1306,1309,1311,1313,1315,1317],{"class":1058,"line":1303},12,[1056,1305,1146],{"class":1145},[1056,1307,1308],{"class":1149}," article_detail",[1056,1310,1153],{"class":1070},[1056,1312,1157],{"class":1156},[1056,1314,1093],{"class":1070},[1056,1316,1162],{"class":1156},[1056,1318,1165],{"class":1070},[1056,1320,1322,1324,1326,1329,1331,1334,1336,1339,1341,1343],{"class":1058,"line":1321},13,[1056,1323,1171],{"class":1066},[1056,1325,1174],{"class":1070},[1056,1327,1328],{"class":1188}," get_object_or_404",[1056,1330,1153],{"class":1070},[1056,1332,1333],{"class":1188},"Article",[1056,1335,1093],{"class":1070},[1056,1337,1338],{"class":1194}," pk",[1056,1340,1174],{"class":1070},[1056,1342,1200],{"class":1188},[1056,1344,1203],{"class":1070},[1056,1346,1348,1350,1353,1355,1357,1359,1363,1366,1369,1371,1374,1376,1378,1380,1383,1386],{"class":1058,"line":1347},14,[1056,1349,1252],{"class":1062},[1056,1351,1352],{"class":1188}," render",[1056,1354,1153],{"class":1070},[1056,1356,1157],{"class":1188},[1056,1358,1093],{"class":1070},[1056,1360,1362],{"class":1361},"sbYkP"," '",[1056,1364,1365],{"class":1217},"article_detail.html",[1056,1367,1368],{"class":1361},"'",[1056,1370,1093],{"class":1070},[1056,1372,1373],{"class":1070}," {",[1056,1375,1368],{"class":1361},[1056,1377,1225],{"class":1217},[1056,1379,1368],{"class":1361},[1056,1381,1382],{"class":1070},":",[1056,1384,1385],{"class":1188}," article",[1056,1387,1388],{"class":1070},"})\n",[1056,1390,1392],{"class":1058,"line":1391},15,[1056,1393,1132],{"emptyLinePlaceholder":1131},[1056,1395,1397],{"class":1058,"line":1396},16,[1056,1398,1399],{"class":1138},"# Django automatically handles:\n",[1056,1401,1403],{"class":1058,"line":1402},17,[1056,1404,1405],{"class":1138},"# - If-None-Match header from client\n",[1056,1407,1409],{"class":1058,"line":1408},18,[1056,1410,1411],{"class":1138},"# - Returns 304 Not Modified if ETag matches\n",[1056,1413,1415],{"class":1058,"line":1414},19,[1056,1416,1417],{"class":1138},"# - Returns full response with ETag header if changed\n",[1038,1419,1421],{"id":1420},"last-modified-headers","Last-Modified Headers",[1046,1423,1425],{"className":1048,"code":1424,"language":1050,"meta":1051,"style":1051},"from django.views.decorators.http import last_modified\n\ndef article_last_modified(request, article_id):\n    article = Article.objects.get(pk=article_id)\n    return article.updated_at\n\n@last_modified(article_last_modified)\ndef article_detail(request, article_id):\n    article = get_object_or_404(Article, pk=article_id)\n    return render(request, 'article_detail.html', {'article': article})\n\n# Django automatically handles:\n# - If-Modified-Since header from client\n# - Returns 304 Not Modified if not modified\n# - Returns full response with Last-Modified header if changed\n",[1053,1426,1427,1450,1454,1471,1497,1508,1512,1526,1542,1564,1598,1602,1606,1611,1616],{"__ignoreMap":1051},[1056,1428,1429,1431,1433,1435,1437,1439,1441,1443,1445,1447],{"class":1058,"line":1059},[1056,1430,1063],{"class":1062},[1056,1432,1067],{"class":1066},[1056,1434,1071],{"class":1070},[1056,1436,1074],{"class":1066},[1056,1438,1071],{"class":1070},[1056,1440,1079],{"class":1066},[1056,1442,1071],{"class":1070},[1056,1444,1084],{"class":1066},[1056,1446,1087],{"class":1062},[1056,1448,1449],{"class":1066}," last_modified\n",[1056,1451,1452],{"class":1058,"line":1099},[1056,1453,1132],{"emptyLinePlaceholder":1131},[1056,1455,1456,1458,1461,1463,1465,1467,1469],{"class":1058,"line":1120},[1056,1457,1146],{"class":1145},[1056,1459,1460],{"class":1149}," article_last_modified",[1056,1462,1153],{"class":1070},[1056,1464,1157],{"class":1156},[1056,1466,1093],{"class":1070},[1056,1468,1162],{"class":1156},[1056,1470,1165],{"class":1070},[1056,1472,1473,1475,1477,1479,1481,1483,1485,1487,1489,1491,1493,1495],{"class":1058,"line":1128},[1056,1474,1171],{"class":1066},[1056,1476,1174],{"class":1070},[1056,1478,1177],{"class":1066},[1056,1480,1071],{"class":1070},[1056,1482,1183],{"class":1182},[1056,1484,1071],{"class":1070},[1056,1486,1189],{"class":1188},[1056,1488,1153],{"class":1070},[1056,1490,1195],{"class":1194},[1056,1492,1174],{"class":1070},[1056,1494,1200],{"class":1188},[1056,1496,1203],{"class":1070},[1056,1498,1499,1501,1503,1505],{"class":1058,"line":1135},[1056,1500,1252],{"class":1062},[1056,1502,1385],{"class":1066},[1056,1504,1071],{"class":1070},[1056,1506,1507],{"class":1182},"updated_at\n",[1056,1509,1510],{"class":1058,"line":1142},[1056,1511,1132],{"emptyLinePlaceholder":1131},[1056,1513,1514,1516,1519,1521,1524],{"class":1058,"line":1168},[1056,1515,1290],{"class":1070},[1056,1517,1518],{"class":1149},"last_modified",[1056,1520,1153],{"class":1070},[1056,1522,1523],{"class":1188},"article_last_modified",[1056,1525,1203],{"class":1070},[1056,1527,1528,1530,1532,1534,1536,1538,1540],{"class":1058,"line":1206},[1056,1529,1146],{"class":1145},[1056,1531,1308],{"class":1149},[1056,1533,1153],{"class":1070},[1056,1535,1157],{"class":1156},[1056,1537,1093],{"class":1070},[1056,1539,1162],{"class":1156},[1056,1541,1165],{"class":1070},[1056,1543,1544,1546,1548,1550,1552,1554,1556,1558,1560,1562],{"class":1058,"line":1249},[1056,1545,1171],{"class":1066},[1056,1547,1174],{"class":1070},[1056,1549,1328],{"class":1188},[1056,1551,1153],{"class":1070},[1056,1553,1333],{"class":1188},[1056,1555,1093],{"class":1070},[1056,1557,1338],{"class":1194},[1056,1559,1174],{"class":1070},[1056,1561,1200],{"class":1188},[1056,1563,1203],{"class":1070},[1056,1565,1566,1568,1570,1572,1574,1576,1578,1580,1582,1584,1586,1588,1590,1592,1594,1596],{"class":1058,"line":1282},[1056,1567,1252],{"class":1062},[1056,1569,1352],{"class":1188},[1056,1571,1153],{"class":1070},[1056,1573,1157],{"class":1188},[1056,1575,1093],{"class":1070},[1056,1577,1362],{"class":1361},[1056,1579,1365],{"class":1217},[1056,1581,1368],{"class":1361},[1056,1583,1093],{"class":1070},[1056,1585,1373],{"class":1070},[1056,1587,1368],{"class":1361},[1056,1589,1225],{"class":1217},[1056,1591,1368],{"class":1361},[1056,1593,1382],{"class":1070},[1056,1595,1385],{"class":1188},[1056,1597,1388],{"class":1070},[1056,1599,1600],{"class":1058,"line":1287},[1056,1601,1132],{"emptyLinePlaceholder":1131},[1056,1603,1604],{"class":1058,"line":1303},[1056,1605,1399],{"class":1138},[1056,1607,1608],{"class":1058,"line":1321},[1056,1609,1610],{"class":1138},"# - If-Modified-Since header from client\n",[1056,1612,1613],{"class":1058,"line":1347},[1056,1614,1615],{"class":1138},"# - Returns 304 Not Modified if not modified\n",[1056,1617,1618],{"class":1058,"line":1391},[1056,1619,1620],{"class":1138},"# - Returns full response with Last-Modified header if changed\n",[1038,1622,1624],{"id":1623},"combined-conditional-processing","Combined Conditional Processing",[1046,1626,1628],{"className":1048,"code":1627,"language":1050,"meta":1051,"style":1051},"from django.views.decorators.http import condition\n\ndef article_etag(request, article_id):\n    article = Article.objects.get(pk=article_id)\n    return hashlib.md5(f\"{article.id}{article.updated_at}\".encode()).hexdigest()\n\ndef article_last_modified(request, article_id):\n    article = Article.objects.get(pk=article_id)\n    return article.updated_at\n\n@condition(etag_func=article_etag, last_modified_func=article_last_modified)\ndef article_detail(request, article_id):\n    article = get_object_or_404(Article, pk=article_id)\n    return render(request, 'article_detail.html', {'article': article})\n",[1053,1629,1630,1653,1657,1674,1700,1748,1752,1768,1794,1804,1808,1836,1852,1874],{"__ignoreMap":1051},[1056,1631,1632,1634,1636,1638,1640,1642,1644,1646,1648,1650],{"class":1058,"line":1059},[1056,1633,1063],{"class":1062},[1056,1635,1067],{"class":1066},[1056,1637,1071],{"class":1070},[1056,1639,1074],{"class":1066},[1056,1641,1071],{"class":1070},[1056,1643,1079],{"class":1066},[1056,1645,1071],{"class":1070},[1056,1647,1084],{"class":1066},[1056,1649,1087],{"class":1062},[1056,1651,1652],{"class":1066}," condition\n",[1056,1654,1655],{"class":1058,"line":1099},[1056,1656,1132],{"emptyLinePlaceholder":1131},[1056,1658,1659,1661,1664,1666,1668,1670,1672],{"class":1058,"line":1120},[1056,1660,1146],{"class":1145},[1056,1662,1663],{"class":1149}," article_etag",[1056,1665,1153],{"class":1070},[1056,1667,1157],{"class":1156},[1056,1669,1093],{"class":1070},[1056,1671,1162],{"class":1156},[1056,1673,1165],{"class":1070},[1056,1675,1676,1678,1680,1682,1684,1686,1688,1690,1692,1694,1696,1698],{"class":1058,"line":1128},[1056,1677,1171],{"class":1066},[1056,1679,1174],{"class":1070},[1056,1681,1177],{"class":1066},[1056,1683,1071],{"class":1070},[1056,1685,1183],{"class":1182},[1056,1687,1071],{"class":1070},[1056,1689,1189],{"class":1188},[1056,1691,1153],{"class":1070},[1056,1693,1195],{"class":1194},[1056,1695,1174],{"class":1070},[1056,1697,1200],{"class":1188},[1056,1699,1203],{"class":1070},[1056,1701,1702,1704,1706,1708,1710,1712,1715,1717,1719,1721,1723,1726,1728,1730,1732,1734,1736,1738,1740,1742,1744,1746],{"class":1058,"line":1135},[1056,1703,1252],{"class":1062},[1056,1705,1255],{"class":1066},[1056,1707,1071],{"class":1070},[1056,1709,1260],{"class":1188},[1056,1711,1153],{"class":1070},[1056,1713,1714],{"class":1145},"f",[1056,1716,1218],{"class":1217},[1056,1718,1222],{"class":1221},[1056,1720,1225],{"class":1188},[1056,1722,1071],{"class":1070},[1056,1724,1725],{"class":1182},"id",[1056,1727,1233],{"class":1221},[1056,1729,1225],{"class":1188},[1056,1731,1071],{"class":1070},[1056,1733,1240],{"class":1182},[1056,1735,1243],{"class":1221},[1056,1737,1218],{"class":1217},[1056,1739,1071],{"class":1070},[1056,1741,1270],{"class":1188},[1056,1743,1273],{"class":1070},[1056,1745,1276],{"class":1188},[1056,1747,1279],{"class":1070},[1056,1749,1750],{"class":1058,"line":1142},[1056,1751,1132],{"emptyLinePlaceholder":1131},[1056,1753,1754,1756,1758,1760,1762,1764,1766],{"class":1058,"line":1168},[1056,1755,1146],{"class":1145},[1056,1757,1460],{"class":1149},[1056,1759,1153],{"class":1070},[1056,1761,1157],{"class":1156},[1056,1763,1093],{"class":1070},[1056,1765,1162],{"class":1156},[1056,1767,1165],{"class":1070},[1056,1769,1770,1772,1774,1776,1778,1780,1782,1784,1786,1788,1790,1792],{"class":1058,"line":1206},[1056,1771,1171],{"class":1066},[1056,1773,1174],{"class":1070},[1056,1775,1177],{"class":1066},[1056,1777,1071],{"class":1070},[1056,1779,1183],{"class":1182},[1056,1781,1071],{"class":1070},[1056,1783,1189],{"class":1188},[1056,1785,1153],{"class":1070},[1056,1787,1195],{"class":1194},[1056,1789,1174],{"class":1070},[1056,1791,1200],{"class":1188},[1056,1793,1203],{"class":1070},[1056,1795,1796,1798,1800,1802],{"class":1058,"line":1249},[1056,1797,1252],{"class":1062},[1056,1799,1385],{"class":1066},[1056,1801,1071],{"class":1070},[1056,1803,1507],{"class":1182},[1056,1805,1806],{"class":1058,"line":1282},[1056,1807,1132],{"emptyLinePlaceholder":1131},[1056,1809,1810,1812,1815,1817,1820,1822,1825,1827,1830,1832,1834],{"class":1058,"line":1287},[1056,1811,1290],{"class":1070},[1056,1813,1814],{"class":1149},"condition",[1056,1816,1153],{"class":1070},[1056,1818,1819],{"class":1194},"etag_func",[1056,1821,1174],{"class":1070},[1056,1823,1824],{"class":1188},"article_etag",[1056,1826,1093],{"class":1070},[1056,1828,1829],{"class":1194}," last_modified_func",[1056,1831,1174],{"class":1070},[1056,1833,1523],{"class":1188},[1056,1835,1203],{"class":1070},[1056,1837,1838,1840,1842,1844,1846,1848,1850],{"class":1058,"line":1303},[1056,1839,1146],{"class":1145},[1056,1841,1308],{"class":1149},[1056,1843,1153],{"class":1070},[1056,1845,1157],{"class":1156},[1056,1847,1093],{"class":1070},[1056,1849,1162],{"class":1156},[1056,1851,1165],{"class":1070},[1056,1853,1854,1856,1858,1860,1862,1864,1866,1868,1870,1872],{"class":1058,"line":1321},[1056,1855,1171],{"class":1066},[1056,1857,1174],{"class":1070},[1056,1859,1328],{"class":1188},[1056,1861,1153],{"class":1070},[1056,1863,1333],{"class":1188},[1056,1865,1093],{"class":1070},[1056,1867,1338],{"class":1194},[1056,1869,1174],{"class":1070},[1056,1871,1200],{"class":1188},[1056,1873,1203],{"class":1070},[1056,1875,1876,1878,1880,1882,1884,1886,1888,1890,1892,1894,1896,1898,1900,1902,1904,1906],{"class":1058,"line":1347},[1056,1877,1252],{"class":1062},[1056,1879,1352],{"class":1188},[1056,1881,1153],{"class":1070},[1056,1883,1157],{"class":1188},[1056,1885,1093],{"class":1070},[1056,1887,1362],{"class":1361},[1056,1889,1365],{"class":1217},[1056,1891,1368],{"class":1361},[1056,1893,1093],{"class":1070},[1056,1895,1373],{"class":1070},[1056,1897,1368],{"class":1361},[1056,1899,1225],{"class":1217},[1056,1901,1368],{"class":1361},[1056,1903,1382],{"class":1070},[1056,1905,1385],{"class":1188},[1056,1907,1388],{"class":1070},[1030,1909,1911],{"id":1910},"class-based-views-with-conditional-processing","Class-Based Views with Conditional Processing",[1046,1913,1915],{"className":1048,"code":1914,"language":1050,"meta":1051,"style":1051},"from django.views.generic import DetailView\nfrom django.utils.decorators import method_decorator\nfrom django.views.decorators.http import condition\nimport hashlib\n\nclass ArticleDetailView(DetailView):\n    model = Article\n    template_name = 'article_detail.html'\n    \n    def get_etag(self):\n        article = self.get_object()\n        content = f\"{article.id}{article.updated_at}\"\n        return hashlib.md5(content.encode()).hexdigest()\n    \n    def get_last_modified(self):\n        article = self.get_object()\n        return article.updated_at\n    \n    @method_decorator(condition(\n        etag_func=lambda request, pk: ArticleDetailView().get_etag(),\n        last_modified_func=lambda request, pk: ArticleDetailView().get_last_modified()\n    ))\n    def dispatch(self, *args, **kwargs):\n        return super().dispatch(*args, **kwargs)\n",[1053,1916,1917,1937,1957,1979,1985,1989,2006,2016,2030,2035,2051,2069,2100,2125,2129,2142,2156,2166,2170,2185,2216,2243,2249,2280],{"__ignoreMap":1051},[1056,1918,1919,1921,1923,1925,1927,1929,1932,1934],{"class":1058,"line":1059},[1056,1920,1063],{"class":1062},[1056,1922,1067],{"class":1066},[1056,1924,1071],{"class":1070},[1056,1926,1074],{"class":1066},[1056,1928,1071],{"class":1070},[1056,1930,1931],{"class":1066},"generic ",[1056,1933,1087],{"class":1062},[1056,1935,1936],{"class":1066}," DetailView\n",[1056,1938,1939,1941,1943,1945,1947,1949,1952,1954],{"class":1058,"line":1099},[1056,1940,1063],{"class":1062},[1056,1942,1067],{"class":1066},[1056,1944,1071],{"class":1070},[1056,1946,1108],{"class":1066},[1056,1948,1071],{"class":1070},[1056,1950,1951],{"class":1066},"decorators ",[1056,1953,1087],{"class":1062},[1056,1955,1956],{"class":1066}," method_decorator\n",[1056,1958,1959,1961,1963,1965,1967,1969,1971,1973,1975,1977],{"class":1058,"line":1120},[1056,1960,1063],{"class":1062},[1056,1962,1067],{"class":1066},[1056,1964,1071],{"class":1070},[1056,1966,1074],{"class":1066},[1056,1968,1071],{"class":1070},[1056,1970,1079],{"class":1066},[1056,1972,1071],{"class":1070},[1056,1974,1084],{"class":1066},[1056,1976,1087],{"class":1062},[1056,1978,1652],{"class":1066},[1056,1980,1981,1983],{"class":1058,"line":1128},[1056,1982,1087],{"class":1062},[1056,1984,1125],{"class":1066},[1056,1986,1987],{"class":1058,"line":1135},[1056,1988,1132],{"emptyLinePlaceholder":1131},[1056,1990,1991,1994,1998,2000,2004],{"class":1058,"line":1142},[1056,1992,1993],{"class":1145},"class",[1056,1995,1997],{"class":1996},"sD-vU"," ArticleDetailView",[1056,1999,1153],{"class":1070},[1056,2001,2003],{"class":2002},"sYn-s","DetailView",[1056,2005,1165],{"class":1070},[1056,2007,2008,2011,2013],{"class":1058,"line":1168},[1056,2009,2010],{"class":1066},"    model ",[1056,2012,1174],{"class":1070},[1056,2014,2015],{"class":1066}," Article\n",[1056,2017,2018,2021,2023,2025,2027],{"class":1058,"line":1206},[1056,2019,2020],{"class":1066},"    template_name ",[1056,2022,1174],{"class":1070},[1056,2024,1362],{"class":1361},[1056,2026,1365],{"class":1217},[1056,2028,2029],{"class":1361},"'\n",[1056,2031,2032],{"class":1058,"line":1249},[1056,2033,2034],{"class":1066},"    \n",[1056,2036,2037,2040,2043,2045,2049],{"class":1058,"line":1282},[1056,2038,2039],{"class":1145},"    def",[1056,2041,2042],{"class":1149}," get_etag",[1056,2044,1153],{"class":1070},[1056,2046,2048],{"class":2047},"sRjD_","self",[1056,2050,1165],{"class":1070},[1056,2052,2053,2056,2058,2062,2064,2067],{"class":1058,"line":1287},[1056,2054,2055],{"class":1066},"        article ",[1056,2057,1174],{"class":1070},[1056,2059,2061],{"class":2060},"se3Ec"," self",[1056,2063,1071],{"class":1070},[1056,2065,2066],{"class":1188},"get_object",[1056,2068,1279],{"class":1070},[1056,2070,2071,2074,2076,2078,2080,2082,2084,2086,2088,2090,2092,2094,2096,2098],{"class":1058,"line":1303},[1056,2072,2073],{"class":1066},"        content ",[1056,2075,1174],{"class":1070},[1056,2077,1214],{"class":1145},[1056,2079,1218],{"class":1217},[1056,2081,1222],{"class":1221},[1056,2083,1225],{"class":1066},[1056,2085,1071],{"class":1070},[1056,2087,1725],{"class":1182},[1056,2089,1233],{"class":1221},[1056,2091,1225],{"class":1066},[1056,2093,1071],{"class":1070},[1056,2095,1240],{"class":1182},[1056,2097,1243],{"class":1221},[1056,2099,1246],{"class":1217},[1056,2101,2102,2105,2107,2109,2111,2113,2115,2117,2119,2121,2123],{"class":1058,"line":1321},[1056,2103,2104],{"class":1062},"        return",[1056,2106,1255],{"class":1066},[1056,2108,1071],{"class":1070},[1056,2110,1260],{"class":1188},[1056,2112,1153],{"class":1070},[1056,2114,1265],{"class":1188},[1056,2116,1071],{"class":1070},[1056,2118,1270],{"class":1188},[1056,2120,1273],{"class":1070},[1056,2122,1276],{"class":1188},[1056,2124,1279],{"class":1070},[1056,2126,2127],{"class":1058,"line":1347},[1056,2128,2034],{"class":1066},[1056,2130,2131,2133,2136,2138,2140],{"class":1058,"line":1391},[1056,2132,2039],{"class":1145},[1056,2134,2135],{"class":1149}," get_last_modified",[1056,2137,1153],{"class":1070},[1056,2139,2048],{"class":2047},[1056,2141,1165],{"class":1070},[1056,2143,2144,2146,2148,2150,2152,2154],{"class":1058,"line":1396},[1056,2145,2055],{"class":1066},[1056,2147,1174],{"class":1070},[1056,2149,2061],{"class":2060},[1056,2151,1071],{"class":1070},[1056,2153,2066],{"class":1188},[1056,2155,1279],{"class":1070},[1056,2157,2158,2160,2162,2164],{"class":1058,"line":1402},[1056,2159,2104],{"class":1062},[1056,2161,1385],{"class":1066},[1056,2163,1071],{"class":1070},[1056,2165,1507],{"class":1182},[1056,2167,2168],{"class":1058,"line":1408},[1056,2169,2034],{"class":1066},[1056,2171,2172,2175,2178,2180,2182],{"class":1058,"line":1414},[1056,2173,2174],{"class":1070},"    @",[1056,2176,2177],{"class":1149},"method_decorator",[1056,2179,1153],{"class":1070},[1056,2181,1814],{"class":1188},[1056,2183,2184],{"class":1070},"(\n",[1056,2186,2188,2191,2193,2196,2199,2201,2203,2205,2207,2210,2213],{"class":1058,"line":2187},20,[1056,2189,2190],{"class":1194},"        etag_func",[1056,2192,1174],{"class":1070},[1056,2194,2195],{"class":1145},"lambda",[1056,2197,2198],{"class":1156}," request",[1056,2200,1093],{"class":1070},[1056,2202,1338],{"class":1156},[1056,2204,1382],{"class":1070},[1056,2206,1997],{"class":1188},[1056,2208,2209],{"class":1070},"().",[1056,2211,2212],{"class":1188},"get_etag",[1056,2214,2215],{"class":1070},"(),\n",[1056,2217,2219,2222,2224,2226,2228,2230,2232,2234,2236,2238,2241],{"class":1058,"line":2218},21,[1056,2220,2221],{"class":1194},"        last_modified_func",[1056,2223,1174],{"class":1070},[1056,2225,2195],{"class":1145},[1056,2227,2198],{"class":1156},[1056,2229,1093],{"class":1070},[1056,2231,1338],{"class":1156},[1056,2233,1382],{"class":1070},[1056,2235,1997],{"class":1188},[1056,2237,2209],{"class":1070},[1056,2239,2240],{"class":1188},"get_last_modified",[1056,2242,1279],{"class":1070},[1056,2244,2246],{"class":1058,"line":2245},22,[1056,2247,2248],{"class":1070},"    ))\n",[1056,2250,2252,2254,2257,2259,2261,2263,2267,2270,2272,2275,2278],{"class":1058,"line":2251},23,[1056,2253,2039],{"class":1145},[1056,2255,2256],{"class":1149}," dispatch",[1056,2258,1153],{"class":1070},[1056,2260,2048],{"class":2047},[1056,2262,1093],{"class":1070},[1056,2264,2266],{"class":2265},"sVsLi"," *",[1056,2268,2269],{"class":1156},"args",[1056,2271,1093],{"class":1070},[1056,2273,2274],{"class":2265}," **",[1056,2276,2277],{"class":1156},"kwargs",[1056,2279,1165],{"class":1070},[1056,2281,2283,2285,2289,2291,2294,2296,2299,2301,2303,2305,2307],{"class":1058,"line":2282},24,[1056,2284,2104],{"class":1062},[1056,2286,2288],{"class":2287},"sa2tF"," super",[1056,2290,2209],{"class":1070},[1056,2292,2293],{"class":1188},"dispatch",[1056,2295,1153],{"class":1070},[1056,2297,2298],{"class":2265},"*",[1056,2300,2269],{"class":1188},[1056,2302,1093],{"class":1070},[1056,2304,2274],{"class":2265},[1056,2306,2277],{"class":1188},[1056,2308,1203],{"class":1070},[1030,2310,2312],{"id":2311},"advanced-conditional-processing","Advanced Conditional Processing",[1038,2314,2316],{"id":2315},"conditional-processing-for-lists","Conditional Processing for Lists",[1046,2318,2320],{"className":1048,"code":2319,"language":1050,"meta":1051,"style":1051},"from django.db.models import Max\n\ndef article_list_etag(request):\n    # Generate ETag based on latest update\n    latest_update = Article.objects.aggregate(Max('updated_at'))['updated_at__max']\n    count = Article.objects.count()\n    content = f\"{count}{latest_update}\"\n    return hashlib.md5(content.encode()).hexdigest()\n\ndef article_list_last_modified(request):\n    # Return latest modification time\n    return Article.objects.aggregate(Max('updated_at'))['updated_at__max']\n\n@condition(etag_func=article_list_etag, last_modified_func=article_list_last_modified)\ndef article_list(request):\n    articles = Article.objects.all()\n    return render(request, 'article_list.html', {'articles': articles})\n",[1053,2321,2322,2343,2347,2360,2365,2409,2429,2452,2476,2480,2493,2498,2534,2538,2564,2577,2597],{"__ignoreMap":1051},[1056,2323,2324,2326,2328,2330,2333,2335,2338,2340],{"class":1058,"line":1059},[1056,2325,1063],{"class":1062},[1056,2327,1067],{"class":1066},[1056,2329,1071],{"class":1070},[1056,2331,2332],{"class":1066},"db",[1056,2334,1071],{"class":1070},[1056,2336,2337],{"class":1066},"models ",[1056,2339,1087],{"class":1062},[1056,2341,2342],{"class":1066}," Max\n",[1056,2344,2345],{"class":1058,"line":1099},[1056,2346,1132],{"emptyLinePlaceholder":1131},[1056,2348,2349,2351,2354,2356,2358],{"class":1058,"line":1120},[1056,2350,1146],{"class":1145},[1056,2352,2353],{"class":1149}," article_list_etag",[1056,2355,1153],{"class":1070},[1056,2357,1157],{"class":1156},[1056,2359,1165],{"class":1070},[1056,2361,2362],{"class":1058,"line":1128},[1056,2363,2364],{"class":1138},"    # Generate ETag based on latest update\n",[1056,2366,2367,2370,2372,2374,2376,2378,2380,2383,2385,2388,2390,2392,2394,2396,2399,2401,2404,2406],{"class":1058,"line":1135},[1056,2368,2369],{"class":1066},"    latest_update ",[1056,2371,1174],{"class":1070},[1056,2373,1177],{"class":1066},[1056,2375,1071],{"class":1070},[1056,2377,1183],{"class":1182},[1056,2379,1071],{"class":1070},[1056,2381,2382],{"class":1188},"aggregate",[1056,2384,1153],{"class":1070},[1056,2386,2387],{"class":1188},"Max",[1056,2389,1153],{"class":1070},[1056,2391,1368],{"class":1361},[1056,2393,1240],{"class":1217},[1056,2395,1368],{"class":1361},[1056,2397,2398],{"class":1070},"))[",[1056,2400,1368],{"class":1361},[1056,2402,2403],{"class":1217},"updated_at__max",[1056,2405,1368],{"class":1361},[1056,2407,2408],{"class":1070},"]\n",[1056,2410,2411,2414,2416,2418,2420,2422,2424,2427],{"class":1058,"line":1142},[1056,2412,2413],{"class":1066},"    count ",[1056,2415,1174],{"class":1070},[1056,2417,1177],{"class":1066},[1056,2419,1071],{"class":1070},[1056,2421,1183],{"class":1182},[1056,2423,1071],{"class":1070},[1056,2425,2426],{"class":1188},"count",[1056,2428,1279],{"class":1070},[1056,2430,2431,2433,2435,2437,2439,2441,2443,2445,2448,2450],{"class":1058,"line":1168},[1056,2432,1209],{"class":1066},[1056,2434,1174],{"class":1070},[1056,2436,1214],{"class":1145},[1056,2438,1218],{"class":1217},[1056,2440,1222],{"class":1221},[1056,2442,2426],{"class":1066},[1056,2444,1233],{"class":1221},[1056,2446,2447],{"class":1066},"latest_update",[1056,2449,1243],{"class":1221},[1056,2451,1246],{"class":1217},[1056,2453,2454,2456,2458,2460,2462,2464,2466,2468,2470,2472,2474],{"class":1058,"line":1206},[1056,2455,1252],{"class":1062},[1056,2457,1255],{"class":1066},[1056,2459,1071],{"class":1070},[1056,2461,1260],{"class":1188},[1056,2463,1153],{"class":1070},[1056,2465,1265],{"class":1188},[1056,2467,1071],{"class":1070},[1056,2469,1270],{"class":1188},[1056,2471,1273],{"class":1070},[1056,2473,1276],{"class":1188},[1056,2475,1279],{"class":1070},[1056,2477,2478],{"class":1058,"line":1249},[1056,2479,1132],{"emptyLinePlaceholder":1131},[1056,2481,2482,2484,2487,2489,2491],{"class":1058,"line":1282},[1056,2483,1146],{"class":1145},[1056,2485,2486],{"class":1149}," article_list_last_modified",[1056,2488,1153],{"class":1070},[1056,2490,1157],{"class":1156},[1056,2492,1165],{"class":1070},[1056,2494,2495],{"class":1058,"line":1287},[1056,2496,2497],{"class":1138},"    # Return latest modification time\n",[1056,2499,2500,2502,2504,2506,2508,2510,2512,2514,2516,2518,2520,2522,2524,2526,2528,2530,2532],{"class":1058,"line":1303},[1056,2501,1252],{"class":1062},[1056,2503,1177],{"class":1066},[1056,2505,1071],{"class":1070},[1056,2507,1183],{"class":1182},[1056,2509,1071],{"class":1070},[1056,2511,2382],{"class":1188},[1056,2513,1153],{"class":1070},[1056,2515,2387],{"class":1188},[1056,2517,1153],{"class":1070},[1056,2519,1368],{"class":1361},[1056,2521,1240],{"class":1217},[1056,2523,1368],{"class":1361},[1056,2525,2398],{"class":1070},[1056,2527,1368],{"class":1361},[1056,2529,2403],{"class":1217},[1056,2531,1368],{"class":1361},[1056,2533,2408],{"class":1070},[1056,2535,2536],{"class":1058,"line":1321},[1056,2537,1132],{"emptyLinePlaceholder":1131},[1056,2539,2540,2542,2544,2546,2548,2550,2553,2555,2557,2559,2562],{"class":1058,"line":1347},[1056,2541,1290],{"class":1070},[1056,2543,1814],{"class":1149},[1056,2545,1153],{"class":1070},[1056,2547,1819],{"class":1194},[1056,2549,1174],{"class":1070},[1056,2551,2552],{"class":1188},"article_list_etag",[1056,2554,1093],{"class":1070},[1056,2556,1829],{"class":1194},[1056,2558,1174],{"class":1070},[1056,2560,2561],{"class":1188},"article_list_last_modified",[1056,2563,1203],{"class":1070},[1056,2565,2566,2568,2571,2573,2575],{"class":1058,"line":1391},[1056,2567,1146],{"class":1145},[1056,2569,2570],{"class":1149}," article_list",[1056,2572,1153],{"class":1070},[1056,2574,1157],{"class":1156},[1056,2576,1165],{"class":1070},[1056,2578,2579,2582,2584,2586,2588,2590,2592,2595],{"class":1058,"line":1396},[1056,2580,2581],{"class":1066},"    articles ",[1056,2583,1174],{"class":1070},[1056,2585,1177],{"class":1066},[1056,2587,1071],{"class":1070},[1056,2589,1183],{"class":1182},[1056,2591,1071],{"class":1070},[1056,2593,2594],{"class":1188},"all",[1056,2596,1279],{"class":1070},[1056,2598,2599,2601,2603,2605,2607,2609,2611,2614,2616,2618,2620,2622,2625,2627,2629,2632],{"class":1058,"line":1402},[1056,2600,1252],{"class":1062},[1056,2602,1352],{"class":1188},[1056,2604,1153],{"class":1070},[1056,2606,1157],{"class":1188},[1056,2608,1093],{"class":1070},[1056,2610,1362],{"class":1361},[1056,2612,2613],{"class":1217},"article_list.html",[1056,2615,1368],{"class":1361},[1056,2617,1093],{"class":1070},[1056,2619,1373],{"class":1070},[1056,2621,1368],{"class":1361},[1056,2623,2624],{"class":1217},"articles",[1056,2626,1368],{"class":1361},[1056,2628,1382],{"class":1070},[1056,2630,2631],{"class":1188}," articles",[1056,2633,1388],{"class":1070},[1038,2635,2637],{"id":2636},"per-user-conditional-processing","Per-User Conditional Processing",[1046,2639,2641],{"className":1048,"code":2640,"language":1050,"meta":1051,"style":1051},"def user_specific_etag(request):\n    # Generate ETag including user information\n    user_id = request.user.id if request.user.is_authenticated else 'anonymous'\n    articles = Article.objects.filter(author=request.user)\n    latest = articles.aggregate(Max('updated_at'))['updated_at__max']\n    content = f\"{user_id}{latest}\"\n    return hashlib.md5(content.encode()).hexdigest()\n\n@condition(etag_func=user_specific_etag)\ndef my_articles(request):\n    articles = Article.objects.filter(author=request.user)\n    return render(request, 'my_articles.html', {'articles': articles})\n",[1053,2642,2643,2656,2661,2703,2735,2770,2794,2818,2822,2839,2852,2882],{"__ignoreMap":1051},[1056,2644,2645,2647,2650,2652,2654],{"class":1058,"line":1059},[1056,2646,1146],{"class":1145},[1056,2648,2649],{"class":1149}," user_specific_etag",[1056,2651,1153],{"class":1070},[1056,2653,1157],{"class":1156},[1056,2655,1165],{"class":1070},[1056,2657,2658],{"class":1058,"line":1099},[1056,2659,2660],{"class":1138},"    # Generate ETag including user information\n",[1056,2662,2663,2666,2668,2670,2672,2675,2677,2679,2682,2684,2686,2688,2690,2693,2696,2698,2701],{"class":1058,"line":1120},[1056,2664,2665],{"class":1066},"    user_id ",[1056,2667,1174],{"class":1070},[1056,2669,2198],{"class":1066},[1056,2671,1071],{"class":1070},[1056,2673,2674],{"class":1182},"user",[1056,2676,1071],{"class":1070},[1056,2678,1725],{"class":1182},[1056,2680,2681],{"class":1062}," if",[1056,2683,2198],{"class":1066},[1056,2685,1071],{"class":1070},[1056,2687,2674],{"class":1182},[1056,2689,1071],{"class":1070},[1056,2691,2692],{"class":1182},"is_authenticated",[1056,2694,2695],{"class":1062}," else",[1056,2697,1362],{"class":1361},[1056,2699,2700],{"class":1217},"anonymous",[1056,2702,2029],{"class":1361},[1056,2704,2705,2707,2709,2711,2713,2715,2717,2720,2722,2725,2727,2729,2731,2733],{"class":1058,"line":1128},[1056,2706,2581],{"class":1066},[1056,2708,1174],{"class":1070},[1056,2710,1177],{"class":1066},[1056,2712,1071],{"class":1070},[1056,2714,1183],{"class":1182},[1056,2716,1071],{"class":1070},[1056,2718,2719],{"class":1188},"filter",[1056,2721,1153],{"class":1070},[1056,2723,2724],{"class":1194},"author",[1056,2726,1174],{"class":1070},[1056,2728,1157],{"class":1188},[1056,2730,1071],{"class":1070},[1056,2732,2674],{"class":1182},[1056,2734,1203],{"class":1070},[1056,2736,2737,2740,2742,2744,2746,2748,2750,2752,2754,2756,2758,2760,2762,2764,2766,2768],{"class":1058,"line":1135},[1056,2738,2739],{"class":1066},"    latest ",[1056,2741,1174],{"class":1070},[1056,2743,2631],{"class":1066},[1056,2745,1071],{"class":1070},[1056,2747,2382],{"class":1188},[1056,2749,1153],{"class":1070},[1056,2751,2387],{"class":1188},[1056,2753,1153],{"class":1070},[1056,2755,1368],{"class":1361},[1056,2757,1240],{"class":1217},[1056,2759,1368],{"class":1361},[1056,2761,2398],{"class":1070},[1056,2763,1368],{"class":1361},[1056,2765,2403],{"class":1217},[1056,2767,1368],{"class":1361},[1056,2769,2408],{"class":1070},[1056,2771,2772,2774,2776,2778,2780,2782,2785,2787,2790,2792],{"class":1058,"line":1142},[1056,2773,1209],{"class":1066},[1056,2775,1174],{"class":1070},[1056,2777,1214],{"class":1145},[1056,2779,1218],{"class":1217},[1056,2781,1222],{"class":1221},[1056,2783,2784],{"class":1066},"user_id",[1056,2786,1233],{"class":1221},[1056,2788,2789],{"class":1066},"latest",[1056,2791,1243],{"class":1221},[1056,2793,1246],{"class":1217},[1056,2795,2796,2798,2800,2802,2804,2806,2808,2810,2812,2814,2816],{"class":1058,"line":1168},[1056,2797,1252],{"class":1062},[1056,2799,1255],{"class":1066},[1056,2801,1071],{"class":1070},[1056,2803,1260],{"class":1188},[1056,2805,1153],{"class":1070},[1056,2807,1265],{"class":1188},[1056,2809,1071],{"class":1070},[1056,2811,1270],{"class":1188},[1056,2813,1273],{"class":1070},[1056,2815,1276],{"class":1188},[1056,2817,1279],{"class":1070},[1056,2819,2820],{"class":1058,"line":1206},[1056,2821,1132],{"emptyLinePlaceholder":1131},[1056,2823,2824,2826,2828,2830,2832,2834,2837],{"class":1058,"line":1249},[1056,2825,1290],{"class":1070},[1056,2827,1814],{"class":1149},[1056,2829,1153],{"class":1070},[1056,2831,1819],{"class":1194},[1056,2833,1174],{"class":1070},[1056,2835,2836],{"class":1188},"user_specific_etag",[1056,2838,1203],{"class":1070},[1056,2840,2841,2843,2846,2848,2850],{"class":1058,"line":1282},[1056,2842,1146],{"class":1145},[1056,2844,2845],{"class":1149}," my_articles",[1056,2847,1153],{"class":1070},[1056,2849,1157],{"class":1156},[1056,2851,1165],{"class":1070},[1056,2853,2854,2856,2858,2860,2862,2864,2866,2868,2870,2872,2874,2876,2878,2880],{"class":1058,"line":1287},[1056,2855,2581],{"class":1066},[1056,2857,1174],{"class":1070},[1056,2859,1177],{"class":1066},[1056,2861,1071],{"class":1070},[1056,2863,1183],{"class":1182},[1056,2865,1071],{"class":1070},[1056,2867,2719],{"class":1188},[1056,2869,1153],{"class":1070},[1056,2871,2724],{"class":1194},[1056,2873,1174],{"class":1070},[1056,2875,1157],{"class":1188},[1056,2877,1071],{"class":1070},[1056,2879,2674],{"class":1182},[1056,2881,1203],{"class":1070},[1056,2883,2884,2886,2888,2890,2892,2894,2896,2899,2901,2903,2905,2907,2909,2911,2913,2915],{"class":1058,"line":1303},[1056,2885,1252],{"class":1062},[1056,2887,1352],{"class":1188},[1056,2889,1153],{"class":1070},[1056,2891,1157],{"class":1188},[1056,2893,1093],{"class":1070},[1056,2895,1362],{"class":1361},[1056,2897,2898],{"class":1217},"my_articles.html",[1056,2900,1368],{"class":1361},[1056,2902,1093],{"class":1070},[1056,2904,1373],{"class":1070},[1056,2906,1368],{"class":1361},[1056,2908,2624],{"class":1217},[1056,2910,1368],{"class":1361},[1056,2912,1382],{"class":1070},[1056,2914,2631],{"class":1188},[1056,2916,1388],{"class":1070},[1030,2918,2920],{"id":2919},"vary-headers","Vary Headers",[1026,2922,2923],{},"Control caching based on request headers:",[1046,2925,2927],{"className":1048,"code":2926,"language":1050,"meta":1051,"style":1051},"from django.views.decorators.vary import vary_on_headers, vary_on_cookie\n\n@vary_on_headers('Accept-Language')\n@condition(etag_func=article_etag)\ndef article_detail(request, article_id):\n    # Response varies by Accept-Language header\n    article = get_object_or_404(Article, pk=article_id)\n    return render(request, 'article_detail.html', {'article': article})\n\n@vary_on_cookie\ndef user_dashboard(request):\n    # Response varies by cookies (user-specific)\n    return render(request, 'dashboard.html')\n",[1053,2928,2929,2958,2962,2980,2996,3012,3017,3039,3073,3077,3084,3097,3102],{"__ignoreMap":1051},[1056,2930,2931,2933,2935,2937,2939,2941,2943,2945,2948,2950,2953,2955],{"class":1058,"line":1059},[1056,2932,1063],{"class":1062},[1056,2934,1067],{"class":1066},[1056,2936,1071],{"class":1070},[1056,2938,1074],{"class":1066},[1056,2940,1071],{"class":1070},[1056,2942,1079],{"class":1066},[1056,2944,1071],{"class":1070},[1056,2946,2947],{"class":1066},"vary ",[1056,2949,1087],{"class":1062},[1056,2951,2952],{"class":1066}," vary_on_headers",[1056,2954,1093],{"class":1070},[1056,2956,2957],{"class":1066}," vary_on_cookie\n",[1056,2959,2960],{"class":1058,"line":1099},[1056,2961,1132],{"emptyLinePlaceholder":1131},[1056,2963,2964,2966,2969,2971,2973,2976,2978],{"class":1058,"line":1120},[1056,2965,1290],{"class":1070},[1056,2967,2968],{"class":1149},"vary_on_headers",[1056,2970,1153],{"class":1070},[1056,2972,1368],{"class":1361},[1056,2974,2975],{"class":1217},"Accept-Language",[1056,2977,1368],{"class":1361},[1056,2979,1203],{"class":1070},[1056,2981,2982,2984,2986,2988,2990,2992,2994],{"class":1058,"line":1128},[1056,2983,1290],{"class":1070},[1056,2985,1814],{"class":1149},[1056,2987,1153],{"class":1070},[1056,2989,1819],{"class":1194},[1056,2991,1174],{"class":1070},[1056,2993,1824],{"class":1188},[1056,2995,1203],{"class":1070},[1056,2997,2998,3000,3002,3004,3006,3008,3010],{"class":1058,"line":1135},[1056,2999,1146],{"class":1145},[1056,3001,1308],{"class":1149},[1056,3003,1153],{"class":1070},[1056,3005,1157],{"class":1156},[1056,3007,1093],{"class":1070},[1056,3009,1162],{"class":1156},[1056,3011,1165],{"class":1070},[1056,3013,3014],{"class":1058,"line":1142},[1056,3015,3016],{"class":1138},"    # Response varies by Accept-Language header\n",[1056,3018,3019,3021,3023,3025,3027,3029,3031,3033,3035,3037],{"class":1058,"line":1168},[1056,3020,1171],{"class":1066},[1056,3022,1174],{"class":1070},[1056,3024,1328],{"class":1188},[1056,3026,1153],{"class":1070},[1056,3028,1333],{"class":1188},[1056,3030,1093],{"class":1070},[1056,3032,1338],{"class":1194},[1056,3034,1174],{"class":1070},[1056,3036,1200],{"class":1188},[1056,3038,1203],{"class":1070},[1056,3040,3041,3043,3045,3047,3049,3051,3053,3055,3057,3059,3061,3063,3065,3067,3069,3071],{"class":1058,"line":1206},[1056,3042,1252],{"class":1062},[1056,3044,1352],{"class":1188},[1056,3046,1153],{"class":1070},[1056,3048,1157],{"class":1188},[1056,3050,1093],{"class":1070},[1056,3052,1362],{"class":1361},[1056,3054,1365],{"class":1217},[1056,3056,1368],{"class":1361},[1056,3058,1093],{"class":1070},[1056,3060,1373],{"class":1070},[1056,3062,1368],{"class":1361},[1056,3064,1225],{"class":1217},[1056,3066,1368],{"class":1361},[1056,3068,1382],{"class":1070},[1056,3070,1385],{"class":1188},[1056,3072,1388],{"class":1070},[1056,3074,3075],{"class":1058,"line":1249},[1056,3076,1132],{"emptyLinePlaceholder":1131},[1056,3078,3079,3081],{"class":1058,"line":1282},[1056,3080,1290],{"class":1070},[1056,3082,3083],{"class":1149},"vary_on_cookie\n",[1056,3085,3086,3088,3091,3093,3095],{"class":1058,"line":1287},[1056,3087,1146],{"class":1145},[1056,3089,3090],{"class":1149}," user_dashboard",[1056,3092,1153],{"class":1070},[1056,3094,1157],{"class":1156},[1056,3096,1165],{"class":1070},[1056,3098,3099],{"class":1058,"line":1303},[1056,3100,3101],{"class":1138},"    # Response varies by cookies (user-specific)\n",[1056,3103,3104,3106,3108,3110,3112,3114,3116,3119,3121],{"class":1058,"line":1321},[1056,3105,1252],{"class":1062},[1056,3107,1352],{"class":1188},[1056,3109,1153],{"class":1070},[1056,3111,1157],{"class":1188},[1056,3113,1093],{"class":1070},[1056,3115,1362],{"class":1361},[1056,3117,3118],{"class":1217},"dashboard.html",[1056,3120,1368],{"class":1361},[1056,3122,1203],{"class":1070},[1030,3124,3126],{"id":3125},"cache-control","Cache Control",[1046,3128,3130],{"className":1048,"code":3129,"language":1050,"meta":1051,"style":1051},"from django.views.decorators.cache import cache_control, never_cache\n\n@cache_control(max_age=3600, public=True)\n@condition(etag_func=article_etag)\ndef article_detail(request, article_id):\n    # Cacheable for 1 hour\n    article = get_object_or_404(Article, pk=article_id)\n    return render(request, 'article_detail.html', {'article': article})\n\n@never_cache\ndef sensitive_data(request):\n    # Never cache this response\n    return render(request, 'sensitive.html')\n\n@cache_control(private=True, max_age=600)\ndef user_profile(request):\n    # Private cache for 10 minutes\n    return render(request, 'profile.html')\n",[1053,3131,3132,3161,3165,3196,3212,3228,3233,3255,3289,3293,3300,3313,3318,3339,3343,3370,3383,3388],{"__ignoreMap":1051},[1056,3133,3134,3136,3138,3140,3142,3144,3146,3148,3151,3153,3156,3158],{"class":1058,"line":1059},[1056,3135,1063],{"class":1062},[1056,3137,1067],{"class":1066},[1056,3139,1071],{"class":1070},[1056,3141,1074],{"class":1066},[1056,3143,1071],{"class":1070},[1056,3145,1079],{"class":1066},[1056,3147,1071],{"class":1070},[1056,3149,3150],{"class":1066},"cache ",[1056,3152,1087],{"class":1062},[1056,3154,3155],{"class":1066}," cache_control",[1056,3157,1093],{"class":1070},[1056,3159,3160],{"class":1066}," never_cache\n",[1056,3162,3163],{"class":1058,"line":1099},[1056,3164,1132],{"emptyLinePlaceholder":1131},[1056,3166,3167,3169,3172,3174,3177,3179,3183,3185,3188,3190,3194],{"class":1058,"line":1120},[1056,3168,1290],{"class":1070},[1056,3170,3171],{"class":1149},"cache_control",[1056,3173,1153],{"class":1070},[1056,3175,3176],{"class":1194},"max_age",[1056,3178,1174],{"class":1070},[1056,3180,3182],{"class":3181},"s7CZa","3600",[1056,3184,1093],{"class":1070},[1056,3186,3187],{"class":1194}," public",[1056,3189,1174],{"class":1070},[1056,3191,3193],{"class":3192},"s8XtY","True",[1056,3195,1203],{"class":1070},[1056,3197,3198,3200,3202,3204,3206,3208,3210],{"class":1058,"line":1128},[1056,3199,1290],{"class":1070},[1056,3201,1814],{"class":1149},[1056,3203,1153],{"class":1070},[1056,3205,1819],{"class":1194},[1056,3207,1174],{"class":1070},[1056,3209,1824],{"class":1188},[1056,3211,1203],{"class":1070},[1056,3213,3214,3216,3218,3220,3222,3224,3226],{"class":1058,"line":1135},[1056,3215,1146],{"class":1145},[1056,3217,1308],{"class":1149},[1056,3219,1153],{"class":1070},[1056,3221,1157],{"class":1156},[1056,3223,1093],{"class":1070},[1056,3225,1162],{"class":1156},[1056,3227,1165],{"class":1070},[1056,3229,3230],{"class":1058,"line":1142},[1056,3231,3232],{"class":1138},"    # Cacheable for 1 hour\n",[1056,3234,3235,3237,3239,3241,3243,3245,3247,3249,3251,3253],{"class":1058,"line":1168},[1056,3236,1171],{"class":1066},[1056,3238,1174],{"class":1070},[1056,3240,1328],{"class":1188},[1056,3242,1153],{"class":1070},[1056,3244,1333],{"class":1188},[1056,3246,1093],{"class":1070},[1056,3248,1338],{"class":1194},[1056,3250,1174],{"class":1070},[1056,3252,1200],{"class":1188},[1056,3254,1203],{"class":1070},[1056,3256,3257,3259,3261,3263,3265,3267,3269,3271,3273,3275,3277,3279,3281,3283,3285,3287],{"class":1058,"line":1206},[1056,3258,1252],{"class":1062},[1056,3260,1352],{"class":1188},[1056,3262,1153],{"class":1070},[1056,3264,1157],{"class":1188},[1056,3266,1093],{"class":1070},[1056,3268,1362],{"class":1361},[1056,3270,1365],{"class":1217},[1056,3272,1368],{"class":1361},[1056,3274,1093],{"class":1070},[1056,3276,1373],{"class":1070},[1056,3278,1368],{"class":1361},[1056,3280,1225],{"class":1217},[1056,3282,1368],{"class":1361},[1056,3284,1382],{"class":1070},[1056,3286,1385],{"class":1188},[1056,3288,1388],{"class":1070},[1056,3290,3291],{"class":1058,"line":1249},[1056,3292,1132],{"emptyLinePlaceholder":1131},[1056,3294,3295,3297],{"class":1058,"line":1282},[1056,3296,1290],{"class":1070},[1056,3298,3299],{"class":1149},"never_cache\n",[1056,3301,3302,3304,3307,3309,3311],{"class":1058,"line":1287},[1056,3303,1146],{"class":1145},[1056,3305,3306],{"class":1149}," sensitive_data",[1056,3308,1153],{"class":1070},[1056,3310,1157],{"class":1156},[1056,3312,1165],{"class":1070},[1056,3314,3315],{"class":1058,"line":1303},[1056,3316,3317],{"class":1138},"    # Never cache this response\n",[1056,3319,3320,3322,3324,3326,3328,3330,3332,3335,3337],{"class":1058,"line":1321},[1056,3321,1252],{"class":1062},[1056,3323,1352],{"class":1188},[1056,3325,1153],{"class":1070},[1056,3327,1157],{"class":1188},[1056,3329,1093],{"class":1070},[1056,3331,1362],{"class":1361},[1056,3333,3334],{"class":1217},"sensitive.html",[1056,3336,1368],{"class":1361},[1056,3338,1203],{"class":1070},[1056,3340,3341],{"class":1058,"line":1347},[1056,3342,1132],{"emptyLinePlaceholder":1131},[1056,3344,3345,3347,3349,3351,3354,3356,3358,3360,3363,3365,3368],{"class":1058,"line":1391},[1056,3346,1290],{"class":1070},[1056,3348,3171],{"class":1149},[1056,3350,1153],{"class":1070},[1056,3352,3353],{"class":1194},"private",[1056,3355,1174],{"class":1070},[1056,3357,3193],{"class":3192},[1056,3359,1093],{"class":1070},[1056,3361,3362],{"class":1194}," max_age",[1056,3364,1174],{"class":1070},[1056,3366,3367],{"class":3181},"600",[1056,3369,1203],{"class":1070},[1056,3371,3372,3374,3377,3379,3381],{"class":1058,"line":1396},[1056,3373,1146],{"class":1145},[1056,3375,3376],{"class":1149}," user_profile",[1056,3378,1153],{"class":1070},[1056,3380,1157],{"class":1156},[1056,3382,1165],{"class":1070},[1056,3384,3385],{"class":1058,"line":1402},[1056,3386,3387],{"class":1138},"    # Private cache for 10 minutes\n",[1056,3389,3390,3392,3394,3396,3398,3400,3402,3405,3407],{"class":1058,"line":1408},[1056,3391,1252],{"class":1062},[1056,3393,1352],{"class":1188},[1056,3395,1153],{"class":1070},[1056,3397,1157],{"class":1188},[1056,3399,1093],{"class":1070},[1056,3401,1362],{"class":1361},[1056,3403,3404],{"class":1217},"profile.html",[1056,3406,1368],{"class":1361},[1056,3408,1203],{"class":1070},[1030,3410,3412],{"id":3411},"middleware-for-conditional-processing","Middleware for Conditional Processing",[1046,3414,3416],{"className":1048,"code":3415,"language":1050,"meta":1051,"style":1051},"from django.utils.cache import get_conditional_response\nfrom django.utils.http import http_date\n\nclass ConditionalProcessingMiddleware:\n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        response = self.get_response(request)\n        \n        # Add conditional processing headers\n        if hasattr(response, 'etag'):\n            response['ETag'] = response.etag\n        \n        if hasattr(response, 'last_modified'):\n            response['Last-Modified'] = http_date(response.last_modified.timestamp())\n        \n        # Check for conditional request\n        conditional_response = get_conditional_response(\n            request,\n            etag=getattr(response, 'etag', None),\n            last_modified=getattr(response, 'last_modified', None)\n        )\n        \n        return conditional_response or response\n",[1053,3417,3418,3437,3455,3459,3469,3488,3504,3508,3525,3544,3549,3554,3577,3605,3609,3629,3665,3669,3674,3686,3694,3724,3751,3756,3760],{"__ignoreMap":1051},[1056,3419,3420,3422,3424,3426,3428,3430,3432,3434],{"class":1058,"line":1059},[1056,3421,1063],{"class":1062},[1056,3423,1067],{"class":1066},[1056,3425,1071],{"class":1070},[1056,3427,1108],{"class":1066},[1056,3429,1071],{"class":1070},[1056,3431,3150],{"class":1066},[1056,3433,1087],{"class":1062},[1056,3435,3436],{"class":1066}," get_conditional_response\n",[1056,3438,3439,3441,3443,3445,3447,3449,3451,3453],{"class":1058,"line":1099},[1056,3440,1063],{"class":1062},[1056,3442,1067],{"class":1066},[1056,3444,1071],{"class":1070},[1056,3446,1108],{"class":1066},[1056,3448,1071],{"class":1070},[1056,3450,1084],{"class":1066},[1056,3452,1087],{"class":1062},[1056,3454,1117],{"class":1066},[1056,3456,3457],{"class":1058,"line":1120},[1056,3458,1132],{"emptyLinePlaceholder":1131},[1056,3460,3461,3463,3466],{"class":1058,"line":1128},[1056,3462,1993],{"class":1145},[1056,3464,3465],{"class":1996}," ConditionalProcessingMiddleware",[1056,3467,3468],{"class":1070},":\n",[1056,3470,3471,3473,3477,3479,3481,3483,3486],{"class":1058,"line":1135},[1056,3472,2039],{"class":1145},[1056,3474,3476],{"class":3475},"sJdAF"," __init__",[1056,3478,1153],{"class":1070},[1056,3480,2048],{"class":2047},[1056,3482,1093],{"class":1070},[1056,3484,3485],{"class":1156}," get_response",[1056,3487,1165],{"class":1070},[1056,3489,3490,3493,3495,3498,3501],{"class":1058,"line":1142},[1056,3491,3492],{"class":2060},"        self",[1056,3494,1071],{"class":1070},[1056,3496,3497],{"class":1182},"get_response",[1056,3499,3500],{"class":1070}," =",[1056,3502,3503],{"class":1066}," get_response\n",[1056,3505,3506],{"class":1058,"line":1168},[1056,3507,2034],{"class":1066},[1056,3509,3510,3512,3515,3517,3519,3521,3523],{"class":1058,"line":1206},[1056,3511,2039],{"class":1145},[1056,3513,3514],{"class":3475}," __call__",[1056,3516,1153],{"class":1070},[1056,3518,2048],{"class":2047},[1056,3520,1093],{"class":1070},[1056,3522,2198],{"class":1156},[1056,3524,1165],{"class":1070},[1056,3526,3527,3530,3532,3534,3536,3538,3540,3542],{"class":1058,"line":1249},[1056,3528,3529],{"class":1066},"        response ",[1056,3531,1174],{"class":1070},[1056,3533,2061],{"class":2060},[1056,3535,1071],{"class":1070},[1056,3537,3497],{"class":1188},[1056,3539,1153],{"class":1070},[1056,3541,1157],{"class":1188},[1056,3543,1203],{"class":1070},[1056,3545,3546],{"class":1058,"line":1282},[1056,3547,3548],{"class":1066},"        \n",[1056,3550,3551],{"class":1058,"line":1287},[1056,3552,3553],{"class":1138},"        # Add conditional processing headers\n",[1056,3555,3556,3559,3562,3564,3567,3569,3571,3573,3575],{"class":1058,"line":1303},[1056,3557,3558],{"class":1062},"        if",[1056,3560,3561],{"class":3475}," hasattr",[1056,3563,1153],{"class":1070},[1056,3565,3566],{"class":1188},"response",[1056,3568,1093],{"class":1070},[1056,3570,1362],{"class":1361},[1056,3572,1293],{"class":1217},[1056,3574,1368],{"class":1361},[1056,3576,1165],{"class":1070},[1056,3578,3579,3582,3585,3587,3590,3592,3595,3597,3600,3602],{"class":1058,"line":1321},[1056,3580,3581],{"class":1066},"            response",[1056,3583,3584],{"class":1070},"[",[1056,3586,1368],{"class":1361},[1056,3588,3589],{"class":1217},"ETag",[1056,3591,1368],{"class":1361},[1056,3593,3594],{"class":1070},"]",[1056,3596,3500],{"class":1070},[1056,3598,3599],{"class":1066}," response",[1056,3601,1071],{"class":1070},[1056,3603,3604],{"class":1182},"etag\n",[1056,3606,3607],{"class":1058,"line":1347},[1056,3608,3548],{"class":1066},[1056,3610,3611,3613,3615,3617,3619,3621,3623,3625,3627],{"class":1058,"line":1391},[1056,3612,3558],{"class":1062},[1056,3614,3561],{"class":3475},[1056,3616,1153],{"class":1070},[1056,3618,3566],{"class":1188},[1056,3620,1093],{"class":1070},[1056,3622,1362],{"class":1361},[1056,3624,1518],{"class":1217},[1056,3626,1368],{"class":1361},[1056,3628,1165],{"class":1070},[1056,3630,3631,3633,3635,3637,3640,3642,3644,3646,3649,3651,3653,3655,3657,3659,3662],{"class":1058,"line":1396},[1056,3632,3581],{"class":1066},[1056,3634,3584],{"class":1070},[1056,3636,1368],{"class":1361},[1056,3638,3639],{"class":1217},"Last-Modified",[1056,3641,1368],{"class":1361},[1056,3643,3594],{"class":1070},[1056,3645,3500],{"class":1070},[1056,3647,3648],{"class":1188}," http_date",[1056,3650,1153],{"class":1070},[1056,3652,3566],{"class":1188},[1056,3654,1071],{"class":1070},[1056,3656,1518],{"class":1182},[1056,3658,1071],{"class":1070},[1056,3660,3661],{"class":1188},"timestamp",[1056,3663,3664],{"class":1070},"())\n",[1056,3666,3667],{"class":1058,"line":1402},[1056,3668,3548],{"class":1066},[1056,3670,3671],{"class":1058,"line":1408},[1056,3672,3673],{"class":1138},"        # Check for conditional request\n",[1056,3675,3676,3679,3681,3684],{"class":1058,"line":1414},[1056,3677,3678],{"class":1066},"        conditional_response ",[1056,3680,1174],{"class":1070},[1056,3682,3683],{"class":1188}," get_conditional_response",[1056,3685,2184],{"class":1070},[1056,3687,3688,3691],{"class":1058,"line":2187},[1056,3689,3690],{"class":1188},"            request",[1056,3692,3693],{"class":1070},",\n",[1056,3695,3696,3699,3701,3704,3706,3708,3710,3712,3714,3716,3718,3721],{"class":1058,"line":2218},[1056,3697,3698],{"class":1194},"            etag",[1056,3700,1174],{"class":1070},[1056,3702,3703],{"class":3475},"getattr",[1056,3705,1153],{"class":1070},[1056,3707,3566],{"class":1188},[1056,3709,1093],{"class":1070},[1056,3711,1362],{"class":1361},[1056,3713,1293],{"class":1217},[1056,3715,1368],{"class":1361},[1056,3717,1093],{"class":1070},[1056,3719,3720],{"class":3192}," None",[1056,3722,3723],{"class":1070},"),\n",[1056,3725,3726,3729,3731,3733,3735,3737,3739,3741,3743,3745,3747,3749],{"class":1058,"line":2245},[1056,3727,3728],{"class":1194},"            last_modified",[1056,3730,1174],{"class":1070},[1056,3732,3703],{"class":3475},[1056,3734,1153],{"class":1070},[1056,3736,3566],{"class":1188},[1056,3738,1093],{"class":1070},[1056,3740,1362],{"class":1361},[1056,3742,1518],{"class":1217},[1056,3744,1368],{"class":1361},[1056,3746,1093],{"class":1070},[1056,3748,3720],{"class":3192},[1056,3750,1203],{"class":1070},[1056,3752,3753],{"class":1058,"line":2251},[1056,3754,3755],{"class":1070},"        )\n",[1056,3757,3758],{"class":1058,"line":2282},[1056,3759,3548],{"class":1066},[1056,3761,3763,3765,3768,3771],{"class":1058,"line":3762},25,[1056,3764,2104],{"class":1062},[1056,3766,3767],{"class":1066}," conditional_response ",[1056,3769,3770],{"class":2265},"or",[1056,3772,3773],{"class":1066}," response\n",[1030,3775,3777],{"id":3776},"api-views-with-conditional-processing","API Views with Conditional Processing",[1046,3779,3781],{"className":1048,"code":3780,"language":1050,"meta":1051,"style":1051},"from rest_framework.views import APIView\nfrom rest_framework.response import Response\nfrom django.utils.decorators import method_decorator\nfrom django.views.decorators.http import condition\n\nclass ArticleAPIView(APIView):\n    def get_etag(self, request, pk):\n        article = Article.objects.get(pk=pk)\n        return hashlib.md5(f\"{article.id}{article.updated_at}\".encode()).hexdigest()\n    \n    def get_last_modified(self, request, pk):\n        article = Article.objects.get(pk=pk)\n        return article.updated_at\n    \n    @method_decorator(condition(\n        etag_func=lambda request, pk: ArticleAPIView().get_etag(request, pk),\n        last_modified_func=lambda request, pk: ArticleAPIView().get_last_modified(request, pk)\n    ))\n    def get(self, request, pk):\n        article = get_object_or_404(Article, pk=pk)\n        serializer = ArticleSerializer(article)\n        return Response(serializer.data)\n",[1053,3782,3783,3800,3816,3834,3856,3860,3874,3894,3920,3966,3970,3990,4016,4026,4030,4042,4074,4106,4110,4131,4153,4169],{"__ignoreMap":1051},[1056,3784,3785,3787,3790,3792,3795,3797],{"class":1058,"line":1059},[1056,3786,1063],{"class":1062},[1056,3788,3789],{"class":1066}," rest_framework",[1056,3791,1071],{"class":1070},[1056,3793,3794],{"class":1066},"views ",[1056,3796,1087],{"class":1062},[1056,3798,3799],{"class":1066}," APIView\n",[1056,3801,3802,3804,3806,3808,3811,3813],{"class":1058,"line":1099},[1056,3803,1063],{"class":1062},[1056,3805,3789],{"class":1066},[1056,3807,1071],{"class":1070},[1056,3809,3810],{"class":1066},"response ",[1056,3812,1087],{"class":1062},[1056,3814,3815],{"class":1066}," Response\n",[1056,3817,3818,3820,3822,3824,3826,3828,3830,3832],{"class":1058,"line":1120},[1056,3819,1063],{"class":1062},[1056,3821,1067],{"class":1066},[1056,3823,1071],{"class":1070},[1056,3825,1108],{"class":1066},[1056,3827,1071],{"class":1070},[1056,3829,1951],{"class":1066},[1056,3831,1087],{"class":1062},[1056,3833,1956],{"class":1066},[1056,3835,3836,3838,3840,3842,3844,3846,3848,3850,3852,3854],{"class":1058,"line":1128},[1056,3837,1063],{"class":1062},[1056,3839,1067],{"class":1066},[1056,3841,1071],{"class":1070},[1056,3843,1074],{"class":1066},[1056,3845,1071],{"class":1070},[1056,3847,1079],{"class":1066},[1056,3849,1071],{"class":1070},[1056,3851,1084],{"class":1066},[1056,3853,1087],{"class":1062},[1056,3855,1652],{"class":1066},[1056,3857,3858],{"class":1058,"line":1135},[1056,3859,1132],{"emptyLinePlaceholder":1131},[1056,3861,3862,3864,3867,3869,3872],{"class":1058,"line":1142},[1056,3863,1993],{"class":1145},[1056,3865,3866],{"class":1996}," ArticleAPIView",[1056,3868,1153],{"class":1070},[1056,3870,3871],{"class":2002},"APIView",[1056,3873,1165],{"class":1070},[1056,3875,3876,3878,3880,3882,3884,3886,3888,3890,3892],{"class":1058,"line":1168},[1056,3877,2039],{"class":1145},[1056,3879,2042],{"class":1149},[1056,3881,1153],{"class":1070},[1056,3883,2048],{"class":2047},[1056,3885,1093],{"class":1070},[1056,3887,2198],{"class":1156},[1056,3889,1093],{"class":1070},[1056,3891,1338],{"class":1156},[1056,3893,1165],{"class":1070},[1056,3895,3896,3898,3900,3902,3904,3906,3908,3910,3912,3914,3916,3918],{"class":1058,"line":1206},[1056,3897,2055],{"class":1066},[1056,3899,1174],{"class":1070},[1056,3901,1177],{"class":1066},[1056,3903,1071],{"class":1070},[1056,3905,1183],{"class":1182},[1056,3907,1071],{"class":1070},[1056,3909,1189],{"class":1188},[1056,3911,1153],{"class":1070},[1056,3913,1195],{"class":1194},[1056,3915,1174],{"class":1070},[1056,3917,1195],{"class":1188},[1056,3919,1203],{"class":1070},[1056,3921,3922,3924,3926,3928,3930,3932,3934,3936,3938,3940,3942,3944,3946,3948,3950,3952,3954,3956,3958,3960,3962,3964],{"class":1058,"line":1249},[1056,3923,2104],{"class":1062},[1056,3925,1255],{"class":1066},[1056,3927,1071],{"class":1070},[1056,3929,1260],{"class":1188},[1056,3931,1153],{"class":1070},[1056,3933,1714],{"class":1145},[1056,3935,1218],{"class":1217},[1056,3937,1222],{"class":1221},[1056,3939,1225],{"class":1188},[1056,3941,1071],{"class":1070},[1056,3943,1725],{"class":1182},[1056,3945,1233],{"class":1221},[1056,3947,1225],{"class":1188},[1056,3949,1071],{"class":1070},[1056,3951,1240],{"class":1182},[1056,3953,1243],{"class":1221},[1056,3955,1218],{"class":1217},[1056,3957,1071],{"class":1070},[1056,3959,1270],{"class":1188},[1056,3961,1273],{"class":1070},[1056,3963,1276],{"class":1188},[1056,3965,1279],{"class":1070},[1056,3967,3968],{"class":1058,"line":1282},[1056,3969,2034],{"class":1066},[1056,3971,3972,3974,3976,3978,3980,3982,3984,3986,3988],{"class":1058,"line":1287},[1056,3973,2039],{"class":1145},[1056,3975,2135],{"class":1149},[1056,3977,1153],{"class":1070},[1056,3979,2048],{"class":2047},[1056,3981,1093],{"class":1070},[1056,3983,2198],{"class":1156},[1056,3985,1093],{"class":1070},[1056,3987,1338],{"class":1156},[1056,3989,1165],{"class":1070},[1056,3991,3992,3994,3996,3998,4000,4002,4004,4006,4008,4010,4012,4014],{"class":1058,"line":1303},[1056,3993,2055],{"class":1066},[1056,3995,1174],{"class":1070},[1056,3997,1177],{"class":1066},[1056,3999,1071],{"class":1070},[1056,4001,1183],{"class":1182},[1056,4003,1071],{"class":1070},[1056,4005,1189],{"class":1188},[1056,4007,1153],{"class":1070},[1056,4009,1195],{"class":1194},[1056,4011,1174],{"class":1070},[1056,4013,1195],{"class":1188},[1056,4015,1203],{"class":1070},[1056,4017,4018,4020,4022,4024],{"class":1058,"line":1321},[1056,4019,2104],{"class":1062},[1056,4021,1385],{"class":1066},[1056,4023,1071],{"class":1070},[1056,4025,1507],{"class":1182},[1056,4027,4028],{"class":1058,"line":1347},[1056,4029,2034],{"class":1066},[1056,4031,4032,4034,4036,4038,4040],{"class":1058,"line":1391},[1056,4033,2174],{"class":1070},[1056,4035,2177],{"class":1149},[1056,4037,1153],{"class":1070},[1056,4039,1814],{"class":1188},[1056,4041,2184],{"class":1070},[1056,4043,4044,4046,4048,4050,4052,4054,4056,4058,4060,4062,4064,4066,4068,4070,4072],{"class":1058,"line":1396},[1056,4045,2190],{"class":1194},[1056,4047,1174],{"class":1070},[1056,4049,2195],{"class":1145},[1056,4051,2198],{"class":1156},[1056,4053,1093],{"class":1070},[1056,4055,1338],{"class":1156},[1056,4057,1382],{"class":1070},[1056,4059,3866],{"class":1188},[1056,4061,2209],{"class":1070},[1056,4063,2212],{"class":1188},[1056,4065,1153],{"class":1070},[1056,4067,1157],{"class":1188},[1056,4069,1093],{"class":1070},[1056,4071,1338],{"class":1188},[1056,4073,3723],{"class":1070},[1056,4075,4076,4078,4080,4082,4084,4086,4088,4090,4092,4094,4096,4098,4100,4102,4104],{"class":1058,"line":1402},[1056,4077,2221],{"class":1194},[1056,4079,1174],{"class":1070},[1056,4081,2195],{"class":1145},[1056,4083,2198],{"class":1156},[1056,4085,1093],{"class":1070},[1056,4087,1338],{"class":1156},[1056,4089,1382],{"class":1070},[1056,4091,3866],{"class":1188},[1056,4093,2209],{"class":1070},[1056,4095,2240],{"class":1188},[1056,4097,1153],{"class":1070},[1056,4099,1157],{"class":1188},[1056,4101,1093],{"class":1070},[1056,4103,1338],{"class":1188},[1056,4105,1203],{"class":1070},[1056,4107,4108],{"class":1058,"line":1408},[1056,4109,2248],{"class":1070},[1056,4111,4112,4114,4117,4119,4121,4123,4125,4127,4129],{"class":1058,"line":1414},[1056,4113,2039],{"class":1145},[1056,4115,4116],{"class":1149}," get",[1056,4118,1153],{"class":1070},[1056,4120,2048],{"class":2047},[1056,4122,1093],{"class":1070},[1056,4124,2198],{"class":1156},[1056,4126,1093],{"class":1070},[1056,4128,1338],{"class":1156},[1056,4130,1165],{"class":1070},[1056,4132,4133,4135,4137,4139,4141,4143,4145,4147,4149,4151],{"class":1058,"line":2187},[1056,4134,2055],{"class":1066},[1056,4136,1174],{"class":1070},[1056,4138,1328],{"class":1188},[1056,4140,1153],{"class":1070},[1056,4142,1333],{"class":1188},[1056,4144,1093],{"class":1070},[1056,4146,1338],{"class":1194},[1056,4148,1174],{"class":1070},[1056,4150,1195],{"class":1188},[1056,4152,1203],{"class":1070},[1056,4154,4155,4158,4160,4163,4165,4167],{"class":1058,"line":2218},[1056,4156,4157],{"class":1066},"        serializer ",[1056,4159,1174],{"class":1070},[1056,4161,4162],{"class":1188}," ArticleSerializer",[1056,4164,1153],{"class":1070},[1056,4166,1225],{"class":1188},[1056,4168,1203],{"class":1070},[1056,4170,4171,4173,4176,4178,4181,4183,4186],{"class":1058,"line":2245},[1056,4172,2104],{"class":1062},[1056,4174,4175],{"class":1188}," Response",[1056,4177,1153],{"class":1070},[1056,4179,4180],{"class":1188},"serializer",[1056,4182,1071],{"class":1070},[1056,4184,4185],{"class":1182},"data",[1056,4187,1203],{"class":1070},[1030,4189,4191],{"id":4190},"testing-conditional-views","Testing Conditional Views",[1046,4193,4195],{"className":1048,"code":4194,"language":1050,"meta":1051,"style":1051},"from django.test import TestCase, Client\nfrom django.utils import timezone\n\nclass ConditionalViewTests(TestCase):\n    def setUp(self):\n        self.client = Client()\n        self.article = Article.objects.create(\n            title='Test Article',\n            content='Test content',\n            updated_at=timezone.now()\n        )\n    \n    def test_etag_match_returns_304(self):\n        # First request to get ETag\n        response = self.client.get(f'/articles/{self.article.id}/')\n        etag = response['ETag']\n        \n        # Second request with If-None-Match\n        response = self.client.get(\n            f'/articles/{self.article.id}/',\n            HTTP_IF_NONE_MATCH=etag\n        )\n        self.assertEqual(response.status_code, 304)\n    \n    def test_modified_content_returns_200(self):\n        # First request\n        response = self.client.get(f'/articles/{self.article.id}/')\n        etag = response['ETag']\n        \n        # Modify article\n        self.article.title = 'Updated Title'\n        self.article.save()\n        \n        # Second request with old ETag\n        response = self.client.get(\n            f'/articles/{self.article.id}/',\n            HTTP_IF_NONE_MATCH=etag\n        )\n        self.assertEqual(response.status_code, 200)\n    \n    def test_last_modified_header(self):\n        response = self.client.get(f'/articles/{self.article.id}/')\n        self.assertIn('Last-Modified', response)\n        \n        # Request with If-Modified-Since\n        last_modified = response['Last-Modified']\n        response = self.client.get(\n            f'/articles/{self.article.id}/',\n            HTTP_IF_MODIFIED_SINCE=last_modified\n        )\n        self.assertEqual(response.status_code, 304)\n",[1053,4196,4197,4218,4234,4238,4252,4265,4281,4304,4320,4336,4353,4357,4361,4374,4379,4421,4440,4444,4449,4467,4492,4501,4505,4530,4534,4547,4553,4594,4613,4618,4624,4646,4662,4667,4673,4692,4717,4726,4731,4755,4760,4774,4815,4839,4844,4850,4870,4889,4914,4925,4930],{"__ignoreMap":1051},[1056,4198,4199,4201,4203,4205,4208,4210,4213,4215],{"class":1058,"line":1059},[1056,4200,1063],{"class":1062},[1056,4202,1067],{"class":1066},[1056,4204,1071],{"class":1070},[1056,4206,4207],{"class":1066},"test ",[1056,4209,1087],{"class":1062},[1056,4211,4212],{"class":1066}," TestCase",[1056,4214,1093],{"class":1070},[1056,4216,4217],{"class":1066}," Client\n",[1056,4219,4220,4222,4224,4226,4229,4231],{"class":1058,"line":1099},[1056,4221,1063],{"class":1062},[1056,4223,1067],{"class":1066},[1056,4225,1071],{"class":1070},[1056,4227,4228],{"class":1066},"utils ",[1056,4230,1087],{"class":1062},[1056,4232,4233],{"class":1066}," timezone\n",[1056,4235,4236],{"class":1058,"line":1120},[1056,4237,1132],{"emptyLinePlaceholder":1131},[1056,4239,4240,4242,4245,4247,4250],{"class":1058,"line":1128},[1056,4241,1993],{"class":1145},[1056,4243,4244],{"class":1996}," ConditionalViewTests",[1056,4246,1153],{"class":1070},[1056,4248,4249],{"class":2002},"TestCase",[1056,4251,1165],{"class":1070},[1056,4253,4254,4256,4259,4261,4263],{"class":1058,"line":1135},[1056,4255,2039],{"class":1145},[1056,4257,4258],{"class":1149}," setUp",[1056,4260,1153],{"class":1070},[1056,4262,2048],{"class":2047},[1056,4264,1165],{"class":1070},[1056,4266,4267,4269,4271,4274,4276,4279],{"class":1058,"line":1142},[1056,4268,3492],{"class":2060},[1056,4270,1071],{"class":1070},[1056,4272,4273],{"class":1182},"client",[1056,4275,3500],{"class":1070},[1056,4277,4278],{"class":1188}," Client",[1056,4280,1279],{"class":1070},[1056,4282,4283,4285,4287,4289,4291,4293,4295,4297,4299,4302],{"class":1058,"line":1168},[1056,4284,3492],{"class":2060},[1056,4286,1071],{"class":1070},[1056,4288,1225],{"class":1182},[1056,4290,3500],{"class":1070},[1056,4292,1177],{"class":1066},[1056,4294,1071],{"class":1070},[1056,4296,1183],{"class":1182},[1056,4298,1071],{"class":1070},[1056,4300,4301],{"class":1188},"create",[1056,4303,2184],{"class":1070},[1056,4305,4306,4309,4311,4313,4316,4318],{"class":1058,"line":1206},[1056,4307,4308],{"class":1194},"            title",[1056,4310,1174],{"class":1070},[1056,4312,1368],{"class":1361},[1056,4314,4315],{"class":1217},"Test Article",[1056,4317,1368],{"class":1361},[1056,4319,3693],{"class":1070},[1056,4321,4322,4325,4327,4329,4332,4334],{"class":1058,"line":1249},[1056,4323,4324],{"class":1194},"            content",[1056,4326,1174],{"class":1070},[1056,4328,1368],{"class":1361},[1056,4330,4331],{"class":1217},"Test content",[1056,4333,1368],{"class":1361},[1056,4335,3693],{"class":1070},[1056,4337,4338,4341,4343,4346,4348,4351],{"class":1058,"line":1282},[1056,4339,4340],{"class":1194},"            updated_at",[1056,4342,1174],{"class":1070},[1056,4344,4345],{"class":1188},"timezone",[1056,4347,1071],{"class":1070},[1056,4349,4350],{"class":1188},"now",[1056,4352,1279],{"class":1070},[1056,4354,4355],{"class":1058,"line":1287},[1056,4356,3755],{"class":1070},[1056,4358,4359],{"class":1058,"line":1303},[1056,4360,2034],{"class":1066},[1056,4362,4363,4365,4368,4370,4372],{"class":1058,"line":1321},[1056,4364,2039],{"class":1145},[1056,4366,4367],{"class":1149}," test_etag_match_returns_304",[1056,4369,1153],{"class":1070},[1056,4371,2048],{"class":2047},[1056,4373,1165],{"class":1070},[1056,4375,4376],{"class":1058,"line":1347},[1056,4377,4378],{"class":1138},"        # First request to get ETag\n",[1056,4380,4381,4383,4385,4387,4389,4391,4393,4395,4397,4399,4402,4404,4406,4408,4410,4412,4414,4416,4419],{"class":1058,"line":1391},[1056,4382,3529],{"class":1066},[1056,4384,1174],{"class":1070},[1056,4386,2061],{"class":2060},[1056,4388,1071],{"class":1070},[1056,4390,4273],{"class":1182},[1056,4392,1071],{"class":1070},[1056,4394,1189],{"class":1188},[1056,4396,1153],{"class":1070},[1056,4398,1714],{"class":1145},[1056,4400,4401],{"class":1217},"'/articles/",[1056,4403,1222],{"class":1221},[1056,4405,2048],{"class":2060},[1056,4407,1071],{"class":1070},[1056,4409,1225],{"class":1182},[1056,4411,1071],{"class":1070},[1056,4413,1725],{"class":1182},[1056,4415,1243],{"class":1221},[1056,4417,4418],{"class":1217},"/'",[1056,4420,1203],{"class":1070},[1056,4422,4423,4426,4428,4430,4432,4434,4436,4438],{"class":1058,"line":1396},[1056,4424,4425],{"class":1066},"        etag ",[1056,4427,1174],{"class":1070},[1056,4429,3599],{"class":1066},[1056,4431,3584],{"class":1070},[1056,4433,1368],{"class":1361},[1056,4435,3589],{"class":1217},[1056,4437,1368],{"class":1361},[1056,4439,2408],{"class":1070},[1056,4441,4442],{"class":1058,"line":1402},[1056,4443,3548],{"class":1066},[1056,4445,4446],{"class":1058,"line":1408},[1056,4447,4448],{"class":1138},"        # Second request with If-None-Match\n",[1056,4450,4451,4453,4455,4457,4459,4461,4463,4465],{"class":1058,"line":1414},[1056,4452,3529],{"class":1066},[1056,4454,1174],{"class":1070},[1056,4456,2061],{"class":2060},[1056,4458,1071],{"class":1070},[1056,4460,4273],{"class":1182},[1056,4462,1071],{"class":1070},[1056,4464,1189],{"class":1188},[1056,4466,2184],{"class":1070},[1056,4468,4469,4472,4474,4476,4478,4480,4482,4484,4486,4488,4490],{"class":1058,"line":2187},[1056,4470,4471],{"class":1145},"            f",[1056,4473,4401],{"class":1217},[1056,4475,1222],{"class":1221},[1056,4477,2048],{"class":2060},[1056,4479,1071],{"class":1070},[1056,4481,1225],{"class":1182},[1056,4483,1071],{"class":1070},[1056,4485,1725],{"class":1182},[1056,4487,1243],{"class":1221},[1056,4489,4418],{"class":1217},[1056,4491,3693],{"class":1070},[1056,4493,4494,4497,4499],{"class":1058,"line":2218},[1056,4495,4496],{"class":1194},"            HTTP_IF_NONE_MATCH",[1056,4498,1174],{"class":1070},[1056,4500,3604],{"class":1188},[1056,4502,4503],{"class":1058,"line":2245},[1056,4504,3755],{"class":1070},[1056,4506,4507,4509,4511,4514,4516,4518,4520,4523,4525,4528],{"class":1058,"line":2251},[1056,4508,3492],{"class":2060},[1056,4510,1071],{"class":1070},[1056,4512,4513],{"class":1188},"assertEqual",[1056,4515,1153],{"class":1070},[1056,4517,3566],{"class":1188},[1056,4519,1071],{"class":1070},[1056,4521,4522],{"class":1182},"status_code",[1056,4524,1093],{"class":1070},[1056,4526,4527],{"class":3181}," 304",[1056,4529,1203],{"class":1070},[1056,4531,4532],{"class":1058,"line":2282},[1056,4533,2034],{"class":1066},[1056,4535,4536,4538,4541,4543,4545],{"class":1058,"line":3762},[1056,4537,2039],{"class":1145},[1056,4539,4540],{"class":1149}," test_modified_content_returns_200",[1056,4542,1153],{"class":1070},[1056,4544,2048],{"class":2047},[1056,4546,1165],{"class":1070},[1056,4548,4550],{"class":1058,"line":4549},26,[1056,4551,4552],{"class":1138},"        # First request\n",[1056,4554,4556,4558,4560,4562,4564,4566,4568,4570,4572,4574,4576,4578,4580,4582,4584,4586,4588,4590,4592],{"class":1058,"line":4555},27,[1056,4557,3529],{"class":1066},[1056,4559,1174],{"class":1070},[1056,4561,2061],{"class":2060},[1056,4563,1071],{"class":1070},[1056,4565,4273],{"class":1182},[1056,4567,1071],{"class":1070},[1056,4569,1189],{"class":1188},[1056,4571,1153],{"class":1070},[1056,4573,1714],{"class":1145},[1056,4575,4401],{"class":1217},[1056,4577,1222],{"class":1221},[1056,4579,2048],{"class":2060},[1056,4581,1071],{"class":1070},[1056,4583,1225],{"class":1182},[1056,4585,1071],{"class":1070},[1056,4587,1725],{"class":1182},[1056,4589,1243],{"class":1221},[1056,4591,4418],{"class":1217},[1056,4593,1203],{"class":1070},[1056,4595,4597,4599,4601,4603,4605,4607,4609,4611],{"class":1058,"line":4596},28,[1056,4598,4425],{"class":1066},[1056,4600,1174],{"class":1070},[1056,4602,3599],{"class":1066},[1056,4604,3584],{"class":1070},[1056,4606,1368],{"class":1361},[1056,4608,3589],{"class":1217},[1056,4610,1368],{"class":1361},[1056,4612,2408],{"class":1070},[1056,4614,4616],{"class":1058,"line":4615},29,[1056,4617,3548],{"class":1066},[1056,4619,4621],{"class":1058,"line":4620},30,[1056,4622,4623],{"class":1138},"        # Modify article\n",[1056,4625,4627,4629,4631,4633,4635,4637,4639,4641,4644],{"class":1058,"line":4626},31,[1056,4628,3492],{"class":2060},[1056,4630,1071],{"class":1070},[1056,4632,1225],{"class":1182},[1056,4634,1071],{"class":1070},[1056,4636,1230],{"class":1182},[1056,4638,3500],{"class":1070},[1056,4640,1362],{"class":1361},[1056,4642,4643],{"class":1217},"Updated Title",[1056,4645,2029],{"class":1361},[1056,4647,4649,4651,4653,4655,4657,4660],{"class":1058,"line":4648},32,[1056,4650,3492],{"class":2060},[1056,4652,1071],{"class":1070},[1056,4654,1225],{"class":1182},[1056,4656,1071],{"class":1070},[1056,4658,4659],{"class":1188},"save",[1056,4661,1279],{"class":1070},[1056,4663,4665],{"class":1058,"line":4664},33,[1056,4666,3548],{"class":1066},[1056,4668,4670],{"class":1058,"line":4669},34,[1056,4671,4672],{"class":1138},"        # Second request with old ETag\n",[1056,4674,4676,4678,4680,4682,4684,4686,4688,4690],{"class":1058,"line":4675},35,[1056,4677,3529],{"class":1066},[1056,4679,1174],{"class":1070},[1056,4681,2061],{"class":2060},[1056,4683,1071],{"class":1070},[1056,4685,4273],{"class":1182},[1056,4687,1071],{"class":1070},[1056,4689,1189],{"class":1188},[1056,4691,2184],{"class":1070},[1056,4693,4695,4697,4699,4701,4703,4705,4707,4709,4711,4713,4715],{"class":1058,"line":4694},36,[1056,4696,4471],{"class":1145},[1056,4698,4401],{"class":1217},[1056,4700,1222],{"class":1221},[1056,4702,2048],{"class":2060},[1056,4704,1071],{"class":1070},[1056,4706,1225],{"class":1182},[1056,4708,1071],{"class":1070},[1056,4710,1725],{"class":1182},[1056,4712,1243],{"class":1221},[1056,4714,4418],{"class":1217},[1056,4716,3693],{"class":1070},[1056,4718,4720,4722,4724],{"class":1058,"line":4719},37,[1056,4721,4496],{"class":1194},[1056,4723,1174],{"class":1070},[1056,4725,3604],{"class":1188},[1056,4727,4729],{"class":1058,"line":4728},38,[1056,4730,3755],{"class":1070},[1056,4732,4734,4736,4738,4740,4742,4744,4746,4748,4750,4753],{"class":1058,"line":4733},39,[1056,4735,3492],{"class":2060},[1056,4737,1071],{"class":1070},[1056,4739,4513],{"class":1188},[1056,4741,1153],{"class":1070},[1056,4743,3566],{"class":1188},[1056,4745,1071],{"class":1070},[1056,4747,4522],{"class":1182},[1056,4749,1093],{"class":1070},[1056,4751,4752],{"class":3181}," 200",[1056,4754,1203],{"class":1070},[1056,4756,4758],{"class":1058,"line":4757},40,[1056,4759,2034],{"class":1066},[1056,4761,4763,4765,4768,4770,4772],{"class":1058,"line":4762},41,[1056,4764,2039],{"class":1145},[1056,4766,4767],{"class":1149}," test_last_modified_header",[1056,4769,1153],{"class":1070},[1056,4771,2048],{"class":2047},[1056,4773,1165],{"class":1070},[1056,4775,4777,4779,4781,4783,4785,4787,4789,4791,4793,4795,4797,4799,4801,4803,4805,4807,4809,4811,4813],{"class":1058,"line":4776},42,[1056,4778,3529],{"class":1066},[1056,4780,1174],{"class":1070},[1056,4782,2061],{"class":2060},[1056,4784,1071],{"class":1070},[1056,4786,4273],{"class":1182},[1056,4788,1071],{"class":1070},[1056,4790,1189],{"class":1188},[1056,4792,1153],{"class":1070},[1056,4794,1714],{"class":1145},[1056,4796,4401],{"class":1217},[1056,4798,1222],{"class":1221},[1056,4800,2048],{"class":2060},[1056,4802,1071],{"class":1070},[1056,4804,1225],{"class":1182},[1056,4806,1071],{"class":1070},[1056,4808,1725],{"class":1182},[1056,4810,1243],{"class":1221},[1056,4812,4418],{"class":1217},[1056,4814,1203],{"class":1070},[1056,4816,4818,4820,4822,4825,4827,4829,4831,4833,4835,4837],{"class":1058,"line":4817},43,[1056,4819,3492],{"class":2060},[1056,4821,1071],{"class":1070},[1056,4823,4824],{"class":1188},"assertIn",[1056,4826,1153],{"class":1070},[1056,4828,1368],{"class":1361},[1056,4830,3639],{"class":1217},[1056,4832,1368],{"class":1361},[1056,4834,1093],{"class":1070},[1056,4836,3599],{"class":1188},[1056,4838,1203],{"class":1070},[1056,4840,4842],{"class":1058,"line":4841},44,[1056,4843,3548],{"class":1066},[1056,4845,4847],{"class":1058,"line":4846},45,[1056,4848,4849],{"class":1138},"        # Request with If-Modified-Since\n",[1056,4851,4853,4856,4858,4860,4862,4864,4866,4868],{"class":1058,"line":4852},46,[1056,4854,4855],{"class":1066},"        last_modified ",[1056,4857,1174],{"class":1070},[1056,4859,3599],{"class":1066},[1056,4861,3584],{"class":1070},[1056,4863,1368],{"class":1361},[1056,4865,3639],{"class":1217},[1056,4867,1368],{"class":1361},[1056,4869,2408],{"class":1070},[1056,4871,4873,4875,4877,4879,4881,4883,4885,4887],{"class":1058,"line":4872},47,[1056,4874,3529],{"class":1066},[1056,4876,1174],{"class":1070},[1056,4878,2061],{"class":2060},[1056,4880,1071],{"class":1070},[1056,4882,4273],{"class":1182},[1056,4884,1071],{"class":1070},[1056,4886,1189],{"class":1188},[1056,4888,2184],{"class":1070},[1056,4890,4892,4894,4896,4898,4900,4902,4904,4906,4908,4910,4912],{"class":1058,"line":4891},48,[1056,4893,4471],{"class":1145},[1056,4895,4401],{"class":1217},[1056,4897,1222],{"class":1221},[1056,4899,2048],{"class":2060},[1056,4901,1071],{"class":1070},[1056,4903,1225],{"class":1182},[1056,4905,1071],{"class":1070},[1056,4907,1725],{"class":1182},[1056,4909,1243],{"class":1221},[1056,4911,4418],{"class":1217},[1056,4913,3693],{"class":1070},[1056,4915,4917,4920,4922],{"class":1058,"line":4916},49,[1056,4918,4919],{"class":1194},"            HTTP_IF_MODIFIED_SINCE",[1056,4921,1174],{"class":1070},[1056,4923,4924],{"class":1188},"last_modified\n",[1056,4926,4928],{"class":1058,"line":4927},50,[1056,4929,3755],{"class":1070},[1056,4931,4933,4935,4937,4939,4941,4943,4945,4947,4949,4951],{"class":1058,"line":4932},51,[1056,4934,3492],{"class":2060},[1056,4936,1071],{"class":1070},[1056,4938,4513],{"class":1188},[1056,4940,1153],{"class":1070},[1056,4942,3566],{"class":1188},[1056,4944,1071],{"class":1070},[1056,4946,4522],{"class":1182},[1056,4948,1093],{"class":1070},[1056,4950,4527],{"class":3181},[1056,4952,1203],{"class":1070},[1030,4954,4956],{"id":4955},"performance-benefits","Performance Benefits",[1026,4958,4959],{},"Conditional view processing provides significant benefits:",[4961,4962,4963,4971,4977,4983,4989],"ul",{},[4964,4965,4966,4970],"li",{},[4967,4968,4969],"strong",{},"Reduced Bandwidth",": 304 responses have no body",[4964,4972,4973,4976],{},[4967,4974,4975],{},"Faster Response Times",": No template rendering needed",[4964,4978,4979,4982],{},[4967,4980,4981],{},"Lower Server Load",": Less processing for unchanged content",[4964,4984,4985,4988],{},[4967,4986,4987],{},"Better User Experience",": Faster page loads",[4964,4990,4991,4994],{},[4967,4992,4993],{},"CDN Efficiency",": Better cache hit rates",[1030,4996,921],{"id":4997},"best-practices",[4999,5000,5001,5007,5013,5019,5025],"ol",{},[4964,5002,5003,5006],{},[4967,5004,5005],{},"Use for Expensive Views",": Apply to views with heavy database queries or rendering",[4964,5008,5009,5012],{},[4967,5010,5011],{},"Combine with Caching",": Use alongside Django's caching framework",[4964,5014,5015,5018],{},[4967,5016,5017],{},"Consider User Context",": Include user-specific data in ETag generation when needed",[4964,5020,5021,5024],{},[4967,5022,5023],{},"Test Thoroughly",": Ensure conditional logic works correctly",[4964,5026,5027,5030],{},[4967,5028,5029],{},"Monitor Performance",": Track 304 response rates and cache effectiveness",[1026,5032,5033],{},"Conditional view processing is a powerful tool for optimizing Django applications, reducing server load and improving response times by leveraging HTTP's built-in caching mechanisms.",[5035,5036,5037],"style",{},"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 .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}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 .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}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 .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}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 .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}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 .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}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 .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}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 .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}",{"title":1051,"searchDepth":1059,"depth":1099,"links":5039},[5040,5045,5046,5050,5051,5052,5053,5054,5055,5056],{"id":1032,"depth":1099,"text":1033,"children":5041},[5042,5043,5044],{"id":1040,"depth":1120,"text":1041},{"id":1420,"depth":1120,"text":1421},{"id":1623,"depth":1120,"text":1624},{"id":1910,"depth":1099,"text":1911},{"id":2311,"depth":1099,"text":2312,"children":5047},[5048,5049],{"id":2315,"depth":1120,"text":2316},{"id":2636,"depth":1120,"text":2637},{"id":2919,"depth":1099,"text":2920},{"id":3125,"depth":1099,"text":3126},{"id":3411,"depth":1099,"text":3412},{"id":3776,"depth":1099,"text":3777},{"id":4190,"depth":1099,"text":4191},{"id":4955,"depth":1099,"text":4956},{"id":4997,"depth":1099,"text":921},"md",null,{},{"title":154,"description":1028},"z-sqwBJ6YKe1LNdEU4vLBppbad6q4cevwbFGJAwBPT8",[5063,5065],{"title":150,"path":151,"stem":152,"description":5064,"children":-1},"HTTP methods define the type of action being performed on a resource. Django provides comprehensive support for handling different HTTP methods, enabling you to build RESTful APIs and implement proper request handling patterns.",{"title":158,"path":159,"stem":160,"description":5066,"children":-1},"File uploads are a common requirement in web applications. Django provides robust support for handling file uploads securely and efficiently, with built-in validation, processing, and storage capabilities.",1772474908973]