[{"data":1,"prerenderedAt":6652},["ShallowReactive",2],{"navigation":3,"/middleware/middleware-overview":1016,"/middleware/middleware-overview-surround":6647},[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":521,"body":1018,"description":1028,"extension":6642,"links":6643,"meta":6644,"navigation":1124,"path":522,"seo":6645,"stem":523,"__hash__":6646},"docs/13.middleware/02.middleware-overview.md",{"type":1019,"value":1020,"toc":6603},"minimark",[1021,1025,1029,1034,1039,1288,1292,1295,1421,1425,1429,1636,1640,2077,2081,2085,2182,2186,2722,2726,2730,3208,3212,3556,3560,3988,3992,4320,4324,4328,4603,4607,5099,5103,5107,5538,5542,5546,6116,6120,6124,6533,6536,6540,6556,6560,6574,6578,6592,6596,6599],[1022,1023,521],"h1",{"id":1024},"middleware-overview",[1026,1027,1028],"p",{},"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.",[1030,1031,1033],"h2",{"id":1032},"how-middleware-works","How Middleware Works",[1035,1036,1038],"h3",{"id":1037},"requestresponse-flow","Request/Response Flow",[1040,1041,1046],"pre",{"className":1042,"code":1043,"language":1044,"meta":1045,"style":1045},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Conceptual flow of a Django request\n\"\"\"\n1. Web Server receives HTTP request\n2. Django creates HttpRequest object\n3. Request flows through middleware (top to bottom)\n4. URL resolver determines view function\n5. View function processes request\n6. View returns HttpResponse object\n7. Response flows through middleware (bottom to top)\n8. Web Server sends HTTP response to client\n\"\"\"\n\n# Visual representation:\n\"\"\"\nHTTP Request\n    ↓\n┌─────────────────┐\n│   Middleware 1  │ ← process_request()\n└─────────────────┘\n    ↓\n┌─────────────────┐\n│   Middleware 2  │ ← process_request()\n└─────────────────┘\n    ↓\n┌─────────────────┐\n│   URL Resolver  │\n└─────────────────┘\n    ↓\n┌─────────────────┐\n│   View Function │\n└─────────────────┘\n    ↓\n┌─────────────────┐\n│   Middleware 2  │ ← process_response()\n└─────────────────┘\n    ↓\n┌─────────────────┐\n│   Middleware 1  │ ← process_response()\n└─────────────────┘\n    ↓\nHTTP Response\n\"\"\"\n","python","",[1047,1048,1049,1058,1065,1072,1078,1084,1090,1096,1102,1108,1114,1119,1126,1132,1137,1143,1149,1155,1161,1167,1172,1177,1183,1188,1193,1198,1204,1209,1214,1219,1225,1230,1235,1240,1246,1251,1256,1261,1267,1272,1277,1283],"code",{"__ignoreMap":1045},[1050,1051,1054],"span",{"class":1052,"line":1053},"line",1,[1050,1055,1057],{"class":1056},"s9Tkl","# Conceptual flow of a Django request\n",[1050,1059,1061],{"class":1052,"line":1060},2,[1050,1062,1064],{"class":1063},"sm7ve","\"\"\"\n",[1050,1066,1068],{"class":1052,"line":1067},3,[1050,1069,1071],{"class":1070},"sVyVU","1. Web Server receives HTTP request\n",[1050,1073,1075],{"class":1052,"line":1074},4,[1050,1076,1077],{"class":1070},"2. Django creates HttpRequest object\n",[1050,1079,1081],{"class":1052,"line":1080},5,[1050,1082,1083],{"class":1070},"3. Request flows through middleware (top to bottom)\n",[1050,1085,1087],{"class":1052,"line":1086},6,[1050,1088,1089],{"class":1070},"4. URL resolver determines view function\n",[1050,1091,1093],{"class":1052,"line":1092},7,[1050,1094,1095],{"class":1070},"5. View function processes request\n",[1050,1097,1099],{"class":1052,"line":1098},8,[1050,1100,1101],{"class":1070},"6. View returns HttpResponse object\n",[1050,1103,1105],{"class":1052,"line":1104},9,[1050,1106,1107],{"class":1070},"7. Response flows through middleware (bottom to top)\n",[1050,1109,1111],{"class":1052,"line":1110},10,[1050,1112,1113],{"class":1070},"8. Web Server sends HTTP response to client\n",[1050,1115,1117],{"class":1052,"line":1116},11,[1050,1118,1064],{"class":1063},[1050,1120,1122],{"class":1052,"line":1121},12,[1050,1123,1125],{"emptyLinePlaceholder":1124},true,"\n",[1050,1127,1129],{"class":1052,"line":1128},13,[1050,1130,1131],{"class":1056},"# Visual representation:\n",[1050,1133,1135],{"class":1052,"line":1134},14,[1050,1136,1064],{"class":1063},[1050,1138,1140],{"class":1052,"line":1139},15,[1050,1141,1142],{"class":1070},"HTTP Request\n",[1050,1144,1146],{"class":1052,"line":1145},16,[1050,1147,1148],{"class":1070},"    ↓\n",[1050,1150,1152],{"class":1052,"line":1151},17,[1050,1153,1154],{"class":1070},"┌─────────────────┐\n",[1050,1156,1158],{"class":1052,"line":1157},18,[1050,1159,1160],{"class":1070},"│   Middleware 1  │ ← process_request()\n",[1050,1162,1164],{"class":1052,"line":1163},19,[1050,1165,1166],{"class":1070},"└─────────────────┘\n",[1050,1168,1170],{"class":1052,"line":1169},20,[1050,1171,1148],{"class":1070},[1050,1173,1175],{"class":1052,"line":1174},21,[1050,1176,1154],{"class":1070},[1050,1178,1180],{"class":1052,"line":1179},22,[1050,1181,1182],{"class":1070},"│   Middleware 2  │ ← process_request()\n",[1050,1184,1186],{"class":1052,"line":1185},23,[1050,1187,1166],{"class":1070},[1050,1189,1191],{"class":1052,"line":1190},24,[1050,1192,1148],{"class":1070},[1050,1194,1196],{"class":1052,"line":1195},25,[1050,1197,1154],{"class":1070},[1050,1199,1201],{"class":1052,"line":1200},26,[1050,1202,1203],{"class":1070},"│   URL Resolver  │\n",[1050,1205,1207],{"class":1052,"line":1206},27,[1050,1208,1166],{"class":1070},[1050,1210,1212],{"class":1052,"line":1211},28,[1050,1213,1148],{"class":1070},[1050,1215,1217],{"class":1052,"line":1216},29,[1050,1218,1154],{"class":1070},[1050,1220,1222],{"class":1052,"line":1221},30,[1050,1223,1224],{"class":1070},"│   View Function │\n",[1050,1226,1228],{"class":1052,"line":1227},31,[1050,1229,1166],{"class":1070},[1050,1231,1233],{"class":1052,"line":1232},32,[1050,1234,1148],{"class":1070},[1050,1236,1238],{"class":1052,"line":1237},33,[1050,1239,1154],{"class":1070},[1050,1241,1243],{"class":1052,"line":1242},34,[1050,1244,1245],{"class":1070},"│   Middleware 2  │ ← process_response()\n",[1050,1247,1249],{"class":1052,"line":1248},35,[1050,1250,1166],{"class":1070},[1050,1252,1254],{"class":1052,"line":1253},36,[1050,1255,1148],{"class":1070},[1050,1257,1259],{"class":1052,"line":1258},37,[1050,1260,1154],{"class":1070},[1050,1262,1264],{"class":1052,"line":1263},38,[1050,1265,1266],{"class":1070},"│   Middleware 1  │ ← process_response()\n",[1050,1268,1270],{"class":1052,"line":1269},39,[1050,1271,1166],{"class":1070},[1050,1273,1275],{"class":1052,"line":1274},40,[1050,1276,1148],{"class":1070},[1050,1278,1280],{"class":1052,"line":1279},41,[1050,1281,1282],{"class":1070},"HTTP Response\n",[1050,1284,1286],{"class":1052,"line":1285},42,[1050,1287,1064],{"class":1063},[1035,1289,1291],{"id":1290},"middleware-configuration","Middleware Configuration",[1026,1293,1294],{},"Middleware is configured in Django settings:",[1040,1296,1298],{"className":1042,"code":1297,"language":1044,"meta":1045,"style":1045},"# settings.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    # Custom middleware\n    'myapp.middleware.CustomMiddleware',\n]\n",[1047,1299,1300,1305,1318,1334,1345,1356,1367,1378,1389,1400,1405,1416],{"__ignoreMap":1045},[1050,1301,1302],{"class":1052,"line":1053},[1050,1303,1304],{"class":1056},"# settings.py\n",[1050,1306,1307,1311,1315],{"class":1052,"line":1060},[1050,1308,1310],{"class":1309},"se3Ec","MIDDLEWARE",[1050,1312,1314],{"class":1313},"soVBu"," =",[1050,1316,1317],{"class":1313}," [\n",[1050,1319,1320,1324,1328,1331],{"class":1052,"line":1067},[1050,1321,1323],{"class":1322},"sbYkP","    '",[1050,1325,1327],{"class":1326},"sTbE_","django.middleware.security.SecurityMiddleware",[1050,1329,1330],{"class":1322},"'",[1050,1332,1333],{"class":1313},",\n",[1050,1335,1336,1338,1341,1343],{"class":1052,"line":1074},[1050,1337,1323],{"class":1322},[1050,1339,1340],{"class":1326},"django.contrib.sessions.middleware.SessionMiddleware",[1050,1342,1330],{"class":1322},[1050,1344,1333],{"class":1313},[1050,1346,1347,1349,1352,1354],{"class":1052,"line":1080},[1050,1348,1323],{"class":1322},[1050,1350,1351],{"class":1326},"django.middleware.common.CommonMiddleware",[1050,1353,1330],{"class":1322},[1050,1355,1333],{"class":1313},[1050,1357,1358,1360,1363,1365],{"class":1052,"line":1086},[1050,1359,1323],{"class":1322},[1050,1361,1362],{"class":1326},"django.middleware.csrf.CsrfViewMiddleware",[1050,1364,1330],{"class":1322},[1050,1366,1333],{"class":1313},[1050,1368,1369,1371,1374,1376],{"class":1052,"line":1092},[1050,1370,1323],{"class":1322},[1050,1372,1373],{"class":1326},"django.contrib.auth.middleware.AuthenticationMiddleware",[1050,1375,1330],{"class":1322},[1050,1377,1333],{"class":1313},[1050,1379,1380,1382,1385,1387],{"class":1052,"line":1098},[1050,1381,1323],{"class":1322},[1050,1383,1384],{"class":1326},"django.contrib.messages.middleware.MessageMiddleware",[1050,1386,1330],{"class":1322},[1050,1388,1333],{"class":1313},[1050,1390,1391,1393,1396,1398],{"class":1052,"line":1104},[1050,1392,1323],{"class":1322},[1050,1394,1395],{"class":1326},"django.middleware.clickjacking.XFrameOptionsMiddleware",[1050,1397,1330],{"class":1322},[1050,1399,1333],{"class":1313},[1050,1401,1402],{"class":1052,"line":1110},[1050,1403,1404],{"class":1056},"    # Custom middleware\n",[1050,1406,1407,1409,1412,1414],{"class":1052,"line":1116},[1050,1408,1323],{"class":1322},[1050,1410,1411],{"class":1326},"myapp.middleware.CustomMiddleware",[1050,1413,1330],{"class":1322},[1050,1415,1333],{"class":1313},[1050,1417,1418],{"class":1052,"line":1121},[1050,1419,1420],{"class":1313},"]\n",[1030,1422,1424],{"id":1423},"middleware-structure","Middleware Structure",[1035,1426,1428],{"id":1427},"modern-middleware-django-110","Modern Middleware (Django 1.10+)",[1040,1430,1432],{"className":1042,"code":1431,"language":1044,"meta":1045,"style":1045},"class SimpleMiddleware:\n    \"\"\"Modern middleware using __call__ method\"\"\"\n    \n    def __init__(self, get_response):\n        \"\"\"\n        One-time configuration and initialization.\n        get_response is the next middleware or view in the chain.\n        \"\"\"\n        self.get_response = get_response\n        # One-time initialization code here\n    \n    def __call__(self, request):\n        \"\"\"\n        Called for each request before the view (and later middleware)\n        are called.\n        \"\"\"\n        # Code to be executed for each request before\n        # the view (and later middleware) are called.\n        \n        response = self.get_response(request)\n        \n        # Code to be executed for each request/response after\n        # the view is called.\n        \n        return response\n",[1047,1433,1434,1447,1457,1463,1489,1494,1499,1504,1508,1525,1530,1534,1552,1556,1561,1566,1570,1575,1580,1585,1609,1613,1618,1623,1627],{"__ignoreMap":1045},[1050,1435,1436,1440,1444],{"class":1052,"line":1053},[1050,1437,1439],{"class":1438},"s5Kfy","class",[1050,1441,1443],{"class":1442},"sD-vU"," SimpleMiddleware",[1050,1445,1446],{"class":1313},":\n",[1050,1448,1449,1452,1455],{"class":1052,"line":1060},[1050,1450,1451],{"class":1063},"    \"\"\"",[1050,1453,1454],{"class":1070},"Modern middleware using __call__ method",[1050,1456,1064],{"class":1063},[1050,1458,1459],{"class":1052,"line":1067},[1050,1460,1462],{"class":1461},"sftqT","    \n",[1050,1464,1465,1468,1472,1475,1479,1482,1486],{"class":1052,"line":1074},[1050,1466,1467],{"class":1438},"    def",[1050,1469,1471],{"class":1470},"sJdAF"," __init__",[1050,1473,1474],{"class":1313},"(",[1050,1476,1478],{"class":1477},"sRjD_","self",[1050,1480,1481],{"class":1313},",",[1050,1483,1485],{"class":1484},"sCyAa"," get_response",[1050,1487,1488],{"class":1313},"):\n",[1050,1490,1491],{"class":1052,"line":1080},[1050,1492,1493],{"class":1063},"        \"\"\"\n",[1050,1495,1496],{"class":1052,"line":1086},[1050,1497,1498],{"class":1070},"        One-time configuration and initialization.\n",[1050,1500,1501],{"class":1052,"line":1092},[1050,1502,1503],{"class":1070},"        get_response is the next middleware or view in the chain.\n",[1050,1505,1506],{"class":1052,"line":1098},[1050,1507,1493],{"class":1063},[1050,1509,1510,1513,1516,1520,1522],{"class":1052,"line":1104},[1050,1511,1512],{"class":1309},"        self",[1050,1514,1515],{"class":1313},".",[1050,1517,1519],{"class":1518},"sBPpx","get_response",[1050,1521,1314],{"class":1313},[1050,1523,1524],{"class":1461}," get_response\n",[1050,1526,1527],{"class":1052,"line":1110},[1050,1528,1529],{"class":1056},"        # One-time initialization code here\n",[1050,1531,1532],{"class":1052,"line":1116},[1050,1533,1462],{"class":1461},[1050,1535,1536,1538,1541,1543,1545,1547,1550],{"class":1052,"line":1121},[1050,1537,1467],{"class":1438},[1050,1539,1540],{"class":1470}," __call__",[1050,1542,1474],{"class":1313},[1050,1544,1478],{"class":1477},[1050,1546,1481],{"class":1313},[1050,1548,1549],{"class":1484}," request",[1050,1551,1488],{"class":1313},[1050,1553,1554],{"class":1052,"line":1128},[1050,1555,1493],{"class":1063},[1050,1557,1558],{"class":1052,"line":1134},[1050,1559,1560],{"class":1070},"        Called for each request before the view (and later middleware)\n",[1050,1562,1563],{"class":1052,"line":1139},[1050,1564,1565],{"class":1070},"        are called.\n",[1050,1567,1568],{"class":1052,"line":1145},[1050,1569,1493],{"class":1063},[1050,1571,1572],{"class":1052,"line":1151},[1050,1573,1574],{"class":1056},"        # Code to be executed for each request before\n",[1050,1576,1577],{"class":1052,"line":1157},[1050,1578,1579],{"class":1056},"        # the view (and later middleware) are called.\n",[1050,1581,1582],{"class":1052,"line":1163},[1050,1583,1584],{"class":1461},"        \n",[1050,1586,1587,1590,1593,1596,1598,1601,1603,1606],{"class":1052,"line":1169},[1050,1588,1589],{"class":1461},"        response ",[1050,1591,1592],{"class":1313},"=",[1050,1594,1595],{"class":1309}," self",[1050,1597,1515],{"class":1313},[1050,1599,1519],{"class":1600},"siWMO",[1050,1602,1474],{"class":1313},[1050,1604,1605],{"class":1600},"request",[1050,1607,1608],{"class":1313},")\n",[1050,1610,1611],{"class":1052,"line":1174},[1050,1612,1584],{"class":1461},[1050,1614,1615],{"class":1052,"line":1179},[1050,1616,1617],{"class":1056},"        # Code to be executed for each request/response after\n",[1050,1619,1620],{"class":1052,"line":1185},[1050,1621,1622],{"class":1056},"        # the view is called.\n",[1050,1624,1625],{"class":1052,"line":1190},[1050,1626,1584],{"class":1461},[1050,1628,1629,1633],{"class":1052,"line":1195},[1050,1630,1632],{"class":1631},"siDh9","        return",[1050,1634,1635],{"class":1461}," response\n",[1035,1637,1639],{"id":1638},"legacy-middleware-methods","Legacy Middleware Methods",[1040,1641,1643],{"className":1042,"code":1642,"language":1044,"meta":1045,"style":1045},"class LegacyStyleMiddleware:\n    \"\"\"Legacy middleware with separate methods\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        # Process request\n        response = self.process_request(request)\n        if response:\n            return response\n        \n        # Get response from next middleware/view\n        response = self.get_response(request)\n        \n        # Process response\n        return self.process_response(request, response)\n    \n    def process_request(self, request):\n        \"\"\"\n        Called on each request, before Django decides which view to execute.\n        Should return None or HttpResponse object.\n        \"\"\"\n        return None\n    \n    def process_view(self, request, view_func, view_args, view_kwargs):\n        \"\"\"\n        Called just before Django calls the view.\n        Should return None or HttpResponse object.\n        \"\"\"\n        return None\n    \n    def process_exception(self, request, exception):\n        \"\"\"\n        Called when a view raises an exception.\n        Should return None or HttpResponse object.\n        \"\"\"\n        return None\n    \n    def process_template_response(self, request, response):\n        \"\"\"\n        Called just after the view has finished executing.\n        Only called if response has render() method.\n        \"\"\"\n        return response\n    \n    def process_response(self, request, response):\n        \"\"\"\n        Called on all responses before they're returned to the browser.\n        Must return HttpResponse object.\n        \"\"\"\n        return response\n",[1047,1644,1645,1654,1663,1667,1683,1695,1699,1715,1720,1739,1749,1756,1760,1765,1783,1787,1792,1813,1817,1835,1839,1844,1849,1853,1861,1865,1897,1901,1906,1910,1914,1920,1924,1946,1950,1955,1959,1963,1969,1973,1994,1998,2003,2009,2014,2021,2026,2048,2053,2059,2065,2070],{"__ignoreMap":1045},[1050,1646,1647,1649,1652],{"class":1052,"line":1053},[1050,1648,1439],{"class":1438},[1050,1650,1651],{"class":1442}," LegacyStyleMiddleware",[1050,1653,1446],{"class":1313},[1050,1655,1656,1658,1661],{"class":1052,"line":1060},[1050,1657,1451],{"class":1063},[1050,1659,1660],{"class":1070},"Legacy middleware with separate methods",[1050,1662,1064],{"class":1063},[1050,1664,1665],{"class":1052,"line":1067},[1050,1666,1462],{"class":1461},[1050,1668,1669,1671,1673,1675,1677,1679,1681],{"class":1052,"line":1074},[1050,1670,1467],{"class":1438},[1050,1672,1471],{"class":1470},[1050,1674,1474],{"class":1313},[1050,1676,1478],{"class":1477},[1050,1678,1481],{"class":1313},[1050,1680,1485],{"class":1484},[1050,1682,1488],{"class":1313},[1050,1684,1685,1687,1689,1691,1693],{"class":1052,"line":1080},[1050,1686,1512],{"class":1309},[1050,1688,1515],{"class":1313},[1050,1690,1519],{"class":1518},[1050,1692,1314],{"class":1313},[1050,1694,1524],{"class":1461},[1050,1696,1697],{"class":1052,"line":1086},[1050,1698,1462],{"class":1461},[1050,1700,1701,1703,1705,1707,1709,1711,1713],{"class":1052,"line":1092},[1050,1702,1467],{"class":1438},[1050,1704,1540],{"class":1470},[1050,1706,1474],{"class":1313},[1050,1708,1478],{"class":1477},[1050,1710,1481],{"class":1313},[1050,1712,1549],{"class":1484},[1050,1714,1488],{"class":1313},[1050,1716,1717],{"class":1052,"line":1098},[1050,1718,1719],{"class":1056},"        # Process request\n",[1050,1721,1722,1724,1726,1728,1730,1733,1735,1737],{"class":1052,"line":1104},[1050,1723,1589],{"class":1461},[1050,1725,1592],{"class":1313},[1050,1727,1595],{"class":1309},[1050,1729,1515],{"class":1313},[1050,1731,1732],{"class":1600},"process_request",[1050,1734,1474],{"class":1313},[1050,1736,1605],{"class":1600},[1050,1738,1608],{"class":1313},[1050,1740,1741,1744,1747],{"class":1052,"line":1110},[1050,1742,1743],{"class":1631},"        if",[1050,1745,1746],{"class":1461}," response",[1050,1748,1446],{"class":1313},[1050,1750,1751,1754],{"class":1052,"line":1116},[1050,1752,1753],{"class":1631},"            return",[1050,1755,1635],{"class":1461},[1050,1757,1758],{"class":1052,"line":1121},[1050,1759,1584],{"class":1461},[1050,1761,1762],{"class":1052,"line":1128},[1050,1763,1764],{"class":1056},"        # Get response from next middleware/view\n",[1050,1766,1767,1769,1771,1773,1775,1777,1779,1781],{"class":1052,"line":1134},[1050,1768,1589],{"class":1461},[1050,1770,1592],{"class":1313},[1050,1772,1595],{"class":1309},[1050,1774,1515],{"class":1313},[1050,1776,1519],{"class":1600},[1050,1778,1474],{"class":1313},[1050,1780,1605],{"class":1600},[1050,1782,1608],{"class":1313},[1050,1784,1785],{"class":1052,"line":1139},[1050,1786,1584],{"class":1461},[1050,1788,1789],{"class":1052,"line":1145},[1050,1790,1791],{"class":1056},"        # Process response\n",[1050,1793,1794,1796,1798,1800,1803,1805,1807,1809,1811],{"class":1052,"line":1151},[1050,1795,1632],{"class":1631},[1050,1797,1595],{"class":1309},[1050,1799,1515],{"class":1313},[1050,1801,1802],{"class":1600},"process_response",[1050,1804,1474],{"class":1313},[1050,1806,1605],{"class":1600},[1050,1808,1481],{"class":1313},[1050,1810,1746],{"class":1600},[1050,1812,1608],{"class":1313},[1050,1814,1815],{"class":1052,"line":1157},[1050,1816,1462],{"class":1461},[1050,1818,1819,1821,1825,1827,1829,1831,1833],{"class":1052,"line":1163},[1050,1820,1467],{"class":1438},[1050,1822,1824],{"class":1823},"sljsM"," process_request",[1050,1826,1474],{"class":1313},[1050,1828,1478],{"class":1477},[1050,1830,1481],{"class":1313},[1050,1832,1549],{"class":1484},[1050,1834,1488],{"class":1313},[1050,1836,1837],{"class":1052,"line":1169},[1050,1838,1493],{"class":1063},[1050,1840,1841],{"class":1052,"line":1174},[1050,1842,1843],{"class":1070},"        Called on each request, before Django decides which view to execute.\n",[1050,1845,1846],{"class":1052,"line":1179},[1050,1847,1848],{"class":1070},"        Should return None or HttpResponse object.\n",[1050,1850,1851],{"class":1052,"line":1185},[1050,1852,1493],{"class":1063},[1050,1854,1855,1857],{"class":1052,"line":1190},[1050,1856,1632],{"class":1631},[1050,1858,1860],{"class":1859},"s8XtY"," None\n",[1050,1862,1863],{"class":1052,"line":1195},[1050,1864,1462],{"class":1461},[1050,1866,1867,1869,1872,1874,1876,1878,1880,1882,1885,1887,1890,1892,1895],{"class":1052,"line":1200},[1050,1868,1467],{"class":1438},[1050,1870,1871],{"class":1823}," process_view",[1050,1873,1474],{"class":1313},[1050,1875,1478],{"class":1477},[1050,1877,1481],{"class":1313},[1050,1879,1549],{"class":1484},[1050,1881,1481],{"class":1313},[1050,1883,1884],{"class":1484}," view_func",[1050,1886,1481],{"class":1313},[1050,1888,1889],{"class":1484}," view_args",[1050,1891,1481],{"class":1313},[1050,1893,1894],{"class":1484}," view_kwargs",[1050,1896,1488],{"class":1313},[1050,1898,1899],{"class":1052,"line":1206},[1050,1900,1493],{"class":1063},[1050,1902,1903],{"class":1052,"line":1211},[1050,1904,1905],{"class":1070},"        Called just before Django calls the view.\n",[1050,1907,1908],{"class":1052,"line":1216},[1050,1909,1848],{"class":1070},[1050,1911,1912],{"class":1052,"line":1221},[1050,1913,1493],{"class":1063},[1050,1915,1916,1918],{"class":1052,"line":1227},[1050,1917,1632],{"class":1631},[1050,1919,1860],{"class":1859},[1050,1921,1922],{"class":1052,"line":1232},[1050,1923,1462],{"class":1461},[1050,1925,1926,1928,1931,1933,1935,1937,1939,1941,1944],{"class":1052,"line":1237},[1050,1927,1467],{"class":1438},[1050,1929,1930],{"class":1823}," process_exception",[1050,1932,1474],{"class":1313},[1050,1934,1478],{"class":1477},[1050,1936,1481],{"class":1313},[1050,1938,1549],{"class":1484},[1050,1940,1481],{"class":1313},[1050,1942,1943],{"class":1484}," exception",[1050,1945,1488],{"class":1313},[1050,1947,1948],{"class":1052,"line":1242},[1050,1949,1493],{"class":1063},[1050,1951,1952],{"class":1052,"line":1248},[1050,1953,1954],{"class":1070},"        Called when a view raises an exception.\n",[1050,1956,1957],{"class":1052,"line":1253},[1050,1958,1848],{"class":1070},[1050,1960,1961],{"class":1052,"line":1258},[1050,1962,1493],{"class":1063},[1050,1964,1965,1967],{"class":1052,"line":1263},[1050,1966,1632],{"class":1631},[1050,1968,1860],{"class":1859},[1050,1970,1971],{"class":1052,"line":1269},[1050,1972,1462],{"class":1461},[1050,1974,1975,1977,1980,1982,1984,1986,1988,1990,1992],{"class":1052,"line":1274},[1050,1976,1467],{"class":1438},[1050,1978,1979],{"class":1823}," process_template_response",[1050,1981,1474],{"class":1313},[1050,1983,1478],{"class":1477},[1050,1985,1481],{"class":1313},[1050,1987,1549],{"class":1484},[1050,1989,1481],{"class":1313},[1050,1991,1746],{"class":1484},[1050,1993,1488],{"class":1313},[1050,1995,1996],{"class":1052,"line":1279},[1050,1997,1493],{"class":1063},[1050,1999,2000],{"class":1052,"line":1285},[1050,2001,2002],{"class":1070},"        Called just after the view has finished executing.\n",[1050,2004,2006],{"class":1052,"line":2005},43,[1050,2007,2008],{"class":1070},"        Only called if response has render() method.\n",[1050,2010,2012],{"class":1052,"line":2011},44,[1050,2013,1493],{"class":1063},[1050,2015,2017,2019],{"class":1052,"line":2016},45,[1050,2018,1632],{"class":1631},[1050,2020,1635],{"class":1461},[1050,2022,2024],{"class":1052,"line":2023},46,[1050,2025,1462],{"class":1461},[1050,2027,2029,2031,2034,2036,2038,2040,2042,2044,2046],{"class":1052,"line":2028},47,[1050,2030,1467],{"class":1438},[1050,2032,2033],{"class":1823}," process_response",[1050,2035,1474],{"class":1313},[1050,2037,1478],{"class":1477},[1050,2039,1481],{"class":1313},[1050,2041,1549],{"class":1484},[1050,2043,1481],{"class":1313},[1050,2045,1746],{"class":1484},[1050,2047,1488],{"class":1313},[1050,2049,2051],{"class":1052,"line":2050},48,[1050,2052,1493],{"class":1063},[1050,2054,2056],{"class":1052,"line":2055},49,[1050,2057,2058],{"class":1070},"        Called on all responses before they're returned to the browser.\n",[1050,2060,2062],{"class":1052,"line":2061},50,[1050,2063,2064],{"class":1070},"        Must return HttpResponse object.\n",[1050,2066,2068],{"class":1052,"line":2067},51,[1050,2069,1493],{"class":1063},[1050,2071,2073,2075],{"class":1052,"line":2072},52,[1050,2074,1632],{"class":1631},[1050,2076,1635],{"class":1461},[1030,2078,2080],{"id":2079},"middleware-execution-order","Middleware Execution Order",[1035,2082,2084],{"id":2083},"request-processing-order","Request Processing Order",[1040,2086,2088],{"className":1042,"code":2087,"language":1044,"meta":1045,"style":1045},"# Example middleware stack\nMIDDLEWARE = [\n    'middleware.SecurityMiddleware',      # 1st to process request\n    'middleware.SessionMiddleware',      # 2nd to process request\n    'middleware.AuthMiddleware',         # 3rd to process request\n    'middleware.CustomMiddleware',       # 4th to process request\n]\n\n# Request flow:\n# Request → Security → Session → Auth → Custom → View\n# Response ← Security ← Session ← Auth ← Custom ← View\n",[1047,2089,2090,2095,2103,2117,2131,2145,2159,2163,2167,2172,2177],{"__ignoreMap":1045},[1050,2091,2092],{"class":1052,"line":1053},[1050,2093,2094],{"class":1056},"# Example middleware stack\n",[1050,2096,2097,2099,2101],{"class":1052,"line":1060},[1050,2098,1310],{"class":1309},[1050,2100,1314],{"class":1313},[1050,2102,1317],{"class":1313},[1050,2104,2105,2107,2110,2112,2114],{"class":1052,"line":1067},[1050,2106,1323],{"class":1322},[1050,2108,2109],{"class":1326},"middleware.SecurityMiddleware",[1050,2111,1330],{"class":1322},[1050,2113,1481],{"class":1313},[1050,2115,2116],{"class":1056},"      # 1st to process request\n",[1050,2118,2119,2121,2124,2126,2128],{"class":1052,"line":1074},[1050,2120,1323],{"class":1322},[1050,2122,2123],{"class":1326},"middleware.SessionMiddleware",[1050,2125,1330],{"class":1322},[1050,2127,1481],{"class":1313},[1050,2129,2130],{"class":1056},"      # 2nd to process request\n",[1050,2132,2133,2135,2138,2140,2142],{"class":1052,"line":1080},[1050,2134,1323],{"class":1322},[1050,2136,2137],{"class":1326},"middleware.AuthMiddleware",[1050,2139,1330],{"class":1322},[1050,2141,1481],{"class":1313},[1050,2143,2144],{"class":1056},"         # 3rd to process request\n",[1050,2146,2147,2149,2152,2154,2156],{"class":1052,"line":1086},[1050,2148,1323],{"class":1322},[1050,2150,2151],{"class":1326},"middleware.CustomMiddleware",[1050,2153,1330],{"class":1322},[1050,2155,1481],{"class":1313},[1050,2157,2158],{"class":1056},"       # 4th to process request\n",[1050,2160,2161],{"class":1052,"line":1092},[1050,2162,1420],{"class":1313},[1050,2164,2165],{"class":1052,"line":1098},[1050,2166,1125],{"emptyLinePlaceholder":1124},[1050,2168,2169],{"class":1052,"line":1104},[1050,2170,2171],{"class":1056},"# Request flow:\n",[1050,2173,2174],{"class":1052,"line":1110},[1050,2175,2176],{"class":1056},"# Request → Security → Session → Auth → Custom → View\n",[1050,2178,2179],{"class":1052,"line":1116},[1050,2180,2181],{"class":1056},"# Response ← Security ← Session ← Auth ← Custom ← View\n",[1035,2183,2185],{"id":2184},"practical-example","Practical Example",[1040,2187,2189],{"className":1042,"code":2188,"language":1044,"meta":1045,"style":1045},"class RequestResponseLogger:\n    \"\"\"Middleware to log request/response flow\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n        print(\"RequestResponseLogger: Initialized\")\n    \n    def __call__(self, request):\n        print(f\"RequestResponseLogger: Processing request to {request.path}\")\n        \n        # Call the next middleware or view\n        response = self.get_response(request)\n        \n        print(f\"RequestResponseLogger: Processing response with status {response.status_code}\")\n        \n        return response\n\nclass TimingMiddleware:\n    \"\"\"Middleware to measure request processing time\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        import time\n        \n        start_time = time.time()\n        print(f\"TimingMiddleware: Request started at {start_time}\")\n        \n        response = self.get_response(request)\n        \n        end_time = time.time()\n        processing_time = end_time - start_time\n        print(f\"TimingMiddleware: Request completed in {processing_time:.4f} seconds\")\n        \n        # Add timing header to response\n        response['X-Processing-Time'] = f\"{processing_time:.4f}\"\n        \n        return response\n\n# With both middleware enabled:\nMIDDLEWARE = [\n    'myapp.middleware.RequestResponseLogger',\n    'myapp.middleware.TimingMiddleware',\n]\n\n# Output for a request:\n\"\"\"\nRequestResponseLogger: Processing request to /example/\nTimingMiddleware: Request started at 1634567890.1234\nTimingMiddleware: Request completed in 0.0156 seconds\nRequestResponseLogger: Processing response with status 200\n\"\"\"\n",[1047,2190,2191,2200,2209,2213,2229,2241,2258,2262,2278,2308,2312,2317,2335,2339,2366,2370,2376,2380,2389,2398,2402,2418,2430,2434,2450,2458,2462,2480,2502,2506,2524,2528,2543,2560,2586,2590,2595,2631,2635,2641,2645,2650,2658,2669,2680,2684,2688,2693,2697,2702,2707,2712,2717],{"__ignoreMap":1045},[1050,2192,2193,2195,2198],{"class":1052,"line":1053},[1050,2194,1439],{"class":1438},[1050,2196,2197],{"class":1442}," RequestResponseLogger",[1050,2199,1446],{"class":1313},[1050,2201,2202,2204,2207],{"class":1052,"line":1060},[1050,2203,1451],{"class":1063},[1050,2205,2206],{"class":1070},"Middleware to log request/response flow",[1050,2208,1064],{"class":1063},[1050,2210,2211],{"class":1052,"line":1067},[1050,2212,1462],{"class":1461},[1050,2214,2215,2217,2219,2221,2223,2225,2227],{"class":1052,"line":1074},[1050,2216,1467],{"class":1438},[1050,2218,1471],{"class":1470},[1050,2220,1474],{"class":1313},[1050,2222,1478],{"class":1477},[1050,2224,1481],{"class":1313},[1050,2226,1485],{"class":1484},[1050,2228,1488],{"class":1313},[1050,2230,2231,2233,2235,2237,2239],{"class":1052,"line":1080},[1050,2232,1512],{"class":1309},[1050,2234,1515],{"class":1313},[1050,2236,1519],{"class":1518},[1050,2238,1314],{"class":1313},[1050,2240,1524],{"class":1461},[1050,2242,2243,2246,2248,2251,2254,2256],{"class":1052,"line":1086},[1050,2244,2245],{"class":1470},"        print",[1050,2247,1474],{"class":1313},[1050,2249,2250],{"class":1322},"\"",[1050,2252,2253],{"class":1326},"RequestResponseLogger: Initialized",[1050,2255,2250],{"class":1322},[1050,2257,1608],{"class":1313},[1050,2259,2260],{"class":1052,"line":1092},[1050,2261,1462],{"class":1461},[1050,2263,2264,2266,2268,2270,2272,2274,2276],{"class":1052,"line":1098},[1050,2265,1467],{"class":1438},[1050,2267,1540],{"class":1470},[1050,2269,1474],{"class":1313},[1050,2271,1478],{"class":1477},[1050,2273,1481],{"class":1313},[1050,2275,1549],{"class":1484},[1050,2277,1488],{"class":1313},[1050,2279,2280,2282,2284,2287,2290,2294,2296,2298,2301,2304,2306],{"class":1052,"line":1104},[1050,2281,2245],{"class":1470},[1050,2283,1474],{"class":1313},[1050,2285,2286],{"class":1438},"f",[1050,2288,2289],{"class":1326},"\"RequestResponseLogger: Processing request to ",[1050,2291,2293],{"class":2292},"s3h35","{",[1050,2295,1605],{"class":1600},[1050,2297,1515],{"class":1313},[1050,2299,2300],{"class":1518},"path",[1050,2302,2303],{"class":2292},"}",[1050,2305,2250],{"class":1326},[1050,2307,1608],{"class":1313},[1050,2309,2310],{"class":1052,"line":1110},[1050,2311,1584],{"class":1461},[1050,2313,2314],{"class":1052,"line":1116},[1050,2315,2316],{"class":1056},"        # Call the next middleware or view\n",[1050,2318,2319,2321,2323,2325,2327,2329,2331,2333],{"class":1052,"line":1121},[1050,2320,1589],{"class":1461},[1050,2322,1592],{"class":1313},[1050,2324,1595],{"class":1309},[1050,2326,1515],{"class":1313},[1050,2328,1519],{"class":1600},[1050,2330,1474],{"class":1313},[1050,2332,1605],{"class":1600},[1050,2334,1608],{"class":1313},[1050,2336,2337],{"class":1052,"line":1128},[1050,2338,1584],{"class":1461},[1050,2340,2341,2343,2345,2347,2350,2352,2355,2357,2360,2362,2364],{"class":1052,"line":1134},[1050,2342,2245],{"class":1470},[1050,2344,1474],{"class":1313},[1050,2346,2286],{"class":1438},[1050,2348,2349],{"class":1326},"\"RequestResponseLogger: Processing response with status ",[1050,2351,2293],{"class":2292},[1050,2353,2354],{"class":1600},"response",[1050,2356,1515],{"class":1313},[1050,2358,2359],{"class":1518},"status_code",[1050,2361,2303],{"class":2292},[1050,2363,2250],{"class":1326},[1050,2365,1608],{"class":1313},[1050,2367,2368],{"class":1052,"line":1139},[1050,2369,1584],{"class":1461},[1050,2371,2372,2374],{"class":1052,"line":1145},[1050,2373,1632],{"class":1631},[1050,2375,1635],{"class":1461},[1050,2377,2378],{"class":1052,"line":1151},[1050,2379,1125],{"emptyLinePlaceholder":1124},[1050,2381,2382,2384,2387],{"class":1052,"line":1157},[1050,2383,1439],{"class":1438},[1050,2385,2386],{"class":1442}," TimingMiddleware",[1050,2388,1446],{"class":1313},[1050,2390,2391,2393,2396],{"class":1052,"line":1163},[1050,2392,1451],{"class":1063},[1050,2394,2395],{"class":1070},"Middleware to measure request processing time",[1050,2397,1064],{"class":1063},[1050,2399,2400],{"class":1052,"line":1169},[1050,2401,1462],{"class":1461},[1050,2403,2404,2406,2408,2410,2412,2414,2416],{"class":1052,"line":1174},[1050,2405,1467],{"class":1438},[1050,2407,1471],{"class":1470},[1050,2409,1474],{"class":1313},[1050,2411,1478],{"class":1477},[1050,2413,1481],{"class":1313},[1050,2415,1485],{"class":1484},[1050,2417,1488],{"class":1313},[1050,2419,2420,2422,2424,2426,2428],{"class":1052,"line":1179},[1050,2421,1512],{"class":1309},[1050,2423,1515],{"class":1313},[1050,2425,1519],{"class":1518},[1050,2427,1314],{"class":1313},[1050,2429,1524],{"class":1461},[1050,2431,2432],{"class":1052,"line":1185},[1050,2433,1462],{"class":1461},[1050,2435,2436,2438,2440,2442,2444,2446,2448],{"class":1052,"line":1190},[1050,2437,1467],{"class":1438},[1050,2439,1540],{"class":1470},[1050,2441,1474],{"class":1313},[1050,2443,1478],{"class":1477},[1050,2445,1481],{"class":1313},[1050,2447,1549],{"class":1484},[1050,2449,1488],{"class":1313},[1050,2451,2452,2455],{"class":1052,"line":1195},[1050,2453,2454],{"class":1631},"        import",[1050,2456,2457],{"class":1461}," time\n",[1050,2459,2460],{"class":1052,"line":1200},[1050,2461,1584],{"class":1461},[1050,2463,2464,2467,2469,2472,2474,2477],{"class":1052,"line":1206},[1050,2465,2466],{"class":1461},"        start_time ",[1050,2468,1592],{"class":1313},[1050,2470,2471],{"class":1461}," time",[1050,2473,1515],{"class":1313},[1050,2475,2476],{"class":1600},"time",[1050,2478,2479],{"class":1313},"()\n",[1050,2481,2482,2484,2486,2488,2491,2493,2496,2498,2500],{"class":1052,"line":1211},[1050,2483,2245],{"class":1470},[1050,2485,1474],{"class":1313},[1050,2487,2286],{"class":1438},[1050,2489,2490],{"class":1326},"\"TimingMiddleware: Request started at ",[1050,2492,2293],{"class":2292},[1050,2494,2495],{"class":1600},"start_time",[1050,2497,2303],{"class":2292},[1050,2499,2250],{"class":1326},[1050,2501,1608],{"class":1313},[1050,2503,2504],{"class":1052,"line":1216},[1050,2505,1584],{"class":1461},[1050,2507,2508,2510,2512,2514,2516,2518,2520,2522],{"class":1052,"line":1221},[1050,2509,1589],{"class":1461},[1050,2511,1592],{"class":1313},[1050,2513,1595],{"class":1309},[1050,2515,1515],{"class":1313},[1050,2517,1519],{"class":1600},[1050,2519,1474],{"class":1313},[1050,2521,1605],{"class":1600},[1050,2523,1608],{"class":1313},[1050,2525,2526],{"class":1052,"line":1227},[1050,2527,1584],{"class":1461},[1050,2529,2530,2533,2535,2537,2539,2541],{"class":1052,"line":1232},[1050,2531,2532],{"class":1461},"        end_time ",[1050,2534,1592],{"class":1313},[1050,2536,2471],{"class":1461},[1050,2538,1515],{"class":1313},[1050,2540,2476],{"class":1600},[1050,2542,2479],{"class":1313},[1050,2544,2545,2548,2550,2553,2557],{"class":1052,"line":1237},[1050,2546,2547],{"class":1461},"        processing_time ",[1050,2549,1592],{"class":1313},[1050,2551,2552],{"class":1461}," end_time ",[1050,2554,2556],{"class":2555},"sVsLi","-",[1050,2558,2559],{"class":1461}," start_time\n",[1050,2561,2562,2564,2566,2568,2571,2573,2576,2579,2581,2584],{"class":1052,"line":1242},[1050,2563,2245],{"class":1470},[1050,2565,1474],{"class":1313},[1050,2567,2286],{"class":1438},[1050,2569,2570],{"class":1326},"\"TimingMiddleware: Request completed in ",[1050,2572,2293],{"class":2292},[1050,2574,2575],{"class":1600},"processing_time",[1050,2577,2578],{"class":1438},":.4f",[1050,2580,2303],{"class":2292},[1050,2582,2583],{"class":1326}," seconds\"",[1050,2585,1608],{"class":1313},[1050,2587,2588],{"class":1052,"line":1248},[1050,2589,1584],{"class":1461},[1050,2591,2592],{"class":1052,"line":1253},[1050,2593,2594],{"class":1056},"        # Add timing header to response\n",[1050,2596,2597,2600,2603,2605,2608,2610,2613,2615,2618,2620,2622,2624,2626,2628],{"class":1052,"line":1258},[1050,2598,2599],{"class":1461},"        response",[1050,2601,2602],{"class":1313},"[",[1050,2604,1330],{"class":1322},[1050,2606,2607],{"class":1326},"X-Processing-Time",[1050,2609,1330],{"class":1322},[1050,2611,2612],{"class":1313},"]",[1050,2614,1314],{"class":1313},[1050,2616,2617],{"class":1438}," f",[1050,2619,2250],{"class":1326},[1050,2621,2293],{"class":2292},[1050,2623,2575],{"class":1461},[1050,2625,2578],{"class":1438},[1050,2627,2303],{"class":2292},[1050,2629,2630],{"class":1326},"\"\n",[1050,2632,2633],{"class":1052,"line":1263},[1050,2634,1584],{"class":1461},[1050,2636,2637,2639],{"class":1052,"line":1269},[1050,2638,1632],{"class":1631},[1050,2640,1635],{"class":1461},[1050,2642,2643],{"class":1052,"line":1274},[1050,2644,1125],{"emptyLinePlaceholder":1124},[1050,2646,2647],{"class":1052,"line":1279},[1050,2648,2649],{"class":1056},"# With both middleware enabled:\n",[1050,2651,2652,2654,2656],{"class":1052,"line":1285},[1050,2653,1310],{"class":1309},[1050,2655,1314],{"class":1313},[1050,2657,1317],{"class":1313},[1050,2659,2660,2662,2665,2667],{"class":1052,"line":2005},[1050,2661,1323],{"class":1322},[1050,2663,2664],{"class":1326},"myapp.middleware.RequestResponseLogger",[1050,2666,1330],{"class":1322},[1050,2668,1333],{"class":1313},[1050,2670,2671,2673,2676,2678],{"class":1052,"line":2011},[1050,2672,1323],{"class":1322},[1050,2674,2675],{"class":1326},"myapp.middleware.TimingMiddleware",[1050,2677,1330],{"class":1322},[1050,2679,1333],{"class":1313},[1050,2681,2682],{"class":1052,"line":2016},[1050,2683,1420],{"class":1313},[1050,2685,2686],{"class":1052,"line":2023},[1050,2687,1125],{"emptyLinePlaceholder":1124},[1050,2689,2690],{"class":1052,"line":2028},[1050,2691,2692],{"class":1056},"# Output for a request:\n",[1050,2694,2695],{"class":1052,"line":2050},[1050,2696,1064],{"class":1063},[1050,2698,2699],{"class":1052,"line":2055},[1050,2700,2701],{"class":1070},"RequestResponseLogger: Processing request to /example/\n",[1050,2703,2704],{"class":1052,"line":2061},[1050,2705,2706],{"class":1070},"TimingMiddleware: Request started at 1634567890.1234\n",[1050,2708,2709],{"class":1052,"line":2067},[1050,2710,2711],{"class":1070},"TimingMiddleware: Request completed in 0.0156 seconds\n",[1050,2713,2714],{"class":1052,"line":2072},[1050,2715,2716],{"class":1070},"RequestResponseLogger: Processing response with status 200\n",[1050,2718,2720],{"class":1052,"line":2719},53,[1050,2721,1064],{"class":1063},[1030,2723,2725],{"id":2724},"middleware-hooks-and-methods","Middleware Hooks and Methods",[1035,2727,2729],{"id":2728},"process-request-hook","Process Request Hook",[1040,2731,2733],{"className":1042,"code":2732,"language":1044,"meta":1045,"style":1045},"class RequestProcessingMiddleware:\n    \"\"\"Demonstrate request processing\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        # This runs before the view\n        self.process_request_data(request)\n        \n        response = self.get_response(request)\n        \n        return response\n    \n    def process_request_data(self, request):\n        \"\"\"Process incoming request data\"\"\"\n        # Add custom attributes to request\n        request.custom_data = {\n            'timestamp': timezone.now(),\n            'user_agent': request.META.get('HTTP_USER_AGENT', ''),\n            'ip_address': self.get_client_ip(request)\n        }\n        \n        # Log request information\n        print(f\"Request from {request.custom_data['ip_address']} at {request.custom_data['timestamp']}\")\n    \n    def get_client_ip(self, request):\n        \"\"\"Get client IP address\"\"\"\n        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')\n        if x_forwarded_for:\n            ip = x_forwarded_for.split(',')[0]\n        else:\n            ip = request.META.get('REMOTE_ADDR')\n        return ip\n",[1047,2734,2735,2744,2753,2757,2773,2785,2789,2805,2810,2825,2829,2847,2851,2857,2861,2878,2888,2893,2908,2932,2973,2997,3002,3006,3011,3069,3073,3090,3099,3127,3136,3167,3174,3201],{"__ignoreMap":1045},[1050,2736,2737,2739,2742],{"class":1052,"line":1053},[1050,2738,1439],{"class":1438},[1050,2740,2741],{"class":1442}," RequestProcessingMiddleware",[1050,2743,1446],{"class":1313},[1050,2745,2746,2748,2751],{"class":1052,"line":1060},[1050,2747,1451],{"class":1063},[1050,2749,2750],{"class":1070},"Demonstrate request processing",[1050,2752,1064],{"class":1063},[1050,2754,2755],{"class":1052,"line":1067},[1050,2756,1462],{"class":1461},[1050,2758,2759,2761,2763,2765,2767,2769,2771],{"class":1052,"line":1074},[1050,2760,1467],{"class":1438},[1050,2762,1471],{"class":1470},[1050,2764,1474],{"class":1313},[1050,2766,1478],{"class":1477},[1050,2768,1481],{"class":1313},[1050,2770,1485],{"class":1484},[1050,2772,1488],{"class":1313},[1050,2774,2775,2777,2779,2781,2783],{"class":1052,"line":1080},[1050,2776,1512],{"class":1309},[1050,2778,1515],{"class":1313},[1050,2780,1519],{"class":1518},[1050,2782,1314],{"class":1313},[1050,2784,1524],{"class":1461},[1050,2786,2787],{"class":1052,"line":1086},[1050,2788,1462],{"class":1461},[1050,2790,2791,2793,2795,2797,2799,2801,2803],{"class":1052,"line":1092},[1050,2792,1467],{"class":1438},[1050,2794,1540],{"class":1470},[1050,2796,1474],{"class":1313},[1050,2798,1478],{"class":1477},[1050,2800,1481],{"class":1313},[1050,2802,1549],{"class":1484},[1050,2804,1488],{"class":1313},[1050,2806,2807],{"class":1052,"line":1098},[1050,2808,2809],{"class":1056},"        # This runs before the view\n",[1050,2811,2812,2814,2816,2819,2821,2823],{"class":1052,"line":1104},[1050,2813,1512],{"class":1309},[1050,2815,1515],{"class":1313},[1050,2817,2818],{"class":1600},"process_request_data",[1050,2820,1474],{"class":1313},[1050,2822,1605],{"class":1600},[1050,2824,1608],{"class":1313},[1050,2826,2827],{"class":1052,"line":1110},[1050,2828,1584],{"class":1461},[1050,2830,2831,2833,2835,2837,2839,2841,2843,2845],{"class":1052,"line":1116},[1050,2832,1589],{"class":1461},[1050,2834,1592],{"class":1313},[1050,2836,1595],{"class":1309},[1050,2838,1515],{"class":1313},[1050,2840,1519],{"class":1600},[1050,2842,1474],{"class":1313},[1050,2844,1605],{"class":1600},[1050,2846,1608],{"class":1313},[1050,2848,2849],{"class":1052,"line":1121},[1050,2850,1584],{"class":1461},[1050,2852,2853,2855],{"class":1052,"line":1128},[1050,2854,1632],{"class":1631},[1050,2856,1635],{"class":1461},[1050,2858,2859],{"class":1052,"line":1134},[1050,2860,1462],{"class":1461},[1050,2862,2863,2865,2868,2870,2872,2874,2876],{"class":1052,"line":1139},[1050,2864,1467],{"class":1438},[1050,2866,2867],{"class":1823}," process_request_data",[1050,2869,1474],{"class":1313},[1050,2871,1478],{"class":1477},[1050,2873,1481],{"class":1313},[1050,2875,1549],{"class":1484},[1050,2877,1488],{"class":1313},[1050,2879,2880,2883,2886],{"class":1052,"line":1145},[1050,2881,2882],{"class":1063},"        \"\"\"",[1050,2884,2885],{"class":1070},"Process incoming request data",[1050,2887,1064],{"class":1063},[1050,2889,2890],{"class":1052,"line":1151},[1050,2891,2892],{"class":1056},"        # Add custom attributes to request\n",[1050,2894,2895,2898,2900,2903,2905],{"class":1052,"line":1157},[1050,2896,2897],{"class":1461},"        request",[1050,2899,1515],{"class":1313},[1050,2901,2902],{"class":1518},"custom_data",[1050,2904,1314],{"class":1313},[1050,2906,2907],{"class":1313}," {\n",[1050,2909,2910,2913,2916,2918,2921,2924,2926,2929],{"class":1052,"line":1163},[1050,2911,2912],{"class":1322},"            '",[1050,2914,2915],{"class":1326},"timestamp",[1050,2917,1330],{"class":1322},[1050,2919,2920],{"class":1313},":",[1050,2922,2923],{"class":1461}," timezone",[1050,2925,1515],{"class":1313},[1050,2927,2928],{"class":1600},"now",[1050,2930,2931],{"class":1313},"(),\n",[1050,2933,2934,2936,2939,2941,2943,2945,2947,2951,2953,2956,2958,2960,2963,2965,2967,2970],{"class":1052,"line":1169},[1050,2935,2912],{"class":1322},[1050,2937,2938],{"class":1326},"user_agent",[1050,2940,1330],{"class":1322},[1050,2942,2920],{"class":1313},[1050,2944,1549],{"class":1461},[1050,2946,1515],{"class":1313},[1050,2948,2950],{"class":2949},"sFGJz","META",[1050,2952,1515],{"class":1313},[1050,2954,2955],{"class":1600},"get",[1050,2957,1474],{"class":1313},[1050,2959,1330],{"class":1322},[1050,2961,2962],{"class":1326},"HTTP_USER_AGENT",[1050,2964,1330],{"class":1322},[1050,2966,1481],{"class":1313},[1050,2968,2969],{"class":1322}," ''",[1050,2971,2972],{"class":1313},"),\n",[1050,2974,2975,2977,2980,2982,2984,2986,2988,2991,2993,2995],{"class":1052,"line":1174},[1050,2976,2912],{"class":1322},[1050,2978,2979],{"class":1326},"ip_address",[1050,2981,1330],{"class":1322},[1050,2983,2920],{"class":1313},[1050,2985,1595],{"class":1309},[1050,2987,1515],{"class":1313},[1050,2989,2990],{"class":1600},"get_client_ip",[1050,2992,1474],{"class":1313},[1050,2994,1605],{"class":1600},[1050,2996,1608],{"class":1313},[1050,2998,2999],{"class":1052,"line":1179},[1050,3000,3001],{"class":1313},"        }\n",[1050,3003,3004],{"class":1052,"line":1185},[1050,3005,1584],{"class":1461},[1050,3007,3008],{"class":1052,"line":1190},[1050,3009,3010],{"class":1056},"        # Log request information\n",[1050,3012,3013,3015,3017,3019,3022,3024,3026,3028,3030,3032,3034,3036,3038,3040,3042,3045,3047,3049,3051,3053,3055,3057,3059,3061,3063,3065,3067],{"class":1052,"line":1195},[1050,3014,2245],{"class":1470},[1050,3016,1474],{"class":1313},[1050,3018,2286],{"class":1438},[1050,3020,3021],{"class":1326},"\"Request from ",[1050,3023,2293],{"class":2292},[1050,3025,1605],{"class":1600},[1050,3027,1515],{"class":1313},[1050,3029,2902],{"class":1518},[1050,3031,2602],{"class":1313},[1050,3033,1330],{"class":1322},[1050,3035,2979],{"class":1326},[1050,3037,1330],{"class":1322},[1050,3039,2612],{"class":1313},[1050,3041,2303],{"class":2292},[1050,3043,3044],{"class":1326}," at ",[1050,3046,2293],{"class":2292},[1050,3048,1605],{"class":1600},[1050,3050,1515],{"class":1313},[1050,3052,2902],{"class":1518},[1050,3054,2602],{"class":1313},[1050,3056,1330],{"class":1322},[1050,3058,2915],{"class":1326},[1050,3060,1330],{"class":1322},[1050,3062,2612],{"class":1313},[1050,3064,2303],{"class":2292},[1050,3066,2250],{"class":1326},[1050,3068,1608],{"class":1313},[1050,3070,3071],{"class":1052,"line":1200},[1050,3072,1462],{"class":1461},[1050,3074,3075,3077,3080,3082,3084,3086,3088],{"class":1052,"line":1206},[1050,3076,1467],{"class":1438},[1050,3078,3079],{"class":1823}," get_client_ip",[1050,3081,1474],{"class":1313},[1050,3083,1478],{"class":1477},[1050,3085,1481],{"class":1313},[1050,3087,1549],{"class":1484},[1050,3089,1488],{"class":1313},[1050,3091,3092,3094,3097],{"class":1052,"line":1211},[1050,3093,2882],{"class":1063},[1050,3095,3096],{"class":1070},"Get client IP address",[1050,3098,1064],{"class":1063},[1050,3100,3101,3104,3106,3108,3110,3112,3114,3116,3118,3120,3123,3125],{"class":1052,"line":1216},[1050,3102,3103],{"class":1461},"        x_forwarded_for ",[1050,3105,1592],{"class":1313},[1050,3107,1549],{"class":1461},[1050,3109,1515],{"class":1313},[1050,3111,2950],{"class":2949},[1050,3113,1515],{"class":1313},[1050,3115,2955],{"class":1600},[1050,3117,1474],{"class":1313},[1050,3119,1330],{"class":1322},[1050,3121,3122],{"class":1326},"HTTP_X_FORWARDED_FOR",[1050,3124,1330],{"class":1322},[1050,3126,1608],{"class":1313},[1050,3128,3129,3131,3134],{"class":1052,"line":1221},[1050,3130,1743],{"class":1631},[1050,3132,3133],{"class":1461}," x_forwarded_for",[1050,3135,1446],{"class":1313},[1050,3137,3138,3141,3143,3145,3147,3150,3152,3154,3156,3158,3161,3165],{"class":1052,"line":1227},[1050,3139,3140],{"class":1461},"            ip ",[1050,3142,1592],{"class":1313},[1050,3144,3133],{"class":1461},[1050,3146,1515],{"class":1313},[1050,3148,3149],{"class":1600},"split",[1050,3151,1474],{"class":1313},[1050,3153,1330],{"class":1322},[1050,3155,1481],{"class":1326},[1050,3157,1330],{"class":1322},[1050,3159,3160],{"class":1313},")[",[1050,3162,3164],{"class":3163},"s7CZa","0",[1050,3166,1420],{"class":1313},[1050,3168,3169,3172],{"class":1052,"line":1232},[1050,3170,3171],{"class":1631},"        else",[1050,3173,1446],{"class":1313},[1050,3175,3176,3178,3180,3182,3184,3186,3188,3190,3192,3194,3197,3199],{"class":1052,"line":1237},[1050,3177,3140],{"class":1461},[1050,3179,1592],{"class":1313},[1050,3181,1549],{"class":1461},[1050,3183,1515],{"class":1313},[1050,3185,2950],{"class":2949},[1050,3187,1515],{"class":1313},[1050,3189,2955],{"class":1600},[1050,3191,1474],{"class":1313},[1050,3193,1330],{"class":1322},[1050,3195,3196],{"class":1326},"REMOTE_ADDR",[1050,3198,1330],{"class":1322},[1050,3200,1608],{"class":1313},[1050,3202,3203,3205],{"class":1052,"line":1242},[1050,3204,1632],{"class":1631},[1050,3206,3207],{"class":1461}," ip\n",[1035,3209,3211],{"id":3210},"process-view-hook","Process View Hook",[1040,3213,3215],{"className":1042,"code":3214,"language":1044,"meta":1045,"style":1045},"class ViewProcessingMiddleware:\n    \"\"\"Middleware with process_view method\"\"\"\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        return response\n    \n    def process_view(self, request, view_func, view_args, view_kwargs):\n        \"\"\"Called just before the view is executed\"\"\"\n        \n        # Log view information\n        print(f\"About to execute view: {view_func.__name__}\")\n        print(f\"View args: {view_args}\")\n        print(f\"View kwargs: {view_kwargs}\")\n        \n        # Add view information to request\n        request.view_info = {\n            'view_name': view_func.__name__,\n            'view_module': view_func.__module__,\n            'args': view_args,\n            'kwargs': view_kwargs\n        }\n        \n        # Could return HttpResponse to short-circuit view execution\n        # return HttpResponse(\"View execution prevented\")\n        \n        # Return None to continue normal processing\n        return None\n",[1047,3216,3217,3226,3235,3239,3255,3267,3271,3287,3305,3311,3315,3343,3352,3356,3361,3389,3411,3433,3437,3442,3455,3474,3494,3509,3523,3527,3531,3536,3541,3545,3550],{"__ignoreMap":1045},[1050,3218,3219,3221,3224],{"class":1052,"line":1053},[1050,3220,1439],{"class":1438},[1050,3222,3223],{"class":1442}," ViewProcessingMiddleware",[1050,3225,1446],{"class":1313},[1050,3227,3228,3230,3233],{"class":1052,"line":1060},[1050,3229,1451],{"class":1063},[1050,3231,3232],{"class":1070},"Middleware with process_view method",[1050,3234,1064],{"class":1063},[1050,3236,3237],{"class":1052,"line":1067},[1050,3238,1462],{"class":1461},[1050,3240,3241,3243,3245,3247,3249,3251,3253],{"class":1052,"line":1074},[1050,3242,1467],{"class":1438},[1050,3244,1471],{"class":1470},[1050,3246,1474],{"class":1313},[1050,3248,1478],{"class":1477},[1050,3250,1481],{"class":1313},[1050,3252,1485],{"class":1484},[1050,3254,1488],{"class":1313},[1050,3256,3257,3259,3261,3263,3265],{"class":1052,"line":1080},[1050,3258,1512],{"class":1309},[1050,3260,1515],{"class":1313},[1050,3262,1519],{"class":1518},[1050,3264,1314],{"class":1313},[1050,3266,1524],{"class":1461},[1050,3268,3269],{"class":1052,"line":1086},[1050,3270,1462],{"class":1461},[1050,3272,3273,3275,3277,3279,3281,3283,3285],{"class":1052,"line":1092},[1050,3274,1467],{"class":1438},[1050,3276,1540],{"class":1470},[1050,3278,1474],{"class":1313},[1050,3280,1478],{"class":1477},[1050,3282,1481],{"class":1313},[1050,3284,1549],{"class":1484},[1050,3286,1488],{"class":1313},[1050,3288,3289,3291,3293,3295,3297,3299,3301,3303],{"class":1052,"line":1098},[1050,3290,1589],{"class":1461},[1050,3292,1592],{"class":1313},[1050,3294,1595],{"class":1309},[1050,3296,1515],{"class":1313},[1050,3298,1519],{"class":1600},[1050,3300,1474],{"class":1313},[1050,3302,1605],{"class":1600},[1050,3304,1608],{"class":1313},[1050,3306,3307,3309],{"class":1052,"line":1104},[1050,3308,1632],{"class":1631},[1050,3310,1635],{"class":1461},[1050,3312,3313],{"class":1052,"line":1110},[1050,3314,1462],{"class":1461},[1050,3316,3317,3319,3321,3323,3325,3327,3329,3331,3333,3335,3337,3339,3341],{"class":1052,"line":1116},[1050,3318,1467],{"class":1438},[1050,3320,1871],{"class":1823},[1050,3322,1474],{"class":1313},[1050,3324,1478],{"class":1477},[1050,3326,1481],{"class":1313},[1050,3328,1549],{"class":1484},[1050,3330,1481],{"class":1313},[1050,3332,1884],{"class":1484},[1050,3334,1481],{"class":1313},[1050,3336,1889],{"class":1484},[1050,3338,1481],{"class":1313},[1050,3340,1894],{"class":1484},[1050,3342,1488],{"class":1313},[1050,3344,3345,3347,3350],{"class":1052,"line":1121},[1050,3346,2882],{"class":1063},[1050,3348,3349],{"class":1070},"Called just before the view is executed",[1050,3351,1064],{"class":1063},[1050,3353,3354],{"class":1052,"line":1128},[1050,3355,1584],{"class":1461},[1050,3357,3358],{"class":1052,"line":1134},[1050,3359,3360],{"class":1056},"        # Log view information\n",[1050,3362,3363,3365,3367,3369,3372,3374,3377,3379,3383,3385,3387],{"class":1052,"line":1139},[1050,3364,2245],{"class":1470},[1050,3366,1474],{"class":1313},[1050,3368,2286],{"class":1438},[1050,3370,3371],{"class":1326},"\"About to execute view: ",[1050,3373,2293],{"class":2292},[1050,3375,3376],{"class":1600},"view_func",[1050,3378,1515],{"class":1313},[1050,3380,3382],{"class":3381},"s131V","__name__",[1050,3384,2303],{"class":2292},[1050,3386,2250],{"class":1326},[1050,3388,1608],{"class":1313},[1050,3390,3391,3393,3395,3397,3400,3402,3405,3407,3409],{"class":1052,"line":1145},[1050,3392,2245],{"class":1470},[1050,3394,1474],{"class":1313},[1050,3396,2286],{"class":1438},[1050,3398,3399],{"class":1326},"\"View args: ",[1050,3401,2293],{"class":2292},[1050,3403,3404],{"class":1600},"view_args",[1050,3406,2303],{"class":2292},[1050,3408,2250],{"class":1326},[1050,3410,1608],{"class":1313},[1050,3412,3413,3415,3417,3419,3422,3424,3427,3429,3431],{"class":1052,"line":1151},[1050,3414,2245],{"class":1470},[1050,3416,1474],{"class":1313},[1050,3418,2286],{"class":1438},[1050,3420,3421],{"class":1326},"\"View kwargs: ",[1050,3423,2293],{"class":2292},[1050,3425,3426],{"class":1600},"view_kwargs",[1050,3428,2303],{"class":2292},[1050,3430,2250],{"class":1326},[1050,3432,1608],{"class":1313},[1050,3434,3435],{"class":1052,"line":1157},[1050,3436,1584],{"class":1461},[1050,3438,3439],{"class":1052,"line":1163},[1050,3440,3441],{"class":1056},"        # Add view information to request\n",[1050,3443,3444,3446,3448,3451,3453],{"class":1052,"line":1169},[1050,3445,2897],{"class":1461},[1050,3447,1515],{"class":1313},[1050,3449,3450],{"class":1518},"view_info",[1050,3452,1314],{"class":1313},[1050,3454,2907],{"class":1313},[1050,3456,3457,3459,3462,3464,3466,3468,3470,3472],{"class":1052,"line":1174},[1050,3458,2912],{"class":1322},[1050,3460,3461],{"class":1326},"view_name",[1050,3463,1330],{"class":1322},[1050,3465,2920],{"class":1313},[1050,3467,1884],{"class":1461},[1050,3469,1515],{"class":1313},[1050,3471,3382],{"class":3381},[1050,3473,1333],{"class":1313},[1050,3475,3476,3478,3481,3483,3485,3487,3489,3492],{"class":1052,"line":1179},[1050,3477,2912],{"class":1322},[1050,3479,3480],{"class":1326},"view_module",[1050,3482,1330],{"class":1322},[1050,3484,2920],{"class":1313},[1050,3486,1884],{"class":1461},[1050,3488,1515],{"class":1313},[1050,3490,3491],{"class":3381},"__module__",[1050,3493,1333],{"class":1313},[1050,3495,3496,3498,3501,3503,3505,3507],{"class":1052,"line":1185},[1050,3497,2912],{"class":1322},[1050,3499,3500],{"class":1326},"args",[1050,3502,1330],{"class":1322},[1050,3504,2920],{"class":1313},[1050,3506,1889],{"class":1461},[1050,3508,1333],{"class":1313},[1050,3510,3511,3513,3516,3518,3520],{"class":1052,"line":1190},[1050,3512,2912],{"class":1322},[1050,3514,3515],{"class":1326},"kwargs",[1050,3517,1330],{"class":1322},[1050,3519,2920],{"class":1313},[1050,3521,3522],{"class":1461}," view_kwargs\n",[1050,3524,3525],{"class":1052,"line":1195},[1050,3526,3001],{"class":1313},[1050,3528,3529],{"class":1052,"line":1200},[1050,3530,1584],{"class":1461},[1050,3532,3533],{"class":1052,"line":1206},[1050,3534,3535],{"class":1056},"        # Could return HttpResponse to short-circuit view execution\n",[1050,3537,3538],{"class":1052,"line":1211},[1050,3539,3540],{"class":1056},"        # return HttpResponse(\"View execution prevented\")\n",[1050,3542,3543],{"class":1052,"line":1216},[1050,3544,1584],{"class":1461},[1050,3546,3547],{"class":1052,"line":1221},[1050,3548,3549],{"class":1056},"        # Return None to continue normal processing\n",[1050,3551,3552,3554],{"class":1052,"line":1227},[1050,3553,1632],{"class":1631},[1050,3555,1860],{"class":1859},[1035,3557,3559],{"id":3558},"process-exception-hook","Process Exception Hook",[1040,3561,3563],{"className":1042,"code":3562,"language":1044,"meta":1045,"style":1045},"class ExceptionHandlingMiddleware:\n    \"\"\"Middleware for handling exceptions\"\"\"\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        return response\n    \n    def process_exception(self, request, exception):\n        \"\"\"Handle exceptions raised by views\"\"\"\n        \n        # Log the exception\n        import logging\n        logger = logging.getLogger(__name__)\n        \n        logger.error(\n            f\"Exception in view: {exception.__class__.__name__}: {exception}\",\n            extra={\n                'request_path': request.path,\n                'request_method': request.method,\n                'user': getattr(request, 'user', None),\n                'exception_type': exception.__class__.__name__\n            },\n            exc_info=True\n        )\n        \n        # Could return custom error response\n        if isinstance(exception, ValueError):\n            from django.http import HttpResponseBadRequest\n            return HttpResponseBadRequest(\"Invalid request data\")\n        \n        # Return None to use default exception handling\n        return None\n",[1047,3564,3565,3574,3583,3587,3603,3615,3619,3635,3653,3659,3663,3683,3692,3696,3701,3708,3729,3733,3746,3783,3792,3812,3832,3866,3888,3893,3903,3908,3912,3917,3936,3955,3973,3977,3982],{"__ignoreMap":1045},[1050,3566,3567,3569,3572],{"class":1052,"line":1053},[1050,3568,1439],{"class":1438},[1050,3570,3571],{"class":1442}," ExceptionHandlingMiddleware",[1050,3573,1446],{"class":1313},[1050,3575,3576,3578,3581],{"class":1052,"line":1060},[1050,3577,1451],{"class":1063},[1050,3579,3580],{"class":1070},"Middleware for handling exceptions",[1050,3582,1064],{"class":1063},[1050,3584,3585],{"class":1052,"line":1067},[1050,3586,1462],{"class":1461},[1050,3588,3589,3591,3593,3595,3597,3599,3601],{"class":1052,"line":1074},[1050,3590,1467],{"class":1438},[1050,3592,1471],{"class":1470},[1050,3594,1474],{"class":1313},[1050,3596,1478],{"class":1477},[1050,3598,1481],{"class":1313},[1050,3600,1485],{"class":1484},[1050,3602,1488],{"class":1313},[1050,3604,3605,3607,3609,3611,3613],{"class":1052,"line":1080},[1050,3606,1512],{"class":1309},[1050,3608,1515],{"class":1313},[1050,3610,1519],{"class":1518},[1050,3612,1314],{"class":1313},[1050,3614,1524],{"class":1461},[1050,3616,3617],{"class":1052,"line":1086},[1050,3618,1462],{"class":1461},[1050,3620,3621,3623,3625,3627,3629,3631,3633],{"class":1052,"line":1092},[1050,3622,1467],{"class":1438},[1050,3624,1540],{"class":1470},[1050,3626,1474],{"class":1313},[1050,3628,1478],{"class":1477},[1050,3630,1481],{"class":1313},[1050,3632,1549],{"class":1484},[1050,3634,1488],{"class":1313},[1050,3636,3637,3639,3641,3643,3645,3647,3649,3651],{"class":1052,"line":1098},[1050,3638,1589],{"class":1461},[1050,3640,1592],{"class":1313},[1050,3642,1595],{"class":1309},[1050,3644,1515],{"class":1313},[1050,3646,1519],{"class":1600},[1050,3648,1474],{"class":1313},[1050,3650,1605],{"class":1600},[1050,3652,1608],{"class":1313},[1050,3654,3655,3657],{"class":1052,"line":1104},[1050,3656,1632],{"class":1631},[1050,3658,1635],{"class":1461},[1050,3660,3661],{"class":1052,"line":1110},[1050,3662,1462],{"class":1461},[1050,3664,3665,3667,3669,3671,3673,3675,3677,3679,3681],{"class":1052,"line":1116},[1050,3666,1467],{"class":1438},[1050,3668,1930],{"class":1823},[1050,3670,1474],{"class":1313},[1050,3672,1478],{"class":1477},[1050,3674,1481],{"class":1313},[1050,3676,1549],{"class":1484},[1050,3678,1481],{"class":1313},[1050,3680,1943],{"class":1484},[1050,3682,1488],{"class":1313},[1050,3684,3685,3687,3690],{"class":1052,"line":1121},[1050,3686,2882],{"class":1063},[1050,3688,3689],{"class":1070},"Handle exceptions raised by views",[1050,3691,1064],{"class":1063},[1050,3693,3694],{"class":1052,"line":1128},[1050,3695,1584],{"class":1461},[1050,3697,3698],{"class":1052,"line":1134},[1050,3699,3700],{"class":1056},"        # Log the exception\n",[1050,3702,3703,3705],{"class":1052,"line":1139},[1050,3704,2454],{"class":1631},[1050,3706,3707],{"class":1461}," logging\n",[1050,3709,3710,3713,3715,3718,3720,3723,3725,3727],{"class":1052,"line":1145},[1050,3711,3712],{"class":1461},"        logger ",[1050,3714,1592],{"class":1313},[1050,3716,3717],{"class":1461}," logging",[1050,3719,1515],{"class":1313},[1050,3721,3722],{"class":1600},"getLogger",[1050,3724,1474],{"class":1313},[1050,3726,3382],{"class":3381},[1050,3728,1608],{"class":1313},[1050,3730,3731],{"class":1052,"line":1151},[1050,3732,1584],{"class":1461},[1050,3734,3735,3738,3740,3743],{"class":1052,"line":1157},[1050,3736,3737],{"class":1461},"        logger",[1050,3739,1515],{"class":1313},[1050,3741,3742],{"class":1600},"error",[1050,3744,3745],{"class":1313},"(\n",[1050,3747,3748,3751,3754,3756,3759,3761,3764,3766,3768,3770,3773,3775,3777,3779,3781],{"class":1052,"line":1163},[1050,3749,3750],{"class":1438},"            f",[1050,3752,3753],{"class":1326},"\"Exception in view: ",[1050,3755,2293],{"class":2292},[1050,3757,3758],{"class":1600},"exception",[1050,3760,1515],{"class":1313},[1050,3762,3763],{"class":3381},"__class__",[1050,3765,1515],{"class":1313},[1050,3767,3382],{"class":3381},[1050,3769,2303],{"class":2292},[1050,3771,3772],{"class":1326},": ",[1050,3774,2293],{"class":2292},[1050,3776,3758],{"class":1600},[1050,3778,2303],{"class":2292},[1050,3780,2250],{"class":1326},[1050,3782,1333],{"class":1313},[1050,3784,3785,3789],{"class":1052,"line":1169},[1050,3786,3788],{"class":3787},"sqOPj","            extra",[1050,3790,3791],{"class":1313},"={\n",[1050,3793,3794,3797,3800,3802,3804,3806,3808,3810],{"class":1052,"line":1174},[1050,3795,3796],{"class":1322},"                '",[1050,3798,3799],{"class":1326},"request_path",[1050,3801,1330],{"class":1322},[1050,3803,2920],{"class":1313},[1050,3805,1549],{"class":1600},[1050,3807,1515],{"class":1313},[1050,3809,2300],{"class":1518},[1050,3811,1333],{"class":1313},[1050,3813,3814,3816,3819,3821,3823,3825,3827,3830],{"class":1052,"line":1179},[1050,3815,3796],{"class":1322},[1050,3817,3818],{"class":1326},"request_method",[1050,3820,1330],{"class":1322},[1050,3822,2920],{"class":1313},[1050,3824,1549],{"class":1600},[1050,3826,1515],{"class":1313},[1050,3828,3829],{"class":1518},"method",[1050,3831,1333],{"class":1313},[1050,3833,3834,3836,3839,3841,3843,3846,3848,3850,3852,3855,3857,3859,3861,3864],{"class":1052,"line":1185},[1050,3835,3796],{"class":1322},[1050,3837,3838],{"class":1326},"user",[1050,3840,1330],{"class":1322},[1050,3842,2920],{"class":1313},[1050,3844,3845],{"class":1470}," getattr",[1050,3847,1474],{"class":1313},[1050,3849,1605],{"class":1600},[1050,3851,1481],{"class":1313},[1050,3853,3854],{"class":1322}," '",[1050,3856,3838],{"class":1326},[1050,3858,1330],{"class":1322},[1050,3860,1481],{"class":1313},[1050,3862,3863],{"class":1859}," None",[1050,3865,2972],{"class":1313},[1050,3867,3868,3870,3873,3875,3877,3879,3881,3883,3885],{"class":1052,"line":1190},[1050,3869,3796],{"class":1322},[1050,3871,3872],{"class":1326},"exception_type",[1050,3874,1330],{"class":1322},[1050,3876,2920],{"class":1313},[1050,3878,1943],{"class":1600},[1050,3880,1515],{"class":1313},[1050,3882,3763],{"class":3381},[1050,3884,1515],{"class":1313},[1050,3886,3887],{"class":3381},"__name__\n",[1050,3889,3890],{"class":1052,"line":1195},[1050,3891,3892],{"class":1313},"            },\n",[1050,3894,3895,3898,3900],{"class":1052,"line":1200},[1050,3896,3897],{"class":3787},"            exc_info",[1050,3899,1592],{"class":1313},[1050,3901,3902],{"class":1859},"True\n",[1050,3904,3905],{"class":1052,"line":1206},[1050,3906,3907],{"class":1313},"        )\n",[1050,3909,3910],{"class":1052,"line":1211},[1050,3911,1584],{"class":1461},[1050,3913,3914],{"class":1052,"line":1216},[1050,3915,3916],{"class":1056},"        # Could return custom error response\n",[1050,3918,3919,3921,3924,3926,3928,3930,3934],{"class":1052,"line":1221},[1050,3920,1743],{"class":1631},[1050,3922,3923],{"class":1470}," isinstance",[1050,3925,1474],{"class":1313},[1050,3927,3758],{"class":1600},[1050,3929,1481],{"class":1313},[1050,3931,3933],{"class":3932},"sa2tF"," ValueError",[1050,3935,1488],{"class":1313},[1050,3937,3938,3941,3944,3946,3949,3952],{"class":1052,"line":1227},[1050,3939,3940],{"class":1631},"            from",[1050,3942,3943],{"class":1461}," django",[1050,3945,1515],{"class":1313},[1050,3947,3948],{"class":1461},"http ",[1050,3950,3951],{"class":1631},"import",[1050,3953,3954],{"class":1461}," HttpResponseBadRequest\n",[1050,3956,3957,3959,3962,3964,3966,3969,3971],{"class":1052,"line":1232},[1050,3958,1753],{"class":1631},[1050,3960,3961],{"class":1600}," HttpResponseBadRequest",[1050,3963,1474],{"class":1313},[1050,3965,2250],{"class":1322},[1050,3967,3968],{"class":1326},"Invalid request data",[1050,3970,2250],{"class":1322},[1050,3972,1608],{"class":1313},[1050,3974,3975],{"class":1052,"line":1237},[1050,3976,1584],{"class":1461},[1050,3978,3979],{"class":1052,"line":1242},[1050,3980,3981],{"class":1056},"        # Return None to use default exception handling\n",[1050,3983,3984,3986],{"class":1052,"line":1248},[1050,3985,1632],{"class":1631},[1050,3987,1860],{"class":1859},[1035,3989,3991],{"id":3990},"process-template-response-hook","Process Template Response Hook",[1040,3993,3995],{"className":1042,"code":3994,"language":1044,"meta":1045,"style":1045},"class TemplateResponseMiddleware:\n    \"\"\"Middleware for processing template responses\"\"\"\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        return response\n    \n    def process_template_response(self, request, response):\n        \"\"\"Process responses that have a render() method\"\"\"\n        \n        # Only called for TemplateResponse objects\n        if hasattr(response, 'context_data'):\n            # Add global context variables\n            response.context_data['global_timestamp'] = timezone.now()\n            response.context_data['request_id'] = getattr(request, 'id', None)\n            \n            # Modify template name based on conditions\n            if request.user.is_authenticated:\n                response.template_name = response.template_name.replace(\n                    '.html', '_authenticated.html'\n                )\n        \n        return response\n",[1047,3996,3997,4006,4015,4019,4035,4047,4051,4067,4085,4091,4095,4115,4124,4128,4133,4155,4160,4190,4232,4237,4242,4260,4285,4305,4310,4314],{"__ignoreMap":1045},[1050,3998,3999,4001,4004],{"class":1052,"line":1053},[1050,4000,1439],{"class":1438},[1050,4002,4003],{"class":1442}," TemplateResponseMiddleware",[1050,4005,1446],{"class":1313},[1050,4007,4008,4010,4013],{"class":1052,"line":1060},[1050,4009,1451],{"class":1063},[1050,4011,4012],{"class":1070},"Middleware for processing template responses",[1050,4014,1064],{"class":1063},[1050,4016,4017],{"class":1052,"line":1067},[1050,4018,1462],{"class":1461},[1050,4020,4021,4023,4025,4027,4029,4031,4033],{"class":1052,"line":1074},[1050,4022,1467],{"class":1438},[1050,4024,1471],{"class":1470},[1050,4026,1474],{"class":1313},[1050,4028,1478],{"class":1477},[1050,4030,1481],{"class":1313},[1050,4032,1485],{"class":1484},[1050,4034,1488],{"class":1313},[1050,4036,4037,4039,4041,4043,4045],{"class":1052,"line":1080},[1050,4038,1512],{"class":1309},[1050,4040,1515],{"class":1313},[1050,4042,1519],{"class":1518},[1050,4044,1314],{"class":1313},[1050,4046,1524],{"class":1461},[1050,4048,4049],{"class":1052,"line":1086},[1050,4050,1462],{"class":1461},[1050,4052,4053,4055,4057,4059,4061,4063,4065],{"class":1052,"line":1092},[1050,4054,1467],{"class":1438},[1050,4056,1540],{"class":1470},[1050,4058,1474],{"class":1313},[1050,4060,1478],{"class":1477},[1050,4062,1481],{"class":1313},[1050,4064,1549],{"class":1484},[1050,4066,1488],{"class":1313},[1050,4068,4069,4071,4073,4075,4077,4079,4081,4083],{"class":1052,"line":1098},[1050,4070,1589],{"class":1461},[1050,4072,1592],{"class":1313},[1050,4074,1595],{"class":1309},[1050,4076,1515],{"class":1313},[1050,4078,1519],{"class":1600},[1050,4080,1474],{"class":1313},[1050,4082,1605],{"class":1600},[1050,4084,1608],{"class":1313},[1050,4086,4087,4089],{"class":1052,"line":1104},[1050,4088,1632],{"class":1631},[1050,4090,1635],{"class":1461},[1050,4092,4093],{"class":1052,"line":1110},[1050,4094,1462],{"class":1461},[1050,4096,4097,4099,4101,4103,4105,4107,4109,4111,4113],{"class":1052,"line":1116},[1050,4098,1467],{"class":1438},[1050,4100,1979],{"class":1823},[1050,4102,1474],{"class":1313},[1050,4104,1478],{"class":1477},[1050,4106,1481],{"class":1313},[1050,4108,1549],{"class":1484},[1050,4110,1481],{"class":1313},[1050,4112,1746],{"class":1484},[1050,4114,1488],{"class":1313},[1050,4116,4117,4119,4122],{"class":1052,"line":1121},[1050,4118,2882],{"class":1063},[1050,4120,4121],{"class":1070},"Process responses that have a render() method",[1050,4123,1064],{"class":1063},[1050,4125,4126],{"class":1052,"line":1128},[1050,4127,1584],{"class":1461},[1050,4129,4130],{"class":1052,"line":1134},[1050,4131,4132],{"class":1056},"        # Only called for TemplateResponse objects\n",[1050,4134,4135,4137,4140,4142,4144,4146,4148,4151,4153],{"class":1052,"line":1139},[1050,4136,1743],{"class":1631},[1050,4138,4139],{"class":1470}," hasattr",[1050,4141,1474],{"class":1313},[1050,4143,2354],{"class":1600},[1050,4145,1481],{"class":1313},[1050,4147,3854],{"class":1322},[1050,4149,4150],{"class":1326},"context_data",[1050,4152,1330],{"class":1322},[1050,4154,1488],{"class":1313},[1050,4156,4157],{"class":1052,"line":1145},[1050,4158,4159],{"class":1056},"            # Add global context variables\n",[1050,4161,4162,4165,4167,4169,4171,4173,4176,4178,4180,4182,4184,4186,4188],{"class":1052,"line":1151},[1050,4163,4164],{"class":1461},"            response",[1050,4166,1515],{"class":1313},[1050,4168,4150],{"class":1518},[1050,4170,2602],{"class":1313},[1050,4172,1330],{"class":1322},[1050,4174,4175],{"class":1326},"global_timestamp",[1050,4177,1330],{"class":1322},[1050,4179,2612],{"class":1313},[1050,4181,1314],{"class":1313},[1050,4183,2923],{"class":1461},[1050,4185,1515],{"class":1313},[1050,4187,2928],{"class":1600},[1050,4189,2479],{"class":1313},[1050,4191,4192,4194,4196,4198,4200,4202,4205,4207,4209,4211,4213,4215,4217,4219,4221,4224,4226,4228,4230],{"class":1052,"line":1157},[1050,4193,4164],{"class":1461},[1050,4195,1515],{"class":1313},[1050,4197,4150],{"class":1518},[1050,4199,2602],{"class":1313},[1050,4201,1330],{"class":1322},[1050,4203,4204],{"class":1326},"request_id",[1050,4206,1330],{"class":1322},[1050,4208,2612],{"class":1313},[1050,4210,1314],{"class":1313},[1050,4212,3845],{"class":1470},[1050,4214,1474],{"class":1313},[1050,4216,1605],{"class":1600},[1050,4218,1481],{"class":1313},[1050,4220,3854],{"class":1322},[1050,4222,4223],{"class":1326},"id",[1050,4225,1330],{"class":1322},[1050,4227,1481],{"class":1313},[1050,4229,3863],{"class":1859},[1050,4231,1608],{"class":1313},[1050,4233,4234],{"class":1052,"line":1163},[1050,4235,4236],{"class":1461},"            \n",[1050,4238,4239],{"class":1052,"line":1169},[1050,4240,4241],{"class":1056},"            # Modify template name based on conditions\n",[1050,4243,4244,4247,4249,4251,4253,4255,4258],{"class":1052,"line":1174},[1050,4245,4246],{"class":1631},"            if",[1050,4248,1549],{"class":1461},[1050,4250,1515],{"class":1313},[1050,4252,3838],{"class":1518},[1050,4254,1515],{"class":1313},[1050,4256,4257],{"class":1518},"is_authenticated",[1050,4259,1446],{"class":1313},[1050,4261,4262,4265,4267,4270,4272,4274,4276,4278,4280,4283],{"class":1052,"line":1179},[1050,4263,4264],{"class":1461},"                response",[1050,4266,1515],{"class":1313},[1050,4268,4269],{"class":1518},"template_name",[1050,4271,1314],{"class":1313},[1050,4273,1746],{"class":1461},[1050,4275,1515],{"class":1313},[1050,4277,4269],{"class":1518},[1050,4279,1515],{"class":1313},[1050,4281,4282],{"class":1600},"replace",[1050,4284,3745],{"class":1313},[1050,4286,4287,4290,4293,4295,4297,4299,4302],{"class":1052,"line":1185},[1050,4288,4289],{"class":1322},"                    '",[1050,4291,4292],{"class":1326},".html",[1050,4294,1330],{"class":1322},[1050,4296,1481],{"class":1313},[1050,4298,3854],{"class":1322},[1050,4300,4301],{"class":1326},"_authenticated.html",[1050,4303,4304],{"class":1322},"'\n",[1050,4306,4307],{"class":1052,"line":1190},[1050,4308,4309],{"class":1313},"                )\n",[1050,4311,4312],{"class":1052,"line":1195},[1050,4313,1584],{"class":1461},[1050,4315,4316,4318],{"class":1052,"line":1200},[1050,4317,1632],{"class":1631},[1050,4319,1635],{"class":1461},[1030,4321,4323],{"id":4322},"middleware-patterns","Middleware Patterns",[1035,4325,4327],{"id":4326},"conditional-middleware","Conditional Middleware",[1040,4329,4331],{"className":1042,"code":4330,"language":1044,"meta":1045,"style":1045},"class ConditionalMiddleware:\n    \"\"\"Middleware that runs conditionally\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n        self.enabled_paths = ['/api/', '/admin/']\n    \n    def __call__(self, request):\n        # Only process certain paths\n        should_process = any(\n            request.path.startswith(path) \n            for path in self.enabled_paths\n        )\n        \n        if should_process:\n            # Add processing logic here\n            request.processed_by_conditional = True\n        \n        response = self.get_response(request)\n        \n        if should_process:\n            # Add response processing here\n            response['X-Processed-By'] = 'ConditionalMiddleware'\n        \n        return response\n",[1047,4332,4333,4342,4351,4355,4371,4383,4415,4419,4435,4440,4452,4476,4494,4498,4502,4511,4516,4530,4534,4552,4556,4564,4569,4593,4597],{"__ignoreMap":1045},[1050,4334,4335,4337,4340],{"class":1052,"line":1053},[1050,4336,1439],{"class":1438},[1050,4338,4339],{"class":1442}," ConditionalMiddleware",[1050,4341,1446],{"class":1313},[1050,4343,4344,4346,4349],{"class":1052,"line":1060},[1050,4345,1451],{"class":1063},[1050,4347,4348],{"class":1070},"Middleware that runs conditionally",[1050,4350,1064],{"class":1063},[1050,4352,4353],{"class":1052,"line":1067},[1050,4354,1462],{"class":1461},[1050,4356,4357,4359,4361,4363,4365,4367,4369],{"class":1052,"line":1074},[1050,4358,1467],{"class":1438},[1050,4360,1471],{"class":1470},[1050,4362,1474],{"class":1313},[1050,4364,1478],{"class":1477},[1050,4366,1481],{"class":1313},[1050,4368,1485],{"class":1484},[1050,4370,1488],{"class":1313},[1050,4372,4373,4375,4377,4379,4381],{"class":1052,"line":1080},[1050,4374,1512],{"class":1309},[1050,4376,1515],{"class":1313},[1050,4378,1519],{"class":1518},[1050,4380,1314],{"class":1313},[1050,4382,1524],{"class":1461},[1050,4384,4385,4387,4389,4392,4394,4397,4399,4402,4404,4406,4408,4411,4413],{"class":1052,"line":1086},[1050,4386,1512],{"class":1309},[1050,4388,1515],{"class":1313},[1050,4390,4391],{"class":1518},"enabled_paths",[1050,4393,1314],{"class":1313},[1050,4395,4396],{"class":1313}," [",[1050,4398,1330],{"class":1322},[1050,4400,4401],{"class":1326},"/api/",[1050,4403,1330],{"class":1322},[1050,4405,1481],{"class":1313},[1050,4407,3854],{"class":1322},[1050,4409,4410],{"class":1326},"/admin/",[1050,4412,1330],{"class":1322},[1050,4414,1420],{"class":1313},[1050,4416,4417],{"class":1052,"line":1092},[1050,4418,1462],{"class":1461},[1050,4420,4421,4423,4425,4427,4429,4431,4433],{"class":1052,"line":1098},[1050,4422,1467],{"class":1438},[1050,4424,1540],{"class":1470},[1050,4426,1474],{"class":1313},[1050,4428,1478],{"class":1477},[1050,4430,1481],{"class":1313},[1050,4432,1549],{"class":1484},[1050,4434,1488],{"class":1313},[1050,4436,4437],{"class":1052,"line":1104},[1050,4438,4439],{"class":1056},"        # Only process certain paths\n",[1050,4441,4442,4445,4447,4450],{"class":1052,"line":1110},[1050,4443,4444],{"class":1461},"        should_process ",[1050,4446,1592],{"class":1313},[1050,4448,4449],{"class":1470}," any",[1050,4451,3745],{"class":1313},[1050,4453,4454,4457,4459,4461,4463,4466,4468,4470,4473],{"class":1052,"line":1116},[1050,4455,4456],{"class":1600},"            request",[1050,4458,1515],{"class":1313},[1050,4460,2300],{"class":1518},[1050,4462,1515],{"class":1313},[1050,4464,4465],{"class":1600},"startswith",[1050,4467,1474],{"class":1313},[1050,4469,2300],{"class":1600},[1050,4471,4472],{"class":1313},")",[1050,4474,4475],{"class":1600}," \n",[1050,4477,4478,4481,4484,4487,4489,4491],{"class":1052,"line":1121},[1050,4479,4480],{"class":1631},"            for",[1050,4482,4483],{"class":1600}," path ",[1050,4485,4486],{"class":1631},"in",[1050,4488,1595],{"class":1309},[1050,4490,1515],{"class":1313},[1050,4492,4493],{"class":1518},"enabled_paths\n",[1050,4495,4496],{"class":1052,"line":1128},[1050,4497,3907],{"class":1313},[1050,4499,4500],{"class":1052,"line":1134},[1050,4501,1584],{"class":1461},[1050,4503,4504,4506,4509],{"class":1052,"line":1139},[1050,4505,1743],{"class":1631},[1050,4507,4508],{"class":1461}," should_process",[1050,4510,1446],{"class":1313},[1050,4512,4513],{"class":1052,"line":1145},[1050,4514,4515],{"class":1056},"            # Add processing logic here\n",[1050,4517,4518,4520,4522,4525,4527],{"class":1052,"line":1151},[1050,4519,4456],{"class":1461},[1050,4521,1515],{"class":1313},[1050,4523,4524],{"class":1518},"processed_by_conditional",[1050,4526,1314],{"class":1313},[1050,4528,4529],{"class":1859}," True\n",[1050,4531,4532],{"class":1052,"line":1157},[1050,4533,1584],{"class":1461},[1050,4535,4536,4538,4540,4542,4544,4546,4548,4550],{"class":1052,"line":1163},[1050,4537,1589],{"class":1461},[1050,4539,1592],{"class":1313},[1050,4541,1595],{"class":1309},[1050,4543,1515],{"class":1313},[1050,4545,1519],{"class":1600},[1050,4547,1474],{"class":1313},[1050,4549,1605],{"class":1600},[1050,4551,1608],{"class":1313},[1050,4553,4554],{"class":1052,"line":1169},[1050,4555,1584],{"class":1461},[1050,4557,4558,4560,4562],{"class":1052,"line":1174},[1050,4559,1743],{"class":1631},[1050,4561,4508],{"class":1461},[1050,4563,1446],{"class":1313},[1050,4565,4566],{"class":1052,"line":1179},[1050,4567,4568],{"class":1056},"            # Add response processing here\n",[1050,4570,4571,4573,4575,4577,4580,4582,4584,4586,4588,4591],{"class":1052,"line":1185},[1050,4572,4164],{"class":1461},[1050,4574,2602],{"class":1313},[1050,4576,1330],{"class":1322},[1050,4578,4579],{"class":1326},"X-Processed-By",[1050,4581,1330],{"class":1322},[1050,4583,2612],{"class":1313},[1050,4585,1314],{"class":1313},[1050,4587,3854],{"class":1322},[1050,4589,4590],{"class":1326},"ConditionalMiddleware",[1050,4592,4304],{"class":1322},[1050,4594,4595],{"class":1052,"line":1190},[1050,4596,1584],{"class":1461},[1050,4598,4599,4601],{"class":1052,"line":1195},[1050,4600,1632],{"class":1631},[1050,4602,1635],{"class":1461},[1035,4604,4606],{"id":4605},"configurable-middleware","Configurable Middleware",[1040,4608,4610],{"className":1042,"code":4609,"language":1044,"meta":1045,"style":1045},"class ConfigurableMiddleware:\n    \"\"\"Middleware with configuration options\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n        \n        # Load configuration from settings\n        from django.conf import settings\n        self.config = getattr(settings, 'CONFIGURABLE_MIDDLEWARE', {})\n        \n        self.enabled = self.config.get('enabled', True)\n        self.debug_mode = self.config.get('debug', False)\n        self.excluded_paths = self.config.get('excluded_paths', [])\n    \n    def __call__(self, request):\n        if not self.enabled:\n            return self.get_response(request)\n        \n        # Skip excluded paths\n        if any(request.path.startswith(path) for path in self.excluded_paths):\n            return self.get_response(request)\n        \n        if self.debug_mode:\n            print(f\"ConfigurableMiddleware processing: {request.path}\")\n        \n        response = self.get_response(request)\n        \n        return response\n\n# settings.py\nCONFIGURABLE_MIDDLEWARE = {\n    'enabled': True,\n    'debug': False,\n    'excluded_paths': ['/static/', '/media/']\n}\n",[1047,4611,4612,4621,4630,4634,4650,4662,4666,4671,4688,4720,4724,4760,4797,4831,4835,4851,4866,4882,4886,4891,4930,4946,4950,4962,4988,4992,5010,5014,5020,5024,5028,5036,5050,5064,5094],{"__ignoreMap":1045},[1050,4613,4614,4616,4619],{"class":1052,"line":1053},[1050,4615,1439],{"class":1438},[1050,4617,4618],{"class":1442}," ConfigurableMiddleware",[1050,4620,1446],{"class":1313},[1050,4622,4623,4625,4628],{"class":1052,"line":1060},[1050,4624,1451],{"class":1063},[1050,4626,4627],{"class":1070},"Middleware with configuration options",[1050,4629,1064],{"class":1063},[1050,4631,4632],{"class":1052,"line":1067},[1050,4633,1462],{"class":1461},[1050,4635,4636,4638,4640,4642,4644,4646,4648],{"class":1052,"line":1074},[1050,4637,1467],{"class":1438},[1050,4639,1471],{"class":1470},[1050,4641,1474],{"class":1313},[1050,4643,1478],{"class":1477},[1050,4645,1481],{"class":1313},[1050,4647,1485],{"class":1484},[1050,4649,1488],{"class":1313},[1050,4651,4652,4654,4656,4658,4660],{"class":1052,"line":1080},[1050,4653,1512],{"class":1309},[1050,4655,1515],{"class":1313},[1050,4657,1519],{"class":1518},[1050,4659,1314],{"class":1313},[1050,4661,1524],{"class":1461},[1050,4663,4664],{"class":1052,"line":1086},[1050,4665,1584],{"class":1461},[1050,4667,4668],{"class":1052,"line":1092},[1050,4669,4670],{"class":1056},"        # Load configuration from settings\n",[1050,4672,4673,4676,4678,4680,4683,4685],{"class":1052,"line":1098},[1050,4674,4675],{"class":1631},"        from",[1050,4677,3943],{"class":1461},[1050,4679,1515],{"class":1313},[1050,4681,4682],{"class":1461},"conf ",[1050,4684,3951],{"class":1631},[1050,4686,4687],{"class":1461}," settings\n",[1050,4689,4690,4692,4694,4697,4699,4701,4703,4706,4708,4710,4713,4715,4717],{"class":1052,"line":1104},[1050,4691,1512],{"class":1309},[1050,4693,1515],{"class":1313},[1050,4695,4696],{"class":1518},"config",[1050,4698,1314],{"class":1313},[1050,4700,3845],{"class":1470},[1050,4702,1474],{"class":1313},[1050,4704,4705],{"class":1600},"settings",[1050,4707,1481],{"class":1313},[1050,4709,3854],{"class":1322},[1050,4711,4712],{"class":1326},"CONFIGURABLE_MIDDLEWARE",[1050,4714,1330],{"class":1322},[1050,4716,1481],{"class":1313},[1050,4718,4719],{"class":1313}," {})\n",[1050,4721,4722],{"class":1052,"line":1110},[1050,4723,1584],{"class":1461},[1050,4725,4726,4728,4730,4733,4735,4737,4739,4741,4743,4745,4747,4749,4751,4753,4755,4758],{"class":1052,"line":1116},[1050,4727,1512],{"class":1309},[1050,4729,1515],{"class":1313},[1050,4731,4732],{"class":1518},"enabled",[1050,4734,1314],{"class":1313},[1050,4736,1595],{"class":1309},[1050,4738,1515],{"class":1313},[1050,4740,4696],{"class":1518},[1050,4742,1515],{"class":1313},[1050,4744,2955],{"class":1600},[1050,4746,1474],{"class":1313},[1050,4748,1330],{"class":1322},[1050,4750,4732],{"class":1326},[1050,4752,1330],{"class":1322},[1050,4754,1481],{"class":1313},[1050,4756,4757],{"class":1859}," True",[1050,4759,1608],{"class":1313},[1050,4761,4762,4764,4766,4769,4771,4773,4775,4777,4779,4781,4783,4785,4788,4790,4792,4795],{"class":1052,"line":1121},[1050,4763,1512],{"class":1309},[1050,4765,1515],{"class":1313},[1050,4767,4768],{"class":1518},"debug_mode",[1050,4770,1314],{"class":1313},[1050,4772,1595],{"class":1309},[1050,4774,1515],{"class":1313},[1050,4776,4696],{"class":1518},[1050,4778,1515],{"class":1313},[1050,4780,2955],{"class":1600},[1050,4782,1474],{"class":1313},[1050,4784,1330],{"class":1322},[1050,4786,4787],{"class":1326},"debug",[1050,4789,1330],{"class":1322},[1050,4791,1481],{"class":1313},[1050,4793,4794],{"class":1859}," False",[1050,4796,1608],{"class":1313},[1050,4798,4799,4801,4803,4806,4808,4810,4812,4814,4816,4818,4820,4822,4824,4826,4828],{"class":1052,"line":1128},[1050,4800,1512],{"class":1309},[1050,4802,1515],{"class":1313},[1050,4804,4805],{"class":1518},"excluded_paths",[1050,4807,1314],{"class":1313},[1050,4809,1595],{"class":1309},[1050,4811,1515],{"class":1313},[1050,4813,4696],{"class":1518},[1050,4815,1515],{"class":1313},[1050,4817,2955],{"class":1600},[1050,4819,1474],{"class":1313},[1050,4821,1330],{"class":1322},[1050,4823,4805],{"class":1326},[1050,4825,1330],{"class":1322},[1050,4827,1481],{"class":1313},[1050,4829,4830],{"class":1313}," [])\n",[1050,4832,4833],{"class":1052,"line":1134},[1050,4834,1462],{"class":1461},[1050,4836,4837,4839,4841,4843,4845,4847,4849],{"class":1052,"line":1139},[1050,4838,1467],{"class":1438},[1050,4840,1540],{"class":1470},[1050,4842,1474],{"class":1313},[1050,4844,1478],{"class":1477},[1050,4846,1481],{"class":1313},[1050,4848,1549],{"class":1484},[1050,4850,1488],{"class":1313},[1050,4852,4853,4855,4858,4860,4862,4864],{"class":1052,"line":1145},[1050,4854,1743],{"class":1631},[1050,4856,4857],{"class":2555}," not",[1050,4859,1595],{"class":1309},[1050,4861,1515],{"class":1313},[1050,4863,4732],{"class":1518},[1050,4865,1446],{"class":1313},[1050,4867,4868,4870,4872,4874,4876,4878,4880],{"class":1052,"line":1151},[1050,4869,1753],{"class":1631},[1050,4871,1595],{"class":1309},[1050,4873,1515],{"class":1313},[1050,4875,1519],{"class":1600},[1050,4877,1474],{"class":1313},[1050,4879,1605],{"class":1600},[1050,4881,1608],{"class":1313},[1050,4883,4884],{"class":1052,"line":1157},[1050,4885,1584],{"class":1461},[1050,4887,4888],{"class":1052,"line":1163},[1050,4889,4890],{"class":1056},"        # Skip excluded paths\n",[1050,4892,4893,4895,4897,4899,4901,4903,4905,4907,4909,4911,4913,4915,4918,4920,4922,4924,4926,4928],{"class":1052,"line":1169},[1050,4894,1743],{"class":1631},[1050,4896,4449],{"class":1470},[1050,4898,1474],{"class":1313},[1050,4900,1605],{"class":1600},[1050,4902,1515],{"class":1313},[1050,4904,2300],{"class":1518},[1050,4906,1515],{"class":1313},[1050,4908,4465],{"class":1600},[1050,4910,1474],{"class":1313},[1050,4912,2300],{"class":1600},[1050,4914,4472],{"class":1313},[1050,4916,4917],{"class":1631}," for",[1050,4919,4483],{"class":1600},[1050,4921,4486],{"class":1631},[1050,4923,1595],{"class":1309},[1050,4925,1515],{"class":1313},[1050,4927,4805],{"class":1518},[1050,4929,1488],{"class":1313},[1050,4931,4932,4934,4936,4938,4940,4942,4944],{"class":1052,"line":1174},[1050,4933,1753],{"class":1631},[1050,4935,1595],{"class":1309},[1050,4937,1515],{"class":1313},[1050,4939,1519],{"class":1600},[1050,4941,1474],{"class":1313},[1050,4943,1605],{"class":1600},[1050,4945,1608],{"class":1313},[1050,4947,4948],{"class":1052,"line":1179},[1050,4949,1584],{"class":1461},[1050,4951,4952,4954,4956,4958,4960],{"class":1052,"line":1185},[1050,4953,1743],{"class":1631},[1050,4955,1595],{"class":1309},[1050,4957,1515],{"class":1313},[1050,4959,4768],{"class":1518},[1050,4961,1446],{"class":1313},[1050,4963,4964,4967,4969,4971,4974,4976,4978,4980,4982,4984,4986],{"class":1052,"line":1190},[1050,4965,4966],{"class":1470},"            print",[1050,4968,1474],{"class":1313},[1050,4970,2286],{"class":1438},[1050,4972,4973],{"class":1326},"\"ConfigurableMiddleware processing: ",[1050,4975,2293],{"class":2292},[1050,4977,1605],{"class":1600},[1050,4979,1515],{"class":1313},[1050,4981,2300],{"class":1518},[1050,4983,2303],{"class":2292},[1050,4985,2250],{"class":1326},[1050,4987,1608],{"class":1313},[1050,4989,4990],{"class":1052,"line":1195},[1050,4991,1584],{"class":1461},[1050,4993,4994,4996,4998,5000,5002,5004,5006,5008],{"class":1052,"line":1200},[1050,4995,1589],{"class":1461},[1050,4997,1592],{"class":1313},[1050,4999,1595],{"class":1309},[1050,5001,1515],{"class":1313},[1050,5003,1519],{"class":1600},[1050,5005,1474],{"class":1313},[1050,5007,1605],{"class":1600},[1050,5009,1608],{"class":1313},[1050,5011,5012],{"class":1052,"line":1206},[1050,5013,1584],{"class":1461},[1050,5015,5016,5018],{"class":1052,"line":1211},[1050,5017,1632],{"class":1631},[1050,5019,1635],{"class":1461},[1050,5021,5022],{"class":1052,"line":1216},[1050,5023,1125],{"emptyLinePlaceholder":1124},[1050,5025,5026],{"class":1052,"line":1221},[1050,5027,1304],{"class":1056},[1050,5029,5030,5032,5034],{"class":1052,"line":1227},[1050,5031,4712],{"class":1309},[1050,5033,1314],{"class":1313},[1050,5035,2907],{"class":1313},[1050,5037,5038,5040,5042,5044,5046,5048],{"class":1052,"line":1232},[1050,5039,1323],{"class":1322},[1050,5041,4732],{"class":1326},[1050,5043,1330],{"class":1322},[1050,5045,2920],{"class":1313},[1050,5047,4757],{"class":1859},[1050,5049,1333],{"class":1313},[1050,5051,5052,5054,5056,5058,5060,5062],{"class":1052,"line":1237},[1050,5053,1323],{"class":1322},[1050,5055,4787],{"class":1326},[1050,5057,1330],{"class":1322},[1050,5059,2920],{"class":1313},[1050,5061,4794],{"class":1859},[1050,5063,1333],{"class":1313},[1050,5065,5066,5068,5070,5072,5074,5076,5078,5081,5083,5085,5087,5090,5092],{"class":1052,"line":1242},[1050,5067,1323],{"class":1322},[1050,5069,4805],{"class":1326},[1050,5071,1330],{"class":1322},[1050,5073,2920],{"class":1313},[1050,5075,4396],{"class":1313},[1050,5077,1330],{"class":1322},[1050,5079,5080],{"class":1326},"/static/",[1050,5082,1330],{"class":1322},[1050,5084,1481],{"class":1313},[1050,5086,3854],{"class":1322},[1050,5088,5089],{"class":1326},"/media/",[1050,5091,1330],{"class":1322},[1050,5093,1420],{"class":1313},[1050,5095,5096],{"class":1052,"line":1248},[1050,5097,5098],{"class":1313},"}\n",[1030,5100,5102],{"id":5101},"middleware-communication","Middleware Communication",[1035,5104,5106],{"id":5105},"sharing-data-between-middleware","Sharing Data Between Middleware",[1040,5108,5110],{"className":1042,"code":5109,"language":1044,"meta":1045,"style":1045},"class DataSharingMiddleware:\n    \"\"\"Middleware that shares data with other middleware\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        # Set data that other middleware can use\n        request.middleware_data = {\n            'processing_start': timezone.now(),\n            'middleware_chain': []\n        }\n        \n        response = self.get_response(request)\n        \n        # Log the complete middleware chain\n        if hasattr(request, 'middleware_data'):\n            chain = request.middleware_data.get('middleware_chain', [])\n            print(f\"Middleware chain: {' → '.join(chain)}\")\n        \n        return response\n\nclass ChainTrackingMiddleware:\n    \"\"\"Middleware that tracks the processing chain\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        # Add self to the chain\n        if hasattr(request, 'middleware_data'):\n            request.middleware_data['middleware_chain'].append(\n                self.__class__.__name__\n            )\n        \n        response = self.get_response(request)\n        \n        return response\n",[1047,5111,5112,5121,5130,5134,5150,5162,5166,5182,5187,5200,5219,5233,5237,5241,5259,5263,5268,5288,5317,5355,5359,5365,5369,5378,5387,5391,5407,5419,5423,5439,5444,5464,5488,5501,5506,5510,5528,5532],{"__ignoreMap":1045},[1050,5113,5114,5116,5119],{"class":1052,"line":1053},[1050,5115,1439],{"class":1438},[1050,5117,5118],{"class":1442}," DataSharingMiddleware",[1050,5120,1446],{"class":1313},[1050,5122,5123,5125,5128],{"class":1052,"line":1060},[1050,5124,1451],{"class":1063},[1050,5126,5127],{"class":1070},"Middleware that shares data with other middleware",[1050,5129,1064],{"class":1063},[1050,5131,5132],{"class":1052,"line":1067},[1050,5133,1462],{"class":1461},[1050,5135,5136,5138,5140,5142,5144,5146,5148],{"class":1052,"line":1074},[1050,5137,1467],{"class":1438},[1050,5139,1471],{"class":1470},[1050,5141,1474],{"class":1313},[1050,5143,1478],{"class":1477},[1050,5145,1481],{"class":1313},[1050,5147,1485],{"class":1484},[1050,5149,1488],{"class":1313},[1050,5151,5152,5154,5156,5158,5160],{"class":1052,"line":1080},[1050,5153,1512],{"class":1309},[1050,5155,1515],{"class":1313},[1050,5157,1519],{"class":1518},[1050,5159,1314],{"class":1313},[1050,5161,1524],{"class":1461},[1050,5163,5164],{"class":1052,"line":1086},[1050,5165,1462],{"class":1461},[1050,5167,5168,5170,5172,5174,5176,5178,5180],{"class":1052,"line":1092},[1050,5169,1467],{"class":1438},[1050,5171,1540],{"class":1470},[1050,5173,1474],{"class":1313},[1050,5175,1478],{"class":1477},[1050,5177,1481],{"class":1313},[1050,5179,1549],{"class":1484},[1050,5181,1488],{"class":1313},[1050,5183,5184],{"class":1052,"line":1098},[1050,5185,5186],{"class":1056},"        # Set data that other middleware can use\n",[1050,5188,5189,5191,5193,5196,5198],{"class":1052,"line":1104},[1050,5190,2897],{"class":1461},[1050,5192,1515],{"class":1313},[1050,5194,5195],{"class":1518},"middleware_data",[1050,5197,1314],{"class":1313},[1050,5199,2907],{"class":1313},[1050,5201,5202,5204,5207,5209,5211,5213,5215,5217],{"class":1052,"line":1110},[1050,5203,2912],{"class":1322},[1050,5205,5206],{"class":1326},"processing_start",[1050,5208,1330],{"class":1322},[1050,5210,2920],{"class":1313},[1050,5212,2923],{"class":1461},[1050,5214,1515],{"class":1313},[1050,5216,2928],{"class":1600},[1050,5218,2931],{"class":1313},[1050,5220,5221,5223,5226,5228,5230],{"class":1052,"line":1116},[1050,5222,2912],{"class":1322},[1050,5224,5225],{"class":1326},"middleware_chain",[1050,5227,1330],{"class":1322},[1050,5229,2920],{"class":1313},[1050,5231,5232],{"class":1313}," []\n",[1050,5234,5235],{"class":1052,"line":1121},[1050,5236,3001],{"class":1313},[1050,5238,5239],{"class":1052,"line":1128},[1050,5240,1584],{"class":1461},[1050,5242,5243,5245,5247,5249,5251,5253,5255,5257],{"class":1052,"line":1134},[1050,5244,1589],{"class":1461},[1050,5246,1592],{"class":1313},[1050,5248,1595],{"class":1309},[1050,5250,1515],{"class":1313},[1050,5252,1519],{"class":1600},[1050,5254,1474],{"class":1313},[1050,5256,1605],{"class":1600},[1050,5258,1608],{"class":1313},[1050,5260,5261],{"class":1052,"line":1139},[1050,5262,1584],{"class":1461},[1050,5264,5265],{"class":1052,"line":1145},[1050,5266,5267],{"class":1056},"        # Log the complete middleware chain\n",[1050,5269,5270,5272,5274,5276,5278,5280,5282,5284,5286],{"class":1052,"line":1151},[1050,5271,1743],{"class":1631},[1050,5273,4139],{"class":1470},[1050,5275,1474],{"class":1313},[1050,5277,1605],{"class":1600},[1050,5279,1481],{"class":1313},[1050,5281,3854],{"class":1322},[1050,5283,5195],{"class":1326},[1050,5285,1330],{"class":1322},[1050,5287,1488],{"class":1313},[1050,5289,5290,5293,5295,5297,5299,5301,5303,5305,5307,5309,5311,5313,5315],{"class":1052,"line":1157},[1050,5291,5292],{"class":1461},"            chain ",[1050,5294,1592],{"class":1313},[1050,5296,1549],{"class":1461},[1050,5298,1515],{"class":1313},[1050,5300,5195],{"class":1518},[1050,5302,1515],{"class":1313},[1050,5304,2955],{"class":1600},[1050,5306,1474],{"class":1313},[1050,5308,1330],{"class":1322},[1050,5310,5225],{"class":1326},[1050,5312,1330],{"class":1322},[1050,5314,1481],{"class":1313},[1050,5316,4830],{"class":1313},[1050,5318,5319,5321,5323,5325,5328,5330,5332,5335,5337,5339,5342,5344,5347,5349,5351,5353],{"class":1052,"line":1163},[1050,5320,4966],{"class":1470},[1050,5322,1474],{"class":1313},[1050,5324,2286],{"class":1438},[1050,5326,5327],{"class":1326},"\"Middleware chain: ",[1050,5329,2293],{"class":2292},[1050,5331,1330],{"class":1322},[1050,5333,5334],{"class":1326}," → ",[1050,5336,1330],{"class":1322},[1050,5338,1515],{"class":1313},[1050,5340,5341],{"class":1600},"join",[1050,5343,1474],{"class":1313},[1050,5345,5346],{"class":1600},"chain",[1050,5348,4472],{"class":1313},[1050,5350,2303],{"class":2292},[1050,5352,2250],{"class":1326},[1050,5354,1608],{"class":1313},[1050,5356,5357],{"class":1052,"line":1169},[1050,5358,1584],{"class":1461},[1050,5360,5361,5363],{"class":1052,"line":1174},[1050,5362,1632],{"class":1631},[1050,5364,1635],{"class":1461},[1050,5366,5367],{"class":1052,"line":1179},[1050,5368,1125],{"emptyLinePlaceholder":1124},[1050,5370,5371,5373,5376],{"class":1052,"line":1185},[1050,5372,1439],{"class":1438},[1050,5374,5375],{"class":1442}," ChainTrackingMiddleware",[1050,5377,1446],{"class":1313},[1050,5379,5380,5382,5385],{"class":1052,"line":1190},[1050,5381,1451],{"class":1063},[1050,5383,5384],{"class":1070},"Middleware that tracks the processing chain",[1050,5386,1064],{"class":1063},[1050,5388,5389],{"class":1052,"line":1195},[1050,5390,1462],{"class":1461},[1050,5392,5393,5395,5397,5399,5401,5403,5405],{"class":1052,"line":1200},[1050,5394,1467],{"class":1438},[1050,5396,1471],{"class":1470},[1050,5398,1474],{"class":1313},[1050,5400,1478],{"class":1477},[1050,5402,1481],{"class":1313},[1050,5404,1485],{"class":1484},[1050,5406,1488],{"class":1313},[1050,5408,5409,5411,5413,5415,5417],{"class":1052,"line":1206},[1050,5410,1512],{"class":1309},[1050,5412,1515],{"class":1313},[1050,5414,1519],{"class":1518},[1050,5416,1314],{"class":1313},[1050,5418,1524],{"class":1461},[1050,5420,5421],{"class":1052,"line":1211},[1050,5422,1462],{"class":1461},[1050,5424,5425,5427,5429,5431,5433,5435,5437],{"class":1052,"line":1216},[1050,5426,1467],{"class":1438},[1050,5428,1540],{"class":1470},[1050,5430,1474],{"class":1313},[1050,5432,1478],{"class":1477},[1050,5434,1481],{"class":1313},[1050,5436,1549],{"class":1484},[1050,5438,1488],{"class":1313},[1050,5440,5441],{"class":1052,"line":1221},[1050,5442,5443],{"class":1056},"        # Add self to the chain\n",[1050,5445,5446,5448,5450,5452,5454,5456,5458,5460,5462],{"class":1052,"line":1227},[1050,5447,1743],{"class":1631},[1050,5449,4139],{"class":1470},[1050,5451,1474],{"class":1313},[1050,5453,1605],{"class":1600},[1050,5455,1481],{"class":1313},[1050,5457,3854],{"class":1322},[1050,5459,5195],{"class":1326},[1050,5461,1330],{"class":1322},[1050,5463,1488],{"class":1313},[1050,5465,5466,5468,5470,5472,5474,5476,5478,5480,5483,5486],{"class":1052,"line":1232},[1050,5467,4456],{"class":1461},[1050,5469,1515],{"class":1313},[1050,5471,5195],{"class":1518},[1050,5473,2602],{"class":1313},[1050,5475,1330],{"class":1322},[1050,5477,5225],{"class":1326},[1050,5479,1330],{"class":1322},[1050,5481,5482],{"class":1313},"].",[1050,5484,5485],{"class":1600},"append",[1050,5487,3745],{"class":1313},[1050,5489,5490,5493,5495,5497,5499],{"class":1052,"line":1237},[1050,5491,5492],{"class":1309},"                self",[1050,5494,1515],{"class":1313},[1050,5496,3763],{"class":3381},[1050,5498,1515],{"class":1313},[1050,5500,3887],{"class":3381},[1050,5502,5503],{"class":1052,"line":1242},[1050,5504,5505],{"class":1313},"            )\n",[1050,5507,5508],{"class":1052,"line":1248},[1050,5509,1584],{"class":1461},[1050,5511,5512,5514,5516,5518,5520,5522,5524,5526],{"class":1052,"line":1253},[1050,5513,1589],{"class":1461},[1050,5515,1592],{"class":1313},[1050,5517,1595],{"class":1309},[1050,5519,1515],{"class":1313},[1050,5521,1519],{"class":1600},[1050,5523,1474],{"class":1313},[1050,5525,1605],{"class":1600},[1050,5527,1608],{"class":1313},[1050,5529,5530],{"class":1052,"line":1258},[1050,5531,1584],{"class":1461},[1050,5533,5534,5536],{"class":1052,"line":1263},[1050,5535,1632],{"class":1631},[1050,5537,1635],{"class":1461},[1030,5539,5541],{"id":5540},"testing-middleware","Testing Middleware",[1035,5543,5545],{"id":5544},"unit-testing-middleware","Unit Testing Middleware",[1040,5547,5549],{"className":1042,"code":5548,"language":1044,"meta":1045,"style":1045},"from django.test import TestCase, RequestFactory\nfrom django.http import HttpResponse\nfrom myapp.middleware import CustomMiddleware\n\nclass MiddlewareTestCase(TestCase):\n    \"\"\"Test cases for custom middleware\"\"\"\n    \n    def setUp(self):\n        self.factory = RequestFactory()\n        \n        # Create a simple get_response callable\n        def get_response(request):\n            return HttpResponse(\"Test response\")\n        \n        self.middleware = CustomMiddleware(get_response)\n    \n    def test_middleware_processes_request(self):\n        \"\"\"Test that middleware processes requests correctly\"\"\"\n        request = self.factory.get('/test/')\n        \n        response = self.middleware(request)\n        \n        self.assertEqual(response.status_code, 200)\n        self.assertTrue(hasattr(request, 'processed_by_middleware'))\n    \n    def test_middleware_adds_headers(self):\n        \"\"\"Test that middleware adds expected headers\"\"\"\n        request = self.factory.get('/test/')\n        \n        response = self.middleware(request)\n        \n        self.assertIn('X-Custom-Header', response)\n    \n    def test_middleware_handles_exceptions(self):\n        \"\"\"Test middleware exception handling\"\"\"\n        def failing_get_response(request):\n            raise ValueError(\"Test exception\")\n        \n        middleware = CustomMiddleware(failing_get_response)\n        request = self.factory.get('/test/')\n        \n        # Should handle exception gracefully\n        response = middleware(request)\n        self.assertEqual(response.status_code, 500)\n",[1047,5550,5551,5573,5588,5605,5609,5624,5633,5637,5650,5666,5670,5675,5688,5706,5710,5730,5734,5747,5756,5784,5788,5806,5810,5834,5864,5868,5881,5890,5916,5920,5938,5942,5966,5970,5983,5992,6005,6023,6027,6043,6069,6073,6078,6093],{"__ignoreMap":1045},[1050,5552,5553,5556,5558,5560,5563,5565,5568,5570],{"class":1052,"line":1053},[1050,5554,5555],{"class":1631},"from",[1050,5557,3943],{"class":1461},[1050,5559,1515],{"class":1313},[1050,5561,5562],{"class":1461},"test ",[1050,5564,3951],{"class":1631},[1050,5566,5567],{"class":1461}," TestCase",[1050,5569,1481],{"class":1313},[1050,5571,5572],{"class":1461}," RequestFactory\n",[1050,5574,5575,5577,5579,5581,5583,5585],{"class":1052,"line":1060},[1050,5576,5555],{"class":1631},[1050,5578,3943],{"class":1461},[1050,5580,1515],{"class":1313},[1050,5582,3948],{"class":1461},[1050,5584,3951],{"class":1631},[1050,5586,5587],{"class":1461}," HttpResponse\n",[1050,5589,5590,5592,5595,5597,5600,5602],{"class":1052,"line":1067},[1050,5591,5555],{"class":1631},[1050,5593,5594],{"class":1461}," myapp",[1050,5596,1515],{"class":1313},[1050,5598,5599],{"class":1461},"middleware ",[1050,5601,3951],{"class":1631},[1050,5603,5604],{"class":1461}," CustomMiddleware\n",[1050,5606,5607],{"class":1052,"line":1074},[1050,5608,1125],{"emptyLinePlaceholder":1124},[1050,5610,5611,5613,5616,5618,5622],{"class":1052,"line":1080},[1050,5612,1439],{"class":1438},[1050,5614,5615],{"class":1442}," MiddlewareTestCase",[1050,5617,1474],{"class":1313},[1050,5619,5621],{"class":5620},"sYn-s","TestCase",[1050,5623,1488],{"class":1313},[1050,5625,5626,5628,5631],{"class":1052,"line":1086},[1050,5627,1451],{"class":1063},[1050,5629,5630],{"class":1070},"Test cases for custom middleware",[1050,5632,1064],{"class":1063},[1050,5634,5635],{"class":1052,"line":1092},[1050,5636,1462],{"class":1461},[1050,5638,5639,5641,5644,5646,5648],{"class":1052,"line":1098},[1050,5640,1467],{"class":1438},[1050,5642,5643],{"class":1823}," setUp",[1050,5645,1474],{"class":1313},[1050,5647,1478],{"class":1477},[1050,5649,1488],{"class":1313},[1050,5651,5652,5654,5656,5659,5661,5664],{"class":1052,"line":1104},[1050,5653,1512],{"class":1309},[1050,5655,1515],{"class":1313},[1050,5657,5658],{"class":1518},"factory",[1050,5660,1314],{"class":1313},[1050,5662,5663],{"class":1600}," RequestFactory",[1050,5665,2479],{"class":1313},[1050,5667,5668],{"class":1052,"line":1110},[1050,5669,1584],{"class":1461},[1050,5671,5672],{"class":1052,"line":1116},[1050,5673,5674],{"class":1056},"        # Create a simple get_response callable\n",[1050,5676,5677,5680,5682,5684,5686],{"class":1052,"line":1121},[1050,5678,5679],{"class":1438},"        def",[1050,5681,1485],{"class":1823},[1050,5683,1474],{"class":1313},[1050,5685,1605],{"class":1484},[1050,5687,1488],{"class":1313},[1050,5689,5690,5692,5695,5697,5699,5702,5704],{"class":1052,"line":1128},[1050,5691,1753],{"class":1631},[1050,5693,5694],{"class":1600}," HttpResponse",[1050,5696,1474],{"class":1313},[1050,5698,2250],{"class":1322},[1050,5700,5701],{"class":1326},"Test response",[1050,5703,2250],{"class":1322},[1050,5705,1608],{"class":1313},[1050,5707,5708],{"class":1052,"line":1134},[1050,5709,1584],{"class":1461},[1050,5711,5712,5714,5716,5719,5721,5724,5726,5728],{"class":1052,"line":1139},[1050,5713,1512],{"class":1309},[1050,5715,1515],{"class":1313},[1050,5717,5718],{"class":1518},"middleware",[1050,5720,1314],{"class":1313},[1050,5722,5723],{"class":1600}," CustomMiddleware",[1050,5725,1474],{"class":1313},[1050,5727,1519],{"class":1600},[1050,5729,1608],{"class":1313},[1050,5731,5732],{"class":1052,"line":1145},[1050,5733,1462],{"class":1461},[1050,5735,5736,5738,5741,5743,5745],{"class":1052,"line":1151},[1050,5737,1467],{"class":1438},[1050,5739,5740],{"class":1823}," test_middleware_processes_request",[1050,5742,1474],{"class":1313},[1050,5744,1478],{"class":1477},[1050,5746,1488],{"class":1313},[1050,5748,5749,5751,5754],{"class":1052,"line":1157},[1050,5750,2882],{"class":1063},[1050,5752,5753],{"class":1070},"Test that middleware processes requests correctly",[1050,5755,1064],{"class":1063},[1050,5757,5758,5761,5763,5765,5767,5769,5771,5773,5775,5777,5780,5782],{"class":1052,"line":1163},[1050,5759,5760],{"class":1461},"        request ",[1050,5762,1592],{"class":1313},[1050,5764,1595],{"class":1309},[1050,5766,1515],{"class":1313},[1050,5768,5658],{"class":1518},[1050,5770,1515],{"class":1313},[1050,5772,2955],{"class":1600},[1050,5774,1474],{"class":1313},[1050,5776,1330],{"class":1322},[1050,5778,5779],{"class":1326},"/test/",[1050,5781,1330],{"class":1322},[1050,5783,1608],{"class":1313},[1050,5785,5786],{"class":1052,"line":1169},[1050,5787,1584],{"class":1461},[1050,5789,5790,5792,5794,5796,5798,5800,5802,5804],{"class":1052,"line":1174},[1050,5791,1589],{"class":1461},[1050,5793,1592],{"class":1313},[1050,5795,1595],{"class":1309},[1050,5797,1515],{"class":1313},[1050,5799,5718],{"class":1600},[1050,5801,1474],{"class":1313},[1050,5803,1605],{"class":1600},[1050,5805,1608],{"class":1313},[1050,5807,5808],{"class":1052,"line":1179},[1050,5809,1584],{"class":1461},[1050,5811,5812,5814,5816,5819,5821,5823,5825,5827,5829,5832],{"class":1052,"line":1185},[1050,5813,1512],{"class":1309},[1050,5815,1515],{"class":1313},[1050,5817,5818],{"class":1600},"assertEqual",[1050,5820,1474],{"class":1313},[1050,5822,2354],{"class":1600},[1050,5824,1515],{"class":1313},[1050,5826,2359],{"class":1518},[1050,5828,1481],{"class":1313},[1050,5830,5831],{"class":3163}," 200",[1050,5833,1608],{"class":1313},[1050,5835,5836,5838,5840,5843,5845,5848,5850,5852,5854,5856,5859,5861],{"class":1052,"line":1190},[1050,5837,1512],{"class":1309},[1050,5839,1515],{"class":1313},[1050,5841,5842],{"class":1600},"assertTrue",[1050,5844,1474],{"class":1313},[1050,5846,5847],{"class":1470},"hasattr",[1050,5849,1474],{"class":1313},[1050,5851,1605],{"class":1600},[1050,5853,1481],{"class":1313},[1050,5855,3854],{"class":1322},[1050,5857,5858],{"class":1326},"processed_by_middleware",[1050,5860,1330],{"class":1322},[1050,5862,5863],{"class":1313},"))\n",[1050,5865,5866],{"class":1052,"line":1195},[1050,5867,1462],{"class":1461},[1050,5869,5870,5872,5875,5877,5879],{"class":1052,"line":1200},[1050,5871,1467],{"class":1438},[1050,5873,5874],{"class":1823}," test_middleware_adds_headers",[1050,5876,1474],{"class":1313},[1050,5878,1478],{"class":1477},[1050,5880,1488],{"class":1313},[1050,5882,5883,5885,5888],{"class":1052,"line":1206},[1050,5884,2882],{"class":1063},[1050,5886,5887],{"class":1070},"Test that middleware adds expected headers",[1050,5889,1064],{"class":1063},[1050,5891,5892,5894,5896,5898,5900,5902,5904,5906,5908,5910,5912,5914],{"class":1052,"line":1211},[1050,5893,5760],{"class":1461},[1050,5895,1592],{"class":1313},[1050,5897,1595],{"class":1309},[1050,5899,1515],{"class":1313},[1050,5901,5658],{"class":1518},[1050,5903,1515],{"class":1313},[1050,5905,2955],{"class":1600},[1050,5907,1474],{"class":1313},[1050,5909,1330],{"class":1322},[1050,5911,5779],{"class":1326},[1050,5913,1330],{"class":1322},[1050,5915,1608],{"class":1313},[1050,5917,5918],{"class":1052,"line":1216},[1050,5919,1584],{"class":1461},[1050,5921,5922,5924,5926,5928,5930,5932,5934,5936],{"class":1052,"line":1221},[1050,5923,1589],{"class":1461},[1050,5925,1592],{"class":1313},[1050,5927,1595],{"class":1309},[1050,5929,1515],{"class":1313},[1050,5931,5718],{"class":1600},[1050,5933,1474],{"class":1313},[1050,5935,1605],{"class":1600},[1050,5937,1608],{"class":1313},[1050,5939,5940],{"class":1052,"line":1227},[1050,5941,1584],{"class":1461},[1050,5943,5944,5946,5948,5951,5953,5955,5958,5960,5962,5964],{"class":1052,"line":1232},[1050,5945,1512],{"class":1309},[1050,5947,1515],{"class":1313},[1050,5949,5950],{"class":1600},"assertIn",[1050,5952,1474],{"class":1313},[1050,5954,1330],{"class":1322},[1050,5956,5957],{"class":1326},"X-Custom-Header",[1050,5959,1330],{"class":1322},[1050,5961,1481],{"class":1313},[1050,5963,1746],{"class":1600},[1050,5965,1608],{"class":1313},[1050,5967,5968],{"class":1052,"line":1237},[1050,5969,1462],{"class":1461},[1050,5971,5972,5974,5977,5979,5981],{"class":1052,"line":1242},[1050,5973,1467],{"class":1438},[1050,5975,5976],{"class":1823}," test_middleware_handles_exceptions",[1050,5978,1474],{"class":1313},[1050,5980,1478],{"class":1477},[1050,5982,1488],{"class":1313},[1050,5984,5985,5987,5990],{"class":1052,"line":1248},[1050,5986,2882],{"class":1063},[1050,5988,5989],{"class":1070},"Test middleware exception handling",[1050,5991,1064],{"class":1063},[1050,5993,5994,5996,5999,6001,6003],{"class":1052,"line":1253},[1050,5995,5679],{"class":1438},[1050,5997,5998],{"class":1823}," failing_get_response",[1050,6000,1474],{"class":1313},[1050,6002,1605],{"class":1484},[1050,6004,1488],{"class":1313},[1050,6006,6007,6010,6012,6014,6016,6019,6021],{"class":1052,"line":1258},[1050,6008,6009],{"class":1631},"            raise",[1050,6011,3933],{"class":3932},[1050,6013,1474],{"class":1313},[1050,6015,2250],{"class":1322},[1050,6017,6018],{"class":1326},"Test exception",[1050,6020,2250],{"class":1322},[1050,6022,1608],{"class":1313},[1050,6024,6025],{"class":1052,"line":1263},[1050,6026,1584],{"class":1461},[1050,6028,6029,6032,6034,6036,6038,6041],{"class":1052,"line":1269},[1050,6030,6031],{"class":1461},"        middleware ",[1050,6033,1592],{"class":1313},[1050,6035,5723],{"class":1600},[1050,6037,1474],{"class":1313},[1050,6039,6040],{"class":1600},"failing_get_response",[1050,6042,1608],{"class":1313},[1050,6044,6045,6047,6049,6051,6053,6055,6057,6059,6061,6063,6065,6067],{"class":1052,"line":1274},[1050,6046,5760],{"class":1461},[1050,6048,1592],{"class":1313},[1050,6050,1595],{"class":1309},[1050,6052,1515],{"class":1313},[1050,6054,5658],{"class":1518},[1050,6056,1515],{"class":1313},[1050,6058,2955],{"class":1600},[1050,6060,1474],{"class":1313},[1050,6062,1330],{"class":1322},[1050,6064,5779],{"class":1326},[1050,6066,1330],{"class":1322},[1050,6068,1608],{"class":1313},[1050,6070,6071],{"class":1052,"line":1279},[1050,6072,1584],{"class":1461},[1050,6074,6075],{"class":1052,"line":1285},[1050,6076,6077],{"class":1056},"        # Should handle exception gracefully\n",[1050,6079,6080,6082,6084,6087,6089,6091],{"class":1052,"line":2005},[1050,6081,1589],{"class":1461},[1050,6083,1592],{"class":1313},[1050,6085,6086],{"class":1600}," middleware",[1050,6088,1474],{"class":1313},[1050,6090,1605],{"class":1600},[1050,6092,1608],{"class":1313},[1050,6094,6095,6097,6099,6101,6103,6105,6107,6109,6111,6114],{"class":1052,"line":2011},[1050,6096,1512],{"class":1309},[1050,6098,1515],{"class":1313},[1050,6100,5818],{"class":1600},[1050,6102,1474],{"class":1313},[1050,6104,2354],{"class":1600},[1050,6106,1515],{"class":1313},[1050,6108,2359],{"class":1518},[1050,6110,1481],{"class":1313},[1050,6112,6113],{"class":3163}," 500",[1050,6115,1608],{"class":1313},[1030,6117,6119],{"id":6118},"performance-considerations","Performance Considerations",[1035,6121,6123],{"id":6122},"efficient-middleware-design","Efficient Middleware Design",[1040,6125,6127],{"className":1042,"code":6126,"language":1044,"meta":1045,"style":1045},"class EfficientMiddleware:\n    \"\"\"Example of performance-conscious middleware\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n        \n        # Pre-compile expensive operations\n        import re\n        self.path_pattern = re.compile(r'^/api/v\\d+/')\n        \n        # Cache expensive lookups\n        self._config_cache = {}\n    \n    def __call__(self, request):\n        # Fast path checks first\n        if not self.should_process(request):\n            return self.get_response(request)\n        \n        # Minimize work in the request path\n        start_time = time.time()\n        \n        response = self.get_response(request)\n        \n        # Add minimal response processing\n        processing_time = time.time() - start_time\n        if processing_time > 0.1:  # Only log slow requests\n            logger.warning(f\"Slow request: {request.path} took {processing_time:.3f}s\")\n        \n        return response\n    \n    def should_process(self, request):\n        \"\"\"Fast check to determine if processing is needed\"\"\"\n        return self.path_pattern.match(request.path) is not None\n",[1047,6128,6129,6138,6147,6151,6167,6179,6183,6188,6195,6243,6247,6252,6266,6270,6286,6291,6310,6326,6330,6335,6349,6353,6371,6375,6380,6400,6418,6462,6466,6472,6476,6492,6501],{"__ignoreMap":1045},[1050,6130,6131,6133,6136],{"class":1052,"line":1053},[1050,6132,1439],{"class":1438},[1050,6134,6135],{"class":1442}," EfficientMiddleware",[1050,6137,1446],{"class":1313},[1050,6139,6140,6142,6145],{"class":1052,"line":1060},[1050,6141,1451],{"class":1063},[1050,6143,6144],{"class":1070},"Example of performance-conscious middleware",[1050,6146,1064],{"class":1063},[1050,6148,6149],{"class":1052,"line":1067},[1050,6150,1462],{"class":1461},[1050,6152,6153,6155,6157,6159,6161,6163,6165],{"class":1052,"line":1074},[1050,6154,1467],{"class":1438},[1050,6156,1471],{"class":1470},[1050,6158,1474],{"class":1313},[1050,6160,1478],{"class":1477},[1050,6162,1481],{"class":1313},[1050,6164,1485],{"class":1484},[1050,6166,1488],{"class":1313},[1050,6168,6169,6171,6173,6175,6177],{"class":1052,"line":1080},[1050,6170,1512],{"class":1309},[1050,6172,1515],{"class":1313},[1050,6174,1519],{"class":1518},[1050,6176,1314],{"class":1313},[1050,6178,1524],{"class":1461},[1050,6180,6181],{"class":1052,"line":1086},[1050,6182,1584],{"class":1461},[1050,6184,6185],{"class":1052,"line":1092},[1050,6186,6187],{"class":1056},"        # Pre-compile expensive operations\n",[1050,6189,6190,6192],{"class":1052,"line":1098},[1050,6191,2454],{"class":1631},[1050,6193,6194],{"class":1461}," re\n",[1050,6196,6197,6199,6201,6204,6206,6209,6211,6214,6216,6219,6221,6225,6229,6232,6236,6239,6241],{"class":1052,"line":1104},[1050,6198,1512],{"class":1309},[1050,6200,1515],{"class":1313},[1050,6202,6203],{"class":1518},"path_pattern",[1050,6205,1314],{"class":1313},[1050,6207,6208],{"class":1461}," re",[1050,6210,1515],{"class":1313},[1050,6212,6213],{"class":1600},"compile",[1050,6215,1474],{"class":1313},[1050,6217,6218],{"class":1438},"r",[1050,6220,1330],{"class":1322},[1050,6222,6224],{"class":6223},"sRJPX","^",[1050,6226,6228],{"class":6227},"s27EL","/api/v",[1050,6230,6231],{"class":6223},"\\d",[1050,6233,6235],{"class":6234},"sGuSu","+",[1050,6237,6238],{"class":6227},"/",[1050,6240,1330],{"class":1322},[1050,6242,1608],{"class":1313},[1050,6244,6245],{"class":1052,"line":1110},[1050,6246,1584],{"class":1461},[1050,6248,6249],{"class":1052,"line":1116},[1050,6250,6251],{"class":1056},"        # Cache expensive lookups\n",[1050,6253,6254,6256,6258,6261,6263],{"class":1052,"line":1121},[1050,6255,1512],{"class":1309},[1050,6257,1515],{"class":1313},[1050,6259,6260],{"class":1518},"_config_cache",[1050,6262,1314],{"class":1313},[1050,6264,6265],{"class":1313}," {}\n",[1050,6267,6268],{"class":1052,"line":1128},[1050,6269,1462],{"class":1461},[1050,6271,6272,6274,6276,6278,6280,6282,6284],{"class":1052,"line":1134},[1050,6273,1467],{"class":1438},[1050,6275,1540],{"class":1470},[1050,6277,1474],{"class":1313},[1050,6279,1478],{"class":1477},[1050,6281,1481],{"class":1313},[1050,6283,1549],{"class":1484},[1050,6285,1488],{"class":1313},[1050,6287,6288],{"class":1052,"line":1139},[1050,6289,6290],{"class":1056},"        # Fast path checks first\n",[1050,6292,6293,6295,6297,6299,6301,6304,6306,6308],{"class":1052,"line":1145},[1050,6294,1743],{"class":1631},[1050,6296,4857],{"class":2555},[1050,6298,1595],{"class":1309},[1050,6300,1515],{"class":1313},[1050,6302,6303],{"class":1600},"should_process",[1050,6305,1474],{"class":1313},[1050,6307,1605],{"class":1600},[1050,6309,1488],{"class":1313},[1050,6311,6312,6314,6316,6318,6320,6322,6324],{"class":1052,"line":1151},[1050,6313,1753],{"class":1631},[1050,6315,1595],{"class":1309},[1050,6317,1515],{"class":1313},[1050,6319,1519],{"class":1600},[1050,6321,1474],{"class":1313},[1050,6323,1605],{"class":1600},[1050,6325,1608],{"class":1313},[1050,6327,6328],{"class":1052,"line":1157},[1050,6329,1584],{"class":1461},[1050,6331,6332],{"class":1052,"line":1163},[1050,6333,6334],{"class":1056},"        # Minimize work in the request path\n",[1050,6336,6337,6339,6341,6343,6345,6347],{"class":1052,"line":1169},[1050,6338,2466],{"class":1461},[1050,6340,1592],{"class":1313},[1050,6342,2471],{"class":1461},[1050,6344,1515],{"class":1313},[1050,6346,2476],{"class":1600},[1050,6348,2479],{"class":1313},[1050,6350,6351],{"class":1052,"line":1174},[1050,6352,1584],{"class":1461},[1050,6354,6355,6357,6359,6361,6363,6365,6367,6369],{"class":1052,"line":1179},[1050,6356,1589],{"class":1461},[1050,6358,1592],{"class":1313},[1050,6360,1595],{"class":1309},[1050,6362,1515],{"class":1313},[1050,6364,1519],{"class":1600},[1050,6366,1474],{"class":1313},[1050,6368,1605],{"class":1600},[1050,6370,1608],{"class":1313},[1050,6372,6373],{"class":1052,"line":1185},[1050,6374,1584],{"class":1461},[1050,6376,6377],{"class":1052,"line":1190},[1050,6378,6379],{"class":1056},"        # Add minimal response processing\n",[1050,6381,6382,6384,6386,6388,6390,6392,6395,6398],{"class":1052,"line":1195},[1050,6383,2547],{"class":1461},[1050,6385,1592],{"class":1313},[1050,6387,2471],{"class":1461},[1050,6389,1515],{"class":1313},[1050,6391,2476],{"class":1600},[1050,6393,6394],{"class":1313},"()",[1050,6396,6397],{"class":2555}," -",[1050,6399,2559],{"class":1461},[1050,6401,6402,6404,6407,6410,6413,6415],{"class":1052,"line":1200},[1050,6403,1743],{"class":1631},[1050,6405,6406],{"class":1461}," processing_time ",[1050,6408,6409],{"class":2555},">",[1050,6411,6412],{"class":3163}," 0.1",[1050,6414,2920],{"class":1313},[1050,6416,6417],{"class":1056},"  # Only log slow requests\n",[1050,6419,6420,6423,6425,6428,6430,6432,6435,6437,6439,6441,6443,6445,6448,6450,6452,6455,6457,6460],{"class":1052,"line":1206},[1050,6421,6422],{"class":1461},"            logger",[1050,6424,1515],{"class":1313},[1050,6426,6427],{"class":1600},"warning",[1050,6429,1474],{"class":1313},[1050,6431,2286],{"class":1438},[1050,6433,6434],{"class":1326},"\"Slow request: ",[1050,6436,2293],{"class":2292},[1050,6438,1605],{"class":1600},[1050,6440,1515],{"class":1313},[1050,6442,2300],{"class":1518},[1050,6444,2303],{"class":2292},[1050,6446,6447],{"class":1326}," took ",[1050,6449,2293],{"class":2292},[1050,6451,2575],{"class":1600},[1050,6453,6454],{"class":1438},":.3f",[1050,6456,2303],{"class":2292},[1050,6458,6459],{"class":1326},"s\"",[1050,6461,1608],{"class":1313},[1050,6463,6464],{"class":1052,"line":1211},[1050,6465,1584],{"class":1461},[1050,6467,6468,6470],{"class":1052,"line":1216},[1050,6469,1632],{"class":1631},[1050,6471,1635],{"class":1461},[1050,6473,6474],{"class":1052,"line":1221},[1050,6475,1462],{"class":1461},[1050,6477,6478,6480,6482,6484,6486,6488,6490],{"class":1052,"line":1227},[1050,6479,1467],{"class":1438},[1050,6481,4508],{"class":1823},[1050,6483,1474],{"class":1313},[1050,6485,1478],{"class":1477},[1050,6487,1481],{"class":1313},[1050,6489,1549],{"class":1484},[1050,6491,1488],{"class":1313},[1050,6493,6494,6496,6499],{"class":1052,"line":1232},[1050,6495,2882],{"class":1063},[1050,6497,6498],{"class":1070},"Fast check to determine if processing is needed",[1050,6500,1064],{"class":1063},[1050,6502,6503,6505,6507,6509,6511,6513,6516,6518,6520,6522,6524,6526,6529,6531],{"class":1052,"line":1237},[1050,6504,1632],{"class":1631},[1050,6506,1595],{"class":1309},[1050,6508,1515],{"class":1313},[1050,6510,6203],{"class":1518},[1050,6512,1515],{"class":1313},[1050,6514,6515],{"class":1600},"match",[1050,6517,1474],{"class":1313},[1050,6519,1605],{"class":1600},[1050,6521,1515],{"class":1313},[1050,6523,2300],{"class":1518},[1050,6525,4472],{"class":1313},[1050,6527,6528],{"class":2555}," is",[1050,6530,4857],{"class":2555},[1050,6532,1860],{"class":1859},[1030,6534,921],{"id":6535},"best-practices",[1035,6537,6539],{"id":6538},"design-guidelines","Design Guidelines",[6541,6542,6543,6547,6550,6553],"ul",{},[6544,6545,6546],"li",{},"Keep middleware lightweight and focused",[6544,6548,6549],{},"Avoid expensive operations in the request path",[6544,6551,6552],{},"Handle exceptions gracefully",[6544,6554,6555],{},"Make middleware configurable and testable",[1035,6557,6559],{"id":6558},"performance-tips","Performance Tips",[6541,6561,6562,6565,6568,6571],{},[6544,6563,6564],{},"Use early returns to skip unnecessary processing",[6544,6566,6567],{},"Cache expensive computations",[6544,6569,6570],{},"Profile middleware performance impact",[6544,6572,6573],{},"Consider async middleware for I/O operations",[1035,6575,6577],{"id":6576},"security-considerations","Security Considerations",[6541,6579,6580,6583,6586,6589],{},[6544,6581,6582],{},"Validate all inputs and outputs",[6544,6584,6585],{},"Be careful with request/response modification",[6544,6587,6588],{},"Log security-relevant events",[6544,6590,6591],{},"Follow the principle of least privilege",[1030,6593,6595],{"id":6594},"next-steps","Next Steps",[1026,6597,6598],{},"Now that you understand how middleware works, let's explore Django's built-in middleware components and learn how they implement common functionality.",[6600,6601,6602],"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 .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 .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 .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .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 .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--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 .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}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 .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sRJPX, html code.shiki .sRJPX{--shiki-light:#91B859;--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 .sGuSu, html code.shiki .sGuSu{--shiki-light:#39ADB5;--shiki-default:#2F798A;--shiki-dark:#4C9A91}",{"title":1045,"searchDepth":1053,"depth":1060,"links":6604},[6605,6609,6613,6617,6623,6627,6630,6633,6636,6641],{"id":1032,"depth":1060,"text":1033,"children":6606},[6607,6608],{"id":1037,"depth":1067,"text":1038},{"id":1290,"depth":1067,"text":1291},{"id":1423,"depth":1060,"text":1424,"children":6610},[6611,6612],{"id":1427,"depth":1067,"text":1428},{"id":1638,"depth":1067,"text":1639},{"id":2079,"depth":1060,"text":2080,"children":6614},[6615,6616],{"id":2083,"depth":1067,"text":2084},{"id":2184,"depth":1067,"text":2185},{"id":2724,"depth":1060,"text":2725,"children":6618},[6619,6620,6621,6622],{"id":2728,"depth":1067,"text":2729},{"id":3210,"depth":1067,"text":3211},{"id":3558,"depth":1067,"text":3559},{"id":3990,"depth":1067,"text":3991},{"id":4322,"depth":1060,"text":4323,"children":6624},[6625,6626],{"id":4326,"depth":1067,"text":4327},{"id":4605,"depth":1067,"text":4606},{"id":5101,"depth":1060,"text":5102,"children":6628},[6629],{"id":5105,"depth":1067,"text":5106},{"id":5540,"depth":1060,"text":5541,"children":6631},[6632],{"id":5544,"depth":1067,"text":5545},{"id":6118,"depth":1060,"text":6119,"children":6634},[6635],{"id":6122,"depth":1067,"text":6123},{"id":6535,"depth":1060,"text":921,"children":6637},[6638,6639,6640],{"id":6538,"depth":1067,"text":6539},{"id":6558,"depth":1067,"text":6559},{"id":6576,"depth":1067,"text":6577},{"id":6594,"depth":1060,"text":6595},"md",null,{},{"title":521,"description":1028},"kpPvwxgWswj3BBVH4wxTW4DgoYQSwd1UPAW2OycxTuY",[6648,6650],{"title":515,"path":516,"stem":517,"description":6649,"children":-1},"Django middleware is a powerful framework for processing requests and responses globally across your application. It provides hooks into Django's request/response processing, allowing you to modify requests before they reach views and responses before they're sent to clients.",{"title":525,"path":526,"stem":527,"description":6651,"children":-1},"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.",1772474936388]