[{"data":1,"prerenderedAt":7722},["ShallowReactive",2],{"navigation":3,"/middleware/built-in-middleware":1016,"/middleware/built-in-middleware-surround":7717},[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":525,"body":1018,"description":1028,"extension":7712,"links":7713,"meta":7714,"navigation":1066,"path":526,"seo":7715,"stem":527,"__hash__":7716},"docs/13.middleware/03.built-in-middleware.md",{"type":1019,"value":1020,"toc":7677},"minimark",[1021,1025,1029,1034,1039,1042,1237,1242,1664,1668,1672,1675,1848,1852,2412,2416,2420,2423,2947,2951,2955,2958,3138,3142,3835,3839,3843,3846,3932,3936,4408,4412,4416,4419,4644,4648,5118,5122,5126,5129,5587,5590,5594,5597,6224,6228,6232,6235,6705,6709,6713,6905,6909,7113,7117,7666,7670,7673],[1022,1023,525],"h1",{"id":1024},"built-in-middleware",[1026,1027,1028],"p",{},"Django comes with several built-in middleware components that handle common web application concerns. Understanding these middleware components helps you leverage Django's capabilities and serves as examples for creating your own middleware.",[1030,1031,1033],"h2",{"id":1032},"security-middleware","Security Middleware",[1035,1036,1038],"h3",{"id":1037},"securitymiddleware","SecurityMiddleware",[1026,1040,1041],{},"Provides several security enhancements for your application:",[1043,1044,1049],"pre",{"className":1045,"code":1046,"language":1047,"meta":1048,"style":1048},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# django.middleware.security.SecurityMiddleware\n\n# Automatic configuration in settings.py\nMIDDLEWARE = [\n    'django.middleware.security.SecurityMiddleware',  # Should be first\n    # ... other middleware\n]\n\n# Security settings it respects:\nSECURE_BROWSER_XSS_FILTER = True\nSECURE_CONTENT_TYPE_NOSNIFF = True\nSECURE_HSTS_INCLUDE_SUBDOMAINS = True\nSECURE_HSTS_PRELOAD = True\nSECURE_HSTS_SECONDS = 31536000  # 1 year\nSECURE_REDIRECT_EXEMPT = []\nSECURE_REFERRER_POLICY = 'same-origin'\nSECURE_SSL_HOST = None\nSECURE_SSL_REDIRECT = True\n","python","",[1050,1051,1052,1061,1068,1074,1088,1108,1114,1120,1125,1131,1143,1153,1163,1173,1188,1199,1216,1227],"code",{"__ignoreMap":1048},[1053,1054,1057],"span",{"class":1055,"line":1056},"line",1,[1053,1058,1060],{"class":1059},"s9Tkl","# django.middleware.security.SecurityMiddleware\n",[1053,1062,1064],{"class":1055,"line":1063},2,[1053,1065,1067],{"emptyLinePlaceholder":1066},true,"\n",[1053,1069,1071],{"class":1055,"line":1070},3,[1053,1072,1073],{"class":1059},"# Automatic configuration in settings.py\n",[1053,1075,1077,1081,1085],{"class":1055,"line":1076},4,[1053,1078,1080],{"class":1079},"se3Ec","MIDDLEWARE",[1053,1082,1084],{"class":1083},"soVBu"," =",[1053,1086,1087],{"class":1083}," [\n",[1053,1089,1091,1095,1099,1102,1105],{"class":1055,"line":1090},5,[1053,1092,1094],{"class":1093},"sbYkP","    '",[1053,1096,1098],{"class":1097},"sTbE_","django.middleware.security.SecurityMiddleware",[1053,1100,1101],{"class":1093},"'",[1053,1103,1104],{"class":1083},",",[1053,1106,1107],{"class":1059},"  # Should be first\n",[1053,1109,1111],{"class":1055,"line":1110},6,[1053,1112,1113],{"class":1059},"    # ... other middleware\n",[1053,1115,1117],{"class":1055,"line":1116},7,[1053,1118,1119],{"class":1083},"]\n",[1053,1121,1123],{"class":1055,"line":1122},8,[1053,1124,1067],{"emptyLinePlaceholder":1066},[1053,1126,1128],{"class":1055,"line":1127},9,[1053,1129,1130],{"class":1059},"# Security settings it respects:\n",[1053,1132,1134,1137,1139],{"class":1055,"line":1133},10,[1053,1135,1136],{"class":1079},"SECURE_BROWSER_XSS_FILTER",[1053,1138,1084],{"class":1083},[1053,1140,1142],{"class":1141},"s8XtY"," True\n",[1053,1144,1146,1149,1151],{"class":1055,"line":1145},11,[1053,1147,1148],{"class":1079},"SECURE_CONTENT_TYPE_NOSNIFF",[1053,1150,1084],{"class":1083},[1053,1152,1142],{"class":1141},[1053,1154,1156,1159,1161],{"class":1055,"line":1155},12,[1053,1157,1158],{"class":1079},"SECURE_HSTS_INCLUDE_SUBDOMAINS",[1053,1160,1084],{"class":1083},[1053,1162,1142],{"class":1141},[1053,1164,1166,1169,1171],{"class":1055,"line":1165},13,[1053,1167,1168],{"class":1079},"SECURE_HSTS_PRELOAD",[1053,1170,1084],{"class":1083},[1053,1172,1142],{"class":1141},[1053,1174,1176,1179,1181,1185],{"class":1055,"line":1175},14,[1053,1177,1178],{"class":1079},"SECURE_HSTS_SECONDS",[1053,1180,1084],{"class":1083},[1053,1182,1184],{"class":1183},"s7CZa"," 31536000",[1053,1186,1187],{"class":1059},"  # 1 year\n",[1053,1189,1191,1194,1196],{"class":1055,"line":1190},15,[1053,1192,1193],{"class":1079},"SECURE_REDIRECT_EXEMPT",[1053,1195,1084],{"class":1083},[1053,1197,1198],{"class":1083}," []\n",[1053,1200,1202,1205,1207,1210,1213],{"class":1055,"line":1201},16,[1053,1203,1204],{"class":1079},"SECURE_REFERRER_POLICY",[1053,1206,1084],{"class":1083},[1053,1208,1209],{"class":1093}," '",[1053,1211,1212],{"class":1097},"same-origin",[1053,1214,1215],{"class":1093},"'\n",[1053,1217,1219,1222,1224],{"class":1055,"line":1218},17,[1053,1220,1221],{"class":1079},"SECURE_SSL_HOST",[1053,1223,1084],{"class":1083},[1053,1225,1226],{"class":1141}," None\n",[1053,1228,1230,1233,1235],{"class":1055,"line":1229},18,[1053,1231,1232],{"class":1079},"SECURE_SSL_REDIRECT",[1053,1234,1084],{"class":1083},[1053,1236,1142],{"class":1141},[1238,1239,1241],"h4",{"id":1240},"what-securitymiddleware-does","What SecurityMiddleware Does:",[1043,1243,1245],{"className":1045,"code":1244,"language":1047,"meta":1048,"style":1048},"# Example of headers added by SecurityMiddleware\n\"\"\"\nX-Content-Type-Options: nosniff\nX-Frame-Options: DENY\nStrict-Transport-Security: max-age=31536000; includeSubDomains; preload\nReferrer-Policy: same-origin\n\"\"\"\n\n# Custom implementation example\nclass CustomSecurityMiddleware:\n    \"\"\"Custom security middleware example\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        # HTTPS redirect\n        if not request.is_secure() and not settings.DEBUG:\n            return HttpResponsePermanentRedirect(\n                'https://' + request.get_host() + request.get_full_path()\n            )\n        \n        response = self.get_response(request)\n        \n        # Add security headers\n        response['X-Content-Type-Options'] = 'nosniff'\n        response['X-Frame-Options'] = 'DENY'\n        response['X-XSS-Protection'] = '1; mode=block'\n        \n        # HSTS header for HTTPS\n        if request.is_secure():\n            response['Strict-Transport-Security'] = 'max-age=31536000; includeSubDomains'\n        \n        return response\n",[1050,1246,1247,1252,1258,1264,1269,1274,1279,1283,1287,1292,1305,1315,1321,1346,1363,1367,1385,1390,1427,1439,1474,1480,1486,1510,1515,1521,1549,1574,1599,1604,1610,1624,1650,1655],{"__ignoreMap":1048},[1053,1248,1249],{"class":1055,"line":1056},[1053,1250,1251],{"class":1059},"# Example of headers added by SecurityMiddleware\n",[1053,1253,1254],{"class":1055,"line":1063},[1053,1255,1257],{"class":1256},"sm7ve","\"\"\"\n",[1053,1259,1260],{"class":1055,"line":1070},[1053,1261,1263],{"class":1262},"sVyVU","X-Content-Type-Options: nosniff\n",[1053,1265,1266],{"class":1055,"line":1076},[1053,1267,1268],{"class":1262},"X-Frame-Options: DENY\n",[1053,1270,1271],{"class":1055,"line":1090},[1053,1272,1273],{"class":1262},"Strict-Transport-Security: max-age=31536000; includeSubDomains; preload\n",[1053,1275,1276],{"class":1055,"line":1110},[1053,1277,1278],{"class":1262},"Referrer-Policy: same-origin\n",[1053,1280,1281],{"class":1055,"line":1116},[1053,1282,1257],{"class":1256},[1053,1284,1285],{"class":1055,"line":1122},[1053,1286,1067],{"emptyLinePlaceholder":1066},[1053,1288,1289],{"class":1055,"line":1127},[1053,1290,1291],{"class":1059},"# Custom implementation example\n",[1053,1293,1294,1298,1302],{"class":1055,"line":1133},[1053,1295,1297],{"class":1296},"s5Kfy","class",[1053,1299,1301],{"class":1300},"sD-vU"," CustomSecurityMiddleware",[1053,1303,1304],{"class":1083},":\n",[1053,1306,1307,1310,1313],{"class":1055,"line":1145},[1053,1308,1309],{"class":1256},"    \"\"\"",[1053,1311,1312],{"class":1262},"Custom security middleware example",[1053,1314,1257],{"class":1256},[1053,1316,1317],{"class":1055,"line":1155},[1053,1318,1320],{"class":1319},"sftqT","    \n",[1053,1322,1323,1326,1330,1333,1337,1339,1343],{"class":1055,"line":1165},[1053,1324,1325],{"class":1296},"    def",[1053,1327,1329],{"class":1328},"sJdAF"," __init__",[1053,1331,1332],{"class":1083},"(",[1053,1334,1336],{"class":1335},"sRjD_","self",[1053,1338,1104],{"class":1083},[1053,1340,1342],{"class":1341},"sCyAa"," get_response",[1053,1344,1345],{"class":1083},"):\n",[1053,1347,1348,1351,1354,1358,1360],{"class":1055,"line":1175},[1053,1349,1350],{"class":1079},"        self",[1053,1352,1353],{"class":1083},".",[1053,1355,1357],{"class":1356},"sBPpx","get_response",[1053,1359,1084],{"class":1083},[1053,1361,1362],{"class":1319}," get_response\n",[1053,1364,1365],{"class":1055,"line":1190},[1053,1366,1320],{"class":1319},[1053,1368,1369,1371,1374,1376,1378,1380,1383],{"class":1055,"line":1201},[1053,1370,1325],{"class":1296},[1053,1372,1373],{"class":1328}," __call__",[1053,1375,1332],{"class":1083},[1053,1377,1336],{"class":1335},[1053,1379,1104],{"class":1083},[1053,1381,1382],{"class":1341}," request",[1053,1384,1345],{"class":1083},[1053,1386,1387],{"class":1055,"line":1218},[1053,1388,1389],{"class":1059},"        # HTTPS redirect\n",[1053,1391,1392,1396,1400,1402,1404,1408,1411,1414,1416,1419,1421,1425],{"class":1055,"line":1229},[1053,1393,1395],{"class":1394},"siDh9","        if",[1053,1397,1399],{"class":1398},"sVsLi"," not",[1053,1401,1382],{"class":1319},[1053,1403,1353],{"class":1083},[1053,1405,1407],{"class":1406},"siWMO","is_secure",[1053,1409,1410],{"class":1083},"()",[1053,1412,1413],{"class":1398}," and",[1053,1415,1399],{"class":1398},[1053,1417,1418],{"class":1319}," settings",[1053,1420,1353],{"class":1083},[1053,1422,1424],{"class":1423},"sFGJz","DEBUG",[1053,1426,1304],{"class":1083},[1053,1428,1430,1433,1436],{"class":1055,"line":1429},19,[1053,1431,1432],{"class":1394},"            return",[1053,1434,1435],{"class":1406}," HttpResponsePermanentRedirect",[1053,1437,1438],{"class":1083},"(\n",[1053,1440,1442,1445,1448,1450,1453,1455,1457,1460,1462,1464,1466,1468,1471],{"class":1055,"line":1441},20,[1053,1443,1444],{"class":1093},"                '",[1053,1446,1447],{"class":1097},"https://",[1053,1449,1101],{"class":1093},[1053,1451,1452],{"class":1398}," +",[1053,1454,1382],{"class":1406},[1053,1456,1353],{"class":1083},[1053,1458,1459],{"class":1406},"get_host",[1053,1461,1410],{"class":1083},[1053,1463,1452],{"class":1398},[1053,1465,1382],{"class":1406},[1053,1467,1353],{"class":1083},[1053,1469,1470],{"class":1406},"get_full_path",[1053,1472,1473],{"class":1083},"()\n",[1053,1475,1477],{"class":1055,"line":1476},21,[1053,1478,1479],{"class":1083},"            )\n",[1053,1481,1483],{"class":1055,"line":1482},22,[1053,1484,1485],{"class":1319},"        \n",[1053,1487,1489,1492,1495,1498,1500,1502,1504,1507],{"class":1055,"line":1488},23,[1053,1490,1491],{"class":1319},"        response ",[1053,1493,1494],{"class":1083},"=",[1053,1496,1497],{"class":1079}," self",[1053,1499,1353],{"class":1083},[1053,1501,1357],{"class":1406},[1053,1503,1332],{"class":1083},[1053,1505,1506],{"class":1406},"request",[1053,1508,1509],{"class":1083},")\n",[1053,1511,1513],{"class":1055,"line":1512},24,[1053,1514,1485],{"class":1319},[1053,1516,1518],{"class":1055,"line":1517},25,[1053,1519,1520],{"class":1059},"        # Add security headers\n",[1053,1522,1524,1527,1530,1532,1535,1537,1540,1542,1544,1547],{"class":1055,"line":1523},26,[1053,1525,1526],{"class":1319},"        response",[1053,1528,1529],{"class":1083},"[",[1053,1531,1101],{"class":1093},[1053,1533,1534],{"class":1097},"X-Content-Type-Options",[1053,1536,1101],{"class":1093},[1053,1538,1539],{"class":1083},"]",[1053,1541,1084],{"class":1083},[1053,1543,1209],{"class":1093},[1053,1545,1546],{"class":1097},"nosniff",[1053,1548,1215],{"class":1093},[1053,1550,1552,1554,1556,1558,1561,1563,1565,1567,1569,1572],{"class":1055,"line":1551},27,[1053,1553,1526],{"class":1319},[1053,1555,1529],{"class":1083},[1053,1557,1101],{"class":1093},[1053,1559,1560],{"class":1097},"X-Frame-Options",[1053,1562,1101],{"class":1093},[1053,1564,1539],{"class":1083},[1053,1566,1084],{"class":1083},[1053,1568,1209],{"class":1093},[1053,1570,1571],{"class":1097},"DENY",[1053,1573,1215],{"class":1093},[1053,1575,1577,1579,1581,1583,1586,1588,1590,1592,1594,1597],{"class":1055,"line":1576},28,[1053,1578,1526],{"class":1319},[1053,1580,1529],{"class":1083},[1053,1582,1101],{"class":1093},[1053,1584,1585],{"class":1097},"X-XSS-Protection",[1053,1587,1101],{"class":1093},[1053,1589,1539],{"class":1083},[1053,1591,1084],{"class":1083},[1053,1593,1209],{"class":1093},[1053,1595,1596],{"class":1097},"1; mode=block",[1053,1598,1215],{"class":1093},[1053,1600,1602],{"class":1055,"line":1601},29,[1053,1603,1485],{"class":1319},[1053,1605,1607],{"class":1055,"line":1606},30,[1053,1608,1609],{"class":1059},"        # HSTS header for HTTPS\n",[1053,1611,1613,1615,1617,1619,1621],{"class":1055,"line":1612},31,[1053,1614,1395],{"class":1394},[1053,1616,1382],{"class":1319},[1053,1618,1353],{"class":1083},[1053,1620,1407],{"class":1406},[1053,1622,1623],{"class":1083},"():\n",[1053,1625,1627,1630,1632,1634,1637,1639,1641,1643,1645,1648],{"class":1055,"line":1626},32,[1053,1628,1629],{"class":1319},"            response",[1053,1631,1529],{"class":1083},[1053,1633,1101],{"class":1093},[1053,1635,1636],{"class":1097},"Strict-Transport-Security",[1053,1638,1101],{"class":1093},[1053,1640,1539],{"class":1083},[1053,1642,1084],{"class":1083},[1053,1644,1209],{"class":1093},[1053,1646,1647],{"class":1097},"max-age=31536000; includeSubDomains",[1053,1649,1215],{"class":1093},[1053,1651,1653],{"class":1055,"line":1652},33,[1053,1654,1485],{"class":1319},[1053,1656,1658,1661],{"class":1055,"line":1657},34,[1053,1659,1660],{"class":1394},"        return",[1053,1662,1663],{"class":1319}," response\n",[1030,1665,1667],{"id":1666},"session-middleware","Session Middleware",[1035,1669,1671],{"id":1670},"sessionmiddleware","SessionMiddleware",[1026,1673,1674],{},"Enables session support across requests:",[1043,1676,1678],{"className":1045,"code":1677,"language":1047,"meta":1048,"style":1048},"# django.contrib.sessions.middleware.SessionMiddleware\n\nMIDDLEWARE = [\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    # ... other middleware\n]\n\n# Session configuration\nSESSION_ENGINE = 'django.contrib.sessions.backends.db'  # Default\nSESSION_COOKIE_AGE = 1209600  # 2 weeks\nSESSION_COOKIE_DOMAIN = None\nSESSION_COOKIE_HTTPONLY = True\nSESSION_COOKIE_NAME = 'sessionid'\nSESSION_COOKIE_PATH = '/'\nSESSION_COOKIE_SAMESITE = 'Lax'\nSESSION_COOKIE_SECURE = False  # Set to True in production with HTTPS\nSESSION_EXPIRE_AT_BROWSER_CLOSE = False\nSESSION_SAVE_EVERY_REQUEST = False\n",[1050,1679,1680,1685,1689,1697,1709,1713,1717,1721,1726,1743,1756,1765,1774,1788,1802,1816,1829,1839],{"__ignoreMap":1048},[1053,1681,1682],{"class":1055,"line":1056},[1053,1683,1684],{"class":1059},"# django.contrib.sessions.middleware.SessionMiddleware\n",[1053,1686,1687],{"class":1055,"line":1063},[1053,1688,1067],{"emptyLinePlaceholder":1066},[1053,1690,1691,1693,1695],{"class":1055,"line":1070},[1053,1692,1080],{"class":1079},[1053,1694,1084],{"class":1083},[1053,1696,1087],{"class":1083},[1053,1698,1699,1701,1704,1706],{"class":1055,"line":1076},[1053,1700,1094],{"class":1093},[1053,1702,1703],{"class":1097},"django.contrib.sessions.middleware.SessionMiddleware",[1053,1705,1101],{"class":1093},[1053,1707,1708],{"class":1083},",\n",[1053,1710,1711],{"class":1055,"line":1090},[1053,1712,1113],{"class":1059},[1053,1714,1715],{"class":1055,"line":1110},[1053,1716,1119],{"class":1083},[1053,1718,1719],{"class":1055,"line":1116},[1053,1720,1067],{"emptyLinePlaceholder":1066},[1053,1722,1723],{"class":1055,"line":1122},[1053,1724,1725],{"class":1059},"# Session configuration\n",[1053,1727,1728,1731,1733,1735,1738,1740],{"class":1055,"line":1127},[1053,1729,1730],{"class":1079},"SESSION_ENGINE",[1053,1732,1084],{"class":1083},[1053,1734,1209],{"class":1093},[1053,1736,1737],{"class":1097},"django.contrib.sessions.backends.db",[1053,1739,1101],{"class":1093},[1053,1741,1742],{"class":1059},"  # Default\n",[1053,1744,1745,1748,1750,1753],{"class":1055,"line":1133},[1053,1746,1747],{"class":1079},"SESSION_COOKIE_AGE",[1053,1749,1084],{"class":1083},[1053,1751,1752],{"class":1183}," 1209600",[1053,1754,1755],{"class":1059},"  # 2 weeks\n",[1053,1757,1758,1761,1763],{"class":1055,"line":1145},[1053,1759,1760],{"class":1079},"SESSION_COOKIE_DOMAIN",[1053,1762,1084],{"class":1083},[1053,1764,1226],{"class":1141},[1053,1766,1767,1770,1772],{"class":1055,"line":1155},[1053,1768,1769],{"class":1079},"SESSION_COOKIE_HTTPONLY",[1053,1771,1084],{"class":1083},[1053,1773,1142],{"class":1141},[1053,1775,1776,1779,1781,1783,1786],{"class":1055,"line":1165},[1053,1777,1778],{"class":1079},"SESSION_COOKIE_NAME",[1053,1780,1084],{"class":1083},[1053,1782,1209],{"class":1093},[1053,1784,1785],{"class":1097},"sessionid",[1053,1787,1215],{"class":1093},[1053,1789,1790,1793,1795,1797,1800],{"class":1055,"line":1175},[1053,1791,1792],{"class":1079},"SESSION_COOKIE_PATH",[1053,1794,1084],{"class":1083},[1053,1796,1209],{"class":1093},[1053,1798,1799],{"class":1097},"/",[1053,1801,1215],{"class":1093},[1053,1803,1804,1807,1809,1811,1814],{"class":1055,"line":1190},[1053,1805,1806],{"class":1079},"SESSION_COOKIE_SAMESITE",[1053,1808,1084],{"class":1083},[1053,1810,1209],{"class":1093},[1053,1812,1813],{"class":1097},"Lax",[1053,1815,1215],{"class":1093},[1053,1817,1818,1821,1823,1826],{"class":1055,"line":1201},[1053,1819,1820],{"class":1079},"SESSION_COOKIE_SECURE",[1053,1822,1084],{"class":1083},[1053,1824,1825],{"class":1141}," False",[1053,1827,1828],{"class":1059},"  # Set to True in production with HTTPS\n",[1053,1830,1831,1834,1836],{"class":1055,"line":1218},[1053,1832,1833],{"class":1079},"SESSION_EXPIRE_AT_BROWSER_CLOSE",[1053,1835,1084],{"class":1083},[1053,1837,1838],{"class":1141}," False\n",[1053,1840,1841,1844,1846],{"class":1055,"line":1229},[1053,1842,1843],{"class":1079},"SESSION_SAVE_EVERY_REQUEST",[1053,1845,1084],{"class":1083},[1053,1847,1838],{"class":1141},[1238,1849,1851],{"id":1850},"session-usage-examples","Session Usage Examples:",[1043,1853,1855],{"className":1045,"code":1854,"language":1047,"meta":1048,"style":1048},"# In views, after SessionMiddleware is enabled\ndef my_view(request):\n    # Store data in session\n    request.session['user_preference'] = 'dark_mode'\n    request.session['cart_items'] = ['item1', 'item2']\n    \n    # Retrieve data from session\n    preference = request.session.get('user_preference', 'light_mode')\n    cart = request.session.get('cart_items', [])\n    \n    # Session methods\n    request.session.set_expiry(300)  # Expire in 5 minutes\n    request.session.flush()  # Delete session data and regenerate key\n    \n    return HttpResponse(f\"Preference: {preference}\")\n\n# Custom session middleware example\nclass CustomSessionMiddleware:\n    \"\"\"Custom session handling\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        # Load session before view\n        session_key = request.COOKIES.get('sessionid')\n        if session_key:\n            # Load session data\n            request.session = self.load_session(session_key)\n        else:\n            request.session = {}\n        \n        response = self.get_response(request)\n        \n        # Save session after view\n        if hasattr(request, 'session') and request.session:\n            session_key = self.save_session(request.session)\n            response.set_cookie('sessionid', session_key)\n        \n        return response\n",[1050,1856,1857,1862,1877,1882,1912,1954,1958,1963,2000,2030,2034,2039,2063,2081,2085,2116,2120,2125,2134,2143,2147,2163,2175,2179,2195,2200,2228,2237,2242,2267,2274,2287,2291,2309,2313,2319,2351,2376,2400,2405],{"__ignoreMap":1048},[1053,1858,1859],{"class":1055,"line":1056},[1053,1860,1861],{"class":1059},"# In views, after SessionMiddleware is enabled\n",[1053,1863,1864,1867,1871,1873,1875],{"class":1055,"line":1063},[1053,1865,1866],{"class":1296},"def",[1053,1868,1870],{"class":1869},"sljsM"," my_view",[1053,1872,1332],{"class":1083},[1053,1874,1506],{"class":1341},[1053,1876,1345],{"class":1083},[1053,1878,1879],{"class":1055,"line":1070},[1053,1880,1881],{"class":1059},"    # Store data in session\n",[1053,1883,1884,1887,1889,1892,1894,1896,1899,1901,1903,1905,1907,1910],{"class":1055,"line":1076},[1053,1885,1886],{"class":1319},"    request",[1053,1888,1353],{"class":1083},[1053,1890,1891],{"class":1356},"session",[1053,1893,1529],{"class":1083},[1053,1895,1101],{"class":1093},[1053,1897,1898],{"class":1097},"user_preference",[1053,1900,1101],{"class":1093},[1053,1902,1539],{"class":1083},[1053,1904,1084],{"class":1083},[1053,1906,1209],{"class":1093},[1053,1908,1909],{"class":1097},"dark_mode",[1053,1911,1215],{"class":1093},[1053,1913,1914,1916,1918,1920,1922,1924,1927,1929,1931,1933,1936,1938,1941,1943,1945,1947,1950,1952],{"class":1055,"line":1090},[1053,1915,1886],{"class":1319},[1053,1917,1353],{"class":1083},[1053,1919,1891],{"class":1356},[1053,1921,1529],{"class":1083},[1053,1923,1101],{"class":1093},[1053,1925,1926],{"class":1097},"cart_items",[1053,1928,1101],{"class":1093},[1053,1930,1539],{"class":1083},[1053,1932,1084],{"class":1083},[1053,1934,1935],{"class":1083}," [",[1053,1937,1101],{"class":1093},[1053,1939,1940],{"class":1097},"item1",[1053,1942,1101],{"class":1093},[1053,1944,1104],{"class":1083},[1053,1946,1209],{"class":1093},[1053,1948,1949],{"class":1097},"item2",[1053,1951,1101],{"class":1093},[1053,1953,1119],{"class":1083},[1053,1955,1956],{"class":1055,"line":1110},[1053,1957,1320],{"class":1319},[1053,1959,1960],{"class":1055,"line":1116},[1053,1961,1962],{"class":1059},"    # Retrieve data from session\n",[1053,1964,1965,1968,1970,1972,1974,1976,1978,1981,1983,1985,1987,1989,1991,1993,1996,1998],{"class":1055,"line":1122},[1053,1966,1967],{"class":1319},"    preference ",[1053,1969,1494],{"class":1083},[1053,1971,1382],{"class":1319},[1053,1973,1353],{"class":1083},[1053,1975,1891],{"class":1356},[1053,1977,1353],{"class":1083},[1053,1979,1980],{"class":1406},"get",[1053,1982,1332],{"class":1083},[1053,1984,1101],{"class":1093},[1053,1986,1898],{"class":1097},[1053,1988,1101],{"class":1093},[1053,1990,1104],{"class":1083},[1053,1992,1209],{"class":1093},[1053,1994,1995],{"class":1097},"light_mode",[1053,1997,1101],{"class":1093},[1053,1999,1509],{"class":1083},[1053,2001,2002,2005,2007,2009,2011,2013,2015,2017,2019,2021,2023,2025,2027],{"class":1055,"line":1127},[1053,2003,2004],{"class":1319},"    cart ",[1053,2006,1494],{"class":1083},[1053,2008,1382],{"class":1319},[1053,2010,1353],{"class":1083},[1053,2012,1891],{"class":1356},[1053,2014,1353],{"class":1083},[1053,2016,1980],{"class":1406},[1053,2018,1332],{"class":1083},[1053,2020,1101],{"class":1093},[1053,2022,1926],{"class":1097},[1053,2024,1101],{"class":1093},[1053,2026,1104],{"class":1083},[1053,2028,2029],{"class":1083}," [])\n",[1053,2031,2032],{"class":1055,"line":1133},[1053,2033,1320],{"class":1319},[1053,2035,2036],{"class":1055,"line":1145},[1053,2037,2038],{"class":1059},"    # Session methods\n",[1053,2040,2041,2043,2045,2047,2049,2052,2054,2057,2060],{"class":1055,"line":1155},[1053,2042,1886],{"class":1319},[1053,2044,1353],{"class":1083},[1053,2046,1891],{"class":1356},[1053,2048,1353],{"class":1083},[1053,2050,2051],{"class":1406},"set_expiry",[1053,2053,1332],{"class":1083},[1053,2055,2056],{"class":1183},"300",[1053,2058,2059],{"class":1083},")",[1053,2061,2062],{"class":1059},"  # Expire in 5 minutes\n",[1053,2064,2065,2067,2069,2071,2073,2076,2078],{"class":1055,"line":1165},[1053,2066,1886],{"class":1319},[1053,2068,1353],{"class":1083},[1053,2070,1891],{"class":1356},[1053,2072,1353],{"class":1083},[1053,2074,2075],{"class":1406},"flush",[1053,2077,1410],{"class":1083},[1053,2079,2080],{"class":1059},"  # Delete session data and regenerate key\n",[1053,2082,2083],{"class":1055,"line":1175},[1053,2084,1320],{"class":1319},[1053,2086,2087,2090,2093,2095,2098,2101,2105,2108,2111,2114],{"class":1055,"line":1190},[1053,2088,2089],{"class":1394},"    return",[1053,2091,2092],{"class":1406}," HttpResponse",[1053,2094,1332],{"class":1083},[1053,2096,2097],{"class":1296},"f",[1053,2099,2100],{"class":1097},"\"Preference: ",[1053,2102,2104],{"class":2103},"s3h35","{",[1053,2106,2107],{"class":1406},"preference",[1053,2109,2110],{"class":2103},"}",[1053,2112,2113],{"class":1097},"\"",[1053,2115,1509],{"class":1083},[1053,2117,2118],{"class":1055,"line":1201},[1053,2119,1067],{"emptyLinePlaceholder":1066},[1053,2121,2122],{"class":1055,"line":1218},[1053,2123,2124],{"class":1059},"# Custom session middleware example\n",[1053,2126,2127,2129,2132],{"class":1055,"line":1229},[1053,2128,1297],{"class":1296},[1053,2130,2131],{"class":1300}," CustomSessionMiddleware",[1053,2133,1304],{"class":1083},[1053,2135,2136,2138,2141],{"class":1055,"line":1429},[1053,2137,1309],{"class":1256},[1053,2139,2140],{"class":1262},"Custom session handling",[1053,2142,1257],{"class":1256},[1053,2144,2145],{"class":1055,"line":1441},[1053,2146,1320],{"class":1319},[1053,2148,2149,2151,2153,2155,2157,2159,2161],{"class":1055,"line":1476},[1053,2150,1325],{"class":1296},[1053,2152,1329],{"class":1328},[1053,2154,1332],{"class":1083},[1053,2156,1336],{"class":1335},[1053,2158,1104],{"class":1083},[1053,2160,1342],{"class":1341},[1053,2162,1345],{"class":1083},[1053,2164,2165,2167,2169,2171,2173],{"class":1055,"line":1482},[1053,2166,1350],{"class":1079},[1053,2168,1353],{"class":1083},[1053,2170,1357],{"class":1356},[1053,2172,1084],{"class":1083},[1053,2174,1362],{"class":1319},[1053,2176,2177],{"class":1055,"line":1488},[1053,2178,1320],{"class":1319},[1053,2180,2181,2183,2185,2187,2189,2191,2193],{"class":1055,"line":1512},[1053,2182,1325],{"class":1296},[1053,2184,1373],{"class":1328},[1053,2186,1332],{"class":1083},[1053,2188,1336],{"class":1335},[1053,2190,1104],{"class":1083},[1053,2192,1382],{"class":1341},[1053,2194,1345],{"class":1083},[1053,2196,2197],{"class":1055,"line":1517},[1053,2198,2199],{"class":1059},"        # Load session before view\n",[1053,2201,2202,2205,2207,2209,2211,2214,2216,2218,2220,2222,2224,2226],{"class":1055,"line":1523},[1053,2203,2204],{"class":1319},"        session_key ",[1053,2206,1494],{"class":1083},[1053,2208,1382],{"class":1319},[1053,2210,1353],{"class":1083},[1053,2212,2213],{"class":1423},"COOKIES",[1053,2215,1353],{"class":1083},[1053,2217,1980],{"class":1406},[1053,2219,1332],{"class":1083},[1053,2221,1101],{"class":1093},[1053,2223,1785],{"class":1097},[1053,2225,1101],{"class":1093},[1053,2227,1509],{"class":1083},[1053,2229,2230,2232,2235],{"class":1055,"line":1551},[1053,2231,1395],{"class":1394},[1053,2233,2234],{"class":1319}," session_key",[1053,2236,1304],{"class":1083},[1053,2238,2239],{"class":1055,"line":1576},[1053,2240,2241],{"class":1059},"            # Load session data\n",[1053,2243,2244,2247,2249,2251,2253,2255,2257,2260,2262,2265],{"class":1055,"line":1601},[1053,2245,2246],{"class":1319},"            request",[1053,2248,1353],{"class":1083},[1053,2250,1891],{"class":1356},[1053,2252,1084],{"class":1083},[1053,2254,1497],{"class":1079},[1053,2256,1353],{"class":1083},[1053,2258,2259],{"class":1406},"load_session",[1053,2261,1332],{"class":1083},[1053,2263,2264],{"class":1406},"session_key",[1053,2266,1509],{"class":1083},[1053,2268,2269,2272],{"class":1055,"line":1606},[1053,2270,2271],{"class":1394},"        else",[1053,2273,1304],{"class":1083},[1053,2275,2276,2278,2280,2282,2284],{"class":1055,"line":1612},[1053,2277,2246],{"class":1319},[1053,2279,1353],{"class":1083},[1053,2281,1891],{"class":1356},[1053,2283,1084],{"class":1083},[1053,2285,2286],{"class":1083}," {}\n",[1053,2288,2289],{"class":1055,"line":1626},[1053,2290,1485],{"class":1319},[1053,2292,2293,2295,2297,2299,2301,2303,2305,2307],{"class":1055,"line":1652},[1053,2294,1491],{"class":1319},[1053,2296,1494],{"class":1083},[1053,2298,1497],{"class":1079},[1053,2300,1353],{"class":1083},[1053,2302,1357],{"class":1406},[1053,2304,1332],{"class":1083},[1053,2306,1506],{"class":1406},[1053,2308,1509],{"class":1083},[1053,2310,2311],{"class":1055,"line":1657},[1053,2312,1485],{"class":1319},[1053,2314,2316],{"class":1055,"line":2315},35,[1053,2317,2318],{"class":1059},"        # Save session after view\n",[1053,2320,2322,2324,2327,2329,2331,2333,2335,2337,2339,2341,2343,2345,2347,2349],{"class":1055,"line":2321},36,[1053,2323,1395],{"class":1394},[1053,2325,2326],{"class":1328}," hasattr",[1053,2328,1332],{"class":1083},[1053,2330,1506],{"class":1406},[1053,2332,1104],{"class":1083},[1053,2334,1209],{"class":1093},[1053,2336,1891],{"class":1097},[1053,2338,1101],{"class":1093},[1053,2340,2059],{"class":1083},[1053,2342,1413],{"class":1398},[1053,2344,1382],{"class":1319},[1053,2346,1353],{"class":1083},[1053,2348,1891],{"class":1356},[1053,2350,1304],{"class":1083},[1053,2352,2354,2357,2359,2361,2363,2366,2368,2370,2372,2374],{"class":1055,"line":2353},37,[1053,2355,2356],{"class":1319},"            session_key ",[1053,2358,1494],{"class":1083},[1053,2360,1497],{"class":1079},[1053,2362,1353],{"class":1083},[1053,2364,2365],{"class":1406},"save_session",[1053,2367,1332],{"class":1083},[1053,2369,1506],{"class":1406},[1053,2371,1353],{"class":1083},[1053,2373,1891],{"class":1356},[1053,2375,1509],{"class":1083},[1053,2377,2379,2381,2383,2386,2388,2390,2392,2394,2396,2398],{"class":1055,"line":2378},38,[1053,2380,1629],{"class":1319},[1053,2382,1353],{"class":1083},[1053,2384,2385],{"class":1406},"set_cookie",[1053,2387,1332],{"class":1083},[1053,2389,1101],{"class":1093},[1053,2391,1785],{"class":1097},[1053,2393,1101],{"class":1093},[1053,2395,1104],{"class":1083},[1053,2397,2234],{"class":1406},[1053,2399,1509],{"class":1083},[1053,2401,2403],{"class":1055,"line":2402},39,[1053,2404,1485],{"class":1319},[1053,2406,2408,2410],{"class":1055,"line":2407},40,[1053,2409,1660],{"class":1394},[1053,2411,1663],{"class":1319},[1030,2413,2415],{"id":2414},"authentication-middleware","Authentication Middleware",[1035,2417,2419],{"id":2418},"authenticationmiddleware","AuthenticationMiddleware",[1026,2421,2422],{},"Adds the user attribute to requests:",[1043,2424,2426],{"className":1045,"code":2425,"language":1047,"meta":1048,"style":1048},"# django.contrib.auth.middleware.AuthenticationMiddleware\n\nMIDDLEWARE = [\n    'django.contrib.sessions.middleware.SessionMiddleware',  # Required first\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    # ... other middleware\n]\n\n# Usage in views\ndef my_view(request):\n    if request.user.is_authenticated:\n        return HttpResponse(f\"Hello, {request.user.username}!\")\n    else:\n        return HttpResponse(\"Please log in.\")\n\n# Custom authentication middleware\nclass CustomAuthMiddleware:\n    \"\"\"Custom authentication middleware\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        # Add user to request\n        user = self.get_user(request)\n        request.user = user\n        \n        response = self.get_response(request)\n        \n        return response\n    \n    def get_user(self, request):\n        \"\"\"Get user from session or return AnonymousUser\"\"\"\n        from django.contrib.auth.models import AnonymousUser\n        from django.contrib.auth import get_user_model\n        \n        User = get_user_model()\n        \n        try:\n            user_id = request.session.get('_auth_user_id')\n            if user_id:\n                return User.objects.get(pk=user_id)\n        except (User.DoesNotExist, KeyError):\n            pass\n        \n        return AnonymousUser()\n",[1050,2427,2428,2433,2437,2445,2458,2469,2473,2477,2481,2486,2498,2517,2550,2557,2574,2578,2583,2592,2601,2605,2621,2633,2637,2653,2658,2678,2692,2696,2714,2718,2724,2728,2745,2755,2784,2804,2808,2820,2824,2831,2859,2870,2901,2926,2932,2937],{"__ignoreMap":1048},[1053,2429,2430],{"class":1055,"line":1056},[1053,2431,2432],{"class":1059},"# django.contrib.auth.middleware.AuthenticationMiddleware\n",[1053,2434,2435],{"class":1055,"line":1063},[1053,2436,1067],{"emptyLinePlaceholder":1066},[1053,2438,2439,2441,2443],{"class":1055,"line":1070},[1053,2440,1080],{"class":1079},[1053,2442,1084],{"class":1083},[1053,2444,1087],{"class":1083},[1053,2446,2447,2449,2451,2453,2455],{"class":1055,"line":1076},[1053,2448,1094],{"class":1093},[1053,2450,1703],{"class":1097},[1053,2452,1101],{"class":1093},[1053,2454,1104],{"class":1083},[1053,2456,2457],{"class":1059},"  # Required first\n",[1053,2459,2460,2462,2465,2467],{"class":1055,"line":1090},[1053,2461,1094],{"class":1093},[1053,2463,2464],{"class":1097},"django.contrib.auth.middleware.AuthenticationMiddleware",[1053,2466,1101],{"class":1093},[1053,2468,1708],{"class":1083},[1053,2470,2471],{"class":1055,"line":1110},[1053,2472,1113],{"class":1059},[1053,2474,2475],{"class":1055,"line":1116},[1053,2476,1119],{"class":1083},[1053,2478,2479],{"class":1055,"line":1122},[1053,2480,1067],{"emptyLinePlaceholder":1066},[1053,2482,2483],{"class":1055,"line":1127},[1053,2484,2485],{"class":1059},"# Usage in views\n",[1053,2487,2488,2490,2492,2494,2496],{"class":1055,"line":1133},[1053,2489,1866],{"class":1296},[1053,2491,1870],{"class":1869},[1053,2493,1332],{"class":1083},[1053,2495,1506],{"class":1341},[1053,2497,1345],{"class":1083},[1053,2499,2500,2503,2505,2507,2510,2512,2515],{"class":1055,"line":1145},[1053,2501,2502],{"class":1394},"    if",[1053,2504,1382],{"class":1319},[1053,2506,1353],{"class":1083},[1053,2508,2509],{"class":1356},"user",[1053,2511,1353],{"class":1083},[1053,2513,2514],{"class":1356},"is_authenticated",[1053,2516,1304],{"class":1083},[1053,2518,2519,2521,2523,2525,2527,2530,2532,2534,2536,2538,2540,2543,2545,2548],{"class":1055,"line":1155},[1053,2520,1660],{"class":1394},[1053,2522,2092],{"class":1406},[1053,2524,1332],{"class":1083},[1053,2526,2097],{"class":1296},[1053,2528,2529],{"class":1097},"\"Hello, ",[1053,2531,2104],{"class":2103},[1053,2533,1506],{"class":1406},[1053,2535,1353],{"class":1083},[1053,2537,2509],{"class":1356},[1053,2539,1353],{"class":1083},[1053,2541,2542],{"class":1356},"username",[1053,2544,2110],{"class":2103},[1053,2546,2547],{"class":1097},"!\"",[1053,2549,1509],{"class":1083},[1053,2551,2552,2555],{"class":1055,"line":1165},[1053,2553,2554],{"class":1394},"    else",[1053,2556,1304],{"class":1083},[1053,2558,2559,2561,2563,2565,2567,2570,2572],{"class":1055,"line":1175},[1053,2560,1660],{"class":1394},[1053,2562,2092],{"class":1406},[1053,2564,1332],{"class":1083},[1053,2566,2113],{"class":1093},[1053,2568,2569],{"class":1097},"Please log in.",[1053,2571,2113],{"class":1093},[1053,2573,1509],{"class":1083},[1053,2575,2576],{"class":1055,"line":1190},[1053,2577,1067],{"emptyLinePlaceholder":1066},[1053,2579,2580],{"class":1055,"line":1201},[1053,2581,2582],{"class":1059},"# Custom authentication middleware\n",[1053,2584,2585,2587,2590],{"class":1055,"line":1218},[1053,2586,1297],{"class":1296},[1053,2588,2589],{"class":1300}," CustomAuthMiddleware",[1053,2591,1304],{"class":1083},[1053,2593,2594,2596,2599],{"class":1055,"line":1229},[1053,2595,1309],{"class":1256},[1053,2597,2598],{"class":1262},"Custom authentication middleware",[1053,2600,1257],{"class":1256},[1053,2602,2603],{"class":1055,"line":1429},[1053,2604,1320],{"class":1319},[1053,2606,2607,2609,2611,2613,2615,2617,2619],{"class":1055,"line":1441},[1053,2608,1325],{"class":1296},[1053,2610,1329],{"class":1328},[1053,2612,1332],{"class":1083},[1053,2614,1336],{"class":1335},[1053,2616,1104],{"class":1083},[1053,2618,1342],{"class":1341},[1053,2620,1345],{"class":1083},[1053,2622,2623,2625,2627,2629,2631],{"class":1055,"line":1476},[1053,2624,1350],{"class":1079},[1053,2626,1353],{"class":1083},[1053,2628,1357],{"class":1356},[1053,2630,1084],{"class":1083},[1053,2632,1362],{"class":1319},[1053,2634,2635],{"class":1055,"line":1482},[1053,2636,1320],{"class":1319},[1053,2638,2639,2641,2643,2645,2647,2649,2651],{"class":1055,"line":1488},[1053,2640,1325],{"class":1296},[1053,2642,1373],{"class":1328},[1053,2644,1332],{"class":1083},[1053,2646,1336],{"class":1335},[1053,2648,1104],{"class":1083},[1053,2650,1382],{"class":1341},[1053,2652,1345],{"class":1083},[1053,2654,2655],{"class":1055,"line":1512},[1053,2656,2657],{"class":1059},"        # Add user to request\n",[1053,2659,2660,2663,2665,2667,2669,2672,2674,2676],{"class":1055,"line":1517},[1053,2661,2662],{"class":1319},"        user ",[1053,2664,1494],{"class":1083},[1053,2666,1497],{"class":1079},[1053,2668,1353],{"class":1083},[1053,2670,2671],{"class":1406},"get_user",[1053,2673,1332],{"class":1083},[1053,2675,1506],{"class":1406},[1053,2677,1509],{"class":1083},[1053,2679,2680,2683,2685,2687,2689],{"class":1055,"line":1523},[1053,2681,2682],{"class":1319},"        request",[1053,2684,1353],{"class":1083},[1053,2686,2509],{"class":1356},[1053,2688,1084],{"class":1083},[1053,2690,2691],{"class":1319}," user\n",[1053,2693,2694],{"class":1055,"line":1551},[1053,2695,1485],{"class":1319},[1053,2697,2698,2700,2702,2704,2706,2708,2710,2712],{"class":1055,"line":1576},[1053,2699,1491],{"class":1319},[1053,2701,1494],{"class":1083},[1053,2703,1497],{"class":1079},[1053,2705,1353],{"class":1083},[1053,2707,1357],{"class":1406},[1053,2709,1332],{"class":1083},[1053,2711,1506],{"class":1406},[1053,2713,1509],{"class":1083},[1053,2715,2716],{"class":1055,"line":1601},[1053,2717,1485],{"class":1319},[1053,2719,2720,2722],{"class":1055,"line":1606},[1053,2721,1660],{"class":1394},[1053,2723,1663],{"class":1319},[1053,2725,2726],{"class":1055,"line":1612},[1053,2727,1320],{"class":1319},[1053,2729,2730,2732,2735,2737,2739,2741,2743],{"class":1055,"line":1626},[1053,2731,1325],{"class":1296},[1053,2733,2734],{"class":1869}," get_user",[1053,2736,1332],{"class":1083},[1053,2738,1336],{"class":1335},[1053,2740,1104],{"class":1083},[1053,2742,1382],{"class":1341},[1053,2744,1345],{"class":1083},[1053,2746,2747,2750,2753],{"class":1055,"line":1652},[1053,2748,2749],{"class":1256},"        \"\"\"",[1053,2751,2752],{"class":1262},"Get user from session or return AnonymousUser",[1053,2754,1257],{"class":1256},[1053,2756,2757,2760,2763,2765,2768,2770,2773,2775,2778,2781],{"class":1055,"line":1657},[1053,2758,2759],{"class":1394},"        from",[1053,2761,2762],{"class":1319}," django",[1053,2764,1353],{"class":1083},[1053,2766,2767],{"class":1319},"contrib",[1053,2769,1353],{"class":1083},[1053,2771,2772],{"class":1319},"auth",[1053,2774,1353],{"class":1083},[1053,2776,2777],{"class":1319},"models ",[1053,2779,2780],{"class":1394},"import",[1053,2782,2783],{"class":1319}," AnonymousUser\n",[1053,2785,2786,2788,2790,2792,2794,2796,2799,2801],{"class":1055,"line":2315},[1053,2787,2759],{"class":1394},[1053,2789,2762],{"class":1319},[1053,2791,1353],{"class":1083},[1053,2793,2767],{"class":1319},[1053,2795,1353],{"class":1083},[1053,2797,2798],{"class":1319},"auth ",[1053,2800,2780],{"class":1394},[1053,2802,2803],{"class":1319}," get_user_model\n",[1053,2805,2806],{"class":1055,"line":2321},[1053,2807,1485],{"class":1319},[1053,2809,2810,2813,2815,2818],{"class":1055,"line":2353},[1053,2811,2812],{"class":1319},"        User ",[1053,2814,1494],{"class":1083},[1053,2816,2817],{"class":1406}," get_user_model",[1053,2819,1473],{"class":1083},[1053,2821,2822],{"class":1055,"line":2378},[1053,2823,1485],{"class":1319},[1053,2825,2826,2829],{"class":1055,"line":2402},[1053,2827,2828],{"class":1394},"        try",[1053,2830,1304],{"class":1083},[1053,2832,2833,2836,2838,2840,2842,2844,2846,2848,2850,2852,2855,2857],{"class":1055,"line":2407},[1053,2834,2835],{"class":1319},"            user_id ",[1053,2837,1494],{"class":1083},[1053,2839,1382],{"class":1319},[1053,2841,1353],{"class":1083},[1053,2843,1891],{"class":1356},[1053,2845,1353],{"class":1083},[1053,2847,1980],{"class":1406},[1053,2849,1332],{"class":1083},[1053,2851,1101],{"class":1093},[1053,2853,2854],{"class":1097},"_auth_user_id",[1053,2856,1101],{"class":1093},[1053,2858,1509],{"class":1083},[1053,2860,2862,2865,2868],{"class":1055,"line":2861},41,[1053,2863,2864],{"class":1394},"            if",[1053,2866,2867],{"class":1319}," user_id",[1053,2869,1304],{"class":1083},[1053,2871,2873,2876,2879,2881,2884,2886,2888,2890,2894,2896,2899],{"class":1055,"line":2872},42,[1053,2874,2875],{"class":1394},"                return",[1053,2877,2878],{"class":1319}," User",[1053,2880,1353],{"class":1083},[1053,2882,2883],{"class":1356},"objects",[1053,2885,1353],{"class":1083},[1053,2887,1980],{"class":1406},[1053,2889,1332],{"class":1083},[1053,2891,2893],{"class":2892},"sqOPj","pk",[1053,2895,1494],{"class":1083},[1053,2897,2898],{"class":1406},"user_id",[1053,2900,1509],{"class":1083},[1053,2902,2904,2907,2910,2913,2915,2918,2920,2924],{"class":1055,"line":2903},43,[1053,2905,2906],{"class":1394},"        except",[1053,2908,2909],{"class":1083}," (",[1053,2911,2912],{"class":1319},"User",[1053,2914,1353],{"class":1083},[1053,2916,2917],{"class":1356},"DoesNotExist",[1053,2919,1104],{"class":1083},[1053,2921,2923],{"class":2922},"sa2tF"," KeyError",[1053,2925,1345],{"class":1083},[1053,2927,2929],{"class":1055,"line":2928},44,[1053,2930,2931],{"class":1394},"            pass\n",[1053,2933,2935],{"class":1055,"line":2934},45,[1053,2936,1485],{"class":1319},[1053,2938,2940,2942,2945],{"class":1055,"line":2939},46,[1053,2941,1660],{"class":1394},[1053,2943,2944],{"class":1406}," AnonymousUser",[1053,2946,1473],{"class":1083},[1030,2948,2950],{"id":2949},"csrf-middleware","CSRF Middleware",[1035,2952,2954],{"id":2953},"csrfviewmiddleware","CsrfViewMiddleware",[1026,2956,2957],{},"Protects against Cross-Site Request Forgery attacks:",[1043,2959,2961],{"className":1045,"code":2960,"language":1047,"meta":1048,"style":1048},"# django.middleware.csrf.CsrfViewMiddleware\n\nMIDDLEWARE = [\n    'django.middleware.csrf.CsrfViewMiddleware',\n    # ... other middleware\n]\n\n# CSRF settings\nCSRF_COOKIE_AGE = 31449600  # 1 year\nCSRF_COOKIE_DOMAIN = None\nCSRF_COOKIE_HTTPONLY = False  # Must be False for JavaScript access\nCSRF_COOKIE_NAME = 'csrftoken'\nCSRF_COOKIE_PATH = '/'\nCSRF_COOKIE_SAMESITE = 'Lax'\nCSRF_COOKIE_SECURE = False  # Set to True in production with HTTPS\nCSRF_FAILURE_VIEW = 'django.views.csrf.csrf_failure'\nCSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN'\nCSRF_TRUSTED_ORIGINS = []\nCSRF_USE_SESSIONS = False\n",[1050,2962,2963,2968,2972,2980,2991,2995,2999,3003,3008,3020,3029,3041,3055,3068,3081,3092,3106,3120,3129],{"__ignoreMap":1048},[1053,2964,2965],{"class":1055,"line":1056},[1053,2966,2967],{"class":1059},"# django.middleware.csrf.CsrfViewMiddleware\n",[1053,2969,2970],{"class":1055,"line":1063},[1053,2971,1067],{"emptyLinePlaceholder":1066},[1053,2973,2974,2976,2978],{"class":1055,"line":1070},[1053,2975,1080],{"class":1079},[1053,2977,1084],{"class":1083},[1053,2979,1087],{"class":1083},[1053,2981,2982,2984,2987,2989],{"class":1055,"line":1076},[1053,2983,1094],{"class":1093},[1053,2985,2986],{"class":1097},"django.middleware.csrf.CsrfViewMiddleware",[1053,2988,1101],{"class":1093},[1053,2990,1708],{"class":1083},[1053,2992,2993],{"class":1055,"line":1090},[1053,2994,1113],{"class":1059},[1053,2996,2997],{"class":1055,"line":1110},[1053,2998,1119],{"class":1083},[1053,3000,3001],{"class":1055,"line":1116},[1053,3002,1067],{"emptyLinePlaceholder":1066},[1053,3004,3005],{"class":1055,"line":1122},[1053,3006,3007],{"class":1059},"# CSRF settings\n",[1053,3009,3010,3013,3015,3018],{"class":1055,"line":1127},[1053,3011,3012],{"class":1079},"CSRF_COOKIE_AGE",[1053,3014,1084],{"class":1083},[1053,3016,3017],{"class":1183}," 31449600",[1053,3019,1187],{"class":1059},[1053,3021,3022,3025,3027],{"class":1055,"line":1133},[1053,3023,3024],{"class":1079},"CSRF_COOKIE_DOMAIN",[1053,3026,1084],{"class":1083},[1053,3028,1226],{"class":1141},[1053,3030,3031,3034,3036,3038],{"class":1055,"line":1145},[1053,3032,3033],{"class":1079},"CSRF_COOKIE_HTTPONLY",[1053,3035,1084],{"class":1083},[1053,3037,1825],{"class":1141},[1053,3039,3040],{"class":1059},"  # Must be False for JavaScript access\n",[1053,3042,3043,3046,3048,3050,3053],{"class":1055,"line":1155},[1053,3044,3045],{"class":1079},"CSRF_COOKIE_NAME",[1053,3047,1084],{"class":1083},[1053,3049,1209],{"class":1093},[1053,3051,3052],{"class":1097},"csrftoken",[1053,3054,1215],{"class":1093},[1053,3056,3057,3060,3062,3064,3066],{"class":1055,"line":1165},[1053,3058,3059],{"class":1079},"CSRF_COOKIE_PATH",[1053,3061,1084],{"class":1083},[1053,3063,1209],{"class":1093},[1053,3065,1799],{"class":1097},[1053,3067,1215],{"class":1093},[1053,3069,3070,3073,3075,3077,3079],{"class":1055,"line":1175},[1053,3071,3072],{"class":1079},"CSRF_COOKIE_SAMESITE",[1053,3074,1084],{"class":1083},[1053,3076,1209],{"class":1093},[1053,3078,1813],{"class":1097},[1053,3080,1215],{"class":1093},[1053,3082,3083,3086,3088,3090],{"class":1055,"line":1190},[1053,3084,3085],{"class":1079},"CSRF_COOKIE_SECURE",[1053,3087,1084],{"class":1083},[1053,3089,1825],{"class":1141},[1053,3091,1828],{"class":1059},[1053,3093,3094,3097,3099,3101,3104],{"class":1055,"line":1201},[1053,3095,3096],{"class":1079},"CSRF_FAILURE_VIEW",[1053,3098,1084],{"class":1083},[1053,3100,1209],{"class":1093},[1053,3102,3103],{"class":1097},"django.views.csrf.csrf_failure",[1053,3105,1215],{"class":1093},[1053,3107,3108,3111,3113,3115,3118],{"class":1055,"line":1218},[1053,3109,3110],{"class":1079},"CSRF_HEADER_NAME",[1053,3112,1084],{"class":1083},[1053,3114,1209],{"class":1093},[1053,3116,3117],{"class":1097},"HTTP_X_CSRFTOKEN",[1053,3119,1215],{"class":1093},[1053,3121,3122,3125,3127],{"class":1055,"line":1229},[1053,3123,3124],{"class":1079},"CSRF_TRUSTED_ORIGINS",[1053,3126,1084],{"class":1083},[1053,3128,1198],{"class":1083},[1053,3130,3131,3134,3136],{"class":1055,"line":1429},[1053,3132,3133],{"class":1079},"CSRF_USE_SESSIONS",[1053,3135,1084],{"class":1083},[1053,3137,1838],{"class":1141},[1238,3139,3141],{"id":3140},"csrf-protection-examples","CSRF Protection Examples:",[1043,3143,3145],{"className":1045,"code":3144,"language":1047,"meta":1048,"style":1048},"# In templates\n\"\"\"\n\u003Cform method=\"post\">\n    {% csrf_token %}\n    \u003C!-- form fields -->\n\u003C/form>\n\"\"\"\n\n# In JavaScript (AJAX)\n\"\"\"\n// Get CSRF token from cookie\nfunction getCookie(name) {\n    let cookieValue = null;\n    if (document.cookie && document.cookie !== '') {\n        const cookies = document.cookie.split(';');\n        for (let i = 0; i \u003C cookies.length; i++) {\n            const cookie = cookies[i].trim();\n            if (cookie.substring(0, name.length + 1) === (name + '=')) {\n                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));\n                break;\n            }\n        }\n    }\n    return cookieValue;\n}\n\nconst csrftoken = getCookie('csrftoken');\n\n// Use in AJAX requests\nfetch('/api/endpoint/', {\n    method: 'POST',\n    headers: {\n        'X-CSRFToken': csrftoken,\n        'Content-Type': 'application/json',\n    },\n    body: JSON.stringify(data)\n});\n\"\"\"\n\n# Exempting views from CSRF protection\nfrom django.views.decorators.csrf import csrf_exempt\n\n@csrf_exempt\ndef api_endpoint(request):\n    # This view is exempt from CSRF protection\n    return JsonResponse({'status': 'ok'})\n\n# Custom CSRF middleware example\nclass CustomCSRFMiddleware:\n    \"\"\"Custom CSRF protection\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        if request.method in ('POST', 'PUT', 'PATCH', 'DELETE'):\n            if not self.is_csrf_valid(request):\n                return HttpResponseForbidden('CSRF token missing or invalid')\n        \n        response = self.get_response(request)\n        \n        # Set CSRF token cookie\n        if not request.COOKIES.get('csrftoken'):\n            csrf_token = self.generate_csrf_token()\n            response.set_cookie('csrftoken', csrf_token)\n        \n        return response\n    \n    def is_csrf_valid(self, request):\n        \"\"\"Validate CSRF token\"\"\"\n        token_from_cookie = request.COOKIES.get('csrftoken')\n        token_from_header = request.META.get('HTTP_X_CSRFTOKEN')\n        \n        return token_from_cookie and token_from_cookie == token_from_header\n",[1050,3146,3147,3152,3156,3161,3166,3171,3176,3180,3184,3189,3193,3198,3203,3208,3213,3218,3223,3228,3233,3238,3243,3248,3253,3258,3263,3268,3272,3277,3281,3286,3291,3296,3301,3306,3311,3316,3321,3326,3330,3334,3339,3366,3370,3378,3391,3396,3426,3431,3437,3447,3457,3462,3479,3492,3497,3514,3567,3587,3606,3611,3630,3635,3641,3668,3685,3709,3714,3721,3726,3744,3754,3782,3811,3816],{"__ignoreMap":1048},[1053,3148,3149],{"class":1055,"line":1056},[1053,3150,3151],{"class":1059},"# In templates\n",[1053,3153,3154],{"class":1055,"line":1063},[1053,3155,1257],{"class":1256},[1053,3157,3158],{"class":1055,"line":1070},[1053,3159,3160],{"class":1262},"\u003Cform method=\"post\">\n",[1053,3162,3163],{"class":1055,"line":1076},[1053,3164,3165],{"class":1262},"    {% csrf_token %}\n",[1053,3167,3168],{"class":1055,"line":1090},[1053,3169,3170],{"class":1262},"    \u003C!-- form fields -->\n",[1053,3172,3173],{"class":1055,"line":1110},[1053,3174,3175],{"class":1262},"\u003C/form>\n",[1053,3177,3178],{"class":1055,"line":1116},[1053,3179,1257],{"class":1256},[1053,3181,3182],{"class":1055,"line":1122},[1053,3183,1067],{"emptyLinePlaceholder":1066},[1053,3185,3186],{"class":1055,"line":1127},[1053,3187,3188],{"class":1059},"# In JavaScript (AJAX)\n",[1053,3190,3191],{"class":1055,"line":1133},[1053,3192,1257],{"class":1256},[1053,3194,3195],{"class":1055,"line":1145},[1053,3196,3197],{"class":1262},"// Get CSRF token from cookie\n",[1053,3199,3200],{"class":1055,"line":1155},[1053,3201,3202],{"class":1262},"function getCookie(name) {\n",[1053,3204,3205],{"class":1055,"line":1165},[1053,3206,3207],{"class":1262},"    let cookieValue = null;\n",[1053,3209,3210],{"class":1055,"line":1175},[1053,3211,3212],{"class":1262},"    if (document.cookie && document.cookie !== '') {\n",[1053,3214,3215],{"class":1055,"line":1190},[1053,3216,3217],{"class":1262},"        const cookies = document.cookie.split(';');\n",[1053,3219,3220],{"class":1055,"line":1201},[1053,3221,3222],{"class":1262},"        for (let i = 0; i \u003C cookies.length; i++) {\n",[1053,3224,3225],{"class":1055,"line":1218},[1053,3226,3227],{"class":1262},"            const cookie = cookies[i].trim();\n",[1053,3229,3230],{"class":1055,"line":1229},[1053,3231,3232],{"class":1262},"            if (cookie.substring(0, name.length + 1) === (name + '=')) {\n",[1053,3234,3235],{"class":1055,"line":1429},[1053,3236,3237],{"class":1262},"                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));\n",[1053,3239,3240],{"class":1055,"line":1441},[1053,3241,3242],{"class":1262},"                break;\n",[1053,3244,3245],{"class":1055,"line":1476},[1053,3246,3247],{"class":1262},"            }\n",[1053,3249,3250],{"class":1055,"line":1482},[1053,3251,3252],{"class":1262},"        }\n",[1053,3254,3255],{"class":1055,"line":1488},[1053,3256,3257],{"class":1262},"    }\n",[1053,3259,3260],{"class":1055,"line":1512},[1053,3261,3262],{"class":1262},"    return cookieValue;\n",[1053,3264,3265],{"class":1055,"line":1517},[1053,3266,3267],{"class":1262},"}\n",[1053,3269,3270],{"class":1055,"line":1523},[1053,3271,1067],{"emptyLinePlaceholder":1066},[1053,3273,3274],{"class":1055,"line":1551},[1053,3275,3276],{"class":1262},"const csrftoken = getCookie('csrftoken');\n",[1053,3278,3279],{"class":1055,"line":1576},[1053,3280,1067],{"emptyLinePlaceholder":1066},[1053,3282,3283],{"class":1055,"line":1601},[1053,3284,3285],{"class":1262},"// Use in AJAX requests\n",[1053,3287,3288],{"class":1055,"line":1606},[1053,3289,3290],{"class":1262},"fetch('/api/endpoint/', {\n",[1053,3292,3293],{"class":1055,"line":1612},[1053,3294,3295],{"class":1262},"    method: 'POST',\n",[1053,3297,3298],{"class":1055,"line":1626},[1053,3299,3300],{"class":1262},"    headers: {\n",[1053,3302,3303],{"class":1055,"line":1652},[1053,3304,3305],{"class":1262},"        'X-CSRFToken': csrftoken,\n",[1053,3307,3308],{"class":1055,"line":1657},[1053,3309,3310],{"class":1262},"        'Content-Type': 'application/json',\n",[1053,3312,3313],{"class":1055,"line":2315},[1053,3314,3315],{"class":1262},"    },\n",[1053,3317,3318],{"class":1055,"line":2321},[1053,3319,3320],{"class":1262},"    body: JSON.stringify(data)\n",[1053,3322,3323],{"class":1055,"line":2353},[1053,3324,3325],{"class":1262},"});\n",[1053,3327,3328],{"class":1055,"line":2378},[1053,3329,1257],{"class":1256},[1053,3331,3332],{"class":1055,"line":2402},[1053,3333,1067],{"emptyLinePlaceholder":1066},[1053,3335,3336],{"class":1055,"line":2407},[1053,3337,3338],{"class":1059},"# Exempting views from CSRF protection\n",[1053,3340,3341,3344,3346,3348,3351,3353,3356,3358,3361,3363],{"class":1055,"line":2861},[1053,3342,3343],{"class":1394},"from",[1053,3345,2762],{"class":1319},[1053,3347,1353],{"class":1083},[1053,3349,3350],{"class":1319},"views",[1053,3352,1353],{"class":1083},[1053,3354,3355],{"class":1319},"decorators",[1053,3357,1353],{"class":1083},[1053,3359,3360],{"class":1319},"csrf ",[1053,3362,2780],{"class":1394},[1053,3364,3365],{"class":1319}," csrf_exempt\n",[1053,3367,3368],{"class":1055,"line":2872},[1053,3369,1067],{"emptyLinePlaceholder":1066},[1053,3371,3372,3375],{"class":1055,"line":2903},[1053,3373,3374],{"class":1083},"@",[1053,3376,3377],{"class":1869},"csrf_exempt\n",[1053,3379,3380,3382,3385,3387,3389],{"class":1055,"line":2928},[1053,3381,1866],{"class":1296},[1053,3383,3384],{"class":1869}," api_endpoint",[1053,3386,1332],{"class":1083},[1053,3388,1506],{"class":1341},[1053,3390,1345],{"class":1083},[1053,3392,3393],{"class":1055,"line":2934},[1053,3394,3395],{"class":1059},"    # This view is exempt from CSRF protection\n",[1053,3397,3398,3400,3403,3406,3408,3411,3413,3416,3418,3421,3423],{"class":1055,"line":2939},[1053,3399,2089],{"class":1394},[1053,3401,3402],{"class":1406}," JsonResponse",[1053,3404,3405],{"class":1083},"({",[1053,3407,1101],{"class":1093},[1053,3409,3410],{"class":1097},"status",[1053,3412,1101],{"class":1093},[1053,3414,3415],{"class":1083},":",[1053,3417,1209],{"class":1093},[1053,3419,3420],{"class":1097},"ok",[1053,3422,1101],{"class":1093},[1053,3424,3425],{"class":1083},"})\n",[1053,3427,3429],{"class":1055,"line":3428},47,[1053,3430,1067],{"emptyLinePlaceholder":1066},[1053,3432,3434],{"class":1055,"line":3433},48,[1053,3435,3436],{"class":1059},"# Custom CSRF middleware example\n",[1053,3438,3440,3442,3445],{"class":1055,"line":3439},49,[1053,3441,1297],{"class":1296},[1053,3443,3444],{"class":1300}," CustomCSRFMiddleware",[1053,3446,1304],{"class":1083},[1053,3448,3450,3452,3455],{"class":1055,"line":3449},50,[1053,3451,1309],{"class":1256},[1053,3453,3454],{"class":1262},"Custom CSRF protection",[1053,3456,1257],{"class":1256},[1053,3458,3460],{"class":1055,"line":3459},51,[1053,3461,1320],{"class":1319},[1053,3463,3465,3467,3469,3471,3473,3475,3477],{"class":1055,"line":3464},52,[1053,3466,1325],{"class":1296},[1053,3468,1329],{"class":1328},[1053,3470,1332],{"class":1083},[1053,3472,1336],{"class":1335},[1053,3474,1104],{"class":1083},[1053,3476,1342],{"class":1341},[1053,3478,1345],{"class":1083},[1053,3480,3482,3484,3486,3488,3490],{"class":1055,"line":3481},53,[1053,3483,1350],{"class":1079},[1053,3485,1353],{"class":1083},[1053,3487,1357],{"class":1356},[1053,3489,1084],{"class":1083},[1053,3491,1362],{"class":1319},[1053,3493,3495],{"class":1055,"line":3494},54,[1053,3496,1320],{"class":1319},[1053,3498,3500,3502,3504,3506,3508,3510,3512],{"class":1055,"line":3499},55,[1053,3501,1325],{"class":1296},[1053,3503,1373],{"class":1328},[1053,3505,1332],{"class":1083},[1053,3507,1336],{"class":1335},[1053,3509,1104],{"class":1083},[1053,3511,1382],{"class":1341},[1053,3513,1345],{"class":1083},[1053,3515,3517,3519,3521,3523,3526,3529,3531,3533,3536,3538,3540,3542,3545,3547,3549,3551,3554,3556,3558,3560,3563,3565],{"class":1055,"line":3516},56,[1053,3518,1395],{"class":1394},[1053,3520,1382],{"class":1319},[1053,3522,1353],{"class":1083},[1053,3524,3525],{"class":1356},"method",[1053,3527,3528],{"class":1398}," in",[1053,3530,2909],{"class":1083},[1053,3532,1101],{"class":1093},[1053,3534,3535],{"class":1097},"POST",[1053,3537,1101],{"class":1093},[1053,3539,1104],{"class":1083},[1053,3541,1209],{"class":1093},[1053,3543,3544],{"class":1097},"PUT",[1053,3546,1101],{"class":1093},[1053,3548,1104],{"class":1083},[1053,3550,1209],{"class":1093},[1053,3552,3553],{"class":1097},"PATCH",[1053,3555,1101],{"class":1093},[1053,3557,1104],{"class":1083},[1053,3559,1209],{"class":1093},[1053,3561,3562],{"class":1097},"DELETE",[1053,3564,1101],{"class":1093},[1053,3566,1345],{"class":1083},[1053,3568,3570,3572,3574,3576,3578,3581,3583,3585],{"class":1055,"line":3569},57,[1053,3571,2864],{"class":1394},[1053,3573,1399],{"class":1398},[1053,3575,1497],{"class":1079},[1053,3577,1353],{"class":1083},[1053,3579,3580],{"class":1406},"is_csrf_valid",[1053,3582,1332],{"class":1083},[1053,3584,1506],{"class":1406},[1053,3586,1345],{"class":1083},[1053,3588,3590,3592,3595,3597,3599,3602,3604],{"class":1055,"line":3589},58,[1053,3591,2875],{"class":1394},[1053,3593,3594],{"class":1406}," HttpResponseForbidden",[1053,3596,1332],{"class":1083},[1053,3598,1101],{"class":1093},[1053,3600,3601],{"class":1097},"CSRF token missing or invalid",[1053,3603,1101],{"class":1093},[1053,3605,1509],{"class":1083},[1053,3607,3609],{"class":1055,"line":3608},59,[1053,3610,1485],{"class":1319},[1053,3612,3614,3616,3618,3620,3622,3624,3626,3628],{"class":1055,"line":3613},60,[1053,3615,1491],{"class":1319},[1053,3617,1494],{"class":1083},[1053,3619,1497],{"class":1079},[1053,3621,1353],{"class":1083},[1053,3623,1357],{"class":1406},[1053,3625,1332],{"class":1083},[1053,3627,1506],{"class":1406},[1053,3629,1509],{"class":1083},[1053,3631,3633],{"class":1055,"line":3632},61,[1053,3634,1485],{"class":1319},[1053,3636,3638],{"class":1055,"line":3637},62,[1053,3639,3640],{"class":1059},"        # Set CSRF token cookie\n",[1053,3642,3644,3646,3648,3650,3652,3654,3656,3658,3660,3662,3664,3666],{"class":1055,"line":3643},63,[1053,3645,1395],{"class":1394},[1053,3647,1399],{"class":1398},[1053,3649,1382],{"class":1319},[1053,3651,1353],{"class":1083},[1053,3653,2213],{"class":1423},[1053,3655,1353],{"class":1083},[1053,3657,1980],{"class":1406},[1053,3659,1332],{"class":1083},[1053,3661,1101],{"class":1093},[1053,3663,3052],{"class":1097},[1053,3665,1101],{"class":1093},[1053,3667,1345],{"class":1083},[1053,3669,3671,3674,3676,3678,3680,3683],{"class":1055,"line":3670},64,[1053,3672,3673],{"class":1319},"            csrf_token ",[1053,3675,1494],{"class":1083},[1053,3677,1497],{"class":1079},[1053,3679,1353],{"class":1083},[1053,3681,3682],{"class":1406},"generate_csrf_token",[1053,3684,1473],{"class":1083},[1053,3686,3688,3690,3692,3694,3696,3698,3700,3702,3704,3707],{"class":1055,"line":3687},65,[1053,3689,1629],{"class":1319},[1053,3691,1353],{"class":1083},[1053,3693,2385],{"class":1406},[1053,3695,1332],{"class":1083},[1053,3697,1101],{"class":1093},[1053,3699,3052],{"class":1097},[1053,3701,1101],{"class":1093},[1053,3703,1104],{"class":1083},[1053,3705,3706],{"class":1406}," csrf_token",[1053,3708,1509],{"class":1083},[1053,3710,3712],{"class":1055,"line":3711},66,[1053,3713,1485],{"class":1319},[1053,3715,3717,3719],{"class":1055,"line":3716},67,[1053,3718,1660],{"class":1394},[1053,3720,1663],{"class":1319},[1053,3722,3724],{"class":1055,"line":3723},68,[1053,3725,1320],{"class":1319},[1053,3727,3729,3731,3734,3736,3738,3740,3742],{"class":1055,"line":3728},69,[1053,3730,1325],{"class":1296},[1053,3732,3733],{"class":1869}," is_csrf_valid",[1053,3735,1332],{"class":1083},[1053,3737,1336],{"class":1335},[1053,3739,1104],{"class":1083},[1053,3741,1382],{"class":1341},[1053,3743,1345],{"class":1083},[1053,3745,3747,3749,3752],{"class":1055,"line":3746},70,[1053,3748,2749],{"class":1256},[1053,3750,3751],{"class":1262},"Validate CSRF token",[1053,3753,1257],{"class":1256},[1053,3755,3757,3760,3762,3764,3766,3768,3770,3772,3774,3776,3778,3780],{"class":1055,"line":3756},71,[1053,3758,3759],{"class":1319},"        token_from_cookie ",[1053,3761,1494],{"class":1083},[1053,3763,1382],{"class":1319},[1053,3765,1353],{"class":1083},[1053,3767,2213],{"class":1423},[1053,3769,1353],{"class":1083},[1053,3771,1980],{"class":1406},[1053,3773,1332],{"class":1083},[1053,3775,1101],{"class":1093},[1053,3777,3052],{"class":1097},[1053,3779,1101],{"class":1093},[1053,3781,1509],{"class":1083},[1053,3783,3785,3788,3790,3792,3794,3797,3799,3801,3803,3805,3807,3809],{"class":1055,"line":3784},72,[1053,3786,3787],{"class":1319},"        token_from_header ",[1053,3789,1494],{"class":1083},[1053,3791,1382],{"class":1319},[1053,3793,1353],{"class":1083},[1053,3795,3796],{"class":1423},"META",[1053,3798,1353],{"class":1083},[1053,3800,1980],{"class":1406},[1053,3802,1332],{"class":1083},[1053,3804,1101],{"class":1093},[1053,3806,3117],{"class":1097},[1053,3808,1101],{"class":1093},[1053,3810,1509],{"class":1083},[1053,3812,3814],{"class":1055,"line":3813},73,[1053,3815,1485],{"class":1319},[1053,3817,3819,3821,3824,3827,3829,3832],{"class":1055,"line":3818},74,[1053,3820,1660],{"class":1394},[1053,3822,3823],{"class":1319}," token_from_cookie ",[1053,3825,3826],{"class":1398},"and",[1053,3828,3823],{"class":1319},[1053,3830,3831],{"class":1398},"==",[1053,3833,3834],{"class":1319}," token_from_header\n",[1030,3836,3838],{"id":3837},"common-middleware","Common Middleware",[1035,3840,3842],{"id":3841},"commonmiddleware","CommonMiddleware",[1026,3844,3845],{},"Provides several common features:",[1043,3847,3849],{"className":1045,"code":3848,"language":1047,"meta":1048,"style":1048},"# django.middleware.common.CommonMiddleware\n\nMIDDLEWARE = [\n    'django.middleware.common.CommonMiddleware',\n    # ... other middleware\n]\n\n# Settings it respects\nAPPEND_SLASH = True\nPREPEND_WWW = False\nDISALLOWED_USER_AGENTS = []\nUSE_ETAGS = False\n",[1050,3850,3851,3856,3860,3868,3879,3883,3887,3891,3896,3905,3914,3923],{"__ignoreMap":1048},[1053,3852,3853],{"class":1055,"line":1056},[1053,3854,3855],{"class":1059},"# django.middleware.common.CommonMiddleware\n",[1053,3857,3858],{"class":1055,"line":1063},[1053,3859,1067],{"emptyLinePlaceholder":1066},[1053,3861,3862,3864,3866],{"class":1055,"line":1070},[1053,3863,1080],{"class":1079},[1053,3865,1084],{"class":1083},[1053,3867,1087],{"class":1083},[1053,3869,3870,3872,3875,3877],{"class":1055,"line":1076},[1053,3871,1094],{"class":1093},[1053,3873,3874],{"class":1097},"django.middleware.common.CommonMiddleware",[1053,3876,1101],{"class":1093},[1053,3878,1708],{"class":1083},[1053,3880,3881],{"class":1055,"line":1090},[1053,3882,1113],{"class":1059},[1053,3884,3885],{"class":1055,"line":1110},[1053,3886,1119],{"class":1083},[1053,3888,3889],{"class":1055,"line":1116},[1053,3890,1067],{"emptyLinePlaceholder":1066},[1053,3892,3893],{"class":1055,"line":1122},[1053,3894,3895],{"class":1059},"# Settings it respects\n",[1053,3897,3898,3901,3903],{"class":1055,"line":1127},[1053,3899,3900],{"class":1079},"APPEND_SLASH",[1053,3902,1084],{"class":1083},[1053,3904,1142],{"class":1141},[1053,3906,3907,3910,3912],{"class":1055,"line":1133},[1053,3908,3909],{"class":1079},"PREPEND_WWW",[1053,3911,1084],{"class":1083},[1053,3913,1838],{"class":1141},[1053,3915,3916,3919,3921],{"class":1055,"line":1145},[1053,3917,3918],{"class":1079},"DISALLOWED_USER_AGENTS",[1053,3920,1084],{"class":1083},[1053,3922,1198],{"class":1083},[1053,3924,3925,3928,3930],{"class":1055,"line":1155},[1053,3926,3927],{"class":1079},"USE_ETAGS",[1053,3929,1084],{"class":1083},[1053,3931,1838],{"class":1141},[1238,3933,3935],{"id":3934},"commonmiddleware-features","CommonMiddleware Features:",[1043,3937,3939],{"className":1045,"code":3938,"language":1047,"meta":1048,"style":1048},"# What CommonMiddleware does:\n\n# 1. URL rewriting (APPEND_SLASH)\n# /example → /example/ (if APPEND_SLASH=True and /example/ exists)\n\n# 2. WWW subdomain handling\n# example.com → www.example.com (if PREPEND_WWW=True)\n\n# 3. User agent blocking\nDISALLOWED_USER_AGENTS = [\n    re.compile(r'BadBot'),\n    re.compile(r'Scraper'),\n]\n\n# 4. ETags for caching\n# Automatically adds ETag headers based on response content\n\n# Custom common middleware example\nclass CustomCommonMiddleware:\n    \"\"\"Custom common functionality\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        # URL normalization\n        if settings.APPEND_SLASH and not request.path.endswith('/'):\n            # Check if URL with slash exists\n            new_path = request.path + '/'\n            if self.url_exists(new_path):\n                return HttpResponsePermanentRedirect(new_path)\n        \n        # Block disallowed user agents\n        user_agent = request.META.get('HTTP_USER_AGENT', '')\n        if self.is_disallowed_user_agent(user_agent):\n            return HttpResponseForbidden('User agent not allowed')\n        \n        response = self.get_response(request)\n        \n        # Add ETag header\n        if settings.USE_ETAGS:\n            etag = self.calculate_etag(response.content)\n            response['ETag'] = etag\n        \n        return response\n",[1050,3940,3941,3946,3950,3955,3960,3964,3969,3974,3978,3983,3991,4017,4038,4042,4046,4051,4056,4060,4065,4074,4083,4087,4103,4115,4119,4135,4140,4176,4181,4202,4220,4232,4236,4241,4274,4292,4309,4313,4331,4335,4340,4352,4378,4398,4402],{"__ignoreMap":1048},[1053,3942,3943],{"class":1055,"line":1056},[1053,3944,3945],{"class":1059},"# What CommonMiddleware does:\n",[1053,3947,3948],{"class":1055,"line":1063},[1053,3949,1067],{"emptyLinePlaceholder":1066},[1053,3951,3952],{"class":1055,"line":1070},[1053,3953,3954],{"class":1059},"# 1. URL rewriting (APPEND_SLASH)\n",[1053,3956,3957],{"class":1055,"line":1076},[1053,3958,3959],{"class":1059},"# /example → /example/ (if APPEND_SLASH=True and /example/ exists)\n",[1053,3961,3962],{"class":1055,"line":1090},[1053,3963,1067],{"emptyLinePlaceholder":1066},[1053,3965,3966],{"class":1055,"line":1110},[1053,3967,3968],{"class":1059},"# 2. WWW subdomain handling\n",[1053,3970,3971],{"class":1055,"line":1116},[1053,3972,3973],{"class":1059},"# example.com → www.example.com (if PREPEND_WWW=True)\n",[1053,3975,3976],{"class":1055,"line":1122},[1053,3977,1067],{"emptyLinePlaceholder":1066},[1053,3979,3980],{"class":1055,"line":1127},[1053,3981,3982],{"class":1059},"# 3. User agent blocking\n",[1053,3984,3985,3987,3989],{"class":1055,"line":1133},[1053,3986,3918],{"class":1079},[1053,3988,1084],{"class":1083},[1053,3990,1087],{"class":1083},[1053,3992,3993,3996,3998,4001,4003,4006,4008,4012,4014],{"class":1055,"line":1145},[1053,3994,3995],{"class":1319},"    re",[1053,3997,1353],{"class":1083},[1053,3999,4000],{"class":1406},"compile",[1053,4002,1332],{"class":1083},[1053,4004,4005],{"class":1296},"r",[1053,4007,1101],{"class":1093},[1053,4009,4011],{"class":4010},"s27EL","BadBot",[1053,4013,1101],{"class":1093},[1053,4015,4016],{"class":1083},"),\n",[1053,4018,4019,4021,4023,4025,4027,4029,4031,4034,4036],{"class":1055,"line":1155},[1053,4020,3995],{"class":1319},[1053,4022,1353],{"class":1083},[1053,4024,4000],{"class":1406},[1053,4026,1332],{"class":1083},[1053,4028,4005],{"class":1296},[1053,4030,1101],{"class":1093},[1053,4032,4033],{"class":4010},"Scraper",[1053,4035,1101],{"class":1093},[1053,4037,4016],{"class":1083},[1053,4039,4040],{"class":1055,"line":1165},[1053,4041,1119],{"class":1083},[1053,4043,4044],{"class":1055,"line":1175},[1053,4045,1067],{"emptyLinePlaceholder":1066},[1053,4047,4048],{"class":1055,"line":1190},[1053,4049,4050],{"class":1059},"# 4. ETags for caching\n",[1053,4052,4053],{"class":1055,"line":1201},[1053,4054,4055],{"class":1059},"# Automatically adds ETag headers based on response content\n",[1053,4057,4058],{"class":1055,"line":1218},[1053,4059,1067],{"emptyLinePlaceholder":1066},[1053,4061,4062],{"class":1055,"line":1229},[1053,4063,4064],{"class":1059},"# Custom common middleware example\n",[1053,4066,4067,4069,4072],{"class":1055,"line":1429},[1053,4068,1297],{"class":1296},[1053,4070,4071],{"class":1300}," CustomCommonMiddleware",[1053,4073,1304],{"class":1083},[1053,4075,4076,4078,4081],{"class":1055,"line":1441},[1053,4077,1309],{"class":1256},[1053,4079,4080],{"class":1262},"Custom common functionality",[1053,4082,1257],{"class":1256},[1053,4084,4085],{"class":1055,"line":1476},[1053,4086,1320],{"class":1319},[1053,4088,4089,4091,4093,4095,4097,4099,4101],{"class":1055,"line":1482},[1053,4090,1325],{"class":1296},[1053,4092,1329],{"class":1328},[1053,4094,1332],{"class":1083},[1053,4096,1336],{"class":1335},[1053,4098,1104],{"class":1083},[1053,4100,1342],{"class":1341},[1053,4102,1345],{"class":1083},[1053,4104,4105,4107,4109,4111,4113],{"class":1055,"line":1488},[1053,4106,1350],{"class":1079},[1053,4108,1353],{"class":1083},[1053,4110,1357],{"class":1356},[1053,4112,1084],{"class":1083},[1053,4114,1362],{"class":1319},[1053,4116,4117],{"class":1055,"line":1512},[1053,4118,1320],{"class":1319},[1053,4120,4121,4123,4125,4127,4129,4131,4133],{"class":1055,"line":1517},[1053,4122,1325],{"class":1296},[1053,4124,1373],{"class":1328},[1053,4126,1332],{"class":1083},[1053,4128,1336],{"class":1335},[1053,4130,1104],{"class":1083},[1053,4132,1382],{"class":1341},[1053,4134,1345],{"class":1083},[1053,4136,4137],{"class":1055,"line":1523},[1053,4138,4139],{"class":1059},"        # URL normalization\n",[1053,4141,4142,4144,4146,4148,4150,4152,4154,4156,4158,4161,4163,4166,4168,4170,4172,4174],{"class":1055,"line":1551},[1053,4143,1395],{"class":1394},[1053,4145,1418],{"class":1319},[1053,4147,1353],{"class":1083},[1053,4149,3900],{"class":1423},[1053,4151,1413],{"class":1398},[1053,4153,1399],{"class":1398},[1053,4155,1382],{"class":1319},[1053,4157,1353],{"class":1083},[1053,4159,4160],{"class":1356},"path",[1053,4162,1353],{"class":1083},[1053,4164,4165],{"class":1406},"endswith",[1053,4167,1332],{"class":1083},[1053,4169,1101],{"class":1093},[1053,4171,1799],{"class":1097},[1053,4173,1101],{"class":1093},[1053,4175,1345],{"class":1083},[1053,4177,4178],{"class":1055,"line":1576},[1053,4179,4180],{"class":1059},"            # Check if URL with slash exists\n",[1053,4182,4183,4186,4188,4190,4192,4194,4196,4198,4200],{"class":1055,"line":1601},[1053,4184,4185],{"class":1319},"            new_path ",[1053,4187,1494],{"class":1083},[1053,4189,1382],{"class":1319},[1053,4191,1353],{"class":1083},[1053,4193,4160],{"class":1356},[1053,4195,1452],{"class":1398},[1053,4197,1209],{"class":1093},[1053,4199,1799],{"class":1097},[1053,4201,1215],{"class":1093},[1053,4203,4204,4206,4208,4210,4213,4215,4218],{"class":1055,"line":1606},[1053,4205,2864],{"class":1394},[1053,4207,1497],{"class":1079},[1053,4209,1353],{"class":1083},[1053,4211,4212],{"class":1406},"url_exists",[1053,4214,1332],{"class":1083},[1053,4216,4217],{"class":1406},"new_path",[1053,4219,1345],{"class":1083},[1053,4221,4222,4224,4226,4228,4230],{"class":1055,"line":1612},[1053,4223,2875],{"class":1394},[1053,4225,1435],{"class":1406},[1053,4227,1332],{"class":1083},[1053,4229,4217],{"class":1406},[1053,4231,1509],{"class":1083},[1053,4233,4234],{"class":1055,"line":1626},[1053,4235,1485],{"class":1319},[1053,4237,4238],{"class":1055,"line":1652},[1053,4239,4240],{"class":1059},"        # Block disallowed user agents\n",[1053,4242,4243,4246,4248,4250,4252,4254,4256,4258,4260,4262,4265,4267,4269,4272],{"class":1055,"line":1657},[1053,4244,4245],{"class":1319},"        user_agent ",[1053,4247,1494],{"class":1083},[1053,4249,1382],{"class":1319},[1053,4251,1353],{"class":1083},[1053,4253,3796],{"class":1423},[1053,4255,1353],{"class":1083},[1053,4257,1980],{"class":1406},[1053,4259,1332],{"class":1083},[1053,4261,1101],{"class":1093},[1053,4263,4264],{"class":1097},"HTTP_USER_AGENT",[1053,4266,1101],{"class":1093},[1053,4268,1104],{"class":1083},[1053,4270,4271],{"class":1093}," ''",[1053,4273,1509],{"class":1083},[1053,4275,4276,4278,4280,4282,4285,4287,4290],{"class":1055,"line":2315},[1053,4277,1395],{"class":1394},[1053,4279,1497],{"class":1079},[1053,4281,1353],{"class":1083},[1053,4283,4284],{"class":1406},"is_disallowed_user_agent",[1053,4286,1332],{"class":1083},[1053,4288,4289],{"class":1406},"user_agent",[1053,4291,1345],{"class":1083},[1053,4293,4294,4296,4298,4300,4302,4305,4307],{"class":1055,"line":2321},[1053,4295,1432],{"class":1394},[1053,4297,3594],{"class":1406},[1053,4299,1332],{"class":1083},[1053,4301,1101],{"class":1093},[1053,4303,4304],{"class":1097},"User agent not allowed",[1053,4306,1101],{"class":1093},[1053,4308,1509],{"class":1083},[1053,4310,4311],{"class":1055,"line":2353},[1053,4312,1485],{"class":1319},[1053,4314,4315,4317,4319,4321,4323,4325,4327,4329],{"class":1055,"line":2378},[1053,4316,1491],{"class":1319},[1053,4318,1494],{"class":1083},[1053,4320,1497],{"class":1079},[1053,4322,1353],{"class":1083},[1053,4324,1357],{"class":1406},[1053,4326,1332],{"class":1083},[1053,4328,1506],{"class":1406},[1053,4330,1509],{"class":1083},[1053,4332,4333],{"class":1055,"line":2402},[1053,4334,1485],{"class":1319},[1053,4336,4337],{"class":1055,"line":2407},[1053,4338,4339],{"class":1059},"        # Add ETag header\n",[1053,4341,4342,4344,4346,4348,4350],{"class":1055,"line":2861},[1053,4343,1395],{"class":1394},[1053,4345,1418],{"class":1319},[1053,4347,1353],{"class":1083},[1053,4349,3927],{"class":1423},[1053,4351,1304],{"class":1083},[1053,4353,4354,4357,4359,4361,4363,4366,4368,4371,4373,4376],{"class":1055,"line":2872},[1053,4355,4356],{"class":1319},"            etag ",[1053,4358,1494],{"class":1083},[1053,4360,1497],{"class":1079},[1053,4362,1353],{"class":1083},[1053,4364,4365],{"class":1406},"calculate_etag",[1053,4367,1332],{"class":1083},[1053,4369,4370],{"class":1406},"response",[1053,4372,1353],{"class":1083},[1053,4374,4375],{"class":1356},"content",[1053,4377,1509],{"class":1083},[1053,4379,4380,4382,4384,4386,4389,4391,4393,4395],{"class":1055,"line":2903},[1053,4381,1629],{"class":1319},[1053,4383,1529],{"class":1083},[1053,4385,1101],{"class":1093},[1053,4387,4388],{"class":1097},"ETag",[1053,4390,1101],{"class":1093},[1053,4392,1539],{"class":1083},[1053,4394,1084],{"class":1083},[1053,4396,4397],{"class":1319}," etag\n",[1053,4399,4400],{"class":1055,"line":2928},[1053,4401,1485],{"class":1319},[1053,4403,4404,4406],{"class":1055,"line":2934},[1053,4405,1660],{"class":1394},[1053,4407,1663],{"class":1319},[1030,4409,4411],{"id":4410},"message-middleware","Message Middleware",[1035,4413,4415],{"id":4414},"messagemiddleware","MessageMiddleware",[1026,4417,4418],{},"Enables the Django messages framework:",[1043,4420,4422],{"className":1045,"code":4421,"language":1047,"meta":1048,"style":1048},"# django.contrib.messages.middleware.MessageMiddleware\n\nMIDDLEWARE = [\n    'django.contrib.sessions.middleware.SessionMiddleware',  # Required\n    'django.contrib.messages.middleware.MessageMiddleware',\n    # ... other middleware\n]\n\n# Messages configuration\nfrom django.contrib.messages import constants as messages\n\nMESSAGE_TAGS = {\n    messages.DEBUG: 'debug',\n    messages.INFO: 'info',\n    messages.SUCCESS: 'success',\n    messages.WARNING: 'warning',\n    messages.ERROR: 'error',\n}\n\nMESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'\n",[1050,4423,4424,4429,4433,4441,4454,4465,4469,4473,4477,4482,4508,4512,4522,4542,4562,4582,4602,4622,4626,4630],{"__ignoreMap":1048},[1053,4425,4426],{"class":1055,"line":1056},[1053,4427,4428],{"class":1059},"# django.contrib.messages.middleware.MessageMiddleware\n",[1053,4430,4431],{"class":1055,"line":1063},[1053,4432,1067],{"emptyLinePlaceholder":1066},[1053,4434,4435,4437,4439],{"class":1055,"line":1070},[1053,4436,1080],{"class":1079},[1053,4438,1084],{"class":1083},[1053,4440,1087],{"class":1083},[1053,4442,4443,4445,4447,4449,4451],{"class":1055,"line":1076},[1053,4444,1094],{"class":1093},[1053,4446,1703],{"class":1097},[1053,4448,1101],{"class":1093},[1053,4450,1104],{"class":1083},[1053,4452,4453],{"class":1059},"  # Required\n",[1053,4455,4456,4458,4461,4463],{"class":1055,"line":1090},[1053,4457,1094],{"class":1093},[1053,4459,4460],{"class":1097},"django.contrib.messages.middleware.MessageMiddleware",[1053,4462,1101],{"class":1093},[1053,4464,1708],{"class":1083},[1053,4466,4467],{"class":1055,"line":1110},[1053,4468,1113],{"class":1059},[1053,4470,4471],{"class":1055,"line":1116},[1053,4472,1119],{"class":1083},[1053,4474,4475],{"class":1055,"line":1122},[1053,4476,1067],{"emptyLinePlaceholder":1066},[1053,4478,4479],{"class":1055,"line":1127},[1053,4480,4481],{"class":1059},"# Messages configuration\n",[1053,4483,4484,4486,4488,4490,4492,4494,4497,4499,4502,4505],{"class":1055,"line":1133},[1053,4485,3343],{"class":1394},[1053,4487,2762],{"class":1319},[1053,4489,1353],{"class":1083},[1053,4491,2767],{"class":1319},[1053,4493,1353],{"class":1083},[1053,4495,4496],{"class":1319},"messages ",[1053,4498,2780],{"class":1394},[1053,4500,4501],{"class":1319}," constants ",[1053,4503,4504],{"class":1394},"as",[1053,4506,4507],{"class":1319}," messages\n",[1053,4509,4510],{"class":1055,"line":1145},[1053,4511,1067],{"emptyLinePlaceholder":1066},[1053,4513,4514,4517,4519],{"class":1055,"line":1155},[1053,4515,4516],{"class":1079},"MESSAGE_TAGS",[1053,4518,1084],{"class":1083},[1053,4520,4521],{"class":1083}," {\n",[1053,4523,4524,4527,4529,4531,4533,4535,4538,4540],{"class":1055,"line":1165},[1053,4525,4526],{"class":1319},"    messages",[1053,4528,1353],{"class":1083},[1053,4530,1424],{"class":1423},[1053,4532,3415],{"class":1083},[1053,4534,1209],{"class":1093},[1053,4536,4537],{"class":1097},"debug",[1053,4539,1101],{"class":1093},[1053,4541,1708],{"class":1083},[1053,4543,4544,4546,4548,4551,4553,4555,4558,4560],{"class":1055,"line":1175},[1053,4545,4526],{"class":1319},[1053,4547,1353],{"class":1083},[1053,4549,4550],{"class":1423},"INFO",[1053,4552,3415],{"class":1083},[1053,4554,1209],{"class":1093},[1053,4556,4557],{"class":1097},"info",[1053,4559,1101],{"class":1093},[1053,4561,1708],{"class":1083},[1053,4563,4564,4566,4568,4571,4573,4575,4578,4580],{"class":1055,"line":1190},[1053,4565,4526],{"class":1319},[1053,4567,1353],{"class":1083},[1053,4569,4570],{"class":1423},"SUCCESS",[1053,4572,3415],{"class":1083},[1053,4574,1209],{"class":1093},[1053,4576,4577],{"class":1097},"success",[1053,4579,1101],{"class":1093},[1053,4581,1708],{"class":1083},[1053,4583,4584,4586,4588,4591,4593,4595,4598,4600],{"class":1055,"line":1201},[1053,4585,4526],{"class":1319},[1053,4587,1353],{"class":1083},[1053,4589,4590],{"class":1423},"WARNING",[1053,4592,3415],{"class":1083},[1053,4594,1209],{"class":1093},[1053,4596,4597],{"class":1097},"warning",[1053,4599,1101],{"class":1093},[1053,4601,1708],{"class":1083},[1053,4603,4604,4606,4608,4611,4613,4615,4618,4620],{"class":1055,"line":1218},[1053,4605,4526],{"class":1319},[1053,4607,1353],{"class":1083},[1053,4609,4610],{"class":1423},"ERROR",[1053,4612,3415],{"class":1083},[1053,4614,1209],{"class":1093},[1053,4616,4617],{"class":1097},"error",[1053,4619,1101],{"class":1093},[1053,4621,1708],{"class":1083},[1053,4623,4624],{"class":1055,"line":1229},[1053,4625,3267],{"class":1083},[1053,4627,4628],{"class":1055,"line":1429},[1053,4629,1067],{"emptyLinePlaceholder":1066},[1053,4631,4632,4635,4637,4639,4642],{"class":1055,"line":1441},[1053,4633,4634],{"class":1079},"MESSAGE_STORAGE",[1053,4636,1084],{"class":1083},[1053,4638,1209],{"class":1093},[1053,4640,4641],{"class":1097},"django.contrib.messages.storage.session.SessionStorage",[1053,4643,1215],{"class":1093},[1238,4645,4647],{"id":4646},"using-messages","Using Messages:",[1043,4649,4651],{"className":1045,"code":4650,"language":1047,"meta":1048,"style":1048},"from django.contrib import messages\n\ndef my_view(request):\n    # Add messages\n    messages.debug(request, 'Debug message')\n    messages.info(request, 'Info message')\n    messages.success(request, 'Success message')\n    messages.warning(request, 'Warning message')\n    messages.error(request, 'Error message')\n    \n    return render(request, 'template.html')\n\n# In templates\n\"\"\"\n{% if messages %}\n    \u003Cul class=\"messages\">\n        {% for message in messages %}\n            \u003Cli class=\"{{ message.tags }}\">{{ message }}\u003C/li>\n        {% endfor %}\n    \u003C/ul>\n{% endif %}\n\"\"\"\n\n# Custom message middleware\nclass CustomMessageMiddleware:\n    \"\"\"Custom message handling\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        # Initialize messages storage\n        request._messages = self.get_messages_storage(request)\n        \n        response = self.get_response(request)\n        \n        # Process messages for response\n        if hasattr(request, '_messages'):\n            # Add messages to response context or headers\n            messages_data = list(request._messages)\n            if messages_data:\n                response['X-Messages-Count'] = str(len(messages_data))\n        \n        return response\n",[1050,4652,4653,4668,4672,4684,4689,4712,4735,4758,4781,4804,4808,4830,4834,4838,4842,4847,4852,4857,4862,4867,4872,4877,4881,4885,4890,4899,4908,4912,4928,4940,4944,4960,4965,4989,4993,5011,5015,5020,5040,5045,5065,5074,5108,5112],{"__ignoreMap":1048},[1053,4654,4655,4657,4659,4661,4664,4666],{"class":1055,"line":1056},[1053,4656,3343],{"class":1394},[1053,4658,2762],{"class":1319},[1053,4660,1353],{"class":1083},[1053,4662,4663],{"class":1319},"contrib ",[1053,4665,2780],{"class":1394},[1053,4667,4507],{"class":1319},[1053,4669,4670],{"class":1055,"line":1063},[1053,4671,1067],{"emptyLinePlaceholder":1066},[1053,4673,4674,4676,4678,4680,4682],{"class":1055,"line":1070},[1053,4675,1866],{"class":1296},[1053,4677,1870],{"class":1869},[1053,4679,1332],{"class":1083},[1053,4681,1506],{"class":1341},[1053,4683,1345],{"class":1083},[1053,4685,4686],{"class":1055,"line":1076},[1053,4687,4688],{"class":1059},"    # Add messages\n",[1053,4690,4691,4693,4695,4697,4699,4701,4703,4705,4708,4710],{"class":1055,"line":1090},[1053,4692,4526],{"class":1319},[1053,4694,1353],{"class":1083},[1053,4696,4537],{"class":1406},[1053,4698,1332],{"class":1083},[1053,4700,1506],{"class":1406},[1053,4702,1104],{"class":1083},[1053,4704,1209],{"class":1093},[1053,4706,4707],{"class":1097},"Debug message",[1053,4709,1101],{"class":1093},[1053,4711,1509],{"class":1083},[1053,4713,4714,4716,4718,4720,4722,4724,4726,4728,4731,4733],{"class":1055,"line":1110},[1053,4715,4526],{"class":1319},[1053,4717,1353],{"class":1083},[1053,4719,4557],{"class":1406},[1053,4721,1332],{"class":1083},[1053,4723,1506],{"class":1406},[1053,4725,1104],{"class":1083},[1053,4727,1209],{"class":1093},[1053,4729,4730],{"class":1097},"Info message",[1053,4732,1101],{"class":1093},[1053,4734,1509],{"class":1083},[1053,4736,4737,4739,4741,4743,4745,4747,4749,4751,4754,4756],{"class":1055,"line":1116},[1053,4738,4526],{"class":1319},[1053,4740,1353],{"class":1083},[1053,4742,4577],{"class":1406},[1053,4744,1332],{"class":1083},[1053,4746,1506],{"class":1406},[1053,4748,1104],{"class":1083},[1053,4750,1209],{"class":1093},[1053,4752,4753],{"class":1097},"Success message",[1053,4755,1101],{"class":1093},[1053,4757,1509],{"class":1083},[1053,4759,4760,4762,4764,4766,4768,4770,4772,4774,4777,4779],{"class":1055,"line":1122},[1053,4761,4526],{"class":1319},[1053,4763,1353],{"class":1083},[1053,4765,4597],{"class":1406},[1053,4767,1332],{"class":1083},[1053,4769,1506],{"class":1406},[1053,4771,1104],{"class":1083},[1053,4773,1209],{"class":1093},[1053,4775,4776],{"class":1097},"Warning message",[1053,4778,1101],{"class":1093},[1053,4780,1509],{"class":1083},[1053,4782,4783,4785,4787,4789,4791,4793,4795,4797,4800,4802],{"class":1055,"line":1127},[1053,4784,4526],{"class":1319},[1053,4786,1353],{"class":1083},[1053,4788,4617],{"class":1406},[1053,4790,1332],{"class":1083},[1053,4792,1506],{"class":1406},[1053,4794,1104],{"class":1083},[1053,4796,1209],{"class":1093},[1053,4798,4799],{"class":1097},"Error message",[1053,4801,1101],{"class":1093},[1053,4803,1509],{"class":1083},[1053,4805,4806],{"class":1055,"line":1133},[1053,4807,1320],{"class":1319},[1053,4809,4810,4812,4815,4817,4819,4821,4823,4826,4828],{"class":1055,"line":1145},[1053,4811,2089],{"class":1394},[1053,4813,4814],{"class":1406}," render",[1053,4816,1332],{"class":1083},[1053,4818,1506],{"class":1406},[1053,4820,1104],{"class":1083},[1053,4822,1209],{"class":1093},[1053,4824,4825],{"class":1097},"template.html",[1053,4827,1101],{"class":1093},[1053,4829,1509],{"class":1083},[1053,4831,4832],{"class":1055,"line":1155},[1053,4833,1067],{"emptyLinePlaceholder":1066},[1053,4835,4836],{"class":1055,"line":1165},[1053,4837,3151],{"class":1059},[1053,4839,4840],{"class":1055,"line":1175},[1053,4841,1257],{"class":1256},[1053,4843,4844],{"class":1055,"line":1190},[1053,4845,4846],{"class":1262},"{% if messages %}\n",[1053,4848,4849],{"class":1055,"line":1201},[1053,4850,4851],{"class":1262},"    \u003Cul class=\"messages\">\n",[1053,4853,4854],{"class":1055,"line":1218},[1053,4855,4856],{"class":1262},"        {% for message in messages %}\n",[1053,4858,4859],{"class":1055,"line":1229},[1053,4860,4861],{"class":1262},"            \u003Cli class=\"{{ message.tags }}\">{{ message }}\u003C/li>\n",[1053,4863,4864],{"class":1055,"line":1429},[1053,4865,4866],{"class":1262},"        {% endfor %}\n",[1053,4868,4869],{"class":1055,"line":1441},[1053,4870,4871],{"class":1262},"    \u003C/ul>\n",[1053,4873,4874],{"class":1055,"line":1476},[1053,4875,4876],{"class":1262},"{% endif %}\n",[1053,4878,4879],{"class":1055,"line":1482},[1053,4880,1257],{"class":1256},[1053,4882,4883],{"class":1055,"line":1488},[1053,4884,1067],{"emptyLinePlaceholder":1066},[1053,4886,4887],{"class":1055,"line":1512},[1053,4888,4889],{"class":1059},"# Custom message middleware\n",[1053,4891,4892,4894,4897],{"class":1055,"line":1517},[1053,4893,1297],{"class":1296},[1053,4895,4896],{"class":1300}," CustomMessageMiddleware",[1053,4898,1304],{"class":1083},[1053,4900,4901,4903,4906],{"class":1055,"line":1523},[1053,4902,1309],{"class":1256},[1053,4904,4905],{"class":1262},"Custom message handling",[1053,4907,1257],{"class":1256},[1053,4909,4910],{"class":1055,"line":1551},[1053,4911,1320],{"class":1319},[1053,4913,4914,4916,4918,4920,4922,4924,4926],{"class":1055,"line":1576},[1053,4915,1325],{"class":1296},[1053,4917,1329],{"class":1328},[1053,4919,1332],{"class":1083},[1053,4921,1336],{"class":1335},[1053,4923,1104],{"class":1083},[1053,4925,1342],{"class":1341},[1053,4927,1345],{"class":1083},[1053,4929,4930,4932,4934,4936,4938],{"class":1055,"line":1601},[1053,4931,1350],{"class":1079},[1053,4933,1353],{"class":1083},[1053,4935,1357],{"class":1356},[1053,4937,1084],{"class":1083},[1053,4939,1362],{"class":1319},[1053,4941,4942],{"class":1055,"line":1606},[1053,4943,1320],{"class":1319},[1053,4945,4946,4948,4950,4952,4954,4956,4958],{"class":1055,"line":1612},[1053,4947,1325],{"class":1296},[1053,4949,1373],{"class":1328},[1053,4951,1332],{"class":1083},[1053,4953,1336],{"class":1335},[1053,4955,1104],{"class":1083},[1053,4957,1382],{"class":1341},[1053,4959,1345],{"class":1083},[1053,4961,4962],{"class":1055,"line":1626},[1053,4963,4964],{"class":1059},"        # Initialize messages storage\n",[1053,4966,4967,4969,4971,4974,4976,4978,4980,4983,4985,4987],{"class":1055,"line":1652},[1053,4968,2682],{"class":1319},[1053,4970,1353],{"class":1083},[1053,4972,4973],{"class":1356},"_messages",[1053,4975,1084],{"class":1083},[1053,4977,1497],{"class":1079},[1053,4979,1353],{"class":1083},[1053,4981,4982],{"class":1406},"get_messages_storage",[1053,4984,1332],{"class":1083},[1053,4986,1506],{"class":1406},[1053,4988,1509],{"class":1083},[1053,4990,4991],{"class":1055,"line":1657},[1053,4992,1485],{"class":1319},[1053,4994,4995,4997,4999,5001,5003,5005,5007,5009],{"class":1055,"line":2315},[1053,4996,1491],{"class":1319},[1053,4998,1494],{"class":1083},[1053,5000,1497],{"class":1079},[1053,5002,1353],{"class":1083},[1053,5004,1357],{"class":1406},[1053,5006,1332],{"class":1083},[1053,5008,1506],{"class":1406},[1053,5010,1509],{"class":1083},[1053,5012,5013],{"class":1055,"line":2321},[1053,5014,1485],{"class":1319},[1053,5016,5017],{"class":1055,"line":2353},[1053,5018,5019],{"class":1059},"        # Process messages for response\n",[1053,5021,5022,5024,5026,5028,5030,5032,5034,5036,5038],{"class":1055,"line":2378},[1053,5023,1395],{"class":1394},[1053,5025,2326],{"class":1328},[1053,5027,1332],{"class":1083},[1053,5029,1506],{"class":1406},[1053,5031,1104],{"class":1083},[1053,5033,1209],{"class":1093},[1053,5035,4973],{"class":1097},[1053,5037,1101],{"class":1093},[1053,5039,1345],{"class":1083},[1053,5041,5042],{"class":1055,"line":2402},[1053,5043,5044],{"class":1059},"            # Add messages to response context or headers\n",[1053,5046,5047,5050,5052,5055,5057,5059,5061,5063],{"class":1055,"line":2407},[1053,5048,5049],{"class":1319},"            messages_data ",[1053,5051,1494],{"class":1083},[1053,5053,5054],{"class":2922}," list",[1053,5056,1332],{"class":1083},[1053,5058,1506],{"class":1406},[1053,5060,1353],{"class":1083},[1053,5062,4973],{"class":1356},[1053,5064,1509],{"class":1083},[1053,5066,5067,5069,5072],{"class":1055,"line":2861},[1053,5068,2864],{"class":1394},[1053,5070,5071],{"class":1319}," messages_data",[1053,5073,1304],{"class":1083},[1053,5075,5076,5079,5081,5083,5086,5088,5090,5092,5095,5097,5100,5102,5105],{"class":1055,"line":2872},[1053,5077,5078],{"class":1319},"                response",[1053,5080,1529],{"class":1083},[1053,5082,1101],{"class":1093},[1053,5084,5085],{"class":1097},"X-Messages-Count",[1053,5087,1101],{"class":1093},[1053,5089,1539],{"class":1083},[1053,5091,1084],{"class":1083},[1053,5093,5094],{"class":2922}," str",[1053,5096,1332],{"class":1083},[1053,5098,5099],{"class":1328},"len",[1053,5101,1332],{"class":1083},[1053,5103,5104],{"class":1406},"messages_data",[1053,5106,5107],{"class":1083},"))\n",[1053,5109,5110],{"class":1055,"line":2903},[1053,5111,1485],{"class":1319},[1053,5113,5114,5116],{"class":1055,"line":2928},[1053,5115,1660],{"class":1394},[1053,5117,1663],{"class":1319},[1030,5119,5121],{"id":5120},"clickjacking-middleware","Clickjacking Middleware",[1035,5123,5125],{"id":5124},"xframeoptionsmiddleware","XFrameOptionsMiddleware",[1026,5127,5128],{},"Protects against clickjacking attacks:",[1043,5130,5132],{"className":1045,"code":5131,"language":1047,"meta":1048,"style":1048},"# django.middleware.clickjacking.XFrameOptionsMiddleware\n\nMIDDLEWARE = [\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\n    # ... other middleware\n]\n\n# Configuration\nX_FRAME_OPTIONS = 'DENY'  # or 'SAMEORIGIN' or 'ALLOW-FROM uri'\n\n# Per-view configuration\nfrom django.views.decorators.clickjacking import xframe_options_deny, xframe_options_sameorigin\n\n@xframe_options_deny\ndef sensitive_view(request):\n    return render(request, 'sensitive.html')\n\n@xframe_options_sameorigin\ndef embeddable_view(request):\n    return render(request, 'embeddable.html')\n\n# Custom clickjacking protection\nclass CustomClickjackingMiddleware:\n    \"\"\"Custom clickjacking protection\"\"\"\n    \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 X-Frame-Options header\n        if not response.get('X-Frame-Options'):\n            response['X-Frame-Options'] = 'DENY'\n        \n        # Add Content Security Policy\n        csp = \"frame-ancestors 'none'\"\n        if response.get('Content-Security-Policy'):\n            response['Content-Security-Policy'] += f'; {csp}'\n        else:\n            response['Content-Security-Policy'] = csp\n        \n        return response\n",[1050,5133,5134,5139,5143,5151,5162,5166,5170,5174,5179,5195,5199,5204,5233,5237,5244,5257,5278,5282,5289,5302,5323,5327,5332,5341,5350,5354,5370,5382,5386,5402,5420,5424,5429,5452,5474,5478,5483,5499,5520,5552,5558,5577,5581],{"__ignoreMap":1048},[1053,5135,5136],{"class":1055,"line":1056},[1053,5137,5138],{"class":1059},"# django.middleware.clickjacking.XFrameOptionsMiddleware\n",[1053,5140,5141],{"class":1055,"line":1063},[1053,5142,1067],{"emptyLinePlaceholder":1066},[1053,5144,5145,5147,5149],{"class":1055,"line":1070},[1053,5146,1080],{"class":1079},[1053,5148,1084],{"class":1083},[1053,5150,1087],{"class":1083},[1053,5152,5153,5155,5158,5160],{"class":1055,"line":1076},[1053,5154,1094],{"class":1093},[1053,5156,5157],{"class":1097},"django.middleware.clickjacking.XFrameOptionsMiddleware",[1053,5159,1101],{"class":1093},[1053,5161,1708],{"class":1083},[1053,5163,5164],{"class":1055,"line":1090},[1053,5165,1113],{"class":1059},[1053,5167,5168],{"class":1055,"line":1110},[1053,5169,1119],{"class":1083},[1053,5171,5172],{"class":1055,"line":1116},[1053,5173,1067],{"emptyLinePlaceholder":1066},[1053,5175,5176],{"class":1055,"line":1122},[1053,5177,5178],{"class":1059},"# Configuration\n",[1053,5180,5181,5184,5186,5188,5190,5192],{"class":1055,"line":1127},[1053,5182,5183],{"class":1079},"X_FRAME_OPTIONS",[1053,5185,1084],{"class":1083},[1053,5187,1209],{"class":1093},[1053,5189,1571],{"class":1097},[1053,5191,1101],{"class":1093},[1053,5193,5194],{"class":1059},"  # or 'SAMEORIGIN' or 'ALLOW-FROM uri'\n",[1053,5196,5197],{"class":1055,"line":1133},[1053,5198,1067],{"emptyLinePlaceholder":1066},[1053,5200,5201],{"class":1055,"line":1145},[1053,5202,5203],{"class":1059},"# Per-view configuration\n",[1053,5205,5206,5208,5210,5212,5214,5216,5218,5220,5223,5225,5228,5230],{"class":1055,"line":1155},[1053,5207,3343],{"class":1394},[1053,5209,2762],{"class":1319},[1053,5211,1353],{"class":1083},[1053,5213,3350],{"class":1319},[1053,5215,1353],{"class":1083},[1053,5217,3355],{"class":1319},[1053,5219,1353],{"class":1083},[1053,5221,5222],{"class":1319},"clickjacking ",[1053,5224,2780],{"class":1394},[1053,5226,5227],{"class":1319}," xframe_options_deny",[1053,5229,1104],{"class":1083},[1053,5231,5232],{"class":1319}," xframe_options_sameorigin\n",[1053,5234,5235],{"class":1055,"line":1165},[1053,5236,1067],{"emptyLinePlaceholder":1066},[1053,5238,5239,5241],{"class":1055,"line":1175},[1053,5240,3374],{"class":1083},[1053,5242,5243],{"class":1869},"xframe_options_deny\n",[1053,5245,5246,5248,5251,5253,5255],{"class":1055,"line":1190},[1053,5247,1866],{"class":1296},[1053,5249,5250],{"class":1869}," sensitive_view",[1053,5252,1332],{"class":1083},[1053,5254,1506],{"class":1341},[1053,5256,1345],{"class":1083},[1053,5258,5259,5261,5263,5265,5267,5269,5271,5274,5276],{"class":1055,"line":1201},[1053,5260,2089],{"class":1394},[1053,5262,4814],{"class":1406},[1053,5264,1332],{"class":1083},[1053,5266,1506],{"class":1406},[1053,5268,1104],{"class":1083},[1053,5270,1209],{"class":1093},[1053,5272,5273],{"class":1097},"sensitive.html",[1053,5275,1101],{"class":1093},[1053,5277,1509],{"class":1083},[1053,5279,5280],{"class":1055,"line":1218},[1053,5281,1067],{"emptyLinePlaceholder":1066},[1053,5283,5284,5286],{"class":1055,"line":1229},[1053,5285,3374],{"class":1083},[1053,5287,5288],{"class":1869},"xframe_options_sameorigin\n",[1053,5290,5291,5293,5296,5298,5300],{"class":1055,"line":1429},[1053,5292,1866],{"class":1296},[1053,5294,5295],{"class":1869}," embeddable_view",[1053,5297,1332],{"class":1083},[1053,5299,1506],{"class":1341},[1053,5301,1345],{"class":1083},[1053,5303,5304,5306,5308,5310,5312,5314,5316,5319,5321],{"class":1055,"line":1441},[1053,5305,2089],{"class":1394},[1053,5307,4814],{"class":1406},[1053,5309,1332],{"class":1083},[1053,5311,1506],{"class":1406},[1053,5313,1104],{"class":1083},[1053,5315,1209],{"class":1093},[1053,5317,5318],{"class":1097},"embeddable.html",[1053,5320,1101],{"class":1093},[1053,5322,1509],{"class":1083},[1053,5324,5325],{"class":1055,"line":1476},[1053,5326,1067],{"emptyLinePlaceholder":1066},[1053,5328,5329],{"class":1055,"line":1482},[1053,5330,5331],{"class":1059},"# Custom clickjacking protection\n",[1053,5333,5334,5336,5339],{"class":1055,"line":1488},[1053,5335,1297],{"class":1296},[1053,5337,5338],{"class":1300}," CustomClickjackingMiddleware",[1053,5340,1304],{"class":1083},[1053,5342,5343,5345,5348],{"class":1055,"line":1512},[1053,5344,1309],{"class":1256},[1053,5346,5347],{"class":1262},"Custom clickjacking protection",[1053,5349,1257],{"class":1256},[1053,5351,5352],{"class":1055,"line":1517},[1053,5353,1320],{"class":1319},[1053,5355,5356,5358,5360,5362,5364,5366,5368],{"class":1055,"line":1523},[1053,5357,1325],{"class":1296},[1053,5359,1329],{"class":1328},[1053,5361,1332],{"class":1083},[1053,5363,1336],{"class":1335},[1053,5365,1104],{"class":1083},[1053,5367,1342],{"class":1341},[1053,5369,1345],{"class":1083},[1053,5371,5372,5374,5376,5378,5380],{"class":1055,"line":1551},[1053,5373,1350],{"class":1079},[1053,5375,1353],{"class":1083},[1053,5377,1357],{"class":1356},[1053,5379,1084],{"class":1083},[1053,5381,1362],{"class":1319},[1053,5383,5384],{"class":1055,"line":1576},[1053,5385,1320],{"class":1319},[1053,5387,5388,5390,5392,5394,5396,5398,5400],{"class":1055,"line":1601},[1053,5389,1325],{"class":1296},[1053,5391,1373],{"class":1328},[1053,5393,1332],{"class":1083},[1053,5395,1336],{"class":1335},[1053,5397,1104],{"class":1083},[1053,5399,1382],{"class":1341},[1053,5401,1345],{"class":1083},[1053,5403,5404,5406,5408,5410,5412,5414,5416,5418],{"class":1055,"line":1606},[1053,5405,1491],{"class":1319},[1053,5407,1494],{"class":1083},[1053,5409,1497],{"class":1079},[1053,5411,1353],{"class":1083},[1053,5413,1357],{"class":1406},[1053,5415,1332],{"class":1083},[1053,5417,1506],{"class":1406},[1053,5419,1509],{"class":1083},[1053,5421,5422],{"class":1055,"line":1612},[1053,5423,1485],{"class":1319},[1053,5425,5426],{"class":1055,"line":1626},[1053,5427,5428],{"class":1059},"        # Add X-Frame-Options header\n",[1053,5430,5431,5433,5435,5438,5440,5442,5444,5446,5448,5450],{"class":1055,"line":1652},[1053,5432,1395],{"class":1394},[1053,5434,1399],{"class":1398},[1053,5436,5437],{"class":1319}," response",[1053,5439,1353],{"class":1083},[1053,5441,1980],{"class":1406},[1053,5443,1332],{"class":1083},[1053,5445,1101],{"class":1093},[1053,5447,1560],{"class":1097},[1053,5449,1101],{"class":1093},[1053,5451,1345],{"class":1083},[1053,5453,5454,5456,5458,5460,5462,5464,5466,5468,5470,5472],{"class":1055,"line":1657},[1053,5455,1629],{"class":1319},[1053,5457,1529],{"class":1083},[1053,5459,1101],{"class":1093},[1053,5461,1560],{"class":1097},[1053,5463,1101],{"class":1093},[1053,5465,1539],{"class":1083},[1053,5467,1084],{"class":1083},[1053,5469,1209],{"class":1093},[1053,5471,1571],{"class":1097},[1053,5473,1215],{"class":1093},[1053,5475,5476],{"class":1055,"line":2315},[1053,5477,1485],{"class":1319},[1053,5479,5480],{"class":1055,"line":2321},[1053,5481,5482],{"class":1059},"        # Add Content Security Policy\n",[1053,5484,5485,5488,5490,5493,5496],{"class":1055,"line":2353},[1053,5486,5487],{"class":1319},"        csp ",[1053,5489,1494],{"class":1083},[1053,5491,5492],{"class":1093}," \"",[1053,5494,5495],{"class":1097},"frame-ancestors 'none'",[1053,5497,5498],{"class":1093},"\"\n",[1053,5500,5501,5503,5505,5507,5509,5511,5513,5516,5518],{"class":1055,"line":2378},[1053,5502,1395],{"class":1394},[1053,5504,5437],{"class":1319},[1053,5506,1353],{"class":1083},[1053,5508,1980],{"class":1406},[1053,5510,1332],{"class":1083},[1053,5512,1101],{"class":1093},[1053,5514,5515],{"class":1097},"Content-Security-Policy",[1053,5517,1101],{"class":1093},[1053,5519,1345],{"class":1083},[1053,5521,5522,5524,5526,5528,5530,5532,5534,5537,5540,5543,5545,5548,5550],{"class":1055,"line":2402},[1053,5523,1629],{"class":1319},[1053,5525,1529],{"class":1083},[1053,5527,1101],{"class":1093},[1053,5529,5515],{"class":1097},[1053,5531,1101],{"class":1093},[1053,5533,1539],{"class":1083},[1053,5535,5536],{"class":1083}," +=",[1053,5538,5539],{"class":1296}," f",[1053,5541,5542],{"class":1097},"'; ",[1053,5544,2104],{"class":2103},[1053,5546,5547],{"class":1319},"csp",[1053,5549,2110],{"class":2103},[1053,5551,1215],{"class":1097},[1053,5553,5554,5556],{"class":1055,"line":2407},[1053,5555,2271],{"class":1394},[1053,5557,1304],{"class":1083},[1053,5559,5560,5562,5564,5566,5568,5570,5572,5574],{"class":1055,"line":2861},[1053,5561,1629],{"class":1319},[1053,5563,1529],{"class":1083},[1053,5565,1101],{"class":1093},[1053,5567,5515],{"class":1097},[1053,5569,1101],{"class":1093},[1053,5571,1539],{"class":1083},[1053,5573,1084],{"class":1083},[1053,5575,5576],{"class":1319}," csp\n",[1053,5578,5579],{"class":1055,"line":2872},[1053,5580,1485],{"class":1319},[1053,5582,5583,5585],{"class":1055,"line":2903},[1053,5584,1660],{"class":1394},[1053,5586,1663],{"class":1319},[1030,5588,669],{"id":5589},"locale-middleware",[1035,5591,5593],{"id":5592},"localemiddleware","LocaleMiddleware",[1026,5595,5596],{},"Enables internationalization based on request data:",[1043,5598,5600],{"className":1045,"code":5599,"language":1047,"meta":1048,"style":1048},"# django.middleware.locale.LocaleMiddleware\n\nMIDDLEWARE = [\n    'django.middleware.locale.LocaleMiddleware',\n    # ... other middleware\n]\n\n# I18n configuration\nUSE_I18N = True\nUSE_L10N = True\nLANGUAGE_CODE = 'en-us'\nLANGUAGES = [\n    ('en', 'English'),\n    ('es', 'Spanish'),\n    ('fr', 'French'),\n]\nLOCALE_PATHS = [\n    os.path.join(BASE_DIR, 'locale'),\n]\n\n# Custom locale middleware\nclass CustomLocaleMiddleware:\n    \"\"\"Custom locale detection\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        # Detect language from various sources\n        language = self.get_language_from_request(request)\n        \n        # Activate language\n        from django.utils import translation\n        translation.activate(language)\n        request.LANGUAGE_CODE = language\n        \n        response = self.get_response(request)\n        \n        # Deactivate language\n        translation.deactivate()\n        \n        return response\n    \n    def get_language_from_request(self, request):\n        \"\"\"Detect language from request\"\"\"\n        # 1. Check URL parameter\n        if 'lang' in request.GET:\n            return request.GET['lang']\n        \n        # 2. Check session\n        if hasattr(request, 'session') and 'language' in request.session:\n            return request.session['language']\n        \n        # 3. Check Accept-Language header\n        accept_language = request.META.get('HTTP_ACCEPT_LANGUAGE', '')\n        # Parse and return best match\n        \n        # 4. Return default\n        return settings.LANGUAGE_CODE\n",[1050,5601,5602,5607,5611,5619,5630,5634,5638,5642,5647,5656,5665,5679,5688,5711,5733,5755,5759,5768,5799,5803,5807,5812,5821,5830,5834,5850,5862,5866,5882,5887,5907,5911,5916,5932,5949,5962,5966,5984,5988,5993,6004,6008,6014,6018,6035,6044,6049,6071,6091,6095,6100,6138,6158,6162,6167,6199,6204,6208,6213],{"__ignoreMap":1048},[1053,5603,5604],{"class":1055,"line":1056},[1053,5605,5606],{"class":1059},"# django.middleware.locale.LocaleMiddleware\n",[1053,5608,5609],{"class":1055,"line":1063},[1053,5610,1067],{"emptyLinePlaceholder":1066},[1053,5612,5613,5615,5617],{"class":1055,"line":1070},[1053,5614,1080],{"class":1079},[1053,5616,1084],{"class":1083},[1053,5618,1087],{"class":1083},[1053,5620,5621,5623,5626,5628],{"class":1055,"line":1076},[1053,5622,1094],{"class":1093},[1053,5624,5625],{"class":1097},"django.middleware.locale.LocaleMiddleware",[1053,5627,1101],{"class":1093},[1053,5629,1708],{"class":1083},[1053,5631,5632],{"class":1055,"line":1090},[1053,5633,1113],{"class":1059},[1053,5635,5636],{"class":1055,"line":1110},[1053,5637,1119],{"class":1083},[1053,5639,5640],{"class":1055,"line":1116},[1053,5641,1067],{"emptyLinePlaceholder":1066},[1053,5643,5644],{"class":1055,"line":1122},[1053,5645,5646],{"class":1059},"# I18n configuration\n",[1053,5648,5649,5652,5654],{"class":1055,"line":1127},[1053,5650,5651],{"class":1079},"USE_I18N",[1053,5653,1084],{"class":1083},[1053,5655,1142],{"class":1141},[1053,5657,5658,5661,5663],{"class":1055,"line":1133},[1053,5659,5660],{"class":1079},"USE_L10N",[1053,5662,1084],{"class":1083},[1053,5664,1142],{"class":1141},[1053,5666,5667,5670,5672,5674,5677],{"class":1055,"line":1145},[1053,5668,5669],{"class":1079},"LANGUAGE_CODE",[1053,5671,1084],{"class":1083},[1053,5673,1209],{"class":1093},[1053,5675,5676],{"class":1097},"en-us",[1053,5678,1215],{"class":1093},[1053,5680,5681,5684,5686],{"class":1055,"line":1155},[1053,5682,5683],{"class":1079},"LANGUAGES",[1053,5685,1084],{"class":1083},[1053,5687,1087],{"class":1083},[1053,5689,5690,5693,5695,5698,5700,5702,5704,5707,5709],{"class":1055,"line":1165},[1053,5691,5692],{"class":1083},"    (",[1053,5694,1101],{"class":1093},[1053,5696,5697],{"class":1097},"en",[1053,5699,1101],{"class":1093},[1053,5701,1104],{"class":1083},[1053,5703,1209],{"class":1093},[1053,5705,5706],{"class":1097},"English",[1053,5708,1101],{"class":1093},[1053,5710,4016],{"class":1083},[1053,5712,5713,5715,5717,5720,5722,5724,5726,5729,5731],{"class":1055,"line":1175},[1053,5714,5692],{"class":1083},[1053,5716,1101],{"class":1093},[1053,5718,5719],{"class":1097},"es",[1053,5721,1101],{"class":1093},[1053,5723,1104],{"class":1083},[1053,5725,1209],{"class":1093},[1053,5727,5728],{"class":1097},"Spanish",[1053,5730,1101],{"class":1093},[1053,5732,4016],{"class":1083},[1053,5734,5735,5737,5739,5742,5744,5746,5748,5751,5753],{"class":1055,"line":1190},[1053,5736,5692],{"class":1083},[1053,5738,1101],{"class":1093},[1053,5740,5741],{"class":1097},"fr",[1053,5743,1101],{"class":1093},[1053,5745,1104],{"class":1083},[1053,5747,1209],{"class":1093},[1053,5749,5750],{"class":1097},"French",[1053,5752,1101],{"class":1093},[1053,5754,4016],{"class":1083},[1053,5756,5757],{"class":1055,"line":1201},[1053,5758,1119],{"class":1083},[1053,5760,5761,5764,5766],{"class":1055,"line":1218},[1053,5762,5763],{"class":1079},"LOCALE_PATHS",[1053,5765,1084],{"class":1083},[1053,5767,1087],{"class":1083},[1053,5769,5770,5773,5775,5777,5779,5782,5784,5788,5790,5792,5795,5797],{"class":1055,"line":1229},[1053,5771,5772],{"class":1319},"    os",[1053,5774,1353],{"class":1083},[1053,5776,4160],{"class":1356},[1053,5778,1353],{"class":1083},[1053,5780,5781],{"class":1406},"join",[1053,5783,1332],{"class":1083},[1053,5785,5787],{"class":5786},"s6DHA","BASE_DIR",[1053,5789,1104],{"class":1083},[1053,5791,1209],{"class":1093},[1053,5793,5794],{"class":1097},"locale",[1053,5796,1101],{"class":1093},[1053,5798,4016],{"class":1083},[1053,5800,5801],{"class":1055,"line":1429},[1053,5802,1119],{"class":1083},[1053,5804,5805],{"class":1055,"line":1441},[1053,5806,1067],{"emptyLinePlaceholder":1066},[1053,5808,5809],{"class":1055,"line":1476},[1053,5810,5811],{"class":1059},"# Custom locale middleware\n",[1053,5813,5814,5816,5819],{"class":1055,"line":1482},[1053,5815,1297],{"class":1296},[1053,5817,5818],{"class":1300}," CustomLocaleMiddleware",[1053,5820,1304],{"class":1083},[1053,5822,5823,5825,5828],{"class":1055,"line":1488},[1053,5824,1309],{"class":1256},[1053,5826,5827],{"class":1262},"Custom locale detection",[1053,5829,1257],{"class":1256},[1053,5831,5832],{"class":1055,"line":1512},[1053,5833,1320],{"class":1319},[1053,5835,5836,5838,5840,5842,5844,5846,5848],{"class":1055,"line":1517},[1053,5837,1325],{"class":1296},[1053,5839,1329],{"class":1328},[1053,5841,1332],{"class":1083},[1053,5843,1336],{"class":1335},[1053,5845,1104],{"class":1083},[1053,5847,1342],{"class":1341},[1053,5849,1345],{"class":1083},[1053,5851,5852,5854,5856,5858,5860],{"class":1055,"line":1523},[1053,5853,1350],{"class":1079},[1053,5855,1353],{"class":1083},[1053,5857,1357],{"class":1356},[1053,5859,1084],{"class":1083},[1053,5861,1362],{"class":1319},[1053,5863,5864],{"class":1055,"line":1551},[1053,5865,1320],{"class":1319},[1053,5867,5868,5870,5872,5874,5876,5878,5880],{"class":1055,"line":1576},[1053,5869,1325],{"class":1296},[1053,5871,1373],{"class":1328},[1053,5873,1332],{"class":1083},[1053,5875,1336],{"class":1335},[1053,5877,1104],{"class":1083},[1053,5879,1382],{"class":1341},[1053,5881,1345],{"class":1083},[1053,5883,5884],{"class":1055,"line":1601},[1053,5885,5886],{"class":1059},"        # Detect language from various sources\n",[1053,5888,5889,5892,5894,5896,5898,5901,5903,5905],{"class":1055,"line":1606},[1053,5890,5891],{"class":1319},"        language ",[1053,5893,1494],{"class":1083},[1053,5895,1497],{"class":1079},[1053,5897,1353],{"class":1083},[1053,5899,5900],{"class":1406},"get_language_from_request",[1053,5902,1332],{"class":1083},[1053,5904,1506],{"class":1406},[1053,5906,1509],{"class":1083},[1053,5908,5909],{"class":1055,"line":1612},[1053,5910,1485],{"class":1319},[1053,5912,5913],{"class":1055,"line":1626},[1053,5914,5915],{"class":1059},"        # Activate language\n",[1053,5917,5918,5920,5922,5924,5927,5929],{"class":1055,"line":1652},[1053,5919,2759],{"class":1394},[1053,5921,2762],{"class":1319},[1053,5923,1353],{"class":1083},[1053,5925,5926],{"class":1319},"utils ",[1053,5928,2780],{"class":1394},[1053,5930,5931],{"class":1319}," translation\n",[1053,5933,5934,5937,5939,5942,5944,5947],{"class":1055,"line":1657},[1053,5935,5936],{"class":1319},"        translation",[1053,5938,1353],{"class":1083},[1053,5940,5941],{"class":1406},"activate",[1053,5943,1332],{"class":1083},[1053,5945,5946],{"class":1406},"language",[1053,5948,1509],{"class":1083},[1053,5950,5951,5953,5955,5957,5959],{"class":1055,"line":2315},[1053,5952,2682],{"class":1319},[1053,5954,1353],{"class":1083},[1053,5956,5669],{"class":1423},[1053,5958,1084],{"class":1083},[1053,5960,5961],{"class":1319}," language\n",[1053,5963,5964],{"class":1055,"line":2321},[1053,5965,1485],{"class":1319},[1053,5967,5968,5970,5972,5974,5976,5978,5980,5982],{"class":1055,"line":2353},[1053,5969,1491],{"class":1319},[1053,5971,1494],{"class":1083},[1053,5973,1497],{"class":1079},[1053,5975,1353],{"class":1083},[1053,5977,1357],{"class":1406},[1053,5979,1332],{"class":1083},[1053,5981,1506],{"class":1406},[1053,5983,1509],{"class":1083},[1053,5985,5986],{"class":1055,"line":2378},[1053,5987,1485],{"class":1319},[1053,5989,5990],{"class":1055,"line":2402},[1053,5991,5992],{"class":1059},"        # Deactivate language\n",[1053,5994,5995,5997,5999,6002],{"class":1055,"line":2407},[1053,5996,5936],{"class":1319},[1053,5998,1353],{"class":1083},[1053,6000,6001],{"class":1406},"deactivate",[1053,6003,1473],{"class":1083},[1053,6005,6006],{"class":1055,"line":2861},[1053,6007,1485],{"class":1319},[1053,6009,6010,6012],{"class":1055,"line":2872},[1053,6011,1660],{"class":1394},[1053,6013,1663],{"class":1319},[1053,6015,6016],{"class":1055,"line":2903},[1053,6017,1320],{"class":1319},[1053,6019,6020,6022,6025,6027,6029,6031,6033],{"class":1055,"line":2928},[1053,6021,1325],{"class":1296},[1053,6023,6024],{"class":1869}," get_language_from_request",[1053,6026,1332],{"class":1083},[1053,6028,1336],{"class":1335},[1053,6030,1104],{"class":1083},[1053,6032,1382],{"class":1341},[1053,6034,1345],{"class":1083},[1053,6036,6037,6039,6042],{"class":1055,"line":2934},[1053,6038,2749],{"class":1256},[1053,6040,6041],{"class":1262},"Detect language from request",[1053,6043,1257],{"class":1256},[1053,6045,6046],{"class":1055,"line":2939},[1053,6047,6048],{"class":1059},"        # 1. Check URL parameter\n",[1053,6050,6051,6053,6055,6058,6060,6062,6064,6066,6069],{"class":1055,"line":3428},[1053,6052,1395],{"class":1394},[1053,6054,1209],{"class":1093},[1053,6056,6057],{"class":1097},"lang",[1053,6059,1101],{"class":1093},[1053,6061,3528],{"class":1398},[1053,6063,1382],{"class":1319},[1053,6065,1353],{"class":1083},[1053,6067,6068],{"class":1423},"GET",[1053,6070,1304],{"class":1083},[1053,6072,6073,6075,6077,6079,6081,6083,6085,6087,6089],{"class":1055,"line":3433},[1053,6074,1432],{"class":1394},[1053,6076,1382],{"class":1319},[1053,6078,1353],{"class":1083},[1053,6080,6068],{"class":1423},[1053,6082,1529],{"class":1083},[1053,6084,1101],{"class":1093},[1053,6086,6057],{"class":1097},[1053,6088,1101],{"class":1093},[1053,6090,1119],{"class":1083},[1053,6092,6093],{"class":1055,"line":3439},[1053,6094,1485],{"class":1319},[1053,6096,6097],{"class":1055,"line":3449},[1053,6098,6099],{"class":1059},"        # 2. Check session\n",[1053,6101,6102,6104,6106,6108,6110,6112,6114,6116,6118,6120,6122,6124,6126,6128,6130,6132,6134,6136],{"class":1055,"line":3459},[1053,6103,1395],{"class":1394},[1053,6105,2326],{"class":1328},[1053,6107,1332],{"class":1083},[1053,6109,1506],{"class":1406},[1053,6111,1104],{"class":1083},[1053,6113,1209],{"class":1093},[1053,6115,1891],{"class":1097},[1053,6117,1101],{"class":1093},[1053,6119,2059],{"class":1083},[1053,6121,1413],{"class":1398},[1053,6123,1209],{"class":1093},[1053,6125,5946],{"class":1097},[1053,6127,1101],{"class":1093},[1053,6129,3528],{"class":1398},[1053,6131,1382],{"class":1319},[1053,6133,1353],{"class":1083},[1053,6135,1891],{"class":1356},[1053,6137,1304],{"class":1083},[1053,6139,6140,6142,6144,6146,6148,6150,6152,6154,6156],{"class":1055,"line":3464},[1053,6141,1432],{"class":1394},[1053,6143,1382],{"class":1319},[1053,6145,1353],{"class":1083},[1053,6147,1891],{"class":1356},[1053,6149,1529],{"class":1083},[1053,6151,1101],{"class":1093},[1053,6153,5946],{"class":1097},[1053,6155,1101],{"class":1093},[1053,6157,1119],{"class":1083},[1053,6159,6160],{"class":1055,"line":3481},[1053,6161,1485],{"class":1319},[1053,6163,6164],{"class":1055,"line":3494},[1053,6165,6166],{"class":1059},"        # 3. Check Accept-Language header\n",[1053,6168,6169,6172,6174,6176,6178,6180,6182,6184,6186,6188,6191,6193,6195,6197],{"class":1055,"line":3499},[1053,6170,6171],{"class":1319},"        accept_language ",[1053,6173,1494],{"class":1083},[1053,6175,1382],{"class":1319},[1053,6177,1353],{"class":1083},[1053,6179,3796],{"class":1423},[1053,6181,1353],{"class":1083},[1053,6183,1980],{"class":1406},[1053,6185,1332],{"class":1083},[1053,6187,1101],{"class":1093},[1053,6189,6190],{"class":1097},"HTTP_ACCEPT_LANGUAGE",[1053,6192,1101],{"class":1093},[1053,6194,1104],{"class":1083},[1053,6196,4271],{"class":1093},[1053,6198,1509],{"class":1083},[1053,6200,6201],{"class":1055,"line":3516},[1053,6202,6203],{"class":1059},"        # Parse and return best match\n",[1053,6205,6206],{"class":1055,"line":3569},[1053,6207,1485],{"class":1319},[1053,6209,6210],{"class":1055,"line":3589},[1053,6211,6212],{"class":1059},"        # 4. Return default\n",[1053,6214,6215,6217,6219,6221],{"class":1055,"line":3608},[1053,6216,1660],{"class":1394},[1053,6218,1418],{"class":1319},[1053,6220,1353],{"class":1083},[1053,6222,6223],{"class":1423},"LANGUAGE_CODE\n",[1030,6225,6227],{"id":6226},"cache-middleware","Cache Middleware",[1035,6229,6231],{"id":6230},"updatecachemiddleware-and-fetchfromcachemiddleware","UpdateCacheMiddleware and FetchFromCacheMiddleware",[1026,6233,6234],{},"Provides full-page caching:",[1043,6236,6238],{"className":1045,"code":6237,"language":1047,"meta":1048,"style":1048},"# Cache middleware (order matters!)\nMIDDLEWARE = [\n    'django.middleware.cache.UpdateCacheMiddleware',  # First\n    # ... other middleware\n    'django.middleware.cache.FetchFromCacheMiddleware',  # Last\n]\n\n# Cache configuration\nCACHE_MIDDLEWARE_ALIAS = 'default'\nCACHE_MIDDLEWARE_SECONDS = 600  # 10 minutes\nCACHE_MIDDLEWARE_KEY_PREFIX = ''\n\n# Custom cache middleware\nclass CustomCacheMiddleware:\n    \"\"\"Custom caching logic\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n        from django.core.cache import cache\n        self.cache = cache\n    \n    def __call__(self, request):\n        # Try to get cached response\n        cache_key = self.get_cache_key(request)\n        cached_response = self.cache.get(cache_key)\n        \n        if cached_response and not settings.DEBUG:\n            return cached_response\n        \n        response = self.get_response(request)\n        \n        # Cache successful responses\n        if response.status_code == 200 and request.method == 'GET':\n            self.cache.set(cache_key, response, 300)  # 5 minutes\n        \n        return response\n    \n    def get_cache_key(self, request):\n        \"\"\"Generate cache key for request\"\"\"\n        return f\"page_cache:{request.path}:{request.GET.urlencode()}\"\n",[1050,6239,6240,6245,6253,6267,6271,6285,6289,6293,6298,6312,6325,6335,6339,6344,6353,6362,6366,6382,6394,6415,6428,6432,6448,6453,6473,6497,6501,6520,6527,6531,6549,6553,6558,6593,6625,6629,6635,6639,6656,6665],{"__ignoreMap":1048},[1053,6241,6242],{"class":1055,"line":1056},[1053,6243,6244],{"class":1059},"# Cache middleware (order matters!)\n",[1053,6246,6247,6249,6251],{"class":1055,"line":1063},[1053,6248,1080],{"class":1079},[1053,6250,1084],{"class":1083},[1053,6252,1087],{"class":1083},[1053,6254,6255,6257,6260,6262,6264],{"class":1055,"line":1070},[1053,6256,1094],{"class":1093},[1053,6258,6259],{"class":1097},"django.middleware.cache.UpdateCacheMiddleware",[1053,6261,1101],{"class":1093},[1053,6263,1104],{"class":1083},[1053,6265,6266],{"class":1059},"  # First\n",[1053,6268,6269],{"class":1055,"line":1076},[1053,6270,1113],{"class":1059},[1053,6272,6273,6275,6278,6280,6282],{"class":1055,"line":1090},[1053,6274,1094],{"class":1093},[1053,6276,6277],{"class":1097},"django.middleware.cache.FetchFromCacheMiddleware",[1053,6279,1101],{"class":1093},[1053,6281,1104],{"class":1083},[1053,6283,6284],{"class":1059},"  # Last\n",[1053,6286,6287],{"class":1055,"line":1110},[1053,6288,1119],{"class":1083},[1053,6290,6291],{"class":1055,"line":1116},[1053,6292,1067],{"emptyLinePlaceholder":1066},[1053,6294,6295],{"class":1055,"line":1122},[1053,6296,6297],{"class":1059},"# Cache configuration\n",[1053,6299,6300,6303,6305,6307,6310],{"class":1055,"line":1127},[1053,6301,6302],{"class":1079},"CACHE_MIDDLEWARE_ALIAS",[1053,6304,1084],{"class":1083},[1053,6306,1209],{"class":1093},[1053,6308,6309],{"class":1097},"default",[1053,6311,1215],{"class":1093},[1053,6313,6314,6317,6319,6322],{"class":1055,"line":1133},[1053,6315,6316],{"class":1079},"CACHE_MIDDLEWARE_SECONDS",[1053,6318,1084],{"class":1083},[1053,6320,6321],{"class":1183}," 600",[1053,6323,6324],{"class":1059},"  # 10 minutes\n",[1053,6326,6327,6330,6332],{"class":1055,"line":1145},[1053,6328,6329],{"class":1079},"CACHE_MIDDLEWARE_KEY_PREFIX",[1053,6331,1084],{"class":1083},[1053,6333,6334],{"class":1093}," ''\n",[1053,6336,6337],{"class":1055,"line":1155},[1053,6338,1067],{"emptyLinePlaceholder":1066},[1053,6340,6341],{"class":1055,"line":1165},[1053,6342,6343],{"class":1059},"# Custom cache middleware\n",[1053,6345,6346,6348,6351],{"class":1055,"line":1175},[1053,6347,1297],{"class":1296},[1053,6349,6350],{"class":1300}," CustomCacheMiddleware",[1053,6352,1304],{"class":1083},[1053,6354,6355,6357,6360],{"class":1055,"line":1190},[1053,6356,1309],{"class":1256},[1053,6358,6359],{"class":1262},"Custom caching logic",[1053,6361,1257],{"class":1256},[1053,6363,6364],{"class":1055,"line":1201},[1053,6365,1320],{"class":1319},[1053,6367,6368,6370,6372,6374,6376,6378,6380],{"class":1055,"line":1218},[1053,6369,1325],{"class":1296},[1053,6371,1329],{"class":1328},[1053,6373,1332],{"class":1083},[1053,6375,1336],{"class":1335},[1053,6377,1104],{"class":1083},[1053,6379,1342],{"class":1341},[1053,6381,1345],{"class":1083},[1053,6383,6384,6386,6388,6390,6392],{"class":1055,"line":1229},[1053,6385,1350],{"class":1079},[1053,6387,1353],{"class":1083},[1053,6389,1357],{"class":1356},[1053,6391,1084],{"class":1083},[1053,6393,1362],{"class":1319},[1053,6395,6396,6398,6400,6402,6405,6407,6410,6412],{"class":1055,"line":1429},[1053,6397,2759],{"class":1394},[1053,6399,2762],{"class":1319},[1053,6401,1353],{"class":1083},[1053,6403,6404],{"class":1319},"core",[1053,6406,1353],{"class":1083},[1053,6408,6409],{"class":1319},"cache ",[1053,6411,2780],{"class":1394},[1053,6413,6414],{"class":1319}," cache\n",[1053,6416,6417,6419,6421,6424,6426],{"class":1055,"line":1441},[1053,6418,1350],{"class":1079},[1053,6420,1353],{"class":1083},[1053,6422,6423],{"class":1356},"cache",[1053,6425,1084],{"class":1083},[1053,6427,6414],{"class":1319},[1053,6429,6430],{"class":1055,"line":1476},[1053,6431,1320],{"class":1319},[1053,6433,6434,6436,6438,6440,6442,6444,6446],{"class":1055,"line":1482},[1053,6435,1325],{"class":1296},[1053,6437,1373],{"class":1328},[1053,6439,1332],{"class":1083},[1053,6441,1336],{"class":1335},[1053,6443,1104],{"class":1083},[1053,6445,1382],{"class":1341},[1053,6447,1345],{"class":1083},[1053,6449,6450],{"class":1055,"line":1488},[1053,6451,6452],{"class":1059},"        # Try to get cached response\n",[1053,6454,6455,6458,6460,6462,6464,6467,6469,6471],{"class":1055,"line":1512},[1053,6456,6457],{"class":1319},"        cache_key ",[1053,6459,1494],{"class":1083},[1053,6461,1497],{"class":1079},[1053,6463,1353],{"class":1083},[1053,6465,6466],{"class":1406},"get_cache_key",[1053,6468,1332],{"class":1083},[1053,6470,1506],{"class":1406},[1053,6472,1509],{"class":1083},[1053,6474,6475,6478,6480,6482,6484,6486,6488,6490,6492,6495],{"class":1055,"line":1517},[1053,6476,6477],{"class":1319},"        cached_response ",[1053,6479,1494],{"class":1083},[1053,6481,1497],{"class":1079},[1053,6483,1353],{"class":1083},[1053,6485,6423],{"class":1356},[1053,6487,1353],{"class":1083},[1053,6489,1980],{"class":1406},[1053,6491,1332],{"class":1083},[1053,6493,6494],{"class":1406},"cache_key",[1053,6496,1509],{"class":1083},[1053,6498,6499],{"class":1055,"line":1523},[1053,6500,1485],{"class":1319},[1053,6502,6503,6505,6508,6510,6512,6514,6516,6518],{"class":1055,"line":1551},[1053,6504,1395],{"class":1394},[1053,6506,6507],{"class":1319}," cached_response ",[1053,6509,3826],{"class":1398},[1053,6511,1399],{"class":1398},[1053,6513,1418],{"class":1319},[1053,6515,1353],{"class":1083},[1053,6517,1424],{"class":1423},[1053,6519,1304],{"class":1083},[1053,6521,6522,6524],{"class":1055,"line":1576},[1053,6523,1432],{"class":1394},[1053,6525,6526],{"class":1319}," cached_response\n",[1053,6528,6529],{"class":1055,"line":1601},[1053,6530,1485],{"class":1319},[1053,6532,6533,6535,6537,6539,6541,6543,6545,6547],{"class":1055,"line":1606},[1053,6534,1491],{"class":1319},[1053,6536,1494],{"class":1083},[1053,6538,1497],{"class":1079},[1053,6540,1353],{"class":1083},[1053,6542,1357],{"class":1406},[1053,6544,1332],{"class":1083},[1053,6546,1506],{"class":1406},[1053,6548,1509],{"class":1083},[1053,6550,6551],{"class":1055,"line":1612},[1053,6552,1485],{"class":1319},[1053,6554,6555],{"class":1055,"line":1626},[1053,6556,6557],{"class":1059},"        # Cache successful responses\n",[1053,6559,6560,6562,6564,6566,6569,6572,6575,6577,6579,6581,6583,6585,6587,6589,6591],{"class":1055,"line":1652},[1053,6561,1395],{"class":1394},[1053,6563,5437],{"class":1319},[1053,6565,1353],{"class":1083},[1053,6567,6568],{"class":1356},"status_code",[1053,6570,6571],{"class":1398}," ==",[1053,6573,6574],{"class":1183}," 200",[1053,6576,1413],{"class":1398},[1053,6578,1382],{"class":1319},[1053,6580,1353],{"class":1083},[1053,6582,3525],{"class":1356},[1053,6584,6571],{"class":1398},[1053,6586,1209],{"class":1093},[1053,6588,6068],{"class":1097},[1053,6590,1101],{"class":1093},[1053,6592,1304],{"class":1083},[1053,6594,6595,6598,6600,6602,6604,6607,6609,6611,6613,6615,6617,6620,6622],{"class":1055,"line":1657},[1053,6596,6597],{"class":1079},"            self",[1053,6599,1353],{"class":1083},[1053,6601,6423],{"class":1356},[1053,6603,1353],{"class":1083},[1053,6605,6606],{"class":1406},"set",[1053,6608,1332],{"class":1083},[1053,6610,6494],{"class":1406},[1053,6612,1104],{"class":1083},[1053,6614,5437],{"class":1406},[1053,6616,1104],{"class":1083},[1053,6618,6619],{"class":1183}," 300",[1053,6621,2059],{"class":1083},[1053,6623,6624],{"class":1059},"  # 5 minutes\n",[1053,6626,6627],{"class":1055,"line":2315},[1053,6628,1485],{"class":1319},[1053,6630,6631,6633],{"class":1055,"line":2321},[1053,6632,1660],{"class":1394},[1053,6634,1663],{"class":1319},[1053,6636,6637],{"class":1055,"line":2353},[1053,6638,1320],{"class":1319},[1053,6640,6641,6643,6646,6648,6650,6652,6654],{"class":1055,"line":2378},[1053,6642,1325],{"class":1296},[1053,6644,6645],{"class":1869}," get_cache_key",[1053,6647,1332],{"class":1083},[1053,6649,1336],{"class":1335},[1053,6651,1104],{"class":1083},[1053,6653,1382],{"class":1341},[1053,6655,1345],{"class":1083},[1053,6657,6658,6660,6663],{"class":1055,"line":2402},[1053,6659,2749],{"class":1256},[1053,6661,6662],{"class":1262},"Generate cache key for request",[1053,6664,1257],{"class":1256},[1053,6666,6667,6669,6671,6674,6676,6678,6680,6682,6684,6686,6688,6690,6692,6694,6696,6699,6701,6703],{"class":1055,"line":2407},[1053,6668,1660],{"class":1394},[1053,6670,5539],{"class":1296},[1053,6672,6673],{"class":1097},"\"page_cache:",[1053,6675,2104],{"class":2103},[1053,6677,1506],{"class":1319},[1053,6679,1353],{"class":1083},[1053,6681,4160],{"class":1356},[1053,6683,2110],{"class":2103},[1053,6685,3415],{"class":1097},[1053,6687,2104],{"class":2103},[1053,6689,1506],{"class":1319},[1053,6691,1353],{"class":1083},[1053,6693,6068],{"class":1423},[1053,6695,1353],{"class":1083},[1053,6697,6698],{"class":1406},"urlencode",[1053,6700,1410],{"class":1083},[1053,6702,2110],{"class":2103},[1053,6704,5498],{"class":1097},[1030,6706,6708],{"id":6707},"middleware-configuration-best-practices","Middleware Configuration Best Practices",[1035,6710,6712],{"id":6711},"optimal-middleware-order","Optimal Middleware Order",[1043,6714,6716],{"className":1045,"code":6715,"language":1047,"meta":1048,"style":1048},"# Recommended middleware order\nMIDDLEWARE = [\n    # Security (should be first)\n    'django.middleware.security.SecurityMiddleware',\n    \n    # Caching (early for performance)\n    'django.middleware.cache.UpdateCacheMiddleware',\n    \n    # Core functionality\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'django.middleware.common.CommonMiddleware',\n    'django.middleware.csrf.CsrfViewMiddleware',\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'django.contrib.messages.middleware.MessageMiddleware',\n    \n    # Internationalization\n    'django.middleware.locale.LocaleMiddleware',\n    \n    # Security (clickjacking)\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\n    \n    # Custom middleware\n    'myapp.middleware.CustomMiddleware',\n    \n    # Caching (should be last)\n    'django.middleware.cache.FetchFromCacheMiddleware',\n]\n",[1050,6717,6718,6723,6731,6736,6746,6750,6755,6765,6769,6774,6784,6794,6804,6814,6824,6828,6833,6843,6847,6852,6862,6866,6871,6882,6886,6891,6901],{"__ignoreMap":1048},[1053,6719,6720],{"class":1055,"line":1056},[1053,6721,6722],{"class":1059},"# Recommended middleware order\n",[1053,6724,6725,6727,6729],{"class":1055,"line":1063},[1053,6726,1080],{"class":1079},[1053,6728,1084],{"class":1083},[1053,6730,1087],{"class":1083},[1053,6732,6733],{"class":1055,"line":1070},[1053,6734,6735],{"class":1059},"    # Security (should be first)\n",[1053,6737,6738,6740,6742,6744],{"class":1055,"line":1076},[1053,6739,1094],{"class":1093},[1053,6741,1098],{"class":1097},[1053,6743,1101],{"class":1093},[1053,6745,1708],{"class":1083},[1053,6747,6748],{"class":1055,"line":1090},[1053,6749,1320],{"class":1319},[1053,6751,6752],{"class":1055,"line":1110},[1053,6753,6754],{"class":1059},"    # Caching (early for performance)\n",[1053,6756,6757,6759,6761,6763],{"class":1055,"line":1116},[1053,6758,1094],{"class":1093},[1053,6760,6259],{"class":1097},[1053,6762,1101],{"class":1093},[1053,6764,1708],{"class":1083},[1053,6766,6767],{"class":1055,"line":1122},[1053,6768,1320],{"class":1319},[1053,6770,6771],{"class":1055,"line":1127},[1053,6772,6773],{"class":1059},"    # Core functionality\n",[1053,6775,6776,6778,6780,6782],{"class":1055,"line":1133},[1053,6777,1094],{"class":1093},[1053,6779,1703],{"class":1097},[1053,6781,1101],{"class":1093},[1053,6783,1708],{"class":1083},[1053,6785,6786,6788,6790,6792],{"class":1055,"line":1145},[1053,6787,1094],{"class":1093},[1053,6789,3874],{"class":1097},[1053,6791,1101],{"class":1093},[1053,6793,1708],{"class":1083},[1053,6795,6796,6798,6800,6802],{"class":1055,"line":1155},[1053,6797,1094],{"class":1093},[1053,6799,2986],{"class":1097},[1053,6801,1101],{"class":1093},[1053,6803,1708],{"class":1083},[1053,6805,6806,6808,6810,6812],{"class":1055,"line":1165},[1053,6807,1094],{"class":1093},[1053,6809,2464],{"class":1097},[1053,6811,1101],{"class":1093},[1053,6813,1708],{"class":1083},[1053,6815,6816,6818,6820,6822],{"class":1055,"line":1175},[1053,6817,1094],{"class":1093},[1053,6819,4460],{"class":1097},[1053,6821,1101],{"class":1093},[1053,6823,1708],{"class":1083},[1053,6825,6826],{"class":1055,"line":1190},[1053,6827,1320],{"class":1319},[1053,6829,6830],{"class":1055,"line":1201},[1053,6831,6832],{"class":1059},"    # Internationalization\n",[1053,6834,6835,6837,6839,6841],{"class":1055,"line":1218},[1053,6836,1094],{"class":1093},[1053,6838,5625],{"class":1097},[1053,6840,1101],{"class":1093},[1053,6842,1708],{"class":1083},[1053,6844,6845],{"class":1055,"line":1229},[1053,6846,1320],{"class":1319},[1053,6848,6849],{"class":1055,"line":1429},[1053,6850,6851],{"class":1059},"    # Security (clickjacking)\n",[1053,6853,6854,6856,6858,6860],{"class":1055,"line":1441},[1053,6855,1094],{"class":1093},[1053,6857,5157],{"class":1097},[1053,6859,1101],{"class":1093},[1053,6861,1708],{"class":1083},[1053,6863,6864],{"class":1055,"line":1476},[1053,6865,1320],{"class":1319},[1053,6867,6868],{"class":1055,"line":1482},[1053,6869,6870],{"class":1059},"    # Custom middleware\n",[1053,6872,6873,6875,6878,6880],{"class":1055,"line":1488},[1053,6874,1094],{"class":1093},[1053,6876,6877],{"class":1097},"myapp.middleware.CustomMiddleware",[1053,6879,1101],{"class":1093},[1053,6881,1708],{"class":1083},[1053,6883,6884],{"class":1055,"line":1512},[1053,6885,1320],{"class":1319},[1053,6887,6888],{"class":1055,"line":1517},[1053,6889,6890],{"class":1059},"    # Caching (should be last)\n",[1053,6892,6893,6895,6897,6899],{"class":1055,"line":1523},[1053,6894,1094],{"class":1093},[1053,6896,6277],{"class":1097},[1053,6898,1101],{"class":1093},[1053,6900,1708],{"class":1083},[1053,6902,6903],{"class":1055,"line":1551},[1053,6904,1119],{"class":1083},[1035,6906,6908],{"id":6907},"environment-specific-configuration","Environment-Specific Configuration",[1043,6910,6912],{"className":1045,"code":6911,"language":1047,"meta":1048,"style":1048},"# settings/base.py\nMIDDLEWARE = [\n    'django.middleware.security.SecurityMiddleware',\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'django.middleware.common.CommonMiddleware',\n    'django.middleware.csrf.CsrfViewMiddleware',\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'django.contrib.messages.middleware.MessageMiddleware',\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\n]\n\n# settings/development.py\nMIDDLEWARE = MIDDLEWARE + [\n    'debug_toolbar.middleware.DebugToolbarMiddleware',\n    'myapp.middleware.DevelopmentMiddleware',\n]\n\n# settings/production.py\nMIDDLEWARE = [\n    'django.middleware.cache.UpdateCacheMiddleware',\n] + MIDDLEWARE + [\n    'myapp.middleware.ProductionLoggingMiddleware',\n    'django.middleware.cache.FetchFromCacheMiddleware',\n]\n",[1050,6913,6914,6919,6927,6937,6947,6957,6967,6977,6987,6997,7001,7005,7010,7023,7034,7045,7049,7053,7058,7066,7076,7088,7099,7109],{"__ignoreMap":1048},[1053,6915,6916],{"class":1055,"line":1056},[1053,6917,6918],{"class":1059},"# settings/base.py\n",[1053,6920,6921,6923,6925],{"class":1055,"line":1063},[1053,6922,1080],{"class":1079},[1053,6924,1084],{"class":1083},[1053,6926,1087],{"class":1083},[1053,6928,6929,6931,6933,6935],{"class":1055,"line":1070},[1053,6930,1094],{"class":1093},[1053,6932,1098],{"class":1097},[1053,6934,1101],{"class":1093},[1053,6936,1708],{"class":1083},[1053,6938,6939,6941,6943,6945],{"class":1055,"line":1076},[1053,6940,1094],{"class":1093},[1053,6942,1703],{"class":1097},[1053,6944,1101],{"class":1093},[1053,6946,1708],{"class":1083},[1053,6948,6949,6951,6953,6955],{"class":1055,"line":1090},[1053,6950,1094],{"class":1093},[1053,6952,3874],{"class":1097},[1053,6954,1101],{"class":1093},[1053,6956,1708],{"class":1083},[1053,6958,6959,6961,6963,6965],{"class":1055,"line":1110},[1053,6960,1094],{"class":1093},[1053,6962,2986],{"class":1097},[1053,6964,1101],{"class":1093},[1053,6966,1708],{"class":1083},[1053,6968,6969,6971,6973,6975],{"class":1055,"line":1116},[1053,6970,1094],{"class":1093},[1053,6972,2464],{"class":1097},[1053,6974,1101],{"class":1093},[1053,6976,1708],{"class":1083},[1053,6978,6979,6981,6983,6985],{"class":1055,"line":1122},[1053,6980,1094],{"class":1093},[1053,6982,4460],{"class":1097},[1053,6984,1101],{"class":1093},[1053,6986,1708],{"class":1083},[1053,6988,6989,6991,6993,6995],{"class":1055,"line":1127},[1053,6990,1094],{"class":1093},[1053,6992,5157],{"class":1097},[1053,6994,1101],{"class":1093},[1053,6996,1708],{"class":1083},[1053,6998,6999],{"class":1055,"line":1133},[1053,7000,1119],{"class":1083},[1053,7002,7003],{"class":1055,"line":1145},[1053,7004,1067],{"emptyLinePlaceholder":1066},[1053,7006,7007],{"class":1055,"line":1155},[1053,7008,7009],{"class":1059},"# settings/development.py\n",[1053,7011,7012,7014,7016,7019,7021],{"class":1055,"line":1165},[1053,7013,1080],{"class":1079},[1053,7015,1084],{"class":1083},[1053,7017,7018],{"class":1079}," MIDDLEWARE",[1053,7020,1452],{"class":1398},[1053,7022,1087],{"class":1083},[1053,7024,7025,7027,7030,7032],{"class":1055,"line":1175},[1053,7026,1094],{"class":1093},[1053,7028,7029],{"class":1097},"debug_toolbar.middleware.DebugToolbarMiddleware",[1053,7031,1101],{"class":1093},[1053,7033,1708],{"class":1083},[1053,7035,7036,7038,7041,7043],{"class":1055,"line":1190},[1053,7037,1094],{"class":1093},[1053,7039,7040],{"class":1097},"myapp.middleware.DevelopmentMiddleware",[1053,7042,1101],{"class":1093},[1053,7044,1708],{"class":1083},[1053,7046,7047],{"class":1055,"line":1201},[1053,7048,1119],{"class":1083},[1053,7050,7051],{"class":1055,"line":1218},[1053,7052,1067],{"emptyLinePlaceholder":1066},[1053,7054,7055],{"class":1055,"line":1229},[1053,7056,7057],{"class":1059},"# settings/production.py\n",[1053,7059,7060,7062,7064],{"class":1055,"line":1429},[1053,7061,1080],{"class":1079},[1053,7063,1084],{"class":1083},[1053,7065,1087],{"class":1083},[1053,7067,7068,7070,7072,7074],{"class":1055,"line":1441},[1053,7069,1094],{"class":1093},[1053,7071,6259],{"class":1097},[1053,7073,1101],{"class":1093},[1053,7075,1708],{"class":1083},[1053,7077,7078,7080,7082,7084,7086],{"class":1055,"line":1476},[1053,7079,1539],{"class":1083},[1053,7081,1452],{"class":1398},[1053,7083,7018],{"class":1079},[1053,7085,1452],{"class":1398},[1053,7087,1087],{"class":1083},[1053,7089,7090,7092,7095,7097],{"class":1055,"line":1482},[1053,7091,1094],{"class":1093},[1053,7093,7094],{"class":1097},"myapp.middleware.ProductionLoggingMiddleware",[1053,7096,1101],{"class":1093},[1053,7098,1708],{"class":1083},[1053,7100,7101,7103,7105,7107],{"class":1055,"line":1488},[1053,7102,1094],{"class":1093},[1053,7104,6277],{"class":1097},[1053,7106,1101],{"class":1093},[1053,7108,1708],{"class":1083},[1053,7110,7111],{"class":1055,"line":1512},[1053,7112,1119],{"class":1083},[1030,7114,7116],{"id":7115},"testing-built-in-middleware","Testing Built-in Middleware",[1043,7118,7120],{"className":1045,"code":7119,"language":1047,"meta":1048,"style":1048},"from django.test import TestCase, RequestFactory\nfrom django.middleware.common import CommonMiddleware\nfrom django.http import HttpResponse\n\nclass BuiltinMiddlewareTests(TestCase):\n    \"\"\"Test built-in middleware functionality\"\"\"\n    \n    def setUp(self):\n        self.factory = RequestFactory()\n    \n    def test_common_middleware_append_slash(self):\n        \"\"\"Test CommonMiddleware APPEND_SLASH functionality\"\"\"\n        def get_response(request):\n            return HttpResponse()\n        \n        middleware = CommonMiddleware(get_response)\n        \n        # Test URL without trailing slash\n        request = self.factory.get('/test')\n        response = middleware(request)\n        \n        # Should redirect to URL with slash\n        self.assertEqual(response.status_code, 301)\n        self.assertTrue(response.url.endswith('/'))\n    \n    def test_security_middleware_headers(self):\n        \"\"\"Test SecurityMiddleware adds security headers\"\"\"\n        from django.middleware.security import SecurityMiddleware\n        \n        def get_response(request):\n            return HttpResponse()\n        \n        middleware = SecurityMiddleware(get_response)\n        request = self.factory.get('/test/')\n        \n        with self.settings(\n            SECURE_CONTENT_TYPE_NOSNIFF=True,\n            SECURE_BROWSER_XSS_FILTER=True\n        ):\n            response = middleware(request)\n        \n        self.assertEqual(response['X-Content-Type-Options'], 'nosniff')\n        self.assertEqual(response['X-XSS-Protection'], '1; mode=block')\n",[1050,7121,7122,7143,7164,7180,7184,7199,7208,7212,7225,7241,7245,7258,7267,7280,7288,7292,7308,7312,7317,7345,7360,7364,7369,7393,7425,7429,7442,7451,7471,7475,7487,7495,7499,7514,7541,7545,7559,7571,7581,7586,7601,7605,7636],{"__ignoreMap":1048},[1053,7123,7124,7126,7128,7130,7133,7135,7138,7140],{"class":1055,"line":1056},[1053,7125,3343],{"class":1394},[1053,7127,2762],{"class":1319},[1053,7129,1353],{"class":1083},[1053,7131,7132],{"class":1319},"test ",[1053,7134,2780],{"class":1394},[1053,7136,7137],{"class":1319}," TestCase",[1053,7139,1104],{"class":1083},[1053,7141,7142],{"class":1319}," RequestFactory\n",[1053,7144,7145,7147,7149,7151,7154,7156,7159,7161],{"class":1055,"line":1063},[1053,7146,3343],{"class":1394},[1053,7148,2762],{"class":1319},[1053,7150,1353],{"class":1083},[1053,7152,7153],{"class":1319},"middleware",[1053,7155,1353],{"class":1083},[1053,7157,7158],{"class":1319},"common ",[1053,7160,2780],{"class":1394},[1053,7162,7163],{"class":1319}," CommonMiddleware\n",[1053,7165,7166,7168,7170,7172,7175,7177],{"class":1055,"line":1070},[1053,7167,3343],{"class":1394},[1053,7169,2762],{"class":1319},[1053,7171,1353],{"class":1083},[1053,7173,7174],{"class":1319},"http ",[1053,7176,2780],{"class":1394},[1053,7178,7179],{"class":1319}," HttpResponse\n",[1053,7181,7182],{"class":1055,"line":1076},[1053,7183,1067],{"emptyLinePlaceholder":1066},[1053,7185,7186,7188,7191,7193,7197],{"class":1055,"line":1090},[1053,7187,1297],{"class":1296},[1053,7189,7190],{"class":1300}," BuiltinMiddlewareTests",[1053,7192,1332],{"class":1083},[1053,7194,7196],{"class":7195},"sYn-s","TestCase",[1053,7198,1345],{"class":1083},[1053,7200,7201,7203,7206],{"class":1055,"line":1110},[1053,7202,1309],{"class":1256},[1053,7204,7205],{"class":1262},"Test built-in middleware functionality",[1053,7207,1257],{"class":1256},[1053,7209,7210],{"class":1055,"line":1116},[1053,7211,1320],{"class":1319},[1053,7213,7214,7216,7219,7221,7223],{"class":1055,"line":1122},[1053,7215,1325],{"class":1296},[1053,7217,7218],{"class":1869}," setUp",[1053,7220,1332],{"class":1083},[1053,7222,1336],{"class":1335},[1053,7224,1345],{"class":1083},[1053,7226,7227,7229,7231,7234,7236,7239],{"class":1055,"line":1127},[1053,7228,1350],{"class":1079},[1053,7230,1353],{"class":1083},[1053,7232,7233],{"class":1356},"factory",[1053,7235,1084],{"class":1083},[1053,7237,7238],{"class":1406}," RequestFactory",[1053,7240,1473],{"class":1083},[1053,7242,7243],{"class":1055,"line":1133},[1053,7244,1320],{"class":1319},[1053,7246,7247,7249,7252,7254,7256],{"class":1055,"line":1145},[1053,7248,1325],{"class":1296},[1053,7250,7251],{"class":1869}," test_common_middleware_append_slash",[1053,7253,1332],{"class":1083},[1053,7255,1336],{"class":1335},[1053,7257,1345],{"class":1083},[1053,7259,7260,7262,7265],{"class":1055,"line":1155},[1053,7261,2749],{"class":1256},[1053,7263,7264],{"class":1262},"Test CommonMiddleware APPEND_SLASH functionality",[1053,7266,1257],{"class":1256},[1053,7268,7269,7272,7274,7276,7278],{"class":1055,"line":1165},[1053,7270,7271],{"class":1296},"        def",[1053,7273,1342],{"class":1869},[1053,7275,1332],{"class":1083},[1053,7277,1506],{"class":1341},[1053,7279,1345],{"class":1083},[1053,7281,7282,7284,7286],{"class":1055,"line":1175},[1053,7283,1432],{"class":1394},[1053,7285,2092],{"class":1406},[1053,7287,1473],{"class":1083},[1053,7289,7290],{"class":1055,"line":1190},[1053,7291,1485],{"class":1319},[1053,7293,7294,7297,7299,7302,7304,7306],{"class":1055,"line":1201},[1053,7295,7296],{"class":1319},"        middleware ",[1053,7298,1494],{"class":1083},[1053,7300,7301],{"class":1406}," CommonMiddleware",[1053,7303,1332],{"class":1083},[1053,7305,1357],{"class":1406},[1053,7307,1509],{"class":1083},[1053,7309,7310],{"class":1055,"line":1218},[1053,7311,1485],{"class":1319},[1053,7313,7314],{"class":1055,"line":1229},[1053,7315,7316],{"class":1059},"        # Test URL without trailing slash\n",[1053,7318,7319,7322,7324,7326,7328,7330,7332,7334,7336,7338,7341,7343],{"class":1055,"line":1429},[1053,7320,7321],{"class":1319},"        request ",[1053,7323,1494],{"class":1083},[1053,7325,1497],{"class":1079},[1053,7327,1353],{"class":1083},[1053,7329,7233],{"class":1356},[1053,7331,1353],{"class":1083},[1053,7333,1980],{"class":1406},[1053,7335,1332],{"class":1083},[1053,7337,1101],{"class":1093},[1053,7339,7340],{"class":1097},"/test",[1053,7342,1101],{"class":1093},[1053,7344,1509],{"class":1083},[1053,7346,7347,7349,7351,7354,7356,7358],{"class":1055,"line":1441},[1053,7348,1491],{"class":1319},[1053,7350,1494],{"class":1083},[1053,7352,7353],{"class":1406}," middleware",[1053,7355,1332],{"class":1083},[1053,7357,1506],{"class":1406},[1053,7359,1509],{"class":1083},[1053,7361,7362],{"class":1055,"line":1476},[1053,7363,1485],{"class":1319},[1053,7365,7366],{"class":1055,"line":1482},[1053,7367,7368],{"class":1059},"        # Should redirect to URL with slash\n",[1053,7370,7371,7373,7375,7378,7380,7382,7384,7386,7388,7391],{"class":1055,"line":1488},[1053,7372,1350],{"class":1079},[1053,7374,1353],{"class":1083},[1053,7376,7377],{"class":1406},"assertEqual",[1053,7379,1332],{"class":1083},[1053,7381,4370],{"class":1406},[1053,7383,1353],{"class":1083},[1053,7385,6568],{"class":1356},[1053,7387,1104],{"class":1083},[1053,7389,7390],{"class":1183}," 301",[1053,7392,1509],{"class":1083},[1053,7394,7395,7397,7399,7402,7404,7406,7408,7411,7413,7415,7417,7419,7421,7423],{"class":1055,"line":1512},[1053,7396,1350],{"class":1079},[1053,7398,1353],{"class":1083},[1053,7400,7401],{"class":1406},"assertTrue",[1053,7403,1332],{"class":1083},[1053,7405,4370],{"class":1406},[1053,7407,1353],{"class":1083},[1053,7409,7410],{"class":1356},"url",[1053,7412,1353],{"class":1083},[1053,7414,4165],{"class":1406},[1053,7416,1332],{"class":1083},[1053,7418,1101],{"class":1093},[1053,7420,1799],{"class":1097},[1053,7422,1101],{"class":1093},[1053,7424,5107],{"class":1083},[1053,7426,7427],{"class":1055,"line":1517},[1053,7428,1320],{"class":1319},[1053,7430,7431,7433,7436,7438,7440],{"class":1055,"line":1523},[1053,7432,1325],{"class":1296},[1053,7434,7435],{"class":1869}," test_security_middleware_headers",[1053,7437,1332],{"class":1083},[1053,7439,1336],{"class":1335},[1053,7441,1345],{"class":1083},[1053,7443,7444,7446,7449],{"class":1055,"line":1551},[1053,7445,2749],{"class":1256},[1053,7447,7448],{"class":1262},"Test SecurityMiddleware adds security headers",[1053,7450,1257],{"class":1256},[1053,7452,7453,7455,7457,7459,7461,7463,7466,7468],{"class":1055,"line":1576},[1053,7454,2759],{"class":1394},[1053,7456,2762],{"class":1319},[1053,7458,1353],{"class":1083},[1053,7460,7153],{"class":1319},[1053,7462,1353],{"class":1083},[1053,7464,7465],{"class":1319},"security ",[1053,7467,2780],{"class":1394},[1053,7469,7470],{"class":1319}," SecurityMiddleware\n",[1053,7472,7473],{"class":1055,"line":1601},[1053,7474,1485],{"class":1319},[1053,7476,7477,7479,7481,7483,7485],{"class":1055,"line":1606},[1053,7478,7271],{"class":1296},[1053,7480,1342],{"class":1869},[1053,7482,1332],{"class":1083},[1053,7484,1506],{"class":1341},[1053,7486,1345],{"class":1083},[1053,7488,7489,7491,7493],{"class":1055,"line":1612},[1053,7490,1432],{"class":1394},[1053,7492,2092],{"class":1406},[1053,7494,1473],{"class":1083},[1053,7496,7497],{"class":1055,"line":1626},[1053,7498,1485],{"class":1319},[1053,7500,7501,7503,7505,7508,7510,7512],{"class":1055,"line":1652},[1053,7502,7296],{"class":1319},[1053,7504,1494],{"class":1083},[1053,7506,7507],{"class":1406}," SecurityMiddleware",[1053,7509,1332],{"class":1083},[1053,7511,1357],{"class":1406},[1053,7513,1509],{"class":1083},[1053,7515,7516,7518,7520,7522,7524,7526,7528,7530,7532,7534,7537,7539],{"class":1055,"line":1657},[1053,7517,7321],{"class":1319},[1053,7519,1494],{"class":1083},[1053,7521,1497],{"class":1079},[1053,7523,1353],{"class":1083},[1053,7525,7233],{"class":1356},[1053,7527,1353],{"class":1083},[1053,7529,1980],{"class":1406},[1053,7531,1332],{"class":1083},[1053,7533,1101],{"class":1093},[1053,7535,7536],{"class":1097},"/test/",[1053,7538,1101],{"class":1093},[1053,7540,1509],{"class":1083},[1053,7542,7543],{"class":1055,"line":2315},[1053,7544,1485],{"class":1319},[1053,7546,7547,7550,7552,7554,7557],{"class":1055,"line":2321},[1053,7548,7549],{"class":1394},"        with",[1053,7551,1497],{"class":1079},[1053,7553,1353],{"class":1083},[1053,7555,7556],{"class":1406},"settings",[1053,7558,1438],{"class":1083},[1053,7560,7561,7564,7566,7569],{"class":1055,"line":2353},[1053,7562,7563],{"class":2892},"            SECURE_CONTENT_TYPE_NOSNIFF",[1053,7565,1494],{"class":1083},[1053,7567,7568],{"class":1141},"True",[1053,7570,1708],{"class":1083},[1053,7572,7573,7576,7578],{"class":1055,"line":2378},[1053,7574,7575],{"class":2892},"            SECURE_BROWSER_XSS_FILTER",[1053,7577,1494],{"class":1083},[1053,7579,7580],{"class":1141},"True\n",[1053,7582,7583],{"class":1055,"line":2402},[1053,7584,7585],{"class":1083},"        ):\n",[1053,7587,7588,7591,7593,7595,7597,7599],{"class":1055,"line":2407},[1053,7589,7590],{"class":1319},"            response ",[1053,7592,1494],{"class":1083},[1053,7594,7353],{"class":1406},[1053,7596,1332],{"class":1083},[1053,7598,1506],{"class":1406},[1053,7600,1509],{"class":1083},[1053,7602,7603],{"class":1055,"line":2861},[1053,7604,1485],{"class":1319},[1053,7606,7607,7609,7611,7613,7615,7617,7619,7621,7623,7625,7628,7630,7632,7634],{"class":1055,"line":2872},[1053,7608,1350],{"class":1079},[1053,7610,1353],{"class":1083},[1053,7612,7377],{"class":1406},[1053,7614,1332],{"class":1083},[1053,7616,4370],{"class":1406},[1053,7618,1529],{"class":1083},[1053,7620,1101],{"class":1093},[1053,7622,1534],{"class":1097},[1053,7624,1101],{"class":1093},[1053,7626,7627],{"class":1083},"],",[1053,7629,1209],{"class":1093},[1053,7631,1546],{"class":1097},[1053,7633,1101],{"class":1093},[1053,7635,1509],{"class":1083},[1053,7637,7638,7640,7642,7644,7646,7648,7650,7652,7654,7656,7658,7660,7662,7664],{"class":1055,"line":2903},[1053,7639,1350],{"class":1079},[1053,7641,1353],{"class":1083},[1053,7643,7377],{"class":1406},[1053,7645,1332],{"class":1083},[1053,7647,4370],{"class":1406},[1053,7649,1529],{"class":1083},[1053,7651,1101],{"class":1093},[1053,7653,1585],{"class":1097},[1053,7655,1101],{"class":1093},[1053,7657,7627],{"class":1083},[1053,7659,1209],{"class":1093},[1053,7661,1596],{"class":1097},[1053,7663,1101],{"class":1093},[1053,7665,1509],{"class":1083},[1030,7667,7669],{"id":7668},"next-steps","Next Steps",[1026,7671,7672],{},"Now that you understand Django's built-in middleware, let's learn how to create your own custom middleware to handle specific application requirements.",[7674,7675,7676],"style",{},"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 .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}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 .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .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 .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 .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}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 .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .s27EL, html code.shiki .s27EL{--shiki-light:#91B859;--shiki-default:#AB5E3F;--shiki-dark:#C4704F}html pre.shiki code .s6DHA, html code.shiki .s6DHA{--shiki-light:#6182B8;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}",{"title":1048,"searchDepth":1056,"depth":1063,"links":7678},[7679,7682,7685,7688,7691,7694,7697,7700,7703,7706,7710,7711],{"id":1032,"depth":1063,"text":1033,"children":7680},[7681],{"id":1037,"depth":1070,"text":1038},{"id":1666,"depth":1063,"text":1667,"children":7683},[7684],{"id":1670,"depth":1070,"text":1671},{"id":2414,"depth":1063,"text":2415,"children":7686},[7687],{"id":2418,"depth":1070,"text":2419},{"id":2949,"depth":1063,"text":2950,"children":7689},[7690],{"id":2953,"depth":1070,"text":2954},{"id":3837,"depth":1063,"text":3838,"children":7692},[7693],{"id":3841,"depth":1070,"text":3842},{"id":4410,"depth":1063,"text":4411,"children":7695},[7696],{"id":4414,"depth":1070,"text":4415},{"id":5120,"depth":1063,"text":5121,"children":7698},[7699],{"id":5124,"depth":1070,"text":5125},{"id":5589,"depth":1063,"text":669,"children":7701},[7702],{"id":5592,"depth":1070,"text":5593},{"id":6226,"depth":1063,"text":6227,"children":7704},[7705],{"id":6230,"depth":1070,"text":6231},{"id":6707,"depth":1063,"text":6708,"children":7707},[7708,7709],{"id":6711,"depth":1070,"text":6712},{"id":6907,"depth":1070,"text":6908},{"id":7115,"depth":1063,"text":7116},{"id":7668,"depth":1063,"text":7669},"md",null,{},{"title":525,"description":1028},"PFyI5cuqrxG-da-P7CQ7C2vkfvJsiVwEbj5ZTA2PTd8",[7718,7720],{"title":521,"path":522,"stem":523,"description":7719,"children":-1},"Django middleware is a framework of hooks into Django's request/response processing. It's a light, low-level \"plugin\" system for globally altering Django's input or output. This chapter provides a comprehensive understanding of how middleware works and its role in Django applications.",{"title":529,"path":530,"stem":531,"description":7721,"children":-1},"Custom middleware allows you to implement application-specific functionality that runs for every request. This chapter covers designing, implementing, and testing custom middleware for various use cases.",1772474936592]