[{"data":1,"prerenderedAt":10582},["ShallowReactive",2],{"navigation":3,"/sessions-cookies-state":1016,"/sessions-cookies-state-surround":10577},[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":445,"body":1018,"description":1028,"extension":10572,"links":10573,"meta":10574,"navigation":2307,"path":441,"seo":10575,"stem":442,"__hash__":10576},"docs/10.sessions-cookies-state/01.index.md",{"type":1019,"value":1020,"toc":10557},"minimark",[1021,1025,1029,1034,1037,1042,4168,4172,4176,5838,5842,5846,7460,7464,8934,8938,8942,10550,10553],[1022,1023,445],"h1",{"id":1024},"sessions-cookies-and-state-management",[1026,1027,1028],"p",{},"Managing user state across HTTP requests is fundamental to building interactive web applications. Django provides robust session management, cookie handling, and state persistence mechanisms that enable you to create seamless user experiences while maintaining security and performance.",[1030,1031,1033],"h2",{"id":1032},"understanding-stateless-http-and-state-management","Understanding Stateless HTTP and State Management",[1026,1035,1036],{},"HTTP is inherently stateless - each request is independent and contains no memory of previous interactions. Web applications need mechanisms to maintain state across requests to provide personalized experiences, shopping carts, user authentication, and more.",[1038,1039,1041],"h3",{"id":1040},"the-challenge-of-state-in-web-applications","The Challenge of State in Web Applications",[1043,1044,1049],"pre",{"className":1045,"code":1046,"language":1047,"meta":1048,"style":1048},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# The fundamental challenge: HTTP is stateless\nclass StatelessHTTPExample:\n    \"\"\"Understanding why we need state management\"\"\"\n    \n    @staticmethod\n    def demonstrate_stateless_nature():\n        \"\"\"Show how HTTP requests are independent\"\"\"\n        \n        # Each request is completely independent\n        request_1 = {\n            'method': 'GET',\n            'path': '/login',\n            'headers': {'User-Agent': 'Browser'},\n            'body': None\n        }\n        \n        request_2 = {\n            'method': 'POST',\n            'path': '/dashboard',\n            'headers': {'User-Agent': 'Browser'},\n            'body': {'username': 'john', 'password': 'secret'}\n        }\n        \n        # Without state management:\n        # - Request 2 has no knowledge of Request 1\n        # - Server cannot remember user authentication\n        # - No way to maintain user preferences\n        # - Shopping cart contents are lost\n        \n        return \"Each request exists in isolation\"\n    \n    @staticmethod\n    def state_management_solutions():\n        \"\"\"Different approaches to managing state\"\"\"\n        \n        solutions = {\n            'cookies': {\n                'description': 'Small data stored in browser',\n                'pros': ['Simple', 'Automatic', 'Persistent'],\n                'cons': ['Size limited', 'Security concerns', 'User can disable'],\n                'use_cases': ['User preferences', 'Shopping cart', 'Authentication tokens']\n            },\n            'sessions': {\n                'description': 'Server-side state storage',\n                'pros': ['Secure', 'Large capacity', 'Server controlled'],\n                'cons': ['Server memory/storage', 'Scalability challenges'],\n                'use_cases': ['User authentication', 'Temporary data', 'Multi-step forms']\n            },\n            'url_parameters': {\n                'description': 'State passed in URL',\n                'pros': ['Simple', 'Bookmarkable', 'No storage needed'],\n                'cons': ['Limited size', 'Visible to user', 'Not secure'],\n                'use_cases': ['Search filters', 'Pagination', 'Public state']\n            },\n            'hidden_form_fields': {\n                'description': 'State in HTML forms',\n                'pros': ['Simple for forms', 'Automatic submission'],\n                'cons': ['Only for forms', 'Visible in HTML', 'Limited scope'],\n                'use_cases': ['Multi-step forms', 'CSRF tokens', 'Form state']\n            },\n            'local_storage': {\n                'description': 'Browser-side storage (JavaScript)',\n                'pros': ['Large capacity', 'Persistent', 'Fast access'],\n                'cons': ['JavaScript required', 'Browser dependent', 'Security risks'],\n                'use_cases': ['Client-side apps', 'Offline data', 'User preferences']\n            }\n        }\n        \n        return solutions\n\n# Django's approach to state management\nclass DjangoStateManagement:\n    \"\"\"How Django handles state management\"\"\"\n    \n    @staticmethod\n    def django_session_framework():\n        \"\"\"Overview of Django's session framework\"\"\"\n        \n        framework_components = {\n            'session_middleware': {\n                'purpose': 'Handles session creation and management',\n                'location': 'django.contrib.sessions.middleware.SessionMiddleware',\n                'responsibilities': [\n                    'Create session objects',\n                    'Load session data',\n                    'Save session changes',\n                    'Handle session cookies'\n                ]\n            },\n            'session_backends': {\n                'purpose': 'Store session data',\n                'options': [\n                    'Database (default)',\n                    'Cache',\n                    'File system',\n                    'Cookie-based',\n                    'Cached database'\n                ]\n            },\n            'session_api': {\n                'purpose': 'Interface for working with sessions',\n                'access': 'request.session',\n                'methods': [\n                    'get()', 'set()', 'pop()', 'clear()',\n                    'flush()', 'cycle_key()', 'set_expiry()'\n                ]\n            }\n        }\n        \n        return framework_components\n    \n    @staticmethod\n    def basic_session_usage():\n        \"\"\"Basic session usage examples\"\"\"\n        \n        # View examples showing session usage\n        session_examples = \"\"\"\n        # Setting session data\n        def set_user_preference(request):\n            request.session['theme'] = 'dark'\n            request.session['language'] = 'en'\n            return HttpResponse('Preferences saved')\n        \n        # Getting session data\n        def get_user_preference(request):\n            theme = request.session.get('theme', 'light')\n            language = request.session.get('language', 'en')\n            return render(request, 'profile.html', {\n                'theme': theme,\n                'language': language\n            })\n        \n        # Modifying session data\n        def add_to_cart(request, product_id):\n            cart = request.session.get('cart', [])\n            cart.append(product_id)\n            request.session['cart'] = cart\n            request.session.modified = True  # Important for mutable objects\n            return HttpResponse('Added to cart')\n        \n        # Clearing session data\n        def logout_user(request):\n            request.session.flush()  # Removes all session data\n            return redirect('login')\n        \"\"\"\n        \n        return session_examples\n\n# Cookie fundamentals\nclass CookieManagement:\n    \"\"\"Understanding and managing cookies in Django\"\"\"\n    \n    @staticmethod\n    def cookie_basics():\n        \"\"\"Cookie fundamentals and properties\"\"\"\n        \n        cookie_properties = {\n            'name_value': {\n                'description': 'Cookie identifier and data',\n                'example': 'sessionid=abc123def456',\n                'rules': ['Name is case-sensitive', 'Value is string data']\n            },\n            'domain': {\n                'description': 'Which domains can access the cookie',\n                'example': '.example.com',\n                'rules': ['Defaults to current domain', 'Subdomain access with dot prefix']\n            },\n            'path': {\n                'description': 'URL path scope for cookie',\n                'example': '/admin/',\n                'rules': ['Defaults to current path', 'More specific paths override']\n            },\n            'expires': {\n                'description': 'When cookie expires',\n                'example': 'Wed, 21 Oct 2025 07:28:00 GMT',\n                'rules': ['Absolute expiration time', 'Browser deletes after expiry']\n            },\n            'max_age': {\n                'description': 'Cookie lifetime in seconds',\n                'example': '3600',\n                'rules': ['Relative to current time', 'Takes precedence over expires']\n            },\n            'secure': {\n                'description': 'HTTPS only transmission',\n                'example': 'Secure',\n                'rules': ['Cookie only sent over HTTPS', 'Essential for production']\n            },\n            'httponly': {\n                'description': 'No JavaScript access',\n                'example': 'HttpOnly',\n                'rules': ['Prevents XSS attacks', 'Server-side access only']\n            },\n            'samesite': {\n                'description': 'Cross-site request policy',\n                'example': 'Strict',\n                'rules': ['Strict, Lax, or None', 'CSRF protection']\n            }\n        }\n        \n        return cookie_properties\n    \n    @staticmethod\n    def django_cookie_usage():\n        \"\"\"How to work with cookies in Django\"\"\"\n        \n        cookie_examples = \"\"\"\n        # Setting cookies in views\n        def set_cookie_view(request):\n            response = HttpResponse('Cookie set')\n            response.set_cookie(\n                'user_preference',\n                'dark_theme',\n                max_age=30*24*60*60,  # 30 days\n                secure=True,\n                httponly=True,\n                samesite='Strict'\n            )\n            return response\n        \n        # Reading cookies\n        def read_cookie_view(request):\n            preference = request.COOKIES.get('user_preference', 'light_theme')\n            return HttpResponse(f'Your preference: {preference}')\n        \n        # Deleting cookies\n        def delete_cookie_view(request):\n            response = HttpResponse('Cookie deleted')\n            response.delete_cookie('user_preference')\n            return response\n        \n        # Signed cookies for security\n        def set_signed_cookie_view(request):\n            response = HttpResponse('Signed cookie set')\n            response.set_signed_cookie(\n                'secure_data',\n                'sensitive_value',\n                salt='my-salt-key'\n            )\n            return response\n        \n        def read_signed_cookie_view(request):\n            try:\n                value = request.get_signed_cookie(\n                    'secure_data',\n                    salt='my-salt-key'\n                )\n                return HttpResponse(f'Secure value: {value}')\n            except BadSignature:\n                return HttpResponse('Cookie tampered with!')\n        \"\"\"\n        \n        return cookie_examples\n","python","",[1050,1051,1052,1061,1076,1090,1097,1107,1120,1131,1137,1143,1155,1183,1204,1238,1254,1260,1265,1275,1295,1315,1344,1395,1400,1405,1411,1417,1423,1429,1435,1440,1456,1461,1468,1478,1488,1493,1503,1517,1539,1582,1623,1665,1671,1685,1705,1745,1776,1816,1821,1835,1855,1894,1934,1973,1978,1992,2012,2043,2083,2122,2127,2141,2161,2199,2239,2278,2284,2289,2294,2302,2309,2315,2325,2335,2340,2347,2357,2367,2372,2382,2396,2417,2438,2453,2466,2478,2490,2501,2507,2512,2526,2546,2560,2572,2584,2596,2608,2618,2623,2628,2642,2662,2683,2697,2736,2764,2769,2774,2779,2784,2792,2797,2804,2814,2824,2829,2835,2846,2852,2858,2864,2870,2876,2881,2887,2893,2899,2905,2911,2917,2923,2929,2934,2940,2946,2952,2958,2964,2970,2976,2981,2987,2993,2999,3005,3011,3016,3024,3029,3035,3045,3055,3060,3067,3077,3087,3092,3102,3116,3136,3157,3189,3194,3208,3228,3248,3279,3284,3297,3317,3337,3368,3373,3387,3407,3427,3458,3463,3477,3497,3517,3548,3553,3567,3587,3606,3637,3642,3656,3676,3696,3727,3732,3746,3766,3786,3817,3822,3827,3832,3840,3845,3852,3862,3872,3877,3887,3893,3899,3905,3911,3917,3923,3929,3935,3941,3947,3953,3959,3964,3970,3976,3982,3995,4000,4006,4012,4018,4024,4029,4034,4040,4046,4052,4058,4064,4070,4076,4081,4086,4091,4097,4103,4109,4115,4121,4127,4138,4144,4150,4155,4160],"code",{"__ignoreMap":1048},[1053,1054,1057],"span",{"class":1055,"line":1056},"line",1,[1053,1058,1060],{"class":1059},"s9Tkl","# The fundamental challenge: HTTP is stateless\n",[1053,1062,1064,1068,1072],{"class":1055,"line":1063},2,[1053,1065,1067],{"class":1066},"s5Kfy","class",[1053,1069,1071],{"class":1070},"sD-vU"," StatelessHTTPExample",[1053,1073,1075],{"class":1074},"soVBu",":\n",[1053,1077,1079,1083,1087],{"class":1055,"line":1078},3,[1053,1080,1082],{"class":1081},"sm7ve","    \"\"\"",[1053,1084,1086],{"class":1085},"sVyVU","Understanding why we need state management",[1053,1088,1089],{"class":1081},"\"\"\"\n",[1053,1091,1093],{"class":1055,"line":1092},4,[1053,1094,1096],{"class":1095},"sftqT","    \n",[1053,1098,1100,1103],{"class":1055,"line":1099},5,[1053,1101,1102],{"class":1074},"    @",[1053,1104,1106],{"class":1105},"sa2tF","staticmethod\n",[1053,1108,1110,1113,1117],{"class":1055,"line":1109},6,[1053,1111,1112],{"class":1066},"    def",[1053,1114,1116],{"class":1115},"sljsM"," demonstrate_stateless_nature",[1053,1118,1119],{"class":1074},"():\n",[1053,1121,1123,1126,1129],{"class":1055,"line":1122},7,[1053,1124,1125],{"class":1081},"        \"\"\"",[1053,1127,1128],{"class":1085},"Show how HTTP requests are independent",[1053,1130,1089],{"class":1081},[1053,1132,1134],{"class":1055,"line":1133},8,[1053,1135,1136],{"class":1095},"        \n",[1053,1138,1140],{"class":1055,"line":1139},9,[1053,1141,1142],{"class":1059},"        # Each request is completely independent\n",[1053,1144,1146,1149,1152],{"class":1055,"line":1145},10,[1053,1147,1148],{"class":1095},"        request_1 ",[1053,1150,1151],{"class":1074},"=",[1053,1153,1154],{"class":1074}," {\n",[1053,1156,1158,1162,1166,1169,1172,1175,1178,1180],{"class":1055,"line":1157},11,[1053,1159,1161],{"class":1160},"sbYkP","            '",[1053,1163,1165],{"class":1164},"sTbE_","method",[1053,1167,1168],{"class":1160},"'",[1053,1170,1171],{"class":1074},":",[1053,1173,1174],{"class":1160}," '",[1053,1176,1177],{"class":1164},"GET",[1053,1179,1168],{"class":1160},[1053,1181,1182],{"class":1074},",\n",[1053,1184,1186,1188,1191,1193,1195,1197,1200,1202],{"class":1055,"line":1185},12,[1053,1187,1161],{"class":1160},[1053,1189,1190],{"class":1164},"path",[1053,1192,1168],{"class":1160},[1053,1194,1171],{"class":1074},[1053,1196,1174],{"class":1160},[1053,1198,1199],{"class":1164},"/login",[1053,1201,1168],{"class":1160},[1053,1203,1182],{"class":1074},[1053,1205,1207,1209,1212,1214,1216,1219,1221,1224,1226,1228,1230,1233,1235],{"class":1055,"line":1206},13,[1053,1208,1161],{"class":1160},[1053,1210,1211],{"class":1164},"headers",[1053,1213,1168],{"class":1160},[1053,1215,1171],{"class":1074},[1053,1217,1218],{"class":1074}," {",[1053,1220,1168],{"class":1160},[1053,1222,1223],{"class":1164},"User-Agent",[1053,1225,1168],{"class":1160},[1053,1227,1171],{"class":1074},[1053,1229,1174],{"class":1160},[1053,1231,1232],{"class":1164},"Browser",[1053,1234,1168],{"class":1160},[1053,1236,1237],{"class":1074},"},\n",[1053,1239,1241,1243,1246,1248,1250],{"class":1055,"line":1240},14,[1053,1242,1161],{"class":1160},[1053,1244,1245],{"class":1164},"body",[1053,1247,1168],{"class":1160},[1053,1249,1171],{"class":1074},[1053,1251,1253],{"class":1252},"s8XtY"," None\n",[1053,1255,1257],{"class":1055,"line":1256},15,[1053,1258,1259],{"class":1074},"        }\n",[1053,1261,1263],{"class":1055,"line":1262},16,[1053,1264,1136],{"class":1095},[1053,1266,1268,1271,1273],{"class":1055,"line":1267},17,[1053,1269,1270],{"class":1095},"        request_2 ",[1053,1272,1151],{"class":1074},[1053,1274,1154],{"class":1074},[1053,1276,1278,1280,1282,1284,1286,1288,1291,1293],{"class":1055,"line":1277},18,[1053,1279,1161],{"class":1160},[1053,1281,1165],{"class":1164},[1053,1283,1168],{"class":1160},[1053,1285,1171],{"class":1074},[1053,1287,1174],{"class":1160},[1053,1289,1290],{"class":1164},"POST",[1053,1292,1168],{"class":1160},[1053,1294,1182],{"class":1074},[1053,1296,1298,1300,1302,1304,1306,1308,1311,1313],{"class":1055,"line":1297},19,[1053,1299,1161],{"class":1160},[1053,1301,1190],{"class":1164},[1053,1303,1168],{"class":1160},[1053,1305,1171],{"class":1074},[1053,1307,1174],{"class":1160},[1053,1309,1310],{"class":1164},"/dashboard",[1053,1312,1168],{"class":1160},[1053,1314,1182],{"class":1074},[1053,1316,1318,1320,1322,1324,1326,1328,1330,1332,1334,1336,1338,1340,1342],{"class":1055,"line":1317},20,[1053,1319,1161],{"class":1160},[1053,1321,1211],{"class":1164},[1053,1323,1168],{"class":1160},[1053,1325,1171],{"class":1074},[1053,1327,1218],{"class":1074},[1053,1329,1168],{"class":1160},[1053,1331,1223],{"class":1164},[1053,1333,1168],{"class":1160},[1053,1335,1171],{"class":1074},[1053,1337,1174],{"class":1160},[1053,1339,1232],{"class":1164},[1053,1341,1168],{"class":1160},[1053,1343,1237],{"class":1074},[1053,1345,1347,1349,1351,1353,1355,1357,1359,1362,1364,1366,1368,1371,1373,1376,1378,1381,1383,1385,1387,1390,1392],{"class":1055,"line":1346},21,[1053,1348,1161],{"class":1160},[1053,1350,1245],{"class":1164},[1053,1352,1168],{"class":1160},[1053,1354,1171],{"class":1074},[1053,1356,1218],{"class":1074},[1053,1358,1168],{"class":1160},[1053,1360,1361],{"class":1164},"username",[1053,1363,1168],{"class":1160},[1053,1365,1171],{"class":1074},[1053,1367,1174],{"class":1160},[1053,1369,1370],{"class":1164},"john",[1053,1372,1168],{"class":1160},[1053,1374,1375],{"class":1074},",",[1053,1377,1174],{"class":1160},[1053,1379,1380],{"class":1164},"password",[1053,1382,1168],{"class":1160},[1053,1384,1171],{"class":1074},[1053,1386,1174],{"class":1160},[1053,1388,1389],{"class":1164},"secret",[1053,1391,1168],{"class":1160},[1053,1393,1394],{"class":1074},"}\n",[1053,1396,1398],{"class":1055,"line":1397},22,[1053,1399,1259],{"class":1074},[1053,1401,1403],{"class":1055,"line":1402},23,[1053,1404,1136],{"class":1095},[1053,1406,1408],{"class":1055,"line":1407},24,[1053,1409,1410],{"class":1059},"        # Without state management:\n",[1053,1412,1414],{"class":1055,"line":1413},25,[1053,1415,1416],{"class":1059},"        # - Request 2 has no knowledge of Request 1\n",[1053,1418,1420],{"class":1055,"line":1419},26,[1053,1421,1422],{"class":1059},"        # - Server cannot remember user authentication\n",[1053,1424,1426],{"class":1055,"line":1425},27,[1053,1427,1428],{"class":1059},"        # - No way to maintain user preferences\n",[1053,1430,1432],{"class":1055,"line":1431},28,[1053,1433,1434],{"class":1059},"        # - Shopping cart contents are lost\n",[1053,1436,1438],{"class":1055,"line":1437},29,[1053,1439,1136],{"class":1095},[1053,1441,1443,1447,1450,1453],{"class":1055,"line":1442},30,[1053,1444,1446],{"class":1445},"siDh9","        return",[1053,1448,1449],{"class":1160}," \"",[1053,1451,1452],{"class":1164},"Each request exists in isolation",[1053,1454,1455],{"class":1160},"\"\n",[1053,1457,1459],{"class":1055,"line":1458},31,[1053,1460,1096],{"class":1095},[1053,1462,1464,1466],{"class":1055,"line":1463},32,[1053,1465,1102],{"class":1074},[1053,1467,1106],{"class":1105},[1053,1469,1471,1473,1476],{"class":1055,"line":1470},33,[1053,1472,1112],{"class":1066},[1053,1474,1475],{"class":1115}," state_management_solutions",[1053,1477,1119],{"class":1074},[1053,1479,1481,1483,1486],{"class":1055,"line":1480},34,[1053,1482,1125],{"class":1081},[1053,1484,1485],{"class":1085},"Different approaches to managing state",[1053,1487,1089],{"class":1081},[1053,1489,1491],{"class":1055,"line":1490},35,[1053,1492,1136],{"class":1095},[1053,1494,1496,1499,1501],{"class":1055,"line":1495},36,[1053,1497,1498],{"class":1095},"        solutions ",[1053,1500,1151],{"class":1074},[1053,1502,1154],{"class":1074},[1053,1504,1506,1508,1511,1513,1515],{"class":1055,"line":1505},37,[1053,1507,1161],{"class":1160},[1053,1509,1510],{"class":1164},"cookies",[1053,1512,1168],{"class":1160},[1053,1514,1171],{"class":1074},[1053,1516,1154],{"class":1074},[1053,1518,1520,1523,1526,1528,1530,1532,1535,1537],{"class":1055,"line":1519},38,[1053,1521,1522],{"class":1160},"                '",[1053,1524,1525],{"class":1164},"description",[1053,1527,1168],{"class":1160},[1053,1529,1171],{"class":1074},[1053,1531,1174],{"class":1160},[1053,1533,1534],{"class":1164},"Small data stored in browser",[1053,1536,1168],{"class":1160},[1053,1538,1182],{"class":1074},[1053,1540,1542,1544,1547,1549,1551,1554,1556,1559,1561,1563,1565,1568,1570,1572,1574,1577,1579],{"class":1055,"line":1541},39,[1053,1543,1522],{"class":1160},[1053,1545,1546],{"class":1164},"pros",[1053,1548,1168],{"class":1160},[1053,1550,1171],{"class":1074},[1053,1552,1553],{"class":1074}," [",[1053,1555,1168],{"class":1160},[1053,1557,1558],{"class":1164},"Simple",[1053,1560,1168],{"class":1160},[1053,1562,1375],{"class":1074},[1053,1564,1174],{"class":1160},[1053,1566,1567],{"class":1164},"Automatic",[1053,1569,1168],{"class":1160},[1053,1571,1375],{"class":1074},[1053,1573,1174],{"class":1160},[1053,1575,1576],{"class":1164},"Persistent",[1053,1578,1168],{"class":1160},[1053,1580,1581],{"class":1074},"],\n",[1053,1583,1585,1587,1590,1592,1594,1596,1598,1601,1603,1605,1607,1610,1612,1614,1616,1619,1621],{"class":1055,"line":1584},40,[1053,1586,1522],{"class":1160},[1053,1588,1589],{"class":1164},"cons",[1053,1591,1168],{"class":1160},[1053,1593,1171],{"class":1074},[1053,1595,1553],{"class":1074},[1053,1597,1168],{"class":1160},[1053,1599,1600],{"class":1164},"Size limited",[1053,1602,1168],{"class":1160},[1053,1604,1375],{"class":1074},[1053,1606,1174],{"class":1160},[1053,1608,1609],{"class":1164},"Security concerns",[1053,1611,1168],{"class":1160},[1053,1613,1375],{"class":1074},[1053,1615,1174],{"class":1160},[1053,1617,1618],{"class":1164},"User can disable",[1053,1620,1168],{"class":1160},[1053,1622,1581],{"class":1074},[1053,1624,1626,1628,1631,1633,1635,1637,1639,1642,1644,1646,1648,1651,1653,1655,1657,1660,1662],{"class":1055,"line":1625},41,[1053,1627,1522],{"class":1160},[1053,1629,1630],{"class":1164},"use_cases",[1053,1632,1168],{"class":1160},[1053,1634,1171],{"class":1074},[1053,1636,1553],{"class":1074},[1053,1638,1168],{"class":1160},[1053,1640,1641],{"class":1164},"User preferences",[1053,1643,1168],{"class":1160},[1053,1645,1375],{"class":1074},[1053,1647,1174],{"class":1160},[1053,1649,1650],{"class":1164},"Shopping cart",[1053,1652,1168],{"class":1160},[1053,1654,1375],{"class":1074},[1053,1656,1174],{"class":1160},[1053,1658,1659],{"class":1164},"Authentication tokens",[1053,1661,1168],{"class":1160},[1053,1663,1664],{"class":1074},"]\n",[1053,1666,1668],{"class":1055,"line":1667},42,[1053,1669,1670],{"class":1074},"            },\n",[1053,1672,1674,1676,1679,1681,1683],{"class":1055,"line":1673},43,[1053,1675,1161],{"class":1160},[1053,1677,1678],{"class":1164},"sessions",[1053,1680,1168],{"class":1160},[1053,1682,1171],{"class":1074},[1053,1684,1154],{"class":1074},[1053,1686,1688,1690,1692,1694,1696,1698,1701,1703],{"class":1055,"line":1687},44,[1053,1689,1522],{"class":1160},[1053,1691,1525],{"class":1164},[1053,1693,1168],{"class":1160},[1053,1695,1171],{"class":1074},[1053,1697,1174],{"class":1160},[1053,1699,1700],{"class":1164},"Server-side state storage",[1053,1702,1168],{"class":1160},[1053,1704,1182],{"class":1074},[1053,1706,1708,1710,1712,1714,1716,1718,1720,1723,1725,1727,1729,1732,1734,1736,1738,1741,1743],{"class":1055,"line":1707},45,[1053,1709,1522],{"class":1160},[1053,1711,1546],{"class":1164},[1053,1713,1168],{"class":1160},[1053,1715,1171],{"class":1074},[1053,1717,1553],{"class":1074},[1053,1719,1168],{"class":1160},[1053,1721,1722],{"class":1164},"Secure",[1053,1724,1168],{"class":1160},[1053,1726,1375],{"class":1074},[1053,1728,1174],{"class":1160},[1053,1730,1731],{"class":1164},"Large capacity",[1053,1733,1168],{"class":1160},[1053,1735,1375],{"class":1074},[1053,1737,1174],{"class":1160},[1053,1739,1740],{"class":1164},"Server controlled",[1053,1742,1168],{"class":1160},[1053,1744,1581],{"class":1074},[1053,1746,1748,1750,1752,1754,1756,1758,1760,1763,1765,1767,1769,1772,1774],{"class":1055,"line":1747},46,[1053,1749,1522],{"class":1160},[1053,1751,1589],{"class":1164},[1053,1753,1168],{"class":1160},[1053,1755,1171],{"class":1074},[1053,1757,1553],{"class":1074},[1053,1759,1168],{"class":1160},[1053,1761,1762],{"class":1164},"Server memory/storage",[1053,1764,1168],{"class":1160},[1053,1766,1375],{"class":1074},[1053,1768,1174],{"class":1160},[1053,1770,1771],{"class":1164},"Scalability challenges",[1053,1773,1168],{"class":1160},[1053,1775,1581],{"class":1074},[1053,1777,1779,1781,1783,1785,1787,1789,1791,1794,1796,1798,1800,1803,1805,1807,1809,1812,1814],{"class":1055,"line":1778},47,[1053,1780,1522],{"class":1160},[1053,1782,1630],{"class":1164},[1053,1784,1168],{"class":1160},[1053,1786,1171],{"class":1074},[1053,1788,1553],{"class":1074},[1053,1790,1168],{"class":1160},[1053,1792,1793],{"class":1164},"User authentication",[1053,1795,1168],{"class":1160},[1053,1797,1375],{"class":1074},[1053,1799,1174],{"class":1160},[1053,1801,1802],{"class":1164},"Temporary data",[1053,1804,1168],{"class":1160},[1053,1806,1375],{"class":1074},[1053,1808,1174],{"class":1160},[1053,1810,1811],{"class":1164},"Multi-step forms",[1053,1813,1168],{"class":1160},[1053,1815,1664],{"class":1074},[1053,1817,1819],{"class":1055,"line":1818},48,[1053,1820,1670],{"class":1074},[1053,1822,1824,1826,1829,1831,1833],{"class":1055,"line":1823},49,[1053,1825,1161],{"class":1160},[1053,1827,1828],{"class":1164},"url_parameters",[1053,1830,1168],{"class":1160},[1053,1832,1171],{"class":1074},[1053,1834,1154],{"class":1074},[1053,1836,1838,1840,1842,1844,1846,1848,1851,1853],{"class":1055,"line":1837},50,[1053,1839,1522],{"class":1160},[1053,1841,1525],{"class":1164},[1053,1843,1168],{"class":1160},[1053,1845,1171],{"class":1074},[1053,1847,1174],{"class":1160},[1053,1849,1850],{"class":1164},"State passed in URL",[1053,1852,1168],{"class":1160},[1053,1854,1182],{"class":1074},[1053,1856,1858,1860,1862,1864,1866,1868,1870,1872,1874,1876,1878,1881,1883,1885,1887,1890,1892],{"class":1055,"line":1857},51,[1053,1859,1522],{"class":1160},[1053,1861,1546],{"class":1164},[1053,1863,1168],{"class":1160},[1053,1865,1171],{"class":1074},[1053,1867,1553],{"class":1074},[1053,1869,1168],{"class":1160},[1053,1871,1558],{"class":1164},[1053,1873,1168],{"class":1160},[1053,1875,1375],{"class":1074},[1053,1877,1174],{"class":1160},[1053,1879,1880],{"class":1164},"Bookmarkable",[1053,1882,1168],{"class":1160},[1053,1884,1375],{"class":1074},[1053,1886,1174],{"class":1160},[1053,1888,1889],{"class":1164},"No storage needed",[1053,1891,1168],{"class":1160},[1053,1893,1581],{"class":1074},[1053,1895,1897,1899,1901,1903,1905,1907,1909,1912,1914,1916,1918,1921,1923,1925,1927,1930,1932],{"class":1055,"line":1896},52,[1053,1898,1522],{"class":1160},[1053,1900,1589],{"class":1164},[1053,1902,1168],{"class":1160},[1053,1904,1171],{"class":1074},[1053,1906,1553],{"class":1074},[1053,1908,1168],{"class":1160},[1053,1910,1911],{"class":1164},"Limited size",[1053,1913,1168],{"class":1160},[1053,1915,1375],{"class":1074},[1053,1917,1174],{"class":1160},[1053,1919,1920],{"class":1164},"Visible to user",[1053,1922,1168],{"class":1160},[1053,1924,1375],{"class":1074},[1053,1926,1174],{"class":1160},[1053,1928,1929],{"class":1164},"Not secure",[1053,1931,1168],{"class":1160},[1053,1933,1581],{"class":1074},[1053,1935,1937,1939,1941,1943,1945,1947,1949,1952,1954,1956,1958,1960,1962,1964,1966,1969,1971],{"class":1055,"line":1936},53,[1053,1938,1522],{"class":1160},[1053,1940,1630],{"class":1164},[1053,1942,1168],{"class":1160},[1053,1944,1171],{"class":1074},[1053,1946,1553],{"class":1074},[1053,1948,1168],{"class":1160},[1053,1950,1951],{"class":1164},"Search filters",[1053,1953,1168],{"class":1160},[1053,1955,1375],{"class":1074},[1053,1957,1174],{"class":1160},[1053,1959,208],{"class":1164},[1053,1961,1168],{"class":1160},[1053,1963,1375],{"class":1074},[1053,1965,1174],{"class":1160},[1053,1967,1968],{"class":1164},"Public state",[1053,1970,1168],{"class":1160},[1053,1972,1664],{"class":1074},[1053,1974,1976],{"class":1055,"line":1975},54,[1053,1977,1670],{"class":1074},[1053,1979,1981,1983,1986,1988,1990],{"class":1055,"line":1980},55,[1053,1982,1161],{"class":1160},[1053,1984,1985],{"class":1164},"hidden_form_fields",[1053,1987,1168],{"class":1160},[1053,1989,1171],{"class":1074},[1053,1991,1154],{"class":1074},[1053,1993,1995,1997,1999,2001,2003,2005,2008,2010],{"class":1055,"line":1994},56,[1053,1996,1522],{"class":1160},[1053,1998,1525],{"class":1164},[1053,2000,1168],{"class":1160},[1053,2002,1171],{"class":1074},[1053,2004,1174],{"class":1160},[1053,2006,2007],{"class":1164},"State in HTML forms",[1053,2009,1168],{"class":1160},[1053,2011,1182],{"class":1074},[1053,2013,2015,2017,2019,2021,2023,2025,2027,2030,2032,2034,2036,2039,2041],{"class":1055,"line":2014},57,[1053,2016,1522],{"class":1160},[1053,2018,1546],{"class":1164},[1053,2020,1168],{"class":1160},[1053,2022,1171],{"class":1074},[1053,2024,1553],{"class":1074},[1053,2026,1168],{"class":1160},[1053,2028,2029],{"class":1164},"Simple for forms",[1053,2031,1168],{"class":1160},[1053,2033,1375],{"class":1074},[1053,2035,1174],{"class":1160},[1053,2037,2038],{"class":1164},"Automatic submission",[1053,2040,1168],{"class":1160},[1053,2042,1581],{"class":1074},[1053,2044,2046,2048,2050,2052,2054,2056,2058,2061,2063,2065,2067,2070,2072,2074,2076,2079,2081],{"class":1055,"line":2045},58,[1053,2047,1522],{"class":1160},[1053,2049,1589],{"class":1164},[1053,2051,1168],{"class":1160},[1053,2053,1171],{"class":1074},[1053,2055,1553],{"class":1074},[1053,2057,1168],{"class":1160},[1053,2059,2060],{"class":1164},"Only for forms",[1053,2062,1168],{"class":1160},[1053,2064,1375],{"class":1074},[1053,2066,1174],{"class":1160},[1053,2068,2069],{"class":1164},"Visible in HTML",[1053,2071,1168],{"class":1160},[1053,2073,1375],{"class":1074},[1053,2075,1174],{"class":1160},[1053,2077,2078],{"class":1164},"Limited scope",[1053,2080,1168],{"class":1160},[1053,2082,1581],{"class":1074},[1053,2084,2086,2088,2090,2092,2094,2096,2098,2100,2102,2104,2106,2109,2111,2113,2115,2118,2120],{"class":1055,"line":2085},59,[1053,2087,1522],{"class":1160},[1053,2089,1630],{"class":1164},[1053,2091,1168],{"class":1160},[1053,2093,1171],{"class":1074},[1053,2095,1553],{"class":1074},[1053,2097,1168],{"class":1160},[1053,2099,1811],{"class":1164},[1053,2101,1168],{"class":1160},[1053,2103,1375],{"class":1074},[1053,2105,1174],{"class":1160},[1053,2107,2108],{"class":1164},"CSRF tokens",[1053,2110,1168],{"class":1160},[1053,2112,1375],{"class":1074},[1053,2114,1174],{"class":1160},[1053,2116,2117],{"class":1164},"Form state",[1053,2119,1168],{"class":1160},[1053,2121,1664],{"class":1074},[1053,2123,2125],{"class":1055,"line":2124},60,[1053,2126,1670],{"class":1074},[1053,2128,2130,2132,2135,2137,2139],{"class":1055,"line":2129},61,[1053,2131,1161],{"class":1160},[1053,2133,2134],{"class":1164},"local_storage",[1053,2136,1168],{"class":1160},[1053,2138,1171],{"class":1074},[1053,2140,1154],{"class":1074},[1053,2142,2144,2146,2148,2150,2152,2154,2157,2159],{"class":1055,"line":2143},62,[1053,2145,1522],{"class":1160},[1053,2147,1525],{"class":1164},[1053,2149,1168],{"class":1160},[1053,2151,1171],{"class":1074},[1053,2153,1174],{"class":1160},[1053,2155,2156],{"class":1164},"Browser-side storage (JavaScript)",[1053,2158,1168],{"class":1160},[1053,2160,1182],{"class":1074},[1053,2162,2164,2166,2168,2170,2172,2174,2176,2178,2180,2182,2184,2186,2188,2190,2192,2195,2197],{"class":1055,"line":2163},63,[1053,2165,1522],{"class":1160},[1053,2167,1546],{"class":1164},[1053,2169,1168],{"class":1160},[1053,2171,1171],{"class":1074},[1053,2173,1553],{"class":1074},[1053,2175,1168],{"class":1160},[1053,2177,1731],{"class":1164},[1053,2179,1168],{"class":1160},[1053,2181,1375],{"class":1074},[1053,2183,1174],{"class":1160},[1053,2185,1576],{"class":1164},[1053,2187,1168],{"class":1160},[1053,2189,1375],{"class":1074},[1053,2191,1174],{"class":1160},[1053,2193,2194],{"class":1164},"Fast access",[1053,2196,1168],{"class":1160},[1053,2198,1581],{"class":1074},[1053,2200,2202,2204,2206,2208,2210,2212,2214,2217,2219,2221,2223,2226,2228,2230,2232,2235,2237],{"class":1055,"line":2201},64,[1053,2203,1522],{"class":1160},[1053,2205,1589],{"class":1164},[1053,2207,1168],{"class":1160},[1053,2209,1171],{"class":1074},[1053,2211,1553],{"class":1074},[1053,2213,1168],{"class":1160},[1053,2215,2216],{"class":1164},"JavaScript required",[1053,2218,1168],{"class":1160},[1053,2220,1375],{"class":1074},[1053,2222,1174],{"class":1160},[1053,2224,2225],{"class":1164},"Browser dependent",[1053,2227,1168],{"class":1160},[1053,2229,1375],{"class":1074},[1053,2231,1174],{"class":1160},[1053,2233,2234],{"class":1164},"Security risks",[1053,2236,1168],{"class":1160},[1053,2238,1581],{"class":1074},[1053,2240,2242,2244,2246,2248,2250,2252,2254,2257,2259,2261,2263,2266,2268,2270,2272,2274,2276],{"class":1055,"line":2241},65,[1053,2243,1522],{"class":1160},[1053,2245,1630],{"class":1164},[1053,2247,1168],{"class":1160},[1053,2249,1171],{"class":1074},[1053,2251,1553],{"class":1074},[1053,2253,1168],{"class":1160},[1053,2255,2256],{"class":1164},"Client-side apps",[1053,2258,1168],{"class":1160},[1053,2260,1375],{"class":1074},[1053,2262,1174],{"class":1160},[1053,2264,2265],{"class":1164},"Offline data",[1053,2267,1168],{"class":1160},[1053,2269,1375],{"class":1074},[1053,2271,1174],{"class":1160},[1053,2273,1641],{"class":1164},[1053,2275,1168],{"class":1160},[1053,2277,1664],{"class":1074},[1053,2279,2281],{"class":1055,"line":2280},66,[1053,2282,2283],{"class":1074},"            }\n",[1053,2285,2287],{"class":1055,"line":2286},67,[1053,2288,1259],{"class":1074},[1053,2290,2292],{"class":1055,"line":2291},68,[1053,2293,1136],{"class":1095},[1053,2295,2297,2299],{"class":1055,"line":2296},69,[1053,2298,1446],{"class":1445},[1053,2300,2301],{"class":1095}," solutions\n",[1053,2303,2305],{"class":1055,"line":2304},70,[1053,2306,2308],{"emptyLinePlaceholder":2307},true,"\n",[1053,2310,2312],{"class":1055,"line":2311},71,[1053,2313,2314],{"class":1059},"# Django's approach to state management\n",[1053,2316,2318,2320,2323],{"class":1055,"line":2317},72,[1053,2319,1067],{"class":1066},[1053,2321,2322],{"class":1070}," DjangoStateManagement",[1053,2324,1075],{"class":1074},[1053,2326,2328,2330,2333],{"class":1055,"line":2327},73,[1053,2329,1082],{"class":1081},[1053,2331,2332],{"class":1085},"How Django handles state management",[1053,2334,1089],{"class":1081},[1053,2336,2338],{"class":1055,"line":2337},74,[1053,2339,1096],{"class":1095},[1053,2341,2343,2345],{"class":1055,"line":2342},75,[1053,2344,1102],{"class":1074},[1053,2346,1106],{"class":1105},[1053,2348,2350,2352,2355],{"class":1055,"line":2349},76,[1053,2351,1112],{"class":1066},[1053,2353,2354],{"class":1115}," django_session_framework",[1053,2356,1119],{"class":1074},[1053,2358,2360,2362,2365],{"class":1055,"line":2359},77,[1053,2361,1125],{"class":1081},[1053,2363,2364],{"class":1085},"Overview of Django's session framework",[1053,2366,1089],{"class":1081},[1053,2368,2370],{"class":1055,"line":2369},78,[1053,2371,1136],{"class":1095},[1053,2373,2375,2378,2380],{"class":1055,"line":2374},79,[1053,2376,2377],{"class":1095},"        framework_components ",[1053,2379,1151],{"class":1074},[1053,2381,1154],{"class":1074},[1053,2383,2385,2387,2390,2392,2394],{"class":1055,"line":2384},80,[1053,2386,1161],{"class":1160},[1053,2388,2389],{"class":1164},"session_middleware",[1053,2391,1168],{"class":1160},[1053,2393,1171],{"class":1074},[1053,2395,1154],{"class":1074},[1053,2397,2399,2401,2404,2406,2408,2410,2413,2415],{"class":1055,"line":2398},81,[1053,2400,1522],{"class":1160},[1053,2402,2403],{"class":1164},"purpose",[1053,2405,1168],{"class":1160},[1053,2407,1171],{"class":1074},[1053,2409,1174],{"class":1160},[1053,2411,2412],{"class":1164},"Handles session creation and management",[1053,2414,1168],{"class":1160},[1053,2416,1182],{"class":1074},[1053,2418,2420,2422,2425,2427,2429,2431,2434,2436],{"class":1055,"line":2419},82,[1053,2421,1522],{"class":1160},[1053,2423,2424],{"class":1164},"location",[1053,2426,1168],{"class":1160},[1053,2428,1171],{"class":1074},[1053,2430,1174],{"class":1160},[1053,2432,2433],{"class":1164},"django.contrib.sessions.middleware.SessionMiddleware",[1053,2435,1168],{"class":1160},[1053,2437,1182],{"class":1074},[1053,2439,2441,2443,2446,2448,2450],{"class":1055,"line":2440},83,[1053,2442,1522],{"class":1160},[1053,2444,2445],{"class":1164},"responsibilities",[1053,2447,1168],{"class":1160},[1053,2449,1171],{"class":1074},[1053,2451,2452],{"class":1074}," [\n",[1053,2454,2456,2459,2462,2464],{"class":1055,"line":2455},84,[1053,2457,2458],{"class":1160},"                    '",[1053,2460,2461],{"class":1164},"Create session objects",[1053,2463,1168],{"class":1160},[1053,2465,1182],{"class":1074},[1053,2467,2469,2471,2474,2476],{"class":1055,"line":2468},85,[1053,2470,2458],{"class":1160},[1053,2472,2473],{"class":1164},"Load session data",[1053,2475,1168],{"class":1160},[1053,2477,1182],{"class":1074},[1053,2479,2481,2483,2486,2488],{"class":1055,"line":2480},86,[1053,2482,2458],{"class":1160},[1053,2484,2485],{"class":1164},"Save session changes",[1053,2487,1168],{"class":1160},[1053,2489,1182],{"class":1074},[1053,2491,2493,2495,2498],{"class":1055,"line":2492},87,[1053,2494,2458],{"class":1160},[1053,2496,2497],{"class":1164},"Handle session cookies",[1053,2499,2500],{"class":1160},"'\n",[1053,2502,2504],{"class":1055,"line":2503},88,[1053,2505,2506],{"class":1074},"                ]\n",[1053,2508,2510],{"class":1055,"line":2509},89,[1053,2511,1670],{"class":1074},[1053,2513,2515,2517,2520,2522,2524],{"class":1055,"line":2514},90,[1053,2516,1161],{"class":1160},[1053,2518,2519],{"class":1164},"session_backends",[1053,2521,1168],{"class":1160},[1053,2523,1171],{"class":1074},[1053,2525,1154],{"class":1074},[1053,2527,2529,2531,2533,2535,2537,2539,2542,2544],{"class":1055,"line":2528},91,[1053,2530,1522],{"class":1160},[1053,2532,2403],{"class":1164},[1053,2534,1168],{"class":1160},[1053,2536,1171],{"class":1074},[1053,2538,1174],{"class":1160},[1053,2540,2541],{"class":1164},"Store session data",[1053,2543,1168],{"class":1160},[1053,2545,1182],{"class":1074},[1053,2547,2549,2551,2554,2556,2558],{"class":1055,"line":2548},92,[1053,2550,1522],{"class":1160},[1053,2552,2553],{"class":1164},"options",[1053,2555,1168],{"class":1160},[1053,2557,1171],{"class":1074},[1053,2559,2452],{"class":1074},[1053,2561,2563,2565,2568,2570],{"class":1055,"line":2562},93,[1053,2564,2458],{"class":1160},[1053,2566,2567],{"class":1164},"Database (default)",[1053,2569,1168],{"class":1160},[1053,2571,1182],{"class":1074},[1053,2573,2575,2577,2580,2582],{"class":1055,"line":2574},94,[1053,2576,2458],{"class":1160},[1053,2578,2579],{"class":1164},"Cache",[1053,2581,1168],{"class":1160},[1053,2583,1182],{"class":1074},[1053,2585,2587,2589,2592,2594],{"class":1055,"line":2586},95,[1053,2588,2458],{"class":1160},[1053,2590,2591],{"class":1164},"File system",[1053,2593,1168],{"class":1160},[1053,2595,1182],{"class":1074},[1053,2597,2599,2601,2604,2606],{"class":1055,"line":2598},96,[1053,2600,2458],{"class":1160},[1053,2602,2603],{"class":1164},"Cookie-based",[1053,2605,1168],{"class":1160},[1053,2607,1182],{"class":1074},[1053,2609,2611,2613,2616],{"class":1055,"line":2610},97,[1053,2612,2458],{"class":1160},[1053,2614,2615],{"class":1164},"Cached database",[1053,2617,2500],{"class":1160},[1053,2619,2621],{"class":1055,"line":2620},98,[1053,2622,2506],{"class":1074},[1053,2624,2626],{"class":1055,"line":2625},99,[1053,2627,1670],{"class":1074},[1053,2629,2631,2633,2636,2638,2640],{"class":1055,"line":2630},100,[1053,2632,1161],{"class":1160},[1053,2634,2635],{"class":1164},"session_api",[1053,2637,1168],{"class":1160},[1053,2639,1171],{"class":1074},[1053,2641,1154],{"class":1074},[1053,2643,2645,2647,2649,2651,2653,2655,2658,2660],{"class":1055,"line":2644},101,[1053,2646,1522],{"class":1160},[1053,2648,2403],{"class":1164},[1053,2650,1168],{"class":1160},[1053,2652,1171],{"class":1074},[1053,2654,1174],{"class":1160},[1053,2656,2657],{"class":1164},"Interface for working with sessions",[1053,2659,1168],{"class":1160},[1053,2661,1182],{"class":1074},[1053,2663,2665,2667,2670,2672,2674,2676,2679,2681],{"class":1055,"line":2664},102,[1053,2666,1522],{"class":1160},[1053,2668,2669],{"class":1164},"access",[1053,2671,1168],{"class":1160},[1053,2673,1171],{"class":1074},[1053,2675,1174],{"class":1160},[1053,2677,2678],{"class":1164},"request.session",[1053,2680,1168],{"class":1160},[1053,2682,1182],{"class":1074},[1053,2684,2686,2688,2691,2693,2695],{"class":1055,"line":2685},103,[1053,2687,1522],{"class":1160},[1053,2689,2690],{"class":1164},"methods",[1053,2692,1168],{"class":1160},[1053,2694,1171],{"class":1074},[1053,2696,2452],{"class":1074},[1053,2698,2700,2702,2705,2707,2709,2711,2714,2716,2718,2720,2723,2725,2727,2729,2732,2734],{"class":1055,"line":2699},104,[1053,2701,2458],{"class":1160},[1053,2703,2704],{"class":1164},"get()",[1053,2706,1168],{"class":1160},[1053,2708,1375],{"class":1074},[1053,2710,1174],{"class":1160},[1053,2712,2713],{"class":1164},"set()",[1053,2715,1168],{"class":1160},[1053,2717,1375],{"class":1074},[1053,2719,1174],{"class":1160},[1053,2721,2722],{"class":1164},"pop()",[1053,2724,1168],{"class":1160},[1053,2726,1375],{"class":1074},[1053,2728,1174],{"class":1160},[1053,2730,2731],{"class":1164},"clear()",[1053,2733,1168],{"class":1160},[1053,2735,1182],{"class":1074},[1053,2737,2739,2741,2744,2746,2748,2750,2753,2755,2757,2759,2762],{"class":1055,"line":2738},105,[1053,2740,2458],{"class":1160},[1053,2742,2743],{"class":1164},"flush()",[1053,2745,1168],{"class":1160},[1053,2747,1375],{"class":1074},[1053,2749,1174],{"class":1160},[1053,2751,2752],{"class":1164},"cycle_key()",[1053,2754,1168],{"class":1160},[1053,2756,1375],{"class":1074},[1053,2758,1174],{"class":1160},[1053,2760,2761],{"class":1164},"set_expiry()",[1053,2763,2500],{"class":1160},[1053,2765,2767],{"class":1055,"line":2766},106,[1053,2768,2506],{"class":1074},[1053,2770,2772],{"class":1055,"line":2771},107,[1053,2773,2283],{"class":1074},[1053,2775,2777],{"class":1055,"line":2776},108,[1053,2778,1259],{"class":1074},[1053,2780,2782],{"class":1055,"line":2781},109,[1053,2783,1136],{"class":1095},[1053,2785,2787,2789],{"class":1055,"line":2786},110,[1053,2788,1446],{"class":1445},[1053,2790,2791],{"class":1095}," framework_components\n",[1053,2793,2795],{"class":1055,"line":2794},111,[1053,2796,1096],{"class":1095},[1053,2798,2800,2802],{"class":1055,"line":2799},112,[1053,2801,1102],{"class":1074},[1053,2803,1106],{"class":1105},[1053,2805,2807,2809,2812],{"class":1055,"line":2806},113,[1053,2808,1112],{"class":1066},[1053,2810,2811],{"class":1115}," basic_session_usage",[1053,2813,1119],{"class":1074},[1053,2815,2817,2819,2822],{"class":1055,"line":2816},114,[1053,2818,1125],{"class":1081},[1053,2820,2821],{"class":1085},"Basic session usage examples",[1053,2823,1089],{"class":1081},[1053,2825,2827],{"class":1055,"line":2826},115,[1053,2828,1136],{"class":1095},[1053,2830,2832],{"class":1055,"line":2831},116,[1053,2833,2834],{"class":1059},"        # View examples showing session usage\n",[1053,2836,2838,2841,2843],{"class":1055,"line":2837},117,[1053,2839,2840],{"class":1095},"        session_examples ",[1053,2842,1151],{"class":1074},[1053,2844,2845],{"class":1160}," \"\"\"\n",[1053,2847,2849],{"class":1055,"line":2848},118,[1053,2850,2851],{"class":1164},"        # Setting session data\n",[1053,2853,2855],{"class":1055,"line":2854},119,[1053,2856,2857],{"class":1164},"        def set_user_preference(request):\n",[1053,2859,2861],{"class":1055,"line":2860},120,[1053,2862,2863],{"class":1164},"            request.session['theme'] = 'dark'\n",[1053,2865,2867],{"class":1055,"line":2866},121,[1053,2868,2869],{"class":1164},"            request.session['language'] = 'en'\n",[1053,2871,2873],{"class":1055,"line":2872},122,[1053,2874,2875],{"class":1164},"            return HttpResponse('Preferences saved')\n",[1053,2877,2879],{"class":1055,"line":2878},123,[1053,2880,1136],{"class":1164},[1053,2882,2884],{"class":1055,"line":2883},124,[1053,2885,2886],{"class":1164},"        # Getting session data\n",[1053,2888,2890],{"class":1055,"line":2889},125,[1053,2891,2892],{"class":1164},"        def get_user_preference(request):\n",[1053,2894,2896],{"class":1055,"line":2895},126,[1053,2897,2898],{"class":1164},"            theme = request.session.get('theme', 'light')\n",[1053,2900,2902],{"class":1055,"line":2901},127,[1053,2903,2904],{"class":1164},"            language = request.session.get('language', 'en')\n",[1053,2906,2908],{"class":1055,"line":2907},128,[1053,2909,2910],{"class":1164},"            return render(request, 'profile.html', {\n",[1053,2912,2914],{"class":1055,"line":2913},129,[1053,2915,2916],{"class":1164},"                'theme': theme,\n",[1053,2918,2920],{"class":1055,"line":2919},130,[1053,2921,2922],{"class":1164},"                'language': language\n",[1053,2924,2926],{"class":1055,"line":2925},131,[1053,2927,2928],{"class":1164},"            })\n",[1053,2930,2932],{"class":1055,"line":2931},132,[1053,2933,1136],{"class":1164},[1053,2935,2937],{"class":1055,"line":2936},133,[1053,2938,2939],{"class":1164},"        # Modifying session data\n",[1053,2941,2943],{"class":1055,"line":2942},134,[1053,2944,2945],{"class":1164},"        def add_to_cart(request, product_id):\n",[1053,2947,2949],{"class":1055,"line":2948},135,[1053,2950,2951],{"class":1164},"            cart = request.session.get('cart', [])\n",[1053,2953,2955],{"class":1055,"line":2954},136,[1053,2956,2957],{"class":1164},"            cart.append(product_id)\n",[1053,2959,2961],{"class":1055,"line":2960},137,[1053,2962,2963],{"class":1164},"            request.session['cart'] = cart\n",[1053,2965,2967],{"class":1055,"line":2966},138,[1053,2968,2969],{"class":1164},"            request.session.modified = True  # Important for mutable objects\n",[1053,2971,2973],{"class":1055,"line":2972},139,[1053,2974,2975],{"class":1164},"            return HttpResponse('Added to cart')\n",[1053,2977,2979],{"class":1055,"line":2978},140,[1053,2980,1136],{"class":1164},[1053,2982,2984],{"class":1055,"line":2983},141,[1053,2985,2986],{"class":1164},"        # Clearing session data\n",[1053,2988,2990],{"class":1055,"line":2989},142,[1053,2991,2992],{"class":1164},"        def logout_user(request):\n",[1053,2994,2996],{"class":1055,"line":2995},143,[1053,2997,2998],{"class":1164},"            request.session.flush()  # Removes all session data\n",[1053,3000,3002],{"class":1055,"line":3001},144,[1053,3003,3004],{"class":1164},"            return redirect('login')\n",[1053,3006,3008],{"class":1055,"line":3007},145,[1053,3009,3010],{"class":1160},"        \"\"\"\n",[1053,3012,3014],{"class":1055,"line":3013},146,[1053,3015,1136],{"class":1095},[1053,3017,3019,3021],{"class":1055,"line":3018},147,[1053,3020,1446],{"class":1445},[1053,3022,3023],{"class":1095}," session_examples\n",[1053,3025,3027],{"class":1055,"line":3026},148,[1053,3028,2308],{"emptyLinePlaceholder":2307},[1053,3030,3032],{"class":1055,"line":3031},149,[1053,3033,3034],{"class":1059},"# Cookie fundamentals\n",[1053,3036,3038,3040,3043],{"class":1055,"line":3037},150,[1053,3039,1067],{"class":1066},[1053,3041,3042],{"class":1070}," CookieManagement",[1053,3044,1075],{"class":1074},[1053,3046,3048,3050,3053],{"class":1055,"line":3047},151,[1053,3049,1082],{"class":1081},[1053,3051,3052],{"class":1085},"Understanding and managing cookies in Django",[1053,3054,1089],{"class":1081},[1053,3056,3058],{"class":1055,"line":3057},152,[1053,3059,1096],{"class":1095},[1053,3061,3063,3065],{"class":1055,"line":3062},153,[1053,3064,1102],{"class":1074},[1053,3066,1106],{"class":1105},[1053,3068,3070,3072,3075],{"class":1055,"line":3069},154,[1053,3071,1112],{"class":1066},[1053,3073,3074],{"class":1115}," cookie_basics",[1053,3076,1119],{"class":1074},[1053,3078,3080,3082,3085],{"class":1055,"line":3079},155,[1053,3081,1125],{"class":1081},[1053,3083,3084],{"class":1085},"Cookie fundamentals and properties",[1053,3086,1089],{"class":1081},[1053,3088,3090],{"class":1055,"line":3089},156,[1053,3091,1136],{"class":1095},[1053,3093,3095,3098,3100],{"class":1055,"line":3094},157,[1053,3096,3097],{"class":1095},"        cookie_properties ",[1053,3099,1151],{"class":1074},[1053,3101,1154],{"class":1074},[1053,3103,3105,3107,3110,3112,3114],{"class":1055,"line":3104},158,[1053,3106,1161],{"class":1160},[1053,3108,3109],{"class":1164},"name_value",[1053,3111,1168],{"class":1160},[1053,3113,1171],{"class":1074},[1053,3115,1154],{"class":1074},[1053,3117,3119,3121,3123,3125,3127,3129,3132,3134],{"class":1055,"line":3118},159,[1053,3120,1522],{"class":1160},[1053,3122,1525],{"class":1164},[1053,3124,1168],{"class":1160},[1053,3126,1171],{"class":1074},[1053,3128,1174],{"class":1160},[1053,3130,3131],{"class":1164},"Cookie identifier and data",[1053,3133,1168],{"class":1160},[1053,3135,1182],{"class":1074},[1053,3137,3139,3141,3144,3146,3148,3150,3153,3155],{"class":1055,"line":3138},160,[1053,3140,1522],{"class":1160},[1053,3142,3143],{"class":1164},"example",[1053,3145,1168],{"class":1160},[1053,3147,1171],{"class":1074},[1053,3149,1174],{"class":1160},[1053,3151,3152],{"class":1164},"sessionid=abc123def456",[1053,3154,1168],{"class":1160},[1053,3156,1182],{"class":1074},[1053,3158,3160,3162,3165,3167,3169,3171,3173,3176,3178,3180,3182,3185,3187],{"class":1055,"line":3159},161,[1053,3161,1522],{"class":1160},[1053,3163,3164],{"class":1164},"rules",[1053,3166,1168],{"class":1160},[1053,3168,1171],{"class":1074},[1053,3170,1553],{"class":1074},[1053,3172,1168],{"class":1160},[1053,3174,3175],{"class":1164},"Name is case-sensitive",[1053,3177,1168],{"class":1160},[1053,3179,1375],{"class":1074},[1053,3181,1174],{"class":1160},[1053,3183,3184],{"class":1164},"Value is string data",[1053,3186,1168],{"class":1160},[1053,3188,1664],{"class":1074},[1053,3190,3192],{"class":1055,"line":3191},162,[1053,3193,1670],{"class":1074},[1053,3195,3197,3199,3202,3204,3206],{"class":1055,"line":3196},163,[1053,3198,1161],{"class":1160},[1053,3200,3201],{"class":1164},"domain",[1053,3203,1168],{"class":1160},[1053,3205,1171],{"class":1074},[1053,3207,1154],{"class":1074},[1053,3209,3211,3213,3215,3217,3219,3221,3224,3226],{"class":1055,"line":3210},164,[1053,3212,1522],{"class":1160},[1053,3214,1525],{"class":1164},[1053,3216,1168],{"class":1160},[1053,3218,1171],{"class":1074},[1053,3220,1174],{"class":1160},[1053,3222,3223],{"class":1164},"Which domains can access the cookie",[1053,3225,1168],{"class":1160},[1053,3227,1182],{"class":1074},[1053,3229,3231,3233,3235,3237,3239,3241,3244,3246],{"class":1055,"line":3230},165,[1053,3232,1522],{"class":1160},[1053,3234,3143],{"class":1164},[1053,3236,1168],{"class":1160},[1053,3238,1171],{"class":1074},[1053,3240,1174],{"class":1160},[1053,3242,3243],{"class":1164},".example.com",[1053,3245,1168],{"class":1160},[1053,3247,1182],{"class":1074},[1053,3249,3251,3253,3255,3257,3259,3261,3263,3266,3268,3270,3272,3275,3277],{"class":1055,"line":3250},166,[1053,3252,1522],{"class":1160},[1053,3254,3164],{"class":1164},[1053,3256,1168],{"class":1160},[1053,3258,1171],{"class":1074},[1053,3260,1553],{"class":1074},[1053,3262,1168],{"class":1160},[1053,3264,3265],{"class":1164},"Defaults to current domain",[1053,3267,1168],{"class":1160},[1053,3269,1375],{"class":1074},[1053,3271,1174],{"class":1160},[1053,3273,3274],{"class":1164},"Subdomain access with dot prefix",[1053,3276,1168],{"class":1160},[1053,3278,1664],{"class":1074},[1053,3280,3282],{"class":1055,"line":3281},167,[1053,3283,1670],{"class":1074},[1053,3285,3287,3289,3291,3293,3295],{"class":1055,"line":3286},168,[1053,3288,1161],{"class":1160},[1053,3290,1190],{"class":1164},[1053,3292,1168],{"class":1160},[1053,3294,1171],{"class":1074},[1053,3296,1154],{"class":1074},[1053,3298,3300,3302,3304,3306,3308,3310,3313,3315],{"class":1055,"line":3299},169,[1053,3301,1522],{"class":1160},[1053,3303,1525],{"class":1164},[1053,3305,1168],{"class":1160},[1053,3307,1171],{"class":1074},[1053,3309,1174],{"class":1160},[1053,3311,3312],{"class":1164},"URL path scope for cookie",[1053,3314,1168],{"class":1160},[1053,3316,1182],{"class":1074},[1053,3318,3320,3322,3324,3326,3328,3330,3333,3335],{"class":1055,"line":3319},170,[1053,3321,1522],{"class":1160},[1053,3323,3143],{"class":1164},[1053,3325,1168],{"class":1160},[1053,3327,1171],{"class":1074},[1053,3329,1174],{"class":1160},[1053,3331,3332],{"class":1164},"/admin/",[1053,3334,1168],{"class":1160},[1053,3336,1182],{"class":1074},[1053,3338,3340,3342,3344,3346,3348,3350,3352,3355,3357,3359,3361,3364,3366],{"class":1055,"line":3339},171,[1053,3341,1522],{"class":1160},[1053,3343,3164],{"class":1164},[1053,3345,1168],{"class":1160},[1053,3347,1171],{"class":1074},[1053,3349,1553],{"class":1074},[1053,3351,1168],{"class":1160},[1053,3353,3354],{"class":1164},"Defaults to current path",[1053,3356,1168],{"class":1160},[1053,3358,1375],{"class":1074},[1053,3360,1174],{"class":1160},[1053,3362,3363],{"class":1164},"More specific paths override",[1053,3365,1168],{"class":1160},[1053,3367,1664],{"class":1074},[1053,3369,3371],{"class":1055,"line":3370},172,[1053,3372,1670],{"class":1074},[1053,3374,3376,3378,3381,3383,3385],{"class":1055,"line":3375},173,[1053,3377,1161],{"class":1160},[1053,3379,3380],{"class":1164},"expires",[1053,3382,1168],{"class":1160},[1053,3384,1171],{"class":1074},[1053,3386,1154],{"class":1074},[1053,3388,3390,3392,3394,3396,3398,3400,3403,3405],{"class":1055,"line":3389},174,[1053,3391,1522],{"class":1160},[1053,3393,1525],{"class":1164},[1053,3395,1168],{"class":1160},[1053,3397,1171],{"class":1074},[1053,3399,1174],{"class":1160},[1053,3401,3402],{"class":1164},"When cookie expires",[1053,3404,1168],{"class":1160},[1053,3406,1182],{"class":1074},[1053,3408,3410,3412,3414,3416,3418,3420,3423,3425],{"class":1055,"line":3409},175,[1053,3411,1522],{"class":1160},[1053,3413,3143],{"class":1164},[1053,3415,1168],{"class":1160},[1053,3417,1171],{"class":1074},[1053,3419,1174],{"class":1160},[1053,3421,3422],{"class":1164},"Wed, 21 Oct 2025 07:28:00 GMT",[1053,3424,1168],{"class":1160},[1053,3426,1182],{"class":1074},[1053,3428,3430,3432,3434,3436,3438,3440,3442,3445,3447,3449,3451,3454,3456],{"class":1055,"line":3429},176,[1053,3431,1522],{"class":1160},[1053,3433,3164],{"class":1164},[1053,3435,1168],{"class":1160},[1053,3437,1171],{"class":1074},[1053,3439,1553],{"class":1074},[1053,3441,1168],{"class":1160},[1053,3443,3444],{"class":1164},"Absolute expiration time",[1053,3446,1168],{"class":1160},[1053,3448,1375],{"class":1074},[1053,3450,1174],{"class":1160},[1053,3452,3453],{"class":1164},"Browser deletes after expiry",[1053,3455,1168],{"class":1160},[1053,3457,1664],{"class":1074},[1053,3459,3461],{"class":1055,"line":3460},177,[1053,3462,1670],{"class":1074},[1053,3464,3466,3468,3471,3473,3475],{"class":1055,"line":3465},178,[1053,3467,1161],{"class":1160},[1053,3469,3470],{"class":1164},"max_age",[1053,3472,1168],{"class":1160},[1053,3474,1171],{"class":1074},[1053,3476,1154],{"class":1074},[1053,3478,3480,3482,3484,3486,3488,3490,3493,3495],{"class":1055,"line":3479},179,[1053,3481,1522],{"class":1160},[1053,3483,1525],{"class":1164},[1053,3485,1168],{"class":1160},[1053,3487,1171],{"class":1074},[1053,3489,1174],{"class":1160},[1053,3491,3492],{"class":1164},"Cookie lifetime in seconds",[1053,3494,1168],{"class":1160},[1053,3496,1182],{"class":1074},[1053,3498,3500,3502,3504,3506,3508,3510,3513,3515],{"class":1055,"line":3499},180,[1053,3501,1522],{"class":1160},[1053,3503,3143],{"class":1164},[1053,3505,1168],{"class":1160},[1053,3507,1171],{"class":1074},[1053,3509,1174],{"class":1160},[1053,3511,3512],{"class":1164},"3600",[1053,3514,1168],{"class":1160},[1053,3516,1182],{"class":1074},[1053,3518,3520,3522,3524,3526,3528,3530,3532,3535,3537,3539,3541,3544,3546],{"class":1055,"line":3519},181,[1053,3521,1522],{"class":1160},[1053,3523,3164],{"class":1164},[1053,3525,1168],{"class":1160},[1053,3527,1171],{"class":1074},[1053,3529,1553],{"class":1074},[1053,3531,1168],{"class":1160},[1053,3533,3534],{"class":1164},"Relative to current time",[1053,3536,1168],{"class":1160},[1053,3538,1375],{"class":1074},[1053,3540,1174],{"class":1160},[1053,3542,3543],{"class":1164},"Takes precedence over expires",[1053,3545,1168],{"class":1160},[1053,3547,1664],{"class":1074},[1053,3549,3551],{"class":1055,"line":3550},182,[1053,3552,1670],{"class":1074},[1053,3554,3556,3558,3561,3563,3565],{"class":1055,"line":3555},183,[1053,3557,1161],{"class":1160},[1053,3559,3560],{"class":1164},"secure",[1053,3562,1168],{"class":1160},[1053,3564,1171],{"class":1074},[1053,3566,1154],{"class":1074},[1053,3568,3570,3572,3574,3576,3578,3580,3583,3585],{"class":1055,"line":3569},184,[1053,3571,1522],{"class":1160},[1053,3573,1525],{"class":1164},[1053,3575,1168],{"class":1160},[1053,3577,1171],{"class":1074},[1053,3579,1174],{"class":1160},[1053,3581,3582],{"class":1164},"HTTPS only transmission",[1053,3584,1168],{"class":1160},[1053,3586,1182],{"class":1074},[1053,3588,3590,3592,3594,3596,3598,3600,3602,3604],{"class":1055,"line":3589},185,[1053,3591,1522],{"class":1160},[1053,3593,3143],{"class":1164},[1053,3595,1168],{"class":1160},[1053,3597,1171],{"class":1074},[1053,3599,1174],{"class":1160},[1053,3601,1722],{"class":1164},[1053,3603,1168],{"class":1160},[1053,3605,1182],{"class":1074},[1053,3607,3609,3611,3613,3615,3617,3619,3621,3624,3626,3628,3630,3633,3635],{"class":1055,"line":3608},186,[1053,3610,1522],{"class":1160},[1053,3612,3164],{"class":1164},[1053,3614,1168],{"class":1160},[1053,3616,1171],{"class":1074},[1053,3618,1553],{"class":1074},[1053,3620,1168],{"class":1160},[1053,3622,3623],{"class":1164},"Cookie only sent over HTTPS",[1053,3625,1168],{"class":1160},[1053,3627,1375],{"class":1074},[1053,3629,1174],{"class":1160},[1053,3631,3632],{"class":1164},"Essential for production",[1053,3634,1168],{"class":1160},[1053,3636,1664],{"class":1074},[1053,3638,3640],{"class":1055,"line":3639},187,[1053,3641,1670],{"class":1074},[1053,3643,3645,3647,3650,3652,3654],{"class":1055,"line":3644},188,[1053,3646,1161],{"class":1160},[1053,3648,3649],{"class":1164},"httponly",[1053,3651,1168],{"class":1160},[1053,3653,1171],{"class":1074},[1053,3655,1154],{"class":1074},[1053,3657,3659,3661,3663,3665,3667,3669,3672,3674],{"class":1055,"line":3658},189,[1053,3660,1522],{"class":1160},[1053,3662,1525],{"class":1164},[1053,3664,1168],{"class":1160},[1053,3666,1171],{"class":1074},[1053,3668,1174],{"class":1160},[1053,3670,3671],{"class":1164},"No JavaScript access",[1053,3673,1168],{"class":1160},[1053,3675,1182],{"class":1074},[1053,3677,3679,3681,3683,3685,3687,3689,3692,3694],{"class":1055,"line":3678},190,[1053,3680,1522],{"class":1160},[1053,3682,3143],{"class":1164},[1053,3684,1168],{"class":1160},[1053,3686,1171],{"class":1074},[1053,3688,1174],{"class":1160},[1053,3690,3691],{"class":1164},"HttpOnly",[1053,3693,1168],{"class":1160},[1053,3695,1182],{"class":1074},[1053,3697,3699,3701,3703,3705,3707,3709,3711,3714,3716,3718,3720,3723,3725],{"class":1055,"line":3698},191,[1053,3700,1522],{"class":1160},[1053,3702,3164],{"class":1164},[1053,3704,1168],{"class":1160},[1053,3706,1171],{"class":1074},[1053,3708,1553],{"class":1074},[1053,3710,1168],{"class":1160},[1053,3712,3713],{"class":1164},"Prevents XSS attacks",[1053,3715,1168],{"class":1160},[1053,3717,1375],{"class":1074},[1053,3719,1174],{"class":1160},[1053,3721,3722],{"class":1164},"Server-side access only",[1053,3724,1168],{"class":1160},[1053,3726,1664],{"class":1074},[1053,3728,3730],{"class":1055,"line":3729},192,[1053,3731,1670],{"class":1074},[1053,3733,3735,3737,3740,3742,3744],{"class":1055,"line":3734},193,[1053,3736,1161],{"class":1160},[1053,3738,3739],{"class":1164},"samesite",[1053,3741,1168],{"class":1160},[1053,3743,1171],{"class":1074},[1053,3745,1154],{"class":1074},[1053,3747,3749,3751,3753,3755,3757,3759,3762,3764],{"class":1055,"line":3748},194,[1053,3750,1522],{"class":1160},[1053,3752,1525],{"class":1164},[1053,3754,1168],{"class":1160},[1053,3756,1171],{"class":1074},[1053,3758,1174],{"class":1160},[1053,3760,3761],{"class":1164},"Cross-site request policy",[1053,3763,1168],{"class":1160},[1053,3765,1182],{"class":1074},[1053,3767,3769,3771,3773,3775,3777,3779,3782,3784],{"class":1055,"line":3768},195,[1053,3770,1522],{"class":1160},[1053,3772,3143],{"class":1164},[1053,3774,1168],{"class":1160},[1053,3776,1171],{"class":1074},[1053,3778,1174],{"class":1160},[1053,3780,3781],{"class":1164},"Strict",[1053,3783,1168],{"class":1160},[1053,3785,1182],{"class":1074},[1053,3787,3789,3791,3793,3795,3797,3799,3801,3804,3806,3808,3810,3813,3815],{"class":1055,"line":3788},196,[1053,3790,1522],{"class":1160},[1053,3792,3164],{"class":1164},[1053,3794,1168],{"class":1160},[1053,3796,1171],{"class":1074},[1053,3798,1553],{"class":1074},[1053,3800,1168],{"class":1160},[1053,3802,3803],{"class":1164},"Strict, Lax, or None",[1053,3805,1168],{"class":1160},[1053,3807,1375],{"class":1074},[1053,3809,1174],{"class":1160},[1053,3811,3812],{"class":1164},"CSRF protection",[1053,3814,1168],{"class":1160},[1053,3816,1664],{"class":1074},[1053,3818,3820],{"class":1055,"line":3819},197,[1053,3821,2283],{"class":1074},[1053,3823,3825],{"class":1055,"line":3824},198,[1053,3826,1259],{"class":1074},[1053,3828,3830],{"class":1055,"line":3829},199,[1053,3831,1136],{"class":1095},[1053,3833,3835,3837],{"class":1055,"line":3834},200,[1053,3836,1446],{"class":1445},[1053,3838,3839],{"class":1095}," cookie_properties\n",[1053,3841,3843],{"class":1055,"line":3842},201,[1053,3844,1096],{"class":1095},[1053,3846,3848,3850],{"class":1055,"line":3847},202,[1053,3849,1102],{"class":1074},[1053,3851,1106],{"class":1105},[1053,3853,3855,3857,3860],{"class":1055,"line":3854},203,[1053,3856,1112],{"class":1066},[1053,3858,3859],{"class":1115}," django_cookie_usage",[1053,3861,1119],{"class":1074},[1053,3863,3865,3867,3870],{"class":1055,"line":3864},204,[1053,3866,1125],{"class":1081},[1053,3868,3869],{"class":1085},"How to work with cookies in Django",[1053,3871,1089],{"class":1081},[1053,3873,3875],{"class":1055,"line":3874},205,[1053,3876,1136],{"class":1095},[1053,3878,3880,3883,3885],{"class":1055,"line":3879},206,[1053,3881,3882],{"class":1095},"        cookie_examples ",[1053,3884,1151],{"class":1074},[1053,3886,2845],{"class":1160},[1053,3888,3890],{"class":1055,"line":3889},207,[1053,3891,3892],{"class":1164},"        # Setting cookies in views\n",[1053,3894,3896],{"class":1055,"line":3895},208,[1053,3897,3898],{"class":1164},"        def set_cookie_view(request):\n",[1053,3900,3902],{"class":1055,"line":3901},209,[1053,3903,3904],{"class":1164},"            response = HttpResponse('Cookie set')\n",[1053,3906,3908],{"class":1055,"line":3907},210,[1053,3909,3910],{"class":1164},"            response.set_cookie(\n",[1053,3912,3914],{"class":1055,"line":3913},211,[1053,3915,3916],{"class":1164},"                'user_preference',\n",[1053,3918,3920],{"class":1055,"line":3919},212,[1053,3921,3922],{"class":1164},"                'dark_theme',\n",[1053,3924,3926],{"class":1055,"line":3925},213,[1053,3927,3928],{"class":1164},"                max_age=30*24*60*60,  # 30 days\n",[1053,3930,3932],{"class":1055,"line":3931},214,[1053,3933,3934],{"class":1164},"                secure=True,\n",[1053,3936,3938],{"class":1055,"line":3937},215,[1053,3939,3940],{"class":1164},"                httponly=True,\n",[1053,3942,3944],{"class":1055,"line":3943},216,[1053,3945,3946],{"class":1164},"                samesite='Strict'\n",[1053,3948,3950],{"class":1055,"line":3949},217,[1053,3951,3952],{"class":1164},"            )\n",[1053,3954,3956],{"class":1055,"line":3955},218,[1053,3957,3958],{"class":1164},"            return response\n",[1053,3960,3962],{"class":1055,"line":3961},219,[1053,3963,1136],{"class":1164},[1053,3965,3967],{"class":1055,"line":3966},220,[1053,3968,3969],{"class":1164},"        # Reading cookies\n",[1053,3971,3973],{"class":1055,"line":3972},221,[1053,3974,3975],{"class":1164},"        def read_cookie_view(request):\n",[1053,3977,3979],{"class":1055,"line":3978},222,[1053,3980,3981],{"class":1164},"            preference = request.COOKIES.get('user_preference', 'light_theme')\n",[1053,3983,3985,3988,3992],{"class":1055,"line":3984},223,[1053,3986,3987],{"class":1164},"            return HttpResponse(f'Your preference: ",[1053,3989,3991],{"class":3990},"s3h35","{preference}",[1053,3993,3994],{"class":1164},"')\n",[1053,3996,3998],{"class":1055,"line":3997},224,[1053,3999,1136],{"class":1164},[1053,4001,4003],{"class":1055,"line":4002},225,[1053,4004,4005],{"class":1164},"        # Deleting cookies\n",[1053,4007,4009],{"class":1055,"line":4008},226,[1053,4010,4011],{"class":1164},"        def delete_cookie_view(request):\n",[1053,4013,4015],{"class":1055,"line":4014},227,[1053,4016,4017],{"class":1164},"            response = HttpResponse('Cookie deleted')\n",[1053,4019,4021],{"class":1055,"line":4020},228,[1053,4022,4023],{"class":1164},"            response.delete_cookie('user_preference')\n",[1053,4025,4027],{"class":1055,"line":4026},229,[1053,4028,3958],{"class":1164},[1053,4030,4032],{"class":1055,"line":4031},230,[1053,4033,1136],{"class":1164},[1053,4035,4037],{"class":1055,"line":4036},231,[1053,4038,4039],{"class":1164},"        # Signed cookies for security\n",[1053,4041,4043],{"class":1055,"line":4042},232,[1053,4044,4045],{"class":1164},"        def set_signed_cookie_view(request):\n",[1053,4047,4049],{"class":1055,"line":4048},233,[1053,4050,4051],{"class":1164},"            response = HttpResponse('Signed cookie set')\n",[1053,4053,4055],{"class":1055,"line":4054},234,[1053,4056,4057],{"class":1164},"            response.set_signed_cookie(\n",[1053,4059,4061],{"class":1055,"line":4060},235,[1053,4062,4063],{"class":1164},"                'secure_data',\n",[1053,4065,4067],{"class":1055,"line":4066},236,[1053,4068,4069],{"class":1164},"                'sensitive_value',\n",[1053,4071,4073],{"class":1055,"line":4072},237,[1053,4074,4075],{"class":1164},"                salt='my-salt-key'\n",[1053,4077,4079],{"class":1055,"line":4078},238,[1053,4080,3952],{"class":1164},[1053,4082,4084],{"class":1055,"line":4083},239,[1053,4085,3958],{"class":1164},[1053,4087,4089],{"class":1055,"line":4088},240,[1053,4090,1136],{"class":1164},[1053,4092,4094],{"class":1055,"line":4093},241,[1053,4095,4096],{"class":1164},"        def read_signed_cookie_view(request):\n",[1053,4098,4100],{"class":1055,"line":4099},242,[1053,4101,4102],{"class":1164},"            try:\n",[1053,4104,4106],{"class":1055,"line":4105},243,[1053,4107,4108],{"class":1164},"                value = request.get_signed_cookie(\n",[1053,4110,4112],{"class":1055,"line":4111},244,[1053,4113,4114],{"class":1164},"                    'secure_data',\n",[1053,4116,4118],{"class":1055,"line":4117},245,[1053,4119,4120],{"class":1164},"                    salt='my-salt-key'\n",[1053,4122,4124],{"class":1055,"line":4123},246,[1053,4125,4126],{"class":1164},"                )\n",[1053,4128,4130,4133,4136],{"class":1055,"line":4129},247,[1053,4131,4132],{"class":1164},"                return HttpResponse(f'Secure value: ",[1053,4134,4135],{"class":3990},"{value}",[1053,4137,3994],{"class":1164},[1053,4139,4141],{"class":1055,"line":4140},248,[1053,4142,4143],{"class":1164},"            except BadSignature:\n",[1053,4145,4147],{"class":1055,"line":4146},249,[1053,4148,4149],{"class":1164},"                return HttpResponse('Cookie tampered with!')\n",[1053,4151,4153],{"class":1055,"line":4152},250,[1053,4154,3010],{"class":1160},[1053,4156,4158],{"class":1055,"line":4157},251,[1053,4159,1136],{"class":1095},[1053,4161,4163,4165],{"class":1055,"line":4162},252,[1053,4164,1446],{"class":1445},[1053,4166,4167],{"class":1095}," cookie_examples\n",[1030,4169,4171],{"id":4170},"django-session-framework","Django Session Framework",[1038,4173,4175],{"id":4174},"session-configuration-and-backends","Session Configuration and Backends",[1043,4177,4179],{"className":1045,"code":4178,"language":1047,"meta":1048,"style":1048},"# Session configuration in Django\nclass SessionConfiguration:\n    \"\"\"Configure Django sessions for different use cases\"\"\"\n    \n    @staticmethod\n    def session_settings():\n        \"\"\"Essential session settings\"\"\"\n        \n        settings_config = {\n            # Session engine (backend)\n            'SESSION_ENGINE': 'django.contrib.sessions.backends.db',  # Default\n            \n            # Session cookie settings\n            'SESSION_COOKIE_NAME': 'sessionid',\n            'SESSION_COOKIE_AGE': 1209600,  # 2 weeks in seconds\n            'SESSION_COOKIE_DOMAIN': None,  # Use default domain\n            'SESSION_COOKIE_SECURE': True,  # HTTPS only in production\n            'SESSION_COOKIE_HTTPONLY': True,  # No JavaScript access\n            'SESSION_COOKIE_SAMESITE': 'Lax',  # CSRF protection\n            \n            # Session behavior\n            'SESSION_EXPIRE_AT_BROWSER_CLOSE': False,\n            'SESSION_SAVE_EVERY_REQUEST': False,\n            'SESSION_COOKIE_PATH': '/',\n            \n            # Cache settings (for cache-based sessions)\n            'SESSION_CACHE_ALIAS': 'default',\n            \n            # File-based session settings\n            'SESSION_FILE_PATH': None,  # Use system temp directory\n            \n            # Security\n            'SESSION_SERIALIZER': 'django.contrib.sessions.serializers.JSONSerializer'\n        }\n        \n        return settings_config\n    \n    @staticmethod\n    def session_backends():\n        \"\"\"Different session backend options\"\"\"\n        \n        backends = {\n            'database': {\n                'engine': 'django.contrib.sessions.backends.db',\n                'description': 'Store sessions in database table',\n                'pros': ['Persistent', 'Reliable', 'Default choice'],\n                'cons': ['Database overhead', 'Requires cleanup'],\n                'use_case': 'Most applications',\n                'setup': 'Requires django_session table'\n            },\n            'cache': {\n                'engine': 'django.contrib.sessions.backends.cache',\n                'description': 'Store sessions in cache system',\n                'pros': ['Fast access', 'Automatic expiry', 'Memory efficient'],\n                'cons': ['Not persistent', 'Can be evicted'],\n                'use_case': 'High-performance applications',\n                'setup': 'Requires cache configuration'\n            },\n            'cached_db': {\n                'engine': 'django.contrib.sessions.backends.cached_db',\n                'description': 'Cache with database fallback',\n                'pros': ['Fast + persistent', 'Best of both worlds'],\n                'cons': ['More complex', 'Higher resource usage'],\n                'use_case': 'High-traffic applications',\n                'setup': 'Requires both cache and database'\n            },\n            'file': {\n                'engine': 'django.contrib.sessions.backends.file',\n                'description': 'Store sessions as files',\n                'pros': ['Simple', 'No database needed'],\n                'cons': ['File system overhead', 'Cleanup required'],\n                'use_case': 'Development or simple deployments',\n                'setup': 'Requires file system access'\n            },\n            'signed_cookies': {\n                'engine': 'django.contrib.sessions.backends.signed_cookies',\n                'description': 'Store session data in signed cookies',\n                'pros': ['No server storage', 'Stateless'],\n                'cons': ['Size limited', 'Security considerations'],\n                'use_case': 'Stateless applications',\n                'setup': 'Requires SECRET_KEY configuration'\n            }\n        }\n        \n        return backends\n\n# Session lifecycle management\nclass SessionLifecycle:\n    \"\"\"Understanding session creation, modification, and cleanup\"\"\"\n    \n    @staticmethod\n    def session_creation_flow():\n        \"\"\"How Django creates and manages sessions\"\"\"\n        \n        flow_steps = [\n            \"1. Request arrives without session cookie\",\n            \"2. SessionMiddleware creates new session object\",\n            \"3. Session gets unique session key\",\n            \"4. Session data stored in configured backend\",\n            \"5. Session cookie sent to browser\",\n            \"6. Subsequent requests include session cookie\",\n            \"7. SessionMiddleware loads existing session data\",\n            \"8. View can read/modify session data\",\n            \"9. Session changes saved to backend\",\n            \"10. Updated session cookie sent if needed\"\n        ]\n        \n        return flow_steps\n    \n    @staticmethod\n    def session_security_considerations():\n        \"\"\"Security aspects of session management\"\"\"\n        \n        security_measures = {\n            'session_hijacking_prevention': [\n                'Use HTTPS for session cookies',\n                'Set HttpOnly flag on session cookies',\n                'Implement session regeneration on login',\n                'Validate session against user agent/IP',\n                'Use short session timeouts'\n            ],\n            'session_fixation_prevention': [\n                'Regenerate session ID on authentication',\n                'Use session.cycle_key() method',\n                'Clear session data on logout',\n                'Validate session ownership'\n            ],\n            'data_protection': [\n                'Use signed cookies for sensitive data',\n                'Encrypt session data if needed',\n                'Minimize data stored in sessions',\n                'Regular session cleanup',\n                'Secure session backend storage'\n            ]\n        }\n        \n        return security_measures\n",[1050,4180,4181,4186,4195,4204,4208,4214,4223,4232,4236,4245,4250,4273,4278,4283,4303,4323,4342,4361,4379,4402,4406,4411,4427,4442,4462,4466,4471,4491,4495,4500,4518,4522,4527,4545,4549,4553,4560,4564,4570,4579,4588,4592,4601,4614,4633,4652,4690,4720,4740,4758,4762,4775,4794,4813,4851,4881,4900,4917,4921,4934,4953,4972,5002,5032,5051,5068,5072,5085,5104,5123,5152,5182,5201,5218,5222,5235,5254,5273,5303,5332,5351,5368,5372,5376,5380,5387,5391,5396,5405,5414,5418,5424,5433,5442,5446,5455,5468,5479,5490,5501,5512,5523,5534,5545,5556,5565,5570,5574,5581,5585,5591,5600,5609,5613,5622,5635,5646,5657,5668,5679,5688,5693,5706,5717,5728,5739,5748,5752,5765,5776,5787,5798,5809,5818,5823,5827,5831],{"__ignoreMap":1048},[1053,4182,4183],{"class":1055,"line":1056},[1053,4184,4185],{"class":1059},"# Session configuration in Django\n",[1053,4187,4188,4190,4193],{"class":1055,"line":1063},[1053,4189,1067],{"class":1066},[1053,4191,4192],{"class":1070}," SessionConfiguration",[1053,4194,1075],{"class":1074},[1053,4196,4197,4199,4202],{"class":1055,"line":1078},[1053,4198,1082],{"class":1081},[1053,4200,4201],{"class":1085},"Configure Django sessions for different use cases",[1053,4203,1089],{"class":1081},[1053,4205,4206],{"class":1055,"line":1092},[1053,4207,1096],{"class":1095},[1053,4209,4210,4212],{"class":1055,"line":1099},[1053,4211,1102],{"class":1074},[1053,4213,1106],{"class":1105},[1053,4215,4216,4218,4221],{"class":1055,"line":1109},[1053,4217,1112],{"class":1066},[1053,4219,4220],{"class":1115}," session_settings",[1053,4222,1119],{"class":1074},[1053,4224,4225,4227,4230],{"class":1055,"line":1122},[1053,4226,1125],{"class":1081},[1053,4228,4229],{"class":1085},"Essential session settings",[1053,4231,1089],{"class":1081},[1053,4233,4234],{"class":1055,"line":1133},[1053,4235,1136],{"class":1095},[1053,4237,4238,4241,4243],{"class":1055,"line":1139},[1053,4239,4240],{"class":1095},"        settings_config ",[1053,4242,1151],{"class":1074},[1053,4244,1154],{"class":1074},[1053,4246,4247],{"class":1055,"line":1145},[1053,4248,4249],{"class":1059},"            # Session engine (backend)\n",[1053,4251,4252,4254,4257,4259,4261,4263,4266,4268,4270],{"class":1055,"line":1157},[1053,4253,1161],{"class":1160},[1053,4255,4256],{"class":1164},"SESSION_ENGINE",[1053,4258,1168],{"class":1160},[1053,4260,1171],{"class":1074},[1053,4262,1174],{"class":1160},[1053,4264,4265],{"class":1164},"django.contrib.sessions.backends.db",[1053,4267,1168],{"class":1160},[1053,4269,1375],{"class":1074},[1053,4271,4272],{"class":1059},"  # Default\n",[1053,4274,4275],{"class":1055,"line":1185},[1053,4276,4277],{"class":1095},"            \n",[1053,4279,4280],{"class":1055,"line":1206},[1053,4281,4282],{"class":1059},"            # Session cookie settings\n",[1053,4284,4285,4287,4290,4292,4294,4296,4299,4301],{"class":1055,"line":1240},[1053,4286,1161],{"class":1160},[1053,4288,4289],{"class":1164},"SESSION_COOKIE_NAME",[1053,4291,1168],{"class":1160},[1053,4293,1171],{"class":1074},[1053,4295,1174],{"class":1160},[1053,4297,4298],{"class":1164},"sessionid",[1053,4300,1168],{"class":1160},[1053,4302,1182],{"class":1074},[1053,4304,4305,4307,4310,4312,4314,4318,4320],{"class":1055,"line":1256},[1053,4306,1161],{"class":1160},[1053,4308,4309],{"class":1164},"SESSION_COOKIE_AGE",[1053,4311,1168],{"class":1160},[1053,4313,1171],{"class":1074},[1053,4315,4317],{"class":4316},"s7CZa"," 1209600",[1053,4319,1375],{"class":1074},[1053,4321,4322],{"class":1059},"  # 2 weeks in seconds\n",[1053,4324,4325,4327,4330,4332,4334,4337,4339],{"class":1055,"line":1262},[1053,4326,1161],{"class":1160},[1053,4328,4329],{"class":1164},"SESSION_COOKIE_DOMAIN",[1053,4331,1168],{"class":1160},[1053,4333,1171],{"class":1074},[1053,4335,4336],{"class":1252}," None",[1053,4338,1375],{"class":1074},[1053,4340,4341],{"class":1059},"  # Use default domain\n",[1053,4343,4344,4346,4349,4351,4353,4356,4358],{"class":1055,"line":1267},[1053,4345,1161],{"class":1160},[1053,4347,4348],{"class":1164},"SESSION_COOKIE_SECURE",[1053,4350,1168],{"class":1160},[1053,4352,1171],{"class":1074},[1053,4354,4355],{"class":1252}," True",[1053,4357,1375],{"class":1074},[1053,4359,4360],{"class":1059},"  # HTTPS only in production\n",[1053,4362,4363,4365,4368,4370,4372,4374,4376],{"class":1055,"line":1277},[1053,4364,1161],{"class":1160},[1053,4366,4367],{"class":1164},"SESSION_COOKIE_HTTPONLY",[1053,4369,1168],{"class":1160},[1053,4371,1171],{"class":1074},[1053,4373,4355],{"class":1252},[1053,4375,1375],{"class":1074},[1053,4377,4378],{"class":1059},"  # No JavaScript access\n",[1053,4380,4381,4383,4386,4388,4390,4392,4395,4397,4399],{"class":1055,"line":1297},[1053,4382,1161],{"class":1160},[1053,4384,4385],{"class":1164},"SESSION_COOKIE_SAMESITE",[1053,4387,1168],{"class":1160},[1053,4389,1171],{"class":1074},[1053,4391,1174],{"class":1160},[1053,4393,4394],{"class":1164},"Lax",[1053,4396,1168],{"class":1160},[1053,4398,1375],{"class":1074},[1053,4400,4401],{"class":1059},"  # CSRF protection\n",[1053,4403,4404],{"class":1055,"line":1317},[1053,4405,4277],{"class":1095},[1053,4407,4408],{"class":1055,"line":1346},[1053,4409,4410],{"class":1059},"            # Session behavior\n",[1053,4412,4413,4415,4418,4420,4422,4425],{"class":1055,"line":1397},[1053,4414,1161],{"class":1160},[1053,4416,4417],{"class":1164},"SESSION_EXPIRE_AT_BROWSER_CLOSE",[1053,4419,1168],{"class":1160},[1053,4421,1171],{"class":1074},[1053,4423,4424],{"class":1252}," False",[1053,4426,1182],{"class":1074},[1053,4428,4429,4431,4434,4436,4438,4440],{"class":1055,"line":1402},[1053,4430,1161],{"class":1160},[1053,4432,4433],{"class":1164},"SESSION_SAVE_EVERY_REQUEST",[1053,4435,1168],{"class":1160},[1053,4437,1171],{"class":1074},[1053,4439,4424],{"class":1252},[1053,4441,1182],{"class":1074},[1053,4443,4444,4446,4449,4451,4453,4455,4458,4460],{"class":1055,"line":1407},[1053,4445,1161],{"class":1160},[1053,4447,4448],{"class":1164},"SESSION_COOKIE_PATH",[1053,4450,1168],{"class":1160},[1053,4452,1171],{"class":1074},[1053,4454,1174],{"class":1160},[1053,4456,4457],{"class":1164},"/",[1053,4459,1168],{"class":1160},[1053,4461,1182],{"class":1074},[1053,4463,4464],{"class":1055,"line":1413},[1053,4465,4277],{"class":1095},[1053,4467,4468],{"class":1055,"line":1419},[1053,4469,4470],{"class":1059},"            # Cache settings (for cache-based sessions)\n",[1053,4472,4473,4475,4478,4480,4482,4484,4487,4489],{"class":1055,"line":1425},[1053,4474,1161],{"class":1160},[1053,4476,4477],{"class":1164},"SESSION_CACHE_ALIAS",[1053,4479,1168],{"class":1160},[1053,4481,1171],{"class":1074},[1053,4483,1174],{"class":1160},[1053,4485,4486],{"class":1164},"default",[1053,4488,1168],{"class":1160},[1053,4490,1182],{"class":1074},[1053,4492,4493],{"class":1055,"line":1431},[1053,4494,4277],{"class":1095},[1053,4496,4497],{"class":1055,"line":1437},[1053,4498,4499],{"class":1059},"            # File-based session settings\n",[1053,4501,4502,4504,4507,4509,4511,4513,4515],{"class":1055,"line":1442},[1053,4503,1161],{"class":1160},[1053,4505,4506],{"class":1164},"SESSION_FILE_PATH",[1053,4508,1168],{"class":1160},[1053,4510,1171],{"class":1074},[1053,4512,4336],{"class":1252},[1053,4514,1375],{"class":1074},[1053,4516,4517],{"class":1059},"  # Use system temp directory\n",[1053,4519,4520],{"class":1055,"line":1458},[1053,4521,4277],{"class":1095},[1053,4523,4524],{"class":1055,"line":1463},[1053,4525,4526],{"class":1059},"            # Security\n",[1053,4528,4529,4531,4534,4536,4538,4540,4543],{"class":1055,"line":1470},[1053,4530,1161],{"class":1160},[1053,4532,4533],{"class":1164},"SESSION_SERIALIZER",[1053,4535,1168],{"class":1160},[1053,4537,1171],{"class":1074},[1053,4539,1174],{"class":1160},[1053,4541,4542],{"class":1164},"django.contrib.sessions.serializers.JSONSerializer",[1053,4544,2500],{"class":1160},[1053,4546,4547],{"class":1055,"line":1480},[1053,4548,1259],{"class":1074},[1053,4550,4551],{"class":1055,"line":1490},[1053,4552,1136],{"class":1095},[1053,4554,4555,4557],{"class":1055,"line":1495},[1053,4556,1446],{"class":1445},[1053,4558,4559],{"class":1095}," settings_config\n",[1053,4561,4562],{"class":1055,"line":1505},[1053,4563,1096],{"class":1095},[1053,4565,4566,4568],{"class":1055,"line":1519},[1053,4567,1102],{"class":1074},[1053,4569,1106],{"class":1105},[1053,4571,4572,4574,4577],{"class":1055,"line":1541},[1053,4573,1112],{"class":1066},[1053,4575,4576],{"class":1115}," session_backends",[1053,4578,1119],{"class":1074},[1053,4580,4581,4583,4586],{"class":1055,"line":1584},[1053,4582,1125],{"class":1081},[1053,4584,4585],{"class":1085},"Different session backend options",[1053,4587,1089],{"class":1081},[1053,4589,4590],{"class":1055,"line":1625},[1053,4591,1136],{"class":1095},[1053,4593,4594,4597,4599],{"class":1055,"line":1667},[1053,4595,4596],{"class":1095},"        backends ",[1053,4598,1151],{"class":1074},[1053,4600,1154],{"class":1074},[1053,4602,4603,4605,4608,4610,4612],{"class":1055,"line":1673},[1053,4604,1161],{"class":1160},[1053,4606,4607],{"class":1164},"database",[1053,4609,1168],{"class":1160},[1053,4611,1171],{"class":1074},[1053,4613,1154],{"class":1074},[1053,4615,4616,4618,4621,4623,4625,4627,4629,4631],{"class":1055,"line":1687},[1053,4617,1522],{"class":1160},[1053,4619,4620],{"class":1164},"engine",[1053,4622,1168],{"class":1160},[1053,4624,1171],{"class":1074},[1053,4626,1174],{"class":1160},[1053,4628,4265],{"class":1164},[1053,4630,1168],{"class":1160},[1053,4632,1182],{"class":1074},[1053,4634,4635,4637,4639,4641,4643,4645,4648,4650],{"class":1055,"line":1707},[1053,4636,1522],{"class":1160},[1053,4638,1525],{"class":1164},[1053,4640,1168],{"class":1160},[1053,4642,1171],{"class":1074},[1053,4644,1174],{"class":1160},[1053,4646,4647],{"class":1164},"Store sessions in database table",[1053,4649,1168],{"class":1160},[1053,4651,1182],{"class":1074},[1053,4653,4654,4656,4658,4660,4662,4664,4666,4668,4670,4672,4674,4677,4679,4681,4683,4686,4688],{"class":1055,"line":1747},[1053,4655,1522],{"class":1160},[1053,4657,1546],{"class":1164},[1053,4659,1168],{"class":1160},[1053,4661,1171],{"class":1074},[1053,4663,1553],{"class":1074},[1053,4665,1168],{"class":1160},[1053,4667,1576],{"class":1164},[1053,4669,1168],{"class":1160},[1053,4671,1375],{"class":1074},[1053,4673,1174],{"class":1160},[1053,4675,4676],{"class":1164},"Reliable",[1053,4678,1168],{"class":1160},[1053,4680,1375],{"class":1074},[1053,4682,1174],{"class":1160},[1053,4684,4685],{"class":1164},"Default choice",[1053,4687,1168],{"class":1160},[1053,4689,1581],{"class":1074},[1053,4691,4692,4694,4696,4698,4700,4702,4704,4707,4709,4711,4713,4716,4718],{"class":1055,"line":1778},[1053,4693,1522],{"class":1160},[1053,4695,1589],{"class":1164},[1053,4697,1168],{"class":1160},[1053,4699,1171],{"class":1074},[1053,4701,1553],{"class":1074},[1053,4703,1168],{"class":1160},[1053,4705,4706],{"class":1164},"Database overhead",[1053,4708,1168],{"class":1160},[1053,4710,1375],{"class":1074},[1053,4712,1174],{"class":1160},[1053,4714,4715],{"class":1164},"Requires cleanup",[1053,4717,1168],{"class":1160},[1053,4719,1581],{"class":1074},[1053,4721,4722,4724,4727,4729,4731,4733,4736,4738],{"class":1055,"line":1818},[1053,4723,1522],{"class":1160},[1053,4725,4726],{"class":1164},"use_case",[1053,4728,1168],{"class":1160},[1053,4730,1171],{"class":1074},[1053,4732,1174],{"class":1160},[1053,4734,4735],{"class":1164},"Most applications",[1053,4737,1168],{"class":1160},[1053,4739,1182],{"class":1074},[1053,4741,4742,4744,4747,4749,4751,4753,4756],{"class":1055,"line":1823},[1053,4743,1522],{"class":1160},[1053,4745,4746],{"class":1164},"setup",[1053,4748,1168],{"class":1160},[1053,4750,1171],{"class":1074},[1053,4752,1174],{"class":1160},[1053,4754,4755],{"class":1164},"Requires django_session table",[1053,4757,2500],{"class":1160},[1053,4759,4760],{"class":1055,"line":1837},[1053,4761,1670],{"class":1074},[1053,4763,4764,4766,4769,4771,4773],{"class":1055,"line":1857},[1053,4765,1161],{"class":1160},[1053,4767,4768],{"class":1164},"cache",[1053,4770,1168],{"class":1160},[1053,4772,1171],{"class":1074},[1053,4774,1154],{"class":1074},[1053,4776,4777,4779,4781,4783,4785,4787,4790,4792],{"class":1055,"line":1896},[1053,4778,1522],{"class":1160},[1053,4780,4620],{"class":1164},[1053,4782,1168],{"class":1160},[1053,4784,1171],{"class":1074},[1053,4786,1174],{"class":1160},[1053,4788,4789],{"class":1164},"django.contrib.sessions.backends.cache",[1053,4791,1168],{"class":1160},[1053,4793,1182],{"class":1074},[1053,4795,4796,4798,4800,4802,4804,4806,4809,4811],{"class":1055,"line":1936},[1053,4797,1522],{"class":1160},[1053,4799,1525],{"class":1164},[1053,4801,1168],{"class":1160},[1053,4803,1171],{"class":1074},[1053,4805,1174],{"class":1160},[1053,4807,4808],{"class":1164},"Store sessions in cache system",[1053,4810,1168],{"class":1160},[1053,4812,1182],{"class":1074},[1053,4814,4815,4817,4819,4821,4823,4825,4827,4829,4831,4833,4835,4838,4840,4842,4844,4847,4849],{"class":1055,"line":1975},[1053,4816,1522],{"class":1160},[1053,4818,1546],{"class":1164},[1053,4820,1168],{"class":1160},[1053,4822,1171],{"class":1074},[1053,4824,1553],{"class":1074},[1053,4826,1168],{"class":1160},[1053,4828,2194],{"class":1164},[1053,4830,1168],{"class":1160},[1053,4832,1375],{"class":1074},[1053,4834,1174],{"class":1160},[1053,4836,4837],{"class":1164},"Automatic expiry",[1053,4839,1168],{"class":1160},[1053,4841,1375],{"class":1074},[1053,4843,1174],{"class":1160},[1053,4845,4846],{"class":1164},"Memory efficient",[1053,4848,1168],{"class":1160},[1053,4850,1581],{"class":1074},[1053,4852,4853,4855,4857,4859,4861,4863,4865,4868,4870,4872,4874,4877,4879],{"class":1055,"line":1980},[1053,4854,1522],{"class":1160},[1053,4856,1589],{"class":1164},[1053,4858,1168],{"class":1160},[1053,4860,1171],{"class":1074},[1053,4862,1553],{"class":1074},[1053,4864,1168],{"class":1160},[1053,4866,4867],{"class":1164},"Not persistent",[1053,4869,1168],{"class":1160},[1053,4871,1375],{"class":1074},[1053,4873,1174],{"class":1160},[1053,4875,4876],{"class":1164},"Can be evicted",[1053,4878,1168],{"class":1160},[1053,4880,1581],{"class":1074},[1053,4882,4883,4885,4887,4889,4891,4893,4896,4898],{"class":1055,"line":1994},[1053,4884,1522],{"class":1160},[1053,4886,4726],{"class":1164},[1053,4888,1168],{"class":1160},[1053,4890,1171],{"class":1074},[1053,4892,1174],{"class":1160},[1053,4894,4895],{"class":1164},"High-performance applications",[1053,4897,1168],{"class":1160},[1053,4899,1182],{"class":1074},[1053,4901,4902,4904,4906,4908,4910,4912,4915],{"class":1055,"line":2014},[1053,4903,1522],{"class":1160},[1053,4905,4746],{"class":1164},[1053,4907,1168],{"class":1160},[1053,4909,1171],{"class":1074},[1053,4911,1174],{"class":1160},[1053,4913,4914],{"class":1164},"Requires cache configuration",[1053,4916,2500],{"class":1160},[1053,4918,4919],{"class":1055,"line":2045},[1053,4920,1670],{"class":1074},[1053,4922,4923,4925,4928,4930,4932],{"class":1055,"line":2085},[1053,4924,1161],{"class":1160},[1053,4926,4927],{"class":1164},"cached_db",[1053,4929,1168],{"class":1160},[1053,4931,1171],{"class":1074},[1053,4933,1154],{"class":1074},[1053,4935,4936,4938,4940,4942,4944,4946,4949,4951],{"class":1055,"line":2124},[1053,4937,1522],{"class":1160},[1053,4939,4620],{"class":1164},[1053,4941,1168],{"class":1160},[1053,4943,1171],{"class":1074},[1053,4945,1174],{"class":1160},[1053,4947,4948],{"class":1164},"django.contrib.sessions.backends.cached_db",[1053,4950,1168],{"class":1160},[1053,4952,1182],{"class":1074},[1053,4954,4955,4957,4959,4961,4963,4965,4968,4970],{"class":1055,"line":2129},[1053,4956,1522],{"class":1160},[1053,4958,1525],{"class":1164},[1053,4960,1168],{"class":1160},[1053,4962,1171],{"class":1074},[1053,4964,1174],{"class":1160},[1053,4966,4967],{"class":1164},"Cache with database fallback",[1053,4969,1168],{"class":1160},[1053,4971,1182],{"class":1074},[1053,4973,4974,4976,4978,4980,4982,4984,4986,4989,4991,4993,4995,4998,5000],{"class":1055,"line":2143},[1053,4975,1522],{"class":1160},[1053,4977,1546],{"class":1164},[1053,4979,1168],{"class":1160},[1053,4981,1171],{"class":1074},[1053,4983,1553],{"class":1074},[1053,4985,1168],{"class":1160},[1053,4987,4988],{"class":1164},"Fast + persistent",[1053,4990,1168],{"class":1160},[1053,4992,1375],{"class":1074},[1053,4994,1174],{"class":1160},[1053,4996,4997],{"class":1164},"Best of both worlds",[1053,4999,1168],{"class":1160},[1053,5001,1581],{"class":1074},[1053,5003,5004,5006,5008,5010,5012,5014,5016,5019,5021,5023,5025,5028,5030],{"class":1055,"line":2163},[1053,5005,1522],{"class":1160},[1053,5007,1589],{"class":1164},[1053,5009,1168],{"class":1160},[1053,5011,1171],{"class":1074},[1053,5013,1553],{"class":1074},[1053,5015,1168],{"class":1160},[1053,5017,5018],{"class":1164},"More complex",[1053,5020,1168],{"class":1160},[1053,5022,1375],{"class":1074},[1053,5024,1174],{"class":1160},[1053,5026,5027],{"class":1164},"Higher resource usage",[1053,5029,1168],{"class":1160},[1053,5031,1581],{"class":1074},[1053,5033,5034,5036,5038,5040,5042,5044,5047,5049],{"class":1055,"line":2201},[1053,5035,1522],{"class":1160},[1053,5037,4726],{"class":1164},[1053,5039,1168],{"class":1160},[1053,5041,1171],{"class":1074},[1053,5043,1174],{"class":1160},[1053,5045,5046],{"class":1164},"High-traffic applications",[1053,5048,1168],{"class":1160},[1053,5050,1182],{"class":1074},[1053,5052,5053,5055,5057,5059,5061,5063,5066],{"class":1055,"line":2241},[1053,5054,1522],{"class":1160},[1053,5056,4746],{"class":1164},[1053,5058,1168],{"class":1160},[1053,5060,1171],{"class":1074},[1053,5062,1174],{"class":1160},[1053,5064,5065],{"class":1164},"Requires both cache and database",[1053,5067,2500],{"class":1160},[1053,5069,5070],{"class":1055,"line":2280},[1053,5071,1670],{"class":1074},[1053,5073,5074,5076,5079,5081,5083],{"class":1055,"line":2286},[1053,5075,1161],{"class":1160},[1053,5077,5078],{"class":1164},"file",[1053,5080,1168],{"class":1160},[1053,5082,1171],{"class":1074},[1053,5084,1154],{"class":1074},[1053,5086,5087,5089,5091,5093,5095,5097,5100,5102],{"class":1055,"line":2291},[1053,5088,1522],{"class":1160},[1053,5090,4620],{"class":1164},[1053,5092,1168],{"class":1160},[1053,5094,1171],{"class":1074},[1053,5096,1174],{"class":1160},[1053,5098,5099],{"class":1164},"django.contrib.sessions.backends.file",[1053,5101,1168],{"class":1160},[1053,5103,1182],{"class":1074},[1053,5105,5106,5108,5110,5112,5114,5116,5119,5121],{"class":1055,"line":2296},[1053,5107,1522],{"class":1160},[1053,5109,1525],{"class":1164},[1053,5111,1168],{"class":1160},[1053,5113,1171],{"class":1074},[1053,5115,1174],{"class":1160},[1053,5117,5118],{"class":1164},"Store sessions as files",[1053,5120,1168],{"class":1160},[1053,5122,1182],{"class":1074},[1053,5124,5125,5127,5129,5131,5133,5135,5137,5139,5141,5143,5145,5148,5150],{"class":1055,"line":2304},[1053,5126,1522],{"class":1160},[1053,5128,1546],{"class":1164},[1053,5130,1168],{"class":1160},[1053,5132,1171],{"class":1074},[1053,5134,1553],{"class":1074},[1053,5136,1168],{"class":1160},[1053,5138,1558],{"class":1164},[1053,5140,1168],{"class":1160},[1053,5142,1375],{"class":1074},[1053,5144,1174],{"class":1160},[1053,5146,5147],{"class":1164},"No database needed",[1053,5149,1168],{"class":1160},[1053,5151,1581],{"class":1074},[1053,5153,5154,5156,5158,5160,5162,5164,5166,5169,5171,5173,5175,5178,5180],{"class":1055,"line":2311},[1053,5155,1522],{"class":1160},[1053,5157,1589],{"class":1164},[1053,5159,1168],{"class":1160},[1053,5161,1171],{"class":1074},[1053,5163,1553],{"class":1074},[1053,5165,1168],{"class":1160},[1053,5167,5168],{"class":1164},"File system overhead",[1053,5170,1168],{"class":1160},[1053,5172,1375],{"class":1074},[1053,5174,1174],{"class":1160},[1053,5176,5177],{"class":1164},"Cleanup required",[1053,5179,1168],{"class":1160},[1053,5181,1581],{"class":1074},[1053,5183,5184,5186,5188,5190,5192,5194,5197,5199],{"class":1055,"line":2317},[1053,5185,1522],{"class":1160},[1053,5187,4726],{"class":1164},[1053,5189,1168],{"class":1160},[1053,5191,1171],{"class":1074},[1053,5193,1174],{"class":1160},[1053,5195,5196],{"class":1164},"Development or simple deployments",[1053,5198,1168],{"class":1160},[1053,5200,1182],{"class":1074},[1053,5202,5203,5205,5207,5209,5211,5213,5216],{"class":1055,"line":2327},[1053,5204,1522],{"class":1160},[1053,5206,4746],{"class":1164},[1053,5208,1168],{"class":1160},[1053,5210,1171],{"class":1074},[1053,5212,1174],{"class":1160},[1053,5214,5215],{"class":1164},"Requires file system access",[1053,5217,2500],{"class":1160},[1053,5219,5220],{"class":1055,"line":2337},[1053,5221,1670],{"class":1074},[1053,5223,5224,5226,5229,5231,5233],{"class":1055,"line":2342},[1053,5225,1161],{"class":1160},[1053,5227,5228],{"class":1164},"signed_cookies",[1053,5230,1168],{"class":1160},[1053,5232,1171],{"class":1074},[1053,5234,1154],{"class":1074},[1053,5236,5237,5239,5241,5243,5245,5247,5250,5252],{"class":1055,"line":2349},[1053,5238,1522],{"class":1160},[1053,5240,4620],{"class":1164},[1053,5242,1168],{"class":1160},[1053,5244,1171],{"class":1074},[1053,5246,1174],{"class":1160},[1053,5248,5249],{"class":1164},"django.contrib.sessions.backends.signed_cookies",[1053,5251,1168],{"class":1160},[1053,5253,1182],{"class":1074},[1053,5255,5256,5258,5260,5262,5264,5266,5269,5271],{"class":1055,"line":2359},[1053,5257,1522],{"class":1160},[1053,5259,1525],{"class":1164},[1053,5261,1168],{"class":1160},[1053,5263,1171],{"class":1074},[1053,5265,1174],{"class":1160},[1053,5267,5268],{"class":1164},"Store session data in signed cookies",[1053,5270,1168],{"class":1160},[1053,5272,1182],{"class":1074},[1053,5274,5275,5277,5279,5281,5283,5285,5287,5290,5292,5294,5296,5299,5301],{"class":1055,"line":2369},[1053,5276,1522],{"class":1160},[1053,5278,1546],{"class":1164},[1053,5280,1168],{"class":1160},[1053,5282,1171],{"class":1074},[1053,5284,1553],{"class":1074},[1053,5286,1168],{"class":1160},[1053,5288,5289],{"class":1164},"No server storage",[1053,5291,1168],{"class":1160},[1053,5293,1375],{"class":1074},[1053,5295,1174],{"class":1160},[1053,5297,5298],{"class":1164},"Stateless",[1053,5300,1168],{"class":1160},[1053,5302,1581],{"class":1074},[1053,5304,5305,5307,5309,5311,5313,5315,5317,5319,5321,5323,5325,5328,5330],{"class":1055,"line":2374},[1053,5306,1522],{"class":1160},[1053,5308,1589],{"class":1164},[1053,5310,1168],{"class":1160},[1053,5312,1171],{"class":1074},[1053,5314,1553],{"class":1074},[1053,5316,1168],{"class":1160},[1053,5318,1600],{"class":1164},[1053,5320,1168],{"class":1160},[1053,5322,1375],{"class":1074},[1053,5324,1174],{"class":1160},[1053,5326,5327],{"class":1164},"Security considerations",[1053,5329,1168],{"class":1160},[1053,5331,1581],{"class":1074},[1053,5333,5334,5336,5338,5340,5342,5344,5347,5349],{"class":1055,"line":2384},[1053,5335,1522],{"class":1160},[1053,5337,4726],{"class":1164},[1053,5339,1168],{"class":1160},[1053,5341,1171],{"class":1074},[1053,5343,1174],{"class":1160},[1053,5345,5346],{"class":1164},"Stateless applications",[1053,5348,1168],{"class":1160},[1053,5350,1182],{"class":1074},[1053,5352,5353,5355,5357,5359,5361,5363,5366],{"class":1055,"line":2398},[1053,5354,1522],{"class":1160},[1053,5356,4746],{"class":1164},[1053,5358,1168],{"class":1160},[1053,5360,1171],{"class":1074},[1053,5362,1174],{"class":1160},[1053,5364,5365],{"class":1164},"Requires SECRET_KEY configuration",[1053,5367,2500],{"class":1160},[1053,5369,5370],{"class":1055,"line":2419},[1053,5371,2283],{"class":1074},[1053,5373,5374],{"class":1055,"line":2440},[1053,5375,1259],{"class":1074},[1053,5377,5378],{"class":1055,"line":2455},[1053,5379,1136],{"class":1095},[1053,5381,5382,5384],{"class":1055,"line":2468},[1053,5383,1446],{"class":1445},[1053,5385,5386],{"class":1095}," backends\n",[1053,5388,5389],{"class":1055,"line":2480},[1053,5390,2308],{"emptyLinePlaceholder":2307},[1053,5392,5393],{"class":1055,"line":2492},[1053,5394,5395],{"class":1059},"# Session lifecycle management\n",[1053,5397,5398,5400,5403],{"class":1055,"line":2503},[1053,5399,1067],{"class":1066},[1053,5401,5402],{"class":1070}," SessionLifecycle",[1053,5404,1075],{"class":1074},[1053,5406,5407,5409,5412],{"class":1055,"line":2509},[1053,5408,1082],{"class":1081},[1053,5410,5411],{"class":1085},"Understanding session creation, modification, and cleanup",[1053,5413,1089],{"class":1081},[1053,5415,5416],{"class":1055,"line":2514},[1053,5417,1096],{"class":1095},[1053,5419,5420,5422],{"class":1055,"line":2528},[1053,5421,1102],{"class":1074},[1053,5423,1106],{"class":1105},[1053,5425,5426,5428,5431],{"class":1055,"line":2548},[1053,5427,1112],{"class":1066},[1053,5429,5430],{"class":1115}," session_creation_flow",[1053,5432,1119],{"class":1074},[1053,5434,5435,5437,5440],{"class":1055,"line":2562},[1053,5436,1125],{"class":1081},[1053,5438,5439],{"class":1085},"How Django creates and manages sessions",[1053,5441,1089],{"class":1081},[1053,5443,5444],{"class":1055,"line":2574},[1053,5445,1136],{"class":1095},[1053,5447,5448,5451,5453],{"class":1055,"line":2586},[1053,5449,5450],{"class":1095},"        flow_steps ",[1053,5452,1151],{"class":1074},[1053,5454,2452],{"class":1074},[1053,5456,5457,5460,5463,5466],{"class":1055,"line":2598},[1053,5458,5459],{"class":1160},"            \"",[1053,5461,5462],{"class":1164},"1. Request arrives without session cookie",[1053,5464,5465],{"class":1160},"\"",[1053,5467,1182],{"class":1074},[1053,5469,5470,5472,5475,5477],{"class":1055,"line":2610},[1053,5471,5459],{"class":1160},[1053,5473,5474],{"class":1164},"2. SessionMiddleware creates new session object",[1053,5476,5465],{"class":1160},[1053,5478,1182],{"class":1074},[1053,5480,5481,5483,5486,5488],{"class":1055,"line":2620},[1053,5482,5459],{"class":1160},[1053,5484,5485],{"class":1164},"3. Session gets unique session key",[1053,5487,5465],{"class":1160},[1053,5489,1182],{"class":1074},[1053,5491,5492,5494,5497,5499],{"class":1055,"line":2625},[1053,5493,5459],{"class":1160},[1053,5495,5496],{"class":1164},"4. Session data stored in configured backend",[1053,5498,5465],{"class":1160},[1053,5500,1182],{"class":1074},[1053,5502,5503,5505,5508,5510],{"class":1055,"line":2630},[1053,5504,5459],{"class":1160},[1053,5506,5507],{"class":1164},"5. Session cookie sent to browser",[1053,5509,5465],{"class":1160},[1053,5511,1182],{"class":1074},[1053,5513,5514,5516,5519,5521],{"class":1055,"line":2644},[1053,5515,5459],{"class":1160},[1053,5517,5518],{"class":1164},"6. Subsequent requests include session cookie",[1053,5520,5465],{"class":1160},[1053,5522,1182],{"class":1074},[1053,5524,5525,5527,5530,5532],{"class":1055,"line":2664},[1053,5526,5459],{"class":1160},[1053,5528,5529],{"class":1164},"7. SessionMiddleware loads existing session data",[1053,5531,5465],{"class":1160},[1053,5533,1182],{"class":1074},[1053,5535,5536,5538,5541,5543],{"class":1055,"line":2685},[1053,5537,5459],{"class":1160},[1053,5539,5540],{"class":1164},"8. View can read/modify session data",[1053,5542,5465],{"class":1160},[1053,5544,1182],{"class":1074},[1053,5546,5547,5549,5552,5554],{"class":1055,"line":2699},[1053,5548,5459],{"class":1160},[1053,5550,5551],{"class":1164},"9. Session changes saved to backend",[1053,5553,5465],{"class":1160},[1053,5555,1182],{"class":1074},[1053,5557,5558,5560,5563],{"class":1055,"line":2738},[1053,5559,5459],{"class":1160},[1053,5561,5562],{"class":1164},"10. Updated session cookie sent if needed",[1053,5564,1455],{"class":1160},[1053,5566,5567],{"class":1055,"line":2766},[1053,5568,5569],{"class":1074},"        ]\n",[1053,5571,5572],{"class":1055,"line":2771},[1053,5573,1136],{"class":1095},[1053,5575,5576,5578],{"class":1055,"line":2776},[1053,5577,1446],{"class":1445},[1053,5579,5580],{"class":1095}," flow_steps\n",[1053,5582,5583],{"class":1055,"line":2781},[1053,5584,1096],{"class":1095},[1053,5586,5587,5589],{"class":1055,"line":2786},[1053,5588,1102],{"class":1074},[1053,5590,1106],{"class":1105},[1053,5592,5593,5595,5598],{"class":1055,"line":2794},[1053,5594,1112],{"class":1066},[1053,5596,5597],{"class":1115}," session_security_considerations",[1053,5599,1119],{"class":1074},[1053,5601,5602,5604,5607],{"class":1055,"line":2799},[1053,5603,1125],{"class":1081},[1053,5605,5606],{"class":1085},"Security aspects of session management",[1053,5608,1089],{"class":1081},[1053,5610,5611],{"class":1055,"line":2806},[1053,5612,1136],{"class":1095},[1053,5614,5615,5618,5620],{"class":1055,"line":2816},[1053,5616,5617],{"class":1095},"        security_measures ",[1053,5619,1151],{"class":1074},[1053,5621,1154],{"class":1074},[1053,5623,5624,5626,5629,5631,5633],{"class":1055,"line":2826},[1053,5625,1161],{"class":1160},[1053,5627,5628],{"class":1164},"session_hijacking_prevention",[1053,5630,1168],{"class":1160},[1053,5632,1171],{"class":1074},[1053,5634,2452],{"class":1074},[1053,5636,5637,5639,5642,5644],{"class":1055,"line":2831},[1053,5638,1522],{"class":1160},[1053,5640,5641],{"class":1164},"Use HTTPS for session cookies",[1053,5643,1168],{"class":1160},[1053,5645,1182],{"class":1074},[1053,5647,5648,5650,5653,5655],{"class":1055,"line":2837},[1053,5649,1522],{"class":1160},[1053,5651,5652],{"class":1164},"Set HttpOnly flag on session cookies",[1053,5654,1168],{"class":1160},[1053,5656,1182],{"class":1074},[1053,5658,5659,5661,5664,5666],{"class":1055,"line":2848},[1053,5660,1522],{"class":1160},[1053,5662,5663],{"class":1164},"Implement session regeneration on login",[1053,5665,1168],{"class":1160},[1053,5667,1182],{"class":1074},[1053,5669,5670,5672,5675,5677],{"class":1055,"line":2854},[1053,5671,1522],{"class":1160},[1053,5673,5674],{"class":1164},"Validate session against user agent/IP",[1053,5676,1168],{"class":1160},[1053,5678,1182],{"class":1074},[1053,5680,5681,5683,5686],{"class":1055,"line":2860},[1053,5682,1522],{"class":1160},[1053,5684,5685],{"class":1164},"Use short session timeouts",[1053,5687,2500],{"class":1160},[1053,5689,5690],{"class":1055,"line":2866},[1053,5691,5692],{"class":1074},"            ],\n",[1053,5694,5695,5697,5700,5702,5704],{"class":1055,"line":2872},[1053,5696,1161],{"class":1160},[1053,5698,5699],{"class":1164},"session_fixation_prevention",[1053,5701,1168],{"class":1160},[1053,5703,1171],{"class":1074},[1053,5705,2452],{"class":1074},[1053,5707,5708,5710,5713,5715],{"class":1055,"line":2878},[1053,5709,1522],{"class":1160},[1053,5711,5712],{"class":1164},"Regenerate session ID on authentication",[1053,5714,1168],{"class":1160},[1053,5716,1182],{"class":1074},[1053,5718,5719,5721,5724,5726],{"class":1055,"line":2883},[1053,5720,1522],{"class":1160},[1053,5722,5723],{"class":1164},"Use session.cycle_key() method",[1053,5725,1168],{"class":1160},[1053,5727,1182],{"class":1074},[1053,5729,5730,5732,5735,5737],{"class":1055,"line":2889},[1053,5731,1522],{"class":1160},[1053,5733,5734],{"class":1164},"Clear session data on logout",[1053,5736,1168],{"class":1160},[1053,5738,1182],{"class":1074},[1053,5740,5741,5743,5746],{"class":1055,"line":2895},[1053,5742,1522],{"class":1160},[1053,5744,5745],{"class":1164},"Validate session ownership",[1053,5747,2500],{"class":1160},[1053,5749,5750],{"class":1055,"line":2901},[1053,5751,5692],{"class":1074},[1053,5753,5754,5756,5759,5761,5763],{"class":1055,"line":2907},[1053,5755,1161],{"class":1160},[1053,5757,5758],{"class":1164},"data_protection",[1053,5760,1168],{"class":1160},[1053,5762,1171],{"class":1074},[1053,5764,2452],{"class":1074},[1053,5766,5767,5769,5772,5774],{"class":1055,"line":2913},[1053,5768,1522],{"class":1160},[1053,5770,5771],{"class":1164},"Use signed cookies for sensitive data",[1053,5773,1168],{"class":1160},[1053,5775,1182],{"class":1074},[1053,5777,5778,5780,5783,5785],{"class":1055,"line":2919},[1053,5779,1522],{"class":1160},[1053,5781,5782],{"class":1164},"Encrypt session data if needed",[1053,5784,1168],{"class":1160},[1053,5786,1182],{"class":1074},[1053,5788,5789,5791,5794,5796],{"class":1055,"line":2925},[1053,5790,1522],{"class":1160},[1053,5792,5793],{"class":1164},"Minimize data stored in sessions",[1053,5795,1168],{"class":1160},[1053,5797,1182],{"class":1074},[1053,5799,5800,5802,5805,5807],{"class":1055,"line":2931},[1053,5801,1522],{"class":1160},[1053,5803,5804],{"class":1164},"Regular session cleanup",[1053,5806,1168],{"class":1160},[1053,5808,1182],{"class":1074},[1053,5810,5811,5813,5816],{"class":1055,"line":2936},[1053,5812,1522],{"class":1160},[1053,5814,5815],{"class":1164},"Secure session backend storage",[1053,5817,2500],{"class":1160},[1053,5819,5820],{"class":1055,"line":2942},[1053,5821,5822],{"class":1074},"            ]\n",[1053,5824,5825],{"class":1055,"line":2948},[1053,5826,1259],{"class":1074},[1053,5828,5829],{"class":1055,"line":2954},[1053,5830,1136],{"class":1095},[1053,5832,5833,5835],{"class":1055,"line":2960},[1053,5834,1446],{"class":1445},[1053,5836,5837],{"class":1095}," security_measures\n",[1030,5839,5841],{"id":5840},"practical-session-usage-patterns","Practical Session Usage Patterns",[1038,5843,5845],{"id":5844},"shopping-cart-implementation","Shopping Cart Implementation",[1043,5847,5849],{"className":1045,"code":5848,"language":1047,"meta":1048,"style":1048},"# Shopping cart using sessions\nclass ShoppingCartManager:\n    \"\"\"Manage shopping cart state using Django sessions\"\"\"\n    \n    @staticmethod\n    def add_to_cart(request, product_id, quantity=1):\n        \"\"\"Add item to shopping cart\"\"\"\n        \n        cart = request.session.get('cart', {})\n        \n        # Convert product_id to string (JSON serialization requirement)\n        product_id = str(product_id)\n        \n        if product_id in cart:\n            cart[product_id]['quantity'] += quantity\n        else:\n            cart[product_id] = {\n                'quantity': quantity,\n                'added_at': timezone.now().isoformat()\n            }\n        \n        request.session['cart'] = cart\n        request.session.modified = True  # Important for nested objects\n        \n        return len(cart)\n    \n    @staticmethod\n    def remove_from_cart(request, product_id):\n        \"\"\"Remove item from shopping cart\"\"\"\n        \n        cart = request.session.get('cart', {})\n        product_id = str(product_id)\n        \n        if product_id in cart:\n            del cart[product_id]\n            request.session['cart'] = cart\n            request.session.modified = True\n            return True\n        \n        return False\n    \n    @staticmethod\n    def get_cart_contents(request):\n        \"\"\"Get cart contents with product details\"\"\"\n        \n        cart = request.session.get('cart', {})\n        \n        if not cart:\n            return []\n        \n        # Get product details for items in cart\n        from myapp.models import Product\n        \n        product_ids = list(cart.keys())\n        products = Product.objects.filter(id__in=product_ids)\n        \n        cart_items = []\n        for product in products:\n            cart_data = cart[str(product.id)]\n            cart_items.append({\n                'product': product,\n                'quantity': cart_data['quantity'],\n                'added_at': cart_data['added_at'],\n                'subtotal': product.price * cart_data['quantity']\n            })\n        \n        return cart_items\n    \n    @staticmethod\n    def clear_cart(request):\n        \"\"\"Clear all items from cart\"\"\"\n        \n        if 'cart' in request.session:\n            del request.session['cart']\n            request.session.modified = True\n\n# Shopping cart views\ndef add_to_cart_view(request, product_id):\n    \"\"\"View to add product to cart\"\"\"\n    \n    if request.method == 'POST':\n        quantity = int(request.POST.get('quantity', 1))\n        \n        try:\n            # Validate product exists\n            product = Product.objects.get(id=product_id)\n            \n            # Add to cart\n            cart_size = ShoppingCartManager.add_to_cart(\n                request, product_id, quantity\n            )\n            \n            messages.success(\n                request, \n                f'Added {product.name} to cart. Cart has {cart_size} items.'\n            )\n            \n            # Return JSON for AJAX requests\n            if request.headers.get('X-Requested-With') == 'XMLHttpRequest':\n                return JsonResponse({\n                    'success': True,\n                    'cart_size': cart_size,\n                    'message': f'Added {product.name} to cart'\n                })\n            \n            return redirect('product_detail', product_id=product_id)\n        \n        except Product.DoesNotExist:\n            messages.error(request, 'Product not found')\n            return redirect('product_list')\n    \n    return redirect('product_list')\n\ndef cart_view(request):\n    \"\"\"Display shopping cart\"\"\"\n    \n    cart_items = ShoppingCartManager.get_cart_contents(request)\n    \n    total = sum(item['subtotal'] for item in cart_items)\n    \n    context = {\n        'cart_items': cart_items,\n        'cart_total': total,\n        'cart_count': len(cart_items)\n    }\n    \n    return render(request, 'cart.html', context)\n",[1050,5850,5851,5856,5865,5874,5878,5884,5917,5926,5930,5967,5971,5976,5994,5998,6014,6043,6050,6065,6079,6107,6111,6115,6139,6159,6163,6177,6181,6187,6204,6213,6217,6245,6259,6263,6275,6288,6311,6328,6335,6339,6346,6350,6356,6369,6378,6382,6410,6414,6425,6432,6436,6441,6460,6464,6486,6519,6523,6532,6547,6574,6587,6602,6625,6647,6680,6684,6688,6695,6699,6705,6718,6727,6731,6752,6772,6788,6792,6797,6815,6824,6828,6850,6889,6893,6900,6905,6932,6936,6941,6958,6971,6975,6979,6991,7000,7034,7038,7042,7047,7085,7095,7109,7124,7153,7158,7162,7188,7192,7206,7230,7247,7251,7268,7272,7285,7294,7298,7318,7322,7360,7364,7373,7389,7405,7424,7429,7433],{"__ignoreMap":1048},[1053,5852,5853],{"class":1055,"line":1056},[1053,5854,5855],{"class":1059},"# Shopping cart using sessions\n",[1053,5857,5858,5860,5863],{"class":1055,"line":1063},[1053,5859,1067],{"class":1066},[1053,5861,5862],{"class":1070}," ShoppingCartManager",[1053,5864,1075],{"class":1074},[1053,5866,5867,5869,5872],{"class":1055,"line":1078},[1053,5868,1082],{"class":1081},[1053,5870,5871],{"class":1085},"Manage shopping cart state using Django sessions",[1053,5873,1089],{"class":1081},[1053,5875,5876],{"class":1055,"line":1092},[1053,5877,1096],{"class":1095},[1053,5879,5880,5882],{"class":1055,"line":1099},[1053,5881,1102],{"class":1074},[1053,5883,1106],{"class":1105},[1053,5885,5886,5888,5891,5894,5898,5900,5903,5905,5908,5911,5914],{"class":1055,"line":1109},[1053,5887,1112],{"class":1066},[1053,5889,5890],{"class":1115}," add_to_cart",[1053,5892,5893],{"class":1074},"(",[1053,5895,5897],{"class":5896},"sCyAa","request",[1053,5899,1375],{"class":1074},[1053,5901,5902],{"class":5896}," product_id",[1053,5904,1375],{"class":1074},[1053,5906,5907],{"class":5896}," quantity",[1053,5909,1151],{"class":5910},"sVsLi",[1053,5912,5913],{"class":4316},"1",[1053,5915,5916],{"class":1074},"):\n",[1053,5918,5919,5921,5924],{"class":1055,"line":1122},[1053,5920,1125],{"class":1081},[1053,5922,5923],{"class":1085},"Add item to shopping cart",[1053,5925,1089],{"class":1081},[1053,5927,5928],{"class":1055,"line":1133},[1053,5929,1136],{"class":1095},[1053,5931,5932,5935,5937,5940,5943,5947,5949,5953,5955,5957,5960,5962,5964],{"class":1055,"line":1139},[1053,5933,5934],{"class":1095},"        cart ",[1053,5936,1151],{"class":1074},[1053,5938,5939],{"class":1095}," request",[1053,5941,5942],{"class":1074},".",[1053,5944,5946],{"class":5945},"sBPpx","session",[1053,5948,5942],{"class":1074},[1053,5950,5952],{"class":5951},"siWMO","get",[1053,5954,5893],{"class":1074},[1053,5956,1168],{"class":1160},[1053,5958,5959],{"class":1164},"cart",[1053,5961,1168],{"class":1160},[1053,5963,1375],{"class":1074},[1053,5965,5966],{"class":1074}," {})\n",[1053,5968,5969],{"class":1055,"line":1145},[1053,5970,1136],{"class":1095},[1053,5972,5973],{"class":1055,"line":1157},[1053,5974,5975],{"class":1059},"        # Convert product_id to string (JSON serialization requirement)\n",[1053,5977,5978,5981,5983,5986,5988,5991],{"class":1055,"line":1185},[1053,5979,5980],{"class":1095},"        product_id ",[1053,5982,1151],{"class":1074},[1053,5984,5985],{"class":1105}," str",[1053,5987,5893],{"class":1074},[1053,5989,5990],{"class":5951},"product_id",[1053,5992,5993],{"class":1074},")\n",[1053,5995,5996],{"class":1055,"line":1206},[1053,5997,1136],{"class":1095},[1053,5999,6000,6003,6006,6009,6012],{"class":1055,"line":1240},[1053,6001,6002],{"class":1445},"        if",[1053,6004,6005],{"class":1095}," product_id ",[1053,6007,6008],{"class":5910},"in",[1053,6010,6011],{"class":1095}," cart",[1053,6013,1075],{"class":1074},[1053,6015,6016,6019,6022,6024,6027,6029,6032,6034,6037,6040],{"class":1055,"line":1256},[1053,6017,6018],{"class":1095},"            cart",[1053,6020,6021],{"class":1074},"[",[1053,6023,5990],{"class":1095},[1053,6025,6026],{"class":1074},"][",[1053,6028,1168],{"class":1160},[1053,6030,6031],{"class":1164},"quantity",[1053,6033,1168],{"class":1160},[1053,6035,6036],{"class":1074},"]",[1053,6038,6039],{"class":1074}," +=",[1053,6041,6042],{"class":1095}," quantity\n",[1053,6044,6045,6048],{"class":1055,"line":1262},[1053,6046,6047],{"class":1445},"        else",[1053,6049,1075],{"class":1074},[1053,6051,6052,6054,6056,6058,6060,6063],{"class":1055,"line":1267},[1053,6053,6018],{"class":1095},[1053,6055,6021],{"class":1074},[1053,6057,5990],{"class":1095},[1053,6059,6036],{"class":1074},[1053,6061,6062],{"class":1074}," =",[1053,6064,1154],{"class":1074},[1053,6066,6067,6069,6071,6073,6075,6077],{"class":1055,"line":1277},[1053,6068,1522],{"class":1160},[1053,6070,6031],{"class":1164},[1053,6072,1168],{"class":1160},[1053,6074,1171],{"class":1074},[1053,6076,5907],{"class":1095},[1053,6078,1182],{"class":1074},[1053,6080,6081,6083,6086,6088,6090,6093,6095,6098,6101,6104],{"class":1055,"line":1297},[1053,6082,1522],{"class":1160},[1053,6084,6085],{"class":1164},"added_at",[1053,6087,1168],{"class":1160},[1053,6089,1171],{"class":1074},[1053,6091,6092],{"class":1095}," timezone",[1053,6094,5942],{"class":1074},[1053,6096,6097],{"class":5951},"now",[1053,6099,6100],{"class":1074},"().",[1053,6102,6103],{"class":5951},"isoformat",[1053,6105,6106],{"class":1074},"()\n",[1053,6108,6109],{"class":1055,"line":1317},[1053,6110,2283],{"class":1074},[1053,6112,6113],{"class":1055,"line":1346},[1053,6114,1136],{"class":1095},[1053,6116,6117,6120,6122,6124,6126,6128,6130,6132,6134,6136],{"class":1055,"line":1397},[1053,6118,6119],{"class":1095},"        request",[1053,6121,5942],{"class":1074},[1053,6123,5946],{"class":5945},[1053,6125,6021],{"class":1074},[1053,6127,1168],{"class":1160},[1053,6129,5959],{"class":1164},[1053,6131,1168],{"class":1160},[1053,6133,6036],{"class":1074},[1053,6135,6062],{"class":1074},[1053,6137,6138],{"class":1095}," cart\n",[1053,6140,6141,6143,6145,6147,6149,6152,6154,6156],{"class":1055,"line":1402},[1053,6142,6119],{"class":1095},[1053,6144,5942],{"class":1074},[1053,6146,5946],{"class":5945},[1053,6148,5942],{"class":1074},[1053,6150,6151],{"class":5945},"modified",[1053,6153,6062],{"class":1074},[1053,6155,4355],{"class":1252},[1053,6157,6158],{"class":1059},"  # Important for nested objects\n",[1053,6160,6161],{"class":1055,"line":1407},[1053,6162,1136],{"class":1095},[1053,6164,6165,6167,6171,6173,6175],{"class":1055,"line":1413},[1053,6166,1446],{"class":1445},[1053,6168,6170],{"class":6169},"sJdAF"," len",[1053,6172,5893],{"class":1074},[1053,6174,5959],{"class":5951},[1053,6176,5993],{"class":1074},[1053,6178,6179],{"class":1055,"line":1419},[1053,6180,1096],{"class":1095},[1053,6182,6183,6185],{"class":1055,"line":1425},[1053,6184,1102],{"class":1074},[1053,6186,1106],{"class":1105},[1053,6188,6189,6191,6194,6196,6198,6200,6202],{"class":1055,"line":1431},[1053,6190,1112],{"class":1066},[1053,6192,6193],{"class":1115}," remove_from_cart",[1053,6195,5893],{"class":1074},[1053,6197,5897],{"class":5896},[1053,6199,1375],{"class":1074},[1053,6201,5902],{"class":5896},[1053,6203,5916],{"class":1074},[1053,6205,6206,6208,6211],{"class":1055,"line":1437},[1053,6207,1125],{"class":1081},[1053,6209,6210],{"class":1085},"Remove item from shopping cart",[1053,6212,1089],{"class":1081},[1053,6214,6215],{"class":1055,"line":1442},[1053,6216,1136],{"class":1095},[1053,6218,6219,6221,6223,6225,6227,6229,6231,6233,6235,6237,6239,6241,6243],{"class":1055,"line":1458},[1053,6220,5934],{"class":1095},[1053,6222,1151],{"class":1074},[1053,6224,5939],{"class":1095},[1053,6226,5942],{"class":1074},[1053,6228,5946],{"class":5945},[1053,6230,5942],{"class":1074},[1053,6232,5952],{"class":5951},[1053,6234,5893],{"class":1074},[1053,6236,1168],{"class":1160},[1053,6238,5959],{"class":1164},[1053,6240,1168],{"class":1160},[1053,6242,1375],{"class":1074},[1053,6244,5966],{"class":1074},[1053,6246,6247,6249,6251,6253,6255,6257],{"class":1055,"line":1463},[1053,6248,5980],{"class":1095},[1053,6250,1151],{"class":1074},[1053,6252,5985],{"class":1105},[1053,6254,5893],{"class":1074},[1053,6256,5990],{"class":5951},[1053,6258,5993],{"class":1074},[1053,6260,6261],{"class":1055,"line":1470},[1053,6262,1136],{"class":1095},[1053,6264,6265,6267,6269,6271,6273],{"class":1055,"line":1480},[1053,6266,6002],{"class":1445},[1053,6268,6005],{"class":1095},[1053,6270,6008],{"class":5910},[1053,6272,6011],{"class":1095},[1053,6274,1075],{"class":1074},[1053,6276,6277,6280,6282,6284,6286],{"class":1055,"line":1490},[1053,6278,6279],{"class":1445},"            del",[1053,6281,6011],{"class":1095},[1053,6283,6021],{"class":1074},[1053,6285,5990],{"class":1095},[1053,6287,1664],{"class":1074},[1053,6289,6290,6293,6295,6297,6299,6301,6303,6305,6307,6309],{"class":1055,"line":1495},[1053,6291,6292],{"class":1095},"            request",[1053,6294,5942],{"class":1074},[1053,6296,5946],{"class":5945},[1053,6298,6021],{"class":1074},[1053,6300,1168],{"class":1160},[1053,6302,5959],{"class":1164},[1053,6304,1168],{"class":1160},[1053,6306,6036],{"class":1074},[1053,6308,6062],{"class":1074},[1053,6310,6138],{"class":1095},[1053,6312,6313,6315,6317,6319,6321,6323,6325],{"class":1055,"line":1505},[1053,6314,6292],{"class":1095},[1053,6316,5942],{"class":1074},[1053,6318,5946],{"class":5945},[1053,6320,5942],{"class":1074},[1053,6322,6151],{"class":5945},[1053,6324,6062],{"class":1074},[1053,6326,6327],{"class":1252}," True\n",[1053,6329,6330,6333],{"class":1055,"line":1519},[1053,6331,6332],{"class":1445},"            return",[1053,6334,6327],{"class":1252},[1053,6336,6337],{"class":1055,"line":1541},[1053,6338,1136],{"class":1095},[1053,6340,6341,6343],{"class":1055,"line":1584},[1053,6342,1446],{"class":1445},[1053,6344,6345],{"class":1252}," False\n",[1053,6347,6348],{"class":1055,"line":1625},[1053,6349,1096],{"class":1095},[1053,6351,6352,6354],{"class":1055,"line":1667},[1053,6353,1102],{"class":1074},[1053,6355,1106],{"class":1105},[1053,6357,6358,6360,6363,6365,6367],{"class":1055,"line":1673},[1053,6359,1112],{"class":1066},[1053,6361,6362],{"class":1115}," get_cart_contents",[1053,6364,5893],{"class":1074},[1053,6366,5897],{"class":5896},[1053,6368,5916],{"class":1074},[1053,6370,6371,6373,6376],{"class":1055,"line":1687},[1053,6372,1125],{"class":1081},[1053,6374,6375],{"class":1085},"Get cart contents with product details",[1053,6377,1089],{"class":1081},[1053,6379,6380],{"class":1055,"line":1707},[1053,6381,1136],{"class":1095},[1053,6383,6384,6386,6388,6390,6392,6394,6396,6398,6400,6402,6404,6406,6408],{"class":1055,"line":1747},[1053,6385,5934],{"class":1095},[1053,6387,1151],{"class":1074},[1053,6389,5939],{"class":1095},[1053,6391,5942],{"class":1074},[1053,6393,5946],{"class":5945},[1053,6395,5942],{"class":1074},[1053,6397,5952],{"class":5951},[1053,6399,5893],{"class":1074},[1053,6401,1168],{"class":1160},[1053,6403,5959],{"class":1164},[1053,6405,1168],{"class":1160},[1053,6407,1375],{"class":1074},[1053,6409,5966],{"class":1074},[1053,6411,6412],{"class":1055,"line":1778},[1053,6413,1136],{"class":1095},[1053,6415,6416,6418,6421,6423],{"class":1055,"line":1818},[1053,6417,6002],{"class":1445},[1053,6419,6420],{"class":5910}," not",[1053,6422,6011],{"class":1095},[1053,6424,1075],{"class":1074},[1053,6426,6427,6429],{"class":1055,"line":1823},[1053,6428,6332],{"class":1445},[1053,6430,6431],{"class":1074}," []\n",[1053,6433,6434],{"class":1055,"line":1837},[1053,6435,1136],{"class":1095},[1053,6437,6438],{"class":1055,"line":1857},[1053,6439,6440],{"class":1059},"        # Get product details for items in cart\n",[1053,6442,6443,6446,6449,6451,6454,6457],{"class":1055,"line":1896},[1053,6444,6445],{"class":1445},"        from",[1053,6447,6448],{"class":1095}," myapp",[1053,6450,5942],{"class":1074},[1053,6452,6453],{"class":1095},"models ",[1053,6455,6456],{"class":1445},"import",[1053,6458,6459],{"class":1095}," Product\n",[1053,6461,6462],{"class":1055,"line":1936},[1053,6463,1136],{"class":1095},[1053,6465,6466,6469,6471,6474,6476,6478,6480,6483],{"class":1055,"line":1975},[1053,6467,6468],{"class":1095},"        product_ids ",[1053,6470,1151],{"class":1074},[1053,6472,6473],{"class":1105}," list",[1053,6475,5893],{"class":1074},[1053,6477,5959],{"class":5951},[1053,6479,5942],{"class":1074},[1053,6481,6482],{"class":5951},"keys",[1053,6484,6485],{"class":1074},"())\n",[1053,6487,6488,6491,6493,6496,6498,6501,6503,6506,6508,6512,6514,6517],{"class":1055,"line":1980},[1053,6489,6490],{"class":1095},"        products ",[1053,6492,1151],{"class":1074},[1053,6494,6495],{"class":1095}," Product",[1053,6497,5942],{"class":1074},[1053,6499,6500],{"class":5945},"objects",[1053,6502,5942],{"class":1074},[1053,6504,6505],{"class":5951},"filter",[1053,6507,5893],{"class":1074},[1053,6509,6511],{"class":6510},"sqOPj","id__in",[1053,6513,1151],{"class":1074},[1053,6515,6516],{"class":5951},"product_ids",[1053,6518,5993],{"class":1074},[1053,6520,6521],{"class":1055,"line":1994},[1053,6522,1136],{"class":1095},[1053,6524,6525,6528,6530],{"class":1055,"line":2014},[1053,6526,6527],{"class":1095},"        cart_items ",[1053,6529,1151],{"class":1074},[1053,6531,6431],{"class":1074},[1053,6533,6534,6537,6540,6542,6545],{"class":1055,"line":2045},[1053,6535,6536],{"class":1445},"        for",[1053,6538,6539],{"class":1095}," product ",[1053,6541,6008],{"class":1445},[1053,6543,6544],{"class":1095}," products",[1053,6546,1075],{"class":1074},[1053,6548,6549,6552,6554,6556,6558,6561,6563,6566,6568,6571],{"class":1055,"line":2085},[1053,6550,6551],{"class":1095},"            cart_data ",[1053,6553,1151],{"class":1074},[1053,6555,6011],{"class":1095},[1053,6557,6021],{"class":1074},[1053,6559,6560],{"class":1105},"str",[1053,6562,5893],{"class":1074},[1053,6564,6565],{"class":5951},"product",[1053,6567,5942],{"class":1074},[1053,6569,6570],{"class":5945},"id",[1053,6572,6573],{"class":1074},")]\n",[1053,6575,6576,6579,6581,6584],{"class":1055,"line":2124},[1053,6577,6578],{"class":1095},"            cart_items",[1053,6580,5942],{"class":1074},[1053,6582,6583],{"class":5951},"append",[1053,6585,6586],{"class":1074},"({\n",[1053,6588,6589,6591,6593,6595,6597,6600],{"class":1055,"line":2129},[1053,6590,1522],{"class":1160},[1053,6592,6565],{"class":1164},[1053,6594,1168],{"class":1160},[1053,6596,1171],{"class":1074},[1053,6598,6599],{"class":5951}," product",[1053,6601,1182],{"class":1074},[1053,6603,6604,6606,6608,6610,6612,6615,6617,6619,6621,6623],{"class":1055,"line":2143},[1053,6605,1522],{"class":1160},[1053,6607,6031],{"class":1164},[1053,6609,1168],{"class":1160},[1053,6611,1171],{"class":1074},[1053,6613,6614],{"class":5951}," cart_data",[1053,6616,6021],{"class":1074},[1053,6618,1168],{"class":1160},[1053,6620,6031],{"class":1164},[1053,6622,1168],{"class":1160},[1053,6624,1581],{"class":1074},[1053,6626,6627,6629,6631,6633,6635,6637,6639,6641,6643,6645],{"class":1055,"line":2163},[1053,6628,1522],{"class":1160},[1053,6630,6085],{"class":1164},[1053,6632,1168],{"class":1160},[1053,6634,1171],{"class":1074},[1053,6636,6614],{"class":5951},[1053,6638,6021],{"class":1074},[1053,6640,1168],{"class":1160},[1053,6642,6085],{"class":1164},[1053,6644,1168],{"class":1160},[1053,6646,1581],{"class":1074},[1053,6648,6649,6651,6654,6656,6658,6660,6662,6665,6668,6670,6672,6674,6676,6678],{"class":1055,"line":2201},[1053,6650,1522],{"class":1160},[1053,6652,6653],{"class":1164},"subtotal",[1053,6655,1168],{"class":1160},[1053,6657,1171],{"class":1074},[1053,6659,6599],{"class":5951},[1053,6661,5942],{"class":1074},[1053,6663,6664],{"class":5945},"price",[1053,6666,6667],{"class":5910}," *",[1053,6669,6614],{"class":5951},[1053,6671,6021],{"class":1074},[1053,6673,1168],{"class":1160},[1053,6675,6031],{"class":1164},[1053,6677,1168],{"class":1160},[1053,6679,1664],{"class":1074},[1053,6681,6682],{"class":1055,"line":2241},[1053,6683,2928],{"class":1074},[1053,6685,6686],{"class":1055,"line":2280},[1053,6687,1136],{"class":1095},[1053,6689,6690,6692],{"class":1055,"line":2286},[1053,6691,1446],{"class":1445},[1053,6693,6694],{"class":1095}," cart_items\n",[1053,6696,6697],{"class":1055,"line":2291},[1053,6698,1096],{"class":1095},[1053,6700,6701,6703],{"class":1055,"line":2296},[1053,6702,1102],{"class":1074},[1053,6704,1106],{"class":1105},[1053,6706,6707,6709,6712,6714,6716],{"class":1055,"line":2304},[1053,6708,1112],{"class":1066},[1053,6710,6711],{"class":1115}," clear_cart",[1053,6713,5893],{"class":1074},[1053,6715,5897],{"class":5896},[1053,6717,5916],{"class":1074},[1053,6719,6720,6722,6725],{"class":1055,"line":2311},[1053,6721,1125],{"class":1081},[1053,6723,6724],{"class":1085},"Clear all items from cart",[1053,6726,1089],{"class":1081},[1053,6728,6729],{"class":1055,"line":2317},[1053,6730,1136],{"class":1095},[1053,6732,6733,6735,6737,6739,6741,6744,6746,6748,6750],{"class":1055,"line":2327},[1053,6734,6002],{"class":1445},[1053,6736,1174],{"class":1160},[1053,6738,5959],{"class":1164},[1053,6740,1168],{"class":1160},[1053,6742,6743],{"class":5910}," in",[1053,6745,5939],{"class":1095},[1053,6747,5942],{"class":1074},[1053,6749,5946],{"class":5945},[1053,6751,1075],{"class":1074},[1053,6753,6754,6756,6758,6760,6762,6764,6766,6768,6770],{"class":1055,"line":2337},[1053,6755,6279],{"class":1445},[1053,6757,5939],{"class":1095},[1053,6759,5942],{"class":1074},[1053,6761,5946],{"class":5945},[1053,6763,6021],{"class":1074},[1053,6765,1168],{"class":1160},[1053,6767,5959],{"class":1164},[1053,6769,1168],{"class":1160},[1053,6771,1664],{"class":1074},[1053,6773,6774,6776,6778,6780,6782,6784,6786],{"class":1055,"line":2342},[1053,6775,6292],{"class":1095},[1053,6777,5942],{"class":1074},[1053,6779,5946],{"class":5945},[1053,6781,5942],{"class":1074},[1053,6783,6151],{"class":5945},[1053,6785,6062],{"class":1074},[1053,6787,6327],{"class":1252},[1053,6789,6790],{"class":1055,"line":2349},[1053,6791,2308],{"emptyLinePlaceholder":2307},[1053,6793,6794],{"class":1055,"line":2359},[1053,6795,6796],{"class":1059},"# Shopping cart views\n",[1053,6798,6799,6802,6805,6807,6809,6811,6813],{"class":1055,"line":2369},[1053,6800,6801],{"class":1066},"def",[1053,6803,6804],{"class":1115}," add_to_cart_view",[1053,6806,5893],{"class":1074},[1053,6808,5897],{"class":5896},[1053,6810,1375],{"class":1074},[1053,6812,5902],{"class":5896},[1053,6814,5916],{"class":1074},[1053,6816,6817,6819,6822],{"class":1055,"line":2374},[1053,6818,1082],{"class":1081},[1053,6820,6821],{"class":1085},"View to add product to cart",[1053,6823,1089],{"class":1081},[1053,6825,6826],{"class":1055,"line":2384},[1053,6827,1096],{"class":1095},[1053,6829,6830,6833,6835,6837,6839,6842,6844,6846,6848],{"class":1055,"line":2398},[1053,6831,6832],{"class":1445},"    if",[1053,6834,5939],{"class":1095},[1053,6836,5942],{"class":1074},[1053,6838,1165],{"class":5945},[1053,6840,6841],{"class":5910}," ==",[1053,6843,1174],{"class":1160},[1053,6845,1290],{"class":1164},[1053,6847,1168],{"class":1160},[1053,6849,1075],{"class":1074},[1053,6851,6852,6855,6857,6860,6862,6864,6866,6869,6871,6873,6875,6877,6879,6881,6883,6886],{"class":1055,"line":2419},[1053,6853,6854],{"class":1095},"        quantity ",[1053,6856,1151],{"class":1074},[1053,6858,6859],{"class":1105}," int",[1053,6861,5893],{"class":1074},[1053,6863,5897],{"class":5951},[1053,6865,5942],{"class":1074},[1053,6867,1290],{"class":6868},"sFGJz",[1053,6870,5942],{"class":1074},[1053,6872,5952],{"class":5951},[1053,6874,5893],{"class":1074},[1053,6876,1168],{"class":1160},[1053,6878,6031],{"class":1164},[1053,6880,1168],{"class":1160},[1053,6882,1375],{"class":1074},[1053,6884,6885],{"class":4316}," 1",[1053,6887,6888],{"class":1074},"))\n",[1053,6890,6891],{"class":1055,"line":2440},[1053,6892,1136],{"class":1095},[1053,6894,6895,6898],{"class":1055,"line":2455},[1053,6896,6897],{"class":1445},"        try",[1053,6899,1075],{"class":1074},[1053,6901,6902],{"class":1055,"line":2468},[1053,6903,6904],{"class":1059},"            # Validate product exists\n",[1053,6906,6907,6910,6912,6914,6916,6918,6920,6922,6924,6926,6928,6930],{"class":1055,"line":2480},[1053,6908,6909],{"class":1095},"            product ",[1053,6911,1151],{"class":1074},[1053,6913,6495],{"class":1095},[1053,6915,5942],{"class":1074},[1053,6917,6500],{"class":5945},[1053,6919,5942],{"class":1074},[1053,6921,5952],{"class":5951},[1053,6923,5893],{"class":1074},[1053,6925,6570],{"class":6510},[1053,6927,1151],{"class":1074},[1053,6929,5990],{"class":5951},[1053,6931,5993],{"class":1074},[1053,6933,6934],{"class":1055,"line":2492},[1053,6935,4277],{"class":1095},[1053,6937,6938],{"class":1055,"line":2503},[1053,6939,6940],{"class":1059},"            # Add to cart\n",[1053,6942,6943,6946,6948,6950,6952,6955],{"class":1055,"line":2509},[1053,6944,6945],{"class":1095},"            cart_size ",[1053,6947,1151],{"class":1074},[1053,6949,5862],{"class":1095},[1053,6951,5942],{"class":1074},[1053,6953,6954],{"class":5951},"add_to_cart",[1053,6956,6957],{"class":1074},"(\n",[1053,6959,6960,6963,6965,6967,6969],{"class":1055,"line":2514},[1053,6961,6962],{"class":5951},"                request",[1053,6964,1375],{"class":1074},[1053,6966,5902],{"class":5951},[1053,6968,1375],{"class":1074},[1053,6970,6042],{"class":5951},[1053,6972,6973],{"class":1055,"line":2528},[1053,6974,3952],{"class":1074},[1053,6976,6977],{"class":1055,"line":2548},[1053,6978,4277],{"class":1095},[1053,6980,6981,6984,6986,6989],{"class":1055,"line":2562},[1053,6982,6983],{"class":1095},"            messages",[1053,6985,5942],{"class":1074},[1053,6987,6988],{"class":5951},"success",[1053,6990,6957],{"class":1074},[1053,6992,6993,6995,6997],{"class":1055,"line":2574},[1053,6994,6962],{"class":5951},[1053,6996,1375],{"class":1074},[1053,6998,6999],{"class":5951}," \n",[1053,7001,7002,7005,7008,7011,7013,7015,7018,7021,7024,7026,7029,7031],{"class":1055,"line":2586},[1053,7003,7004],{"class":1066},"                f",[1053,7006,7007],{"class":1164},"'Added ",[1053,7009,7010],{"class":3990},"{",[1053,7012,6565],{"class":5951},[1053,7014,5942],{"class":1074},[1053,7016,7017],{"class":5945},"name",[1053,7019,7020],{"class":3990},"}",[1053,7022,7023],{"class":1164}," to cart. Cart has ",[1053,7025,7010],{"class":3990},[1053,7027,7028],{"class":5951},"cart_size",[1053,7030,7020],{"class":3990},[1053,7032,7033],{"class":1164}," items.'\n",[1053,7035,7036],{"class":1055,"line":2598},[1053,7037,3952],{"class":1074},[1053,7039,7040],{"class":1055,"line":2610},[1053,7041,4277],{"class":1095},[1053,7043,7044],{"class":1055,"line":2620},[1053,7045,7046],{"class":1059},"            # Return JSON for AJAX requests\n",[1053,7048,7049,7052,7054,7056,7058,7060,7062,7064,7066,7069,7071,7074,7076,7078,7081,7083],{"class":1055,"line":2625},[1053,7050,7051],{"class":1445},"            if",[1053,7053,5939],{"class":1095},[1053,7055,5942],{"class":1074},[1053,7057,1211],{"class":5945},[1053,7059,5942],{"class":1074},[1053,7061,5952],{"class":5951},[1053,7063,5893],{"class":1074},[1053,7065,1168],{"class":1160},[1053,7067,7068],{"class":1164},"X-Requested-With",[1053,7070,1168],{"class":1160},[1053,7072,7073],{"class":1074},")",[1053,7075,6841],{"class":5910},[1053,7077,1174],{"class":1160},[1053,7079,7080],{"class":1164},"XMLHttpRequest",[1053,7082,1168],{"class":1160},[1053,7084,1075],{"class":1074},[1053,7086,7087,7090,7093],{"class":1055,"line":2630},[1053,7088,7089],{"class":1445},"                return",[1053,7091,7092],{"class":5951}," JsonResponse",[1053,7094,6586],{"class":1074},[1053,7096,7097,7099,7101,7103,7105,7107],{"class":1055,"line":2644},[1053,7098,2458],{"class":1160},[1053,7100,6988],{"class":1164},[1053,7102,1168],{"class":1160},[1053,7104,1171],{"class":1074},[1053,7106,4355],{"class":1252},[1053,7108,1182],{"class":1074},[1053,7110,7111,7113,7115,7117,7119,7122],{"class":1055,"line":2664},[1053,7112,2458],{"class":1160},[1053,7114,7028],{"class":1164},[1053,7116,1168],{"class":1160},[1053,7118,1171],{"class":1074},[1053,7120,7121],{"class":5951}," cart_size",[1053,7123,1182],{"class":1074},[1053,7125,7126,7128,7131,7133,7135,7138,7140,7142,7144,7146,7148,7150],{"class":1055,"line":2685},[1053,7127,2458],{"class":1160},[1053,7129,7130],{"class":1164},"message",[1053,7132,1168],{"class":1160},[1053,7134,1171],{"class":1074},[1053,7136,7137],{"class":1066}," f",[1053,7139,7007],{"class":1164},[1053,7141,7010],{"class":3990},[1053,7143,6565],{"class":5951},[1053,7145,5942],{"class":1074},[1053,7147,7017],{"class":5945},[1053,7149,7020],{"class":3990},[1053,7151,7152],{"class":1164}," to cart'\n",[1053,7154,7155],{"class":1055,"line":2699},[1053,7156,7157],{"class":1074},"                })\n",[1053,7159,7160],{"class":1055,"line":2738},[1053,7161,4277],{"class":1095},[1053,7163,7164,7166,7169,7171,7173,7176,7178,7180,7182,7184,7186],{"class":1055,"line":2766},[1053,7165,6332],{"class":1445},[1053,7167,7168],{"class":5951}," redirect",[1053,7170,5893],{"class":1074},[1053,7172,1168],{"class":1160},[1053,7174,7175],{"class":1164},"product_detail",[1053,7177,1168],{"class":1160},[1053,7179,1375],{"class":1074},[1053,7181,5902],{"class":6510},[1053,7183,1151],{"class":1074},[1053,7185,5990],{"class":5951},[1053,7187,5993],{"class":1074},[1053,7189,7190],{"class":1055,"line":2771},[1053,7191,1136],{"class":1095},[1053,7193,7194,7197,7199,7201,7204],{"class":1055,"line":2776},[1053,7195,7196],{"class":1445},"        except",[1053,7198,6495],{"class":1095},[1053,7200,5942],{"class":1074},[1053,7202,7203],{"class":5945},"DoesNotExist",[1053,7205,1075],{"class":1074},[1053,7207,7208,7210,7212,7215,7217,7219,7221,7223,7226,7228],{"class":1055,"line":2781},[1053,7209,6983],{"class":1095},[1053,7211,5942],{"class":1074},[1053,7213,7214],{"class":5951},"error",[1053,7216,5893],{"class":1074},[1053,7218,5897],{"class":5951},[1053,7220,1375],{"class":1074},[1053,7222,1174],{"class":1160},[1053,7224,7225],{"class":1164},"Product not found",[1053,7227,1168],{"class":1160},[1053,7229,5993],{"class":1074},[1053,7231,7232,7234,7236,7238,7240,7243,7245],{"class":1055,"line":2786},[1053,7233,6332],{"class":1445},[1053,7235,7168],{"class":5951},[1053,7237,5893],{"class":1074},[1053,7239,1168],{"class":1160},[1053,7241,7242],{"class":1164},"product_list",[1053,7244,1168],{"class":1160},[1053,7246,5993],{"class":1074},[1053,7248,7249],{"class":1055,"line":2794},[1053,7250,1096],{"class":1095},[1053,7252,7253,7256,7258,7260,7262,7264,7266],{"class":1055,"line":2799},[1053,7254,7255],{"class":1445},"    return",[1053,7257,7168],{"class":5951},[1053,7259,5893],{"class":1074},[1053,7261,1168],{"class":1160},[1053,7263,7242],{"class":1164},[1053,7265,1168],{"class":1160},[1053,7267,5993],{"class":1074},[1053,7269,7270],{"class":1055,"line":2806},[1053,7271,2308],{"emptyLinePlaceholder":2307},[1053,7273,7274,7276,7279,7281,7283],{"class":1055,"line":2816},[1053,7275,6801],{"class":1066},[1053,7277,7278],{"class":1115}," cart_view",[1053,7280,5893],{"class":1074},[1053,7282,5897],{"class":5896},[1053,7284,5916],{"class":1074},[1053,7286,7287,7289,7292],{"class":1055,"line":2826},[1053,7288,1082],{"class":1081},[1053,7290,7291],{"class":1085},"Display shopping cart",[1053,7293,1089],{"class":1081},[1053,7295,7296],{"class":1055,"line":2831},[1053,7297,1096],{"class":1095},[1053,7299,7300,7303,7305,7307,7309,7312,7314,7316],{"class":1055,"line":2837},[1053,7301,7302],{"class":1095},"    cart_items ",[1053,7304,1151],{"class":1074},[1053,7306,5862],{"class":1095},[1053,7308,5942],{"class":1074},[1053,7310,7311],{"class":5951},"get_cart_contents",[1053,7313,5893],{"class":1074},[1053,7315,5897],{"class":5951},[1053,7317,5993],{"class":1074},[1053,7319,7320],{"class":1055,"line":2848},[1053,7321,1096],{"class":1095},[1053,7323,7324,7327,7329,7332,7334,7337,7339,7341,7343,7345,7347,7350,7353,7355,7358],{"class":1055,"line":2854},[1053,7325,7326],{"class":1095},"    total ",[1053,7328,1151],{"class":1074},[1053,7330,7331],{"class":6169}," sum",[1053,7333,5893],{"class":1074},[1053,7335,7336],{"class":5951},"item",[1053,7338,6021],{"class":1074},[1053,7340,1168],{"class":1160},[1053,7342,6653],{"class":1164},[1053,7344,1168],{"class":1160},[1053,7346,6036],{"class":1074},[1053,7348,7349],{"class":1445}," for",[1053,7351,7352],{"class":5951}," item ",[1053,7354,6008],{"class":1445},[1053,7356,7357],{"class":5951}," cart_items",[1053,7359,5993],{"class":1074},[1053,7361,7362],{"class":1055,"line":2860},[1053,7363,1096],{"class":1095},[1053,7365,7366,7369,7371],{"class":1055,"line":2866},[1053,7367,7368],{"class":1095},"    context ",[1053,7370,1151],{"class":1074},[1053,7372,1154],{"class":1074},[1053,7374,7375,7378,7381,7383,7385,7387],{"class":1055,"line":2872},[1053,7376,7377],{"class":1160},"        '",[1053,7379,7380],{"class":1164},"cart_items",[1053,7382,1168],{"class":1160},[1053,7384,1171],{"class":1074},[1053,7386,7357],{"class":1095},[1053,7388,1182],{"class":1074},[1053,7390,7391,7393,7396,7398,7400,7403],{"class":1055,"line":2878},[1053,7392,7377],{"class":1160},[1053,7394,7395],{"class":1164},"cart_total",[1053,7397,1168],{"class":1160},[1053,7399,1171],{"class":1074},[1053,7401,7402],{"class":1095}," total",[1053,7404,1182],{"class":1074},[1053,7406,7407,7409,7412,7414,7416,7418,7420,7422],{"class":1055,"line":2883},[1053,7408,7377],{"class":1160},[1053,7410,7411],{"class":1164},"cart_count",[1053,7413,1168],{"class":1160},[1053,7415,1171],{"class":1074},[1053,7417,6170],{"class":6169},[1053,7419,5893],{"class":1074},[1053,7421,7380],{"class":5951},[1053,7423,5993],{"class":1074},[1053,7425,7426],{"class":1055,"line":2889},[1053,7427,7428],{"class":1074},"    }\n",[1053,7430,7431],{"class":1055,"line":2895},[1053,7432,1096],{"class":1095},[1053,7434,7435,7437,7440,7442,7444,7446,7448,7451,7453,7455,7458],{"class":1055,"line":2901},[1053,7436,7255],{"class":1445},[1053,7438,7439],{"class":5951}," render",[1053,7441,5893],{"class":1074},[1053,7443,5897],{"class":5951},[1053,7445,1375],{"class":1074},[1053,7447,1174],{"class":1160},[1053,7449,7450],{"class":1164},"cart.html",[1053,7452,1168],{"class":1160},[1053,7454,1375],{"class":1074},[1053,7456,7457],{"class":5951}," context",[1053,7459,5993],{"class":1074},[1038,7461,7463],{"id":7462},"multi-step-form-wizard","Multi-Step Form Wizard",[1043,7465,7467],{"className":1045,"code":7466,"language":1047,"meta":1048,"style":1048},"# Multi-step form using sessions\nclass FormWizardManager:\n    \"\"\"Manage multi-step form data using sessions\"\"\"\n    \n    @staticmethod\n    def save_step_data(request, step, data):\n        \"\"\"Save form step data to session\"\"\"\n        \n        wizard_data = request.session.get('form_wizard', {})\n        wizard_data[step] = data\n        wizard_data['current_step'] = step\n        wizard_data['updated_at'] = timezone.now().isoformat()\n        \n        request.session['form_wizard'] = wizard_data\n        request.session.modified = True\n    \n    @staticmethod\n    def get_step_data(request, step):\n        \"\"\"Get form step data from session\"\"\"\n        \n        wizard_data = request.session.get('form_wizard', {})\n        return wizard_data.get(step, {})\n    \n    @staticmethod\n    def get_all_data(request):\n        \"\"\"Get all form wizard data\"\"\"\n        \n        return request.session.get('form_wizard', {})\n    \n    @staticmethod\n    def clear_wizard_data(request):\n        \"\"\"Clear all wizard data\"\"\"\n        \n        if 'form_wizard' in request.session:\n            del request.session['form_wizard']\n            request.session.modified = True\n    \n    @staticmethod\n    def get_current_step(request):\n        \"\"\"Get current wizard step\"\"\"\n        \n        wizard_data = request.session.get('form_wizard', {})\n        return wizard_data.get('current_step', 1)\n\n# Multi-step form views\nclass UserRegistrationWizard:\n    \"\"\"Multi-step user registration process\"\"\"\n    \n    def step_1_personal_info(self, request):\n        \"\"\"Step 1: Personal information\"\"\"\n        \n        if request.method == 'POST':\n            form = PersonalInfoForm(request.POST)\n            \n            if form.is_valid():\n                # Save step data\n                FormWizardManager.save_step_data(\n                    request, 'personal_info', form.cleaned_data\n                )\n                \n                return redirect('registration_step_2')\n        else:\n            # Load existing data if available\n            initial_data = FormWizardManager.get_step_data(request, 'personal_info')\n            form = PersonalInfoForm(initial=initial_data)\n        \n        return render(request, 'registration/step1.html', {'form': form})\n    \n    def step_2_contact_info(self, request):\n        \"\"\"Step 2: Contact information\"\"\"\n        \n        if request.method == 'POST':\n            form = ContactInfoForm(request.POST)\n            \n            if form.is_valid():\n                FormWizardManager.save_step_data(\n                    request, 'contact_info', form.cleaned_data\n                )\n                \n                return redirect('registration_step_3')\n        else:\n            initial_data = FormWizardManager.get_step_data(request, 'contact_info')\n            form = ContactInfoForm(initial=initial_data)\n        \n        # Get previous step data for display\n        personal_info = FormWizardManager.get_step_data(request, 'personal_info')\n        \n        return render(request, 'registration/step2.html', {\n            'form': form,\n            'personal_info': personal_info\n        })\n    \n    def step_3_confirmation(self, request):\n        \"\"\"Step 3: Confirmation and submission\"\"\"\n        \n        all_data = FormWizardManager.get_all_data(request)\n        \n        if request.method == 'POST':\n            # Create user account\n            user_data = {\n                **all_data.get('personal_info', {}),\n                **all_data.get('contact_info', {})\n            }\n            \n            try:\n                # Create user\n                user = User.objects.create_user(**user_data)\n                \n                # Clear wizard data\n                FormWizardManager.clear_wizard_data(request)\n                \n                messages.success(request, 'Registration completed successfully!')\n                return redirect('login')\n            \n            except Exception as e:\n                messages.error(request, f'Registration failed: {e}')\n        \n        return render(request, 'registration/step3.html', {\n            'all_data': all_data\n        })\n",[1050,7468,7469,7474,7483,7492,7496,7502,7525,7534,7538,7568,7585,7605,7634,7638,7661,7677,7681,7687,7704,7713,7717,7745,7764,7768,7774,7787,7796,7800,7826,7830,7836,7849,7858,7862,7882,7902,7918,7922,7928,7941,7950,7954,7982,8006,8010,8015,8024,8033,8037,8056,8065,8069,8089,8109,8113,8127,8132,8144,8167,8171,8176,8193,8199,8204,8232,8252,8256,8293,8297,8314,8323,8327,8347,8366,8370,8382,8392,8413,8417,8421,8438,8444,8470,8488,8492,8497,8524,8528,8551,8565,8578,8583,8587,8604,8613,8617,8637,8641,8661,8666,8675,8700,8722,8726,8730,8737,8742,8771,8775,8780,8795,8799,8823,8840,8844,8860,8890,8894,8917,8930],{"__ignoreMap":1048},[1053,7470,7471],{"class":1055,"line":1056},[1053,7472,7473],{"class":1059},"# Multi-step form using sessions\n",[1053,7475,7476,7478,7481],{"class":1055,"line":1063},[1053,7477,1067],{"class":1066},[1053,7479,7480],{"class":1070}," FormWizardManager",[1053,7482,1075],{"class":1074},[1053,7484,7485,7487,7490],{"class":1055,"line":1078},[1053,7486,1082],{"class":1081},[1053,7488,7489],{"class":1085},"Manage multi-step form data using sessions",[1053,7491,1089],{"class":1081},[1053,7493,7494],{"class":1055,"line":1092},[1053,7495,1096],{"class":1095},[1053,7497,7498,7500],{"class":1055,"line":1099},[1053,7499,1102],{"class":1074},[1053,7501,1106],{"class":1105},[1053,7503,7504,7506,7509,7511,7513,7515,7518,7520,7523],{"class":1055,"line":1109},[1053,7505,1112],{"class":1066},[1053,7507,7508],{"class":1115}," save_step_data",[1053,7510,5893],{"class":1074},[1053,7512,5897],{"class":5896},[1053,7514,1375],{"class":1074},[1053,7516,7517],{"class":5896}," step",[1053,7519,1375],{"class":1074},[1053,7521,7522],{"class":5896}," data",[1053,7524,5916],{"class":1074},[1053,7526,7527,7529,7532],{"class":1055,"line":1122},[1053,7528,1125],{"class":1081},[1053,7530,7531],{"class":1085},"Save form step data to session",[1053,7533,1089],{"class":1081},[1053,7535,7536],{"class":1055,"line":1133},[1053,7537,1136],{"class":1095},[1053,7539,7540,7543,7545,7547,7549,7551,7553,7555,7557,7559,7562,7564,7566],{"class":1055,"line":1139},[1053,7541,7542],{"class":1095},"        wizard_data ",[1053,7544,1151],{"class":1074},[1053,7546,5939],{"class":1095},[1053,7548,5942],{"class":1074},[1053,7550,5946],{"class":5945},[1053,7552,5942],{"class":1074},[1053,7554,5952],{"class":5951},[1053,7556,5893],{"class":1074},[1053,7558,1168],{"class":1160},[1053,7560,7561],{"class":1164},"form_wizard",[1053,7563,1168],{"class":1160},[1053,7565,1375],{"class":1074},[1053,7567,5966],{"class":1074},[1053,7569,7570,7573,7575,7578,7580,7582],{"class":1055,"line":1145},[1053,7571,7572],{"class":1095},"        wizard_data",[1053,7574,6021],{"class":1074},[1053,7576,7577],{"class":1095},"step",[1053,7579,6036],{"class":1074},[1053,7581,6062],{"class":1074},[1053,7583,7584],{"class":1095}," data\n",[1053,7586,7587,7589,7591,7593,7596,7598,7600,7602],{"class":1055,"line":1157},[1053,7588,7572],{"class":1095},[1053,7590,6021],{"class":1074},[1053,7592,1168],{"class":1160},[1053,7594,7595],{"class":1164},"current_step",[1053,7597,1168],{"class":1160},[1053,7599,6036],{"class":1074},[1053,7601,6062],{"class":1074},[1053,7603,7604],{"class":1095}," step\n",[1053,7606,7607,7609,7611,7613,7616,7618,7620,7622,7624,7626,7628,7630,7632],{"class":1055,"line":1185},[1053,7608,7572],{"class":1095},[1053,7610,6021],{"class":1074},[1053,7612,1168],{"class":1160},[1053,7614,7615],{"class":1164},"updated_at",[1053,7617,1168],{"class":1160},[1053,7619,6036],{"class":1074},[1053,7621,6062],{"class":1074},[1053,7623,6092],{"class":1095},[1053,7625,5942],{"class":1074},[1053,7627,6097],{"class":5951},[1053,7629,6100],{"class":1074},[1053,7631,6103],{"class":5951},[1053,7633,6106],{"class":1074},[1053,7635,7636],{"class":1055,"line":1206},[1053,7637,1136],{"class":1095},[1053,7639,7640,7642,7644,7646,7648,7650,7652,7654,7656,7658],{"class":1055,"line":1240},[1053,7641,6119],{"class":1095},[1053,7643,5942],{"class":1074},[1053,7645,5946],{"class":5945},[1053,7647,6021],{"class":1074},[1053,7649,1168],{"class":1160},[1053,7651,7561],{"class":1164},[1053,7653,1168],{"class":1160},[1053,7655,6036],{"class":1074},[1053,7657,6062],{"class":1074},[1053,7659,7660],{"class":1095}," wizard_data\n",[1053,7662,7663,7665,7667,7669,7671,7673,7675],{"class":1055,"line":1256},[1053,7664,6119],{"class":1095},[1053,7666,5942],{"class":1074},[1053,7668,5946],{"class":5945},[1053,7670,5942],{"class":1074},[1053,7672,6151],{"class":5945},[1053,7674,6062],{"class":1074},[1053,7676,6327],{"class":1252},[1053,7678,7679],{"class":1055,"line":1262},[1053,7680,1096],{"class":1095},[1053,7682,7683,7685],{"class":1055,"line":1267},[1053,7684,1102],{"class":1074},[1053,7686,1106],{"class":1105},[1053,7688,7689,7691,7694,7696,7698,7700,7702],{"class":1055,"line":1277},[1053,7690,1112],{"class":1066},[1053,7692,7693],{"class":1115}," get_step_data",[1053,7695,5893],{"class":1074},[1053,7697,5897],{"class":5896},[1053,7699,1375],{"class":1074},[1053,7701,7517],{"class":5896},[1053,7703,5916],{"class":1074},[1053,7705,7706,7708,7711],{"class":1055,"line":1297},[1053,7707,1125],{"class":1081},[1053,7709,7710],{"class":1085},"Get form step data from session",[1053,7712,1089],{"class":1081},[1053,7714,7715],{"class":1055,"line":1317},[1053,7716,1136],{"class":1095},[1053,7718,7719,7721,7723,7725,7727,7729,7731,7733,7735,7737,7739,7741,7743],{"class":1055,"line":1346},[1053,7720,7542],{"class":1095},[1053,7722,1151],{"class":1074},[1053,7724,5939],{"class":1095},[1053,7726,5942],{"class":1074},[1053,7728,5946],{"class":5945},[1053,7730,5942],{"class":1074},[1053,7732,5952],{"class":5951},[1053,7734,5893],{"class":1074},[1053,7736,1168],{"class":1160},[1053,7738,7561],{"class":1164},[1053,7740,1168],{"class":1160},[1053,7742,1375],{"class":1074},[1053,7744,5966],{"class":1074},[1053,7746,7747,7749,7752,7754,7756,7758,7760,7762],{"class":1055,"line":1397},[1053,7748,1446],{"class":1445},[1053,7750,7751],{"class":1095}," wizard_data",[1053,7753,5942],{"class":1074},[1053,7755,5952],{"class":5951},[1053,7757,5893],{"class":1074},[1053,7759,7577],{"class":5951},[1053,7761,1375],{"class":1074},[1053,7763,5966],{"class":1074},[1053,7765,7766],{"class":1055,"line":1402},[1053,7767,1096],{"class":1095},[1053,7769,7770,7772],{"class":1055,"line":1407},[1053,7771,1102],{"class":1074},[1053,7773,1106],{"class":1105},[1053,7775,7776,7778,7781,7783,7785],{"class":1055,"line":1413},[1053,7777,1112],{"class":1066},[1053,7779,7780],{"class":1115}," get_all_data",[1053,7782,5893],{"class":1074},[1053,7784,5897],{"class":5896},[1053,7786,5916],{"class":1074},[1053,7788,7789,7791,7794],{"class":1055,"line":1419},[1053,7790,1125],{"class":1081},[1053,7792,7793],{"class":1085},"Get all form wizard data",[1053,7795,1089],{"class":1081},[1053,7797,7798],{"class":1055,"line":1425},[1053,7799,1136],{"class":1095},[1053,7801,7802,7804,7806,7808,7810,7812,7814,7816,7818,7820,7822,7824],{"class":1055,"line":1431},[1053,7803,1446],{"class":1445},[1053,7805,5939],{"class":1095},[1053,7807,5942],{"class":1074},[1053,7809,5946],{"class":5945},[1053,7811,5942],{"class":1074},[1053,7813,5952],{"class":5951},[1053,7815,5893],{"class":1074},[1053,7817,1168],{"class":1160},[1053,7819,7561],{"class":1164},[1053,7821,1168],{"class":1160},[1053,7823,1375],{"class":1074},[1053,7825,5966],{"class":1074},[1053,7827,7828],{"class":1055,"line":1437},[1053,7829,1096],{"class":1095},[1053,7831,7832,7834],{"class":1055,"line":1442},[1053,7833,1102],{"class":1074},[1053,7835,1106],{"class":1105},[1053,7837,7838,7840,7843,7845,7847],{"class":1055,"line":1458},[1053,7839,1112],{"class":1066},[1053,7841,7842],{"class":1115}," clear_wizard_data",[1053,7844,5893],{"class":1074},[1053,7846,5897],{"class":5896},[1053,7848,5916],{"class":1074},[1053,7850,7851,7853,7856],{"class":1055,"line":1463},[1053,7852,1125],{"class":1081},[1053,7854,7855],{"class":1085},"Clear all wizard data",[1053,7857,1089],{"class":1081},[1053,7859,7860],{"class":1055,"line":1470},[1053,7861,1136],{"class":1095},[1053,7863,7864,7866,7868,7870,7872,7874,7876,7878,7880],{"class":1055,"line":1480},[1053,7865,6002],{"class":1445},[1053,7867,1174],{"class":1160},[1053,7869,7561],{"class":1164},[1053,7871,1168],{"class":1160},[1053,7873,6743],{"class":5910},[1053,7875,5939],{"class":1095},[1053,7877,5942],{"class":1074},[1053,7879,5946],{"class":5945},[1053,7881,1075],{"class":1074},[1053,7883,7884,7886,7888,7890,7892,7894,7896,7898,7900],{"class":1055,"line":1490},[1053,7885,6279],{"class":1445},[1053,7887,5939],{"class":1095},[1053,7889,5942],{"class":1074},[1053,7891,5946],{"class":5945},[1053,7893,6021],{"class":1074},[1053,7895,1168],{"class":1160},[1053,7897,7561],{"class":1164},[1053,7899,1168],{"class":1160},[1053,7901,1664],{"class":1074},[1053,7903,7904,7906,7908,7910,7912,7914,7916],{"class":1055,"line":1495},[1053,7905,6292],{"class":1095},[1053,7907,5942],{"class":1074},[1053,7909,5946],{"class":5945},[1053,7911,5942],{"class":1074},[1053,7913,6151],{"class":5945},[1053,7915,6062],{"class":1074},[1053,7917,6327],{"class":1252},[1053,7919,7920],{"class":1055,"line":1505},[1053,7921,1096],{"class":1095},[1053,7923,7924,7926],{"class":1055,"line":1519},[1053,7925,1102],{"class":1074},[1053,7927,1106],{"class":1105},[1053,7929,7930,7932,7935,7937,7939],{"class":1055,"line":1541},[1053,7931,1112],{"class":1066},[1053,7933,7934],{"class":1115}," get_current_step",[1053,7936,5893],{"class":1074},[1053,7938,5897],{"class":5896},[1053,7940,5916],{"class":1074},[1053,7942,7943,7945,7948],{"class":1055,"line":1584},[1053,7944,1125],{"class":1081},[1053,7946,7947],{"class":1085},"Get current wizard step",[1053,7949,1089],{"class":1081},[1053,7951,7952],{"class":1055,"line":1625},[1053,7953,1136],{"class":1095},[1053,7955,7956,7958,7960,7962,7964,7966,7968,7970,7972,7974,7976,7978,7980],{"class":1055,"line":1667},[1053,7957,7542],{"class":1095},[1053,7959,1151],{"class":1074},[1053,7961,5939],{"class":1095},[1053,7963,5942],{"class":1074},[1053,7965,5946],{"class":5945},[1053,7967,5942],{"class":1074},[1053,7969,5952],{"class":5951},[1053,7971,5893],{"class":1074},[1053,7973,1168],{"class":1160},[1053,7975,7561],{"class":1164},[1053,7977,1168],{"class":1160},[1053,7979,1375],{"class":1074},[1053,7981,5966],{"class":1074},[1053,7983,7984,7986,7988,7990,7992,7994,7996,7998,8000,8002,8004],{"class":1055,"line":1673},[1053,7985,1446],{"class":1445},[1053,7987,7751],{"class":1095},[1053,7989,5942],{"class":1074},[1053,7991,5952],{"class":5951},[1053,7993,5893],{"class":1074},[1053,7995,1168],{"class":1160},[1053,7997,7595],{"class":1164},[1053,7999,1168],{"class":1160},[1053,8001,1375],{"class":1074},[1053,8003,6885],{"class":4316},[1053,8005,5993],{"class":1074},[1053,8007,8008],{"class":1055,"line":1687},[1053,8009,2308],{"emptyLinePlaceholder":2307},[1053,8011,8012],{"class":1055,"line":1707},[1053,8013,8014],{"class":1059},"# Multi-step form views\n",[1053,8016,8017,8019,8022],{"class":1055,"line":1747},[1053,8018,1067],{"class":1066},[1053,8020,8021],{"class":1070}," UserRegistrationWizard",[1053,8023,1075],{"class":1074},[1053,8025,8026,8028,8031],{"class":1055,"line":1778},[1053,8027,1082],{"class":1081},[1053,8029,8030],{"class":1085},"Multi-step user registration process",[1053,8032,1089],{"class":1081},[1053,8034,8035],{"class":1055,"line":1818},[1053,8036,1096],{"class":1095},[1053,8038,8039,8041,8044,8046,8050,8052,8054],{"class":1055,"line":1823},[1053,8040,1112],{"class":1066},[1053,8042,8043],{"class":1115}," step_1_personal_info",[1053,8045,5893],{"class":1074},[1053,8047,8049],{"class":8048},"sRjD_","self",[1053,8051,1375],{"class":1074},[1053,8053,5939],{"class":5896},[1053,8055,5916],{"class":1074},[1053,8057,8058,8060,8063],{"class":1055,"line":1837},[1053,8059,1125],{"class":1081},[1053,8061,8062],{"class":1085},"Step 1: Personal information",[1053,8064,1089],{"class":1081},[1053,8066,8067],{"class":1055,"line":1857},[1053,8068,1136],{"class":1095},[1053,8070,8071,8073,8075,8077,8079,8081,8083,8085,8087],{"class":1055,"line":1896},[1053,8072,6002],{"class":1445},[1053,8074,5939],{"class":1095},[1053,8076,5942],{"class":1074},[1053,8078,1165],{"class":5945},[1053,8080,6841],{"class":5910},[1053,8082,1174],{"class":1160},[1053,8084,1290],{"class":1164},[1053,8086,1168],{"class":1160},[1053,8088,1075],{"class":1074},[1053,8090,8091,8094,8096,8099,8101,8103,8105,8107],{"class":1055,"line":1936},[1053,8092,8093],{"class":1095},"            form ",[1053,8095,1151],{"class":1074},[1053,8097,8098],{"class":5951}," PersonalInfoForm",[1053,8100,5893],{"class":1074},[1053,8102,5897],{"class":5951},[1053,8104,5942],{"class":1074},[1053,8106,1290],{"class":6868},[1053,8108,5993],{"class":1074},[1053,8110,8111],{"class":1055,"line":1975},[1053,8112,4277],{"class":1095},[1053,8114,8115,8117,8120,8122,8125],{"class":1055,"line":1980},[1053,8116,7051],{"class":1445},[1053,8118,8119],{"class":1095}," form",[1053,8121,5942],{"class":1074},[1053,8123,8124],{"class":5951},"is_valid",[1053,8126,1119],{"class":1074},[1053,8128,8129],{"class":1055,"line":1994},[1053,8130,8131],{"class":1059},"                # Save step data\n",[1053,8133,8134,8137,8139,8142],{"class":1055,"line":2014},[1053,8135,8136],{"class":1095},"                FormWizardManager",[1053,8138,5942],{"class":1074},[1053,8140,8141],{"class":5951},"save_step_data",[1053,8143,6957],{"class":1074},[1053,8145,8146,8149,8151,8153,8156,8158,8160,8162,8164],{"class":1055,"line":2045},[1053,8147,8148],{"class":5951},"                    request",[1053,8150,1375],{"class":1074},[1053,8152,1174],{"class":1160},[1053,8154,8155],{"class":1164},"personal_info",[1053,8157,1168],{"class":1160},[1053,8159,1375],{"class":1074},[1053,8161,8119],{"class":5951},[1053,8163,5942],{"class":1074},[1053,8165,8166],{"class":5945},"cleaned_data\n",[1053,8168,8169],{"class":1055,"line":2085},[1053,8170,4126],{"class":1074},[1053,8172,8173],{"class":1055,"line":2124},[1053,8174,8175],{"class":1095},"                \n",[1053,8177,8178,8180,8182,8184,8186,8189,8191],{"class":1055,"line":2129},[1053,8179,7089],{"class":1445},[1053,8181,7168],{"class":5951},[1053,8183,5893],{"class":1074},[1053,8185,1168],{"class":1160},[1053,8187,8188],{"class":1164},"registration_step_2",[1053,8190,1168],{"class":1160},[1053,8192,5993],{"class":1074},[1053,8194,8195,8197],{"class":1055,"line":2143},[1053,8196,6047],{"class":1445},[1053,8198,1075],{"class":1074},[1053,8200,8201],{"class":1055,"line":2163},[1053,8202,8203],{"class":1059},"            # Load existing data if available\n",[1053,8205,8206,8209,8211,8213,8215,8218,8220,8222,8224,8226,8228,8230],{"class":1055,"line":2201},[1053,8207,8208],{"class":1095},"            initial_data ",[1053,8210,1151],{"class":1074},[1053,8212,7480],{"class":1095},[1053,8214,5942],{"class":1074},[1053,8216,8217],{"class":5951},"get_step_data",[1053,8219,5893],{"class":1074},[1053,8221,5897],{"class":5951},[1053,8223,1375],{"class":1074},[1053,8225,1174],{"class":1160},[1053,8227,8155],{"class":1164},[1053,8229,1168],{"class":1160},[1053,8231,5993],{"class":1074},[1053,8233,8234,8236,8238,8240,8242,8245,8247,8250],{"class":1055,"line":2241},[1053,8235,8093],{"class":1095},[1053,8237,1151],{"class":1074},[1053,8239,8098],{"class":5951},[1053,8241,5893],{"class":1074},[1053,8243,8244],{"class":6510},"initial",[1053,8246,1151],{"class":1074},[1053,8248,8249],{"class":5951},"initial_data",[1053,8251,5993],{"class":1074},[1053,8253,8254],{"class":1055,"line":2280},[1053,8255,1136],{"class":1095},[1053,8257,8258,8260,8262,8264,8266,8268,8270,8273,8275,8277,8279,8281,8284,8286,8288,8290],{"class":1055,"line":2286},[1053,8259,1446],{"class":1445},[1053,8261,7439],{"class":5951},[1053,8263,5893],{"class":1074},[1053,8265,5897],{"class":5951},[1053,8267,1375],{"class":1074},[1053,8269,1174],{"class":1160},[1053,8271,8272],{"class":1164},"registration/step1.html",[1053,8274,1168],{"class":1160},[1053,8276,1375],{"class":1074},[1053,8278,1218],{"class":1074},[1053,8280,1168],{"class":1160},[1053,8282,8283],{"class":1164},"form",[1053,8285,1168],{"class":1160},[1053,8287,1171],{"class":1074},[1053,8289,8119],{"class":5951},[1053,8291,8292],{"class":1074},"})\n",[1053,8294,8295],{"class":1055,"line":2291},[1053,8296,1096],{"class":1095},[1053,8298,8299,8301,8304,8306,8308,8310,8312],{"class":1055,"line":2296},[1053,8300,1112],{"class":1066},[1053,8302,8303],{"class":1115}," step_2_contact_info",[1053,8305,5893],{"class":1074},[1053,8307,8049],{"class":8048},[1053,8309,1375],{"class":1074},[1053,8311,5939],{"class":5896},[1053,8313,5916],{"class":1074},[1053,8315,8316,8318,8321],{"class":1055,"line":2304},[1053,8317,1125],{"class":1081},[1053,8319,8320],{"class":1085},"Step 2: Contact information",[1053,8322,1089],{"class":1081},[1053,8324,8325],{"class":1055,"line":2311},[1053,8326,1136],{"class":1095},[1053,8328,8329,8331,8333,8335,8337,8339,8341,8343,8345],{"class":1055,"line":2317},[1053,8330,6002],{"class":1445},[1053,8332,5939],{"class":1095},[1053,8334,5942],{"class":1074},[1053,8336,1165],{"class":5945},[1053,8338,6841],{"class":5910},[1053,8340,1174],{"class":1160},[1053,8342,1290],{"class":1164},[1053,8344,1168],{"class":1160},[1053,8346,1075],{"class":1074},[1053,8348,8349,8351,8353,8356,8358,8360,8362,8364],{"class":1055,"line":2327},[1053,8350,8093],{"class":1095},[1053,8352,1151],{"class":1074},[1053,8354,8355],{"class":5951}," ContactInfoForm",[1053,8357,5893],{"class":1074},[1053,8359,5897],{"class":5951},[1053,8361,5942],{"class":1074},[1053,8363,1290],{"class":6868},[1053,8365,5993],{"class":1074},[1053,8367,8368],{"class":1055,"line":2337},[1053,8369,4277],{"class":1095},[1053,8371,8372,8374,8376,8378,8380],{"class":1055,"line":2342},[1053,8373,7051],{"class":1445},[1053,8375,8119],{"class":1095},[1053,8377,5942],{"class":1074},[1053,8379,8124],{"class":5951},[1053,8381,1119],{"class":1074},[1053,8383,8384,8386,8388,8390],{"class":1055,"line":2349},[1053,8385,8136],{"class":1095},[1053,8387,5942],{"class":1074},[1053,8389,8141],{"class":5951},[1053,8391,6957],{"class":1074},[1053,8393,8394,8396,8398,8400,8403,8405,8407,8409,8411],{"class":1055,"line":2359},[1053,8395,8148],{"class":5951},[1053,8397,1375],{"class":1074},[1053,8399,1174],{"class":1160},[1053,8401,8402],{"class":1164},"contact_info",[1053,8404,1168],{"class":1160},[1053,8406,1375],{"class":1074},[1053,8408,8119],{"class":5951},[1053,8410,5942],{"class":1074},[1053,8412,8166],{"class":5945},[1053,8414,8415],{"class":1055,"line":2369},[1053,8416,4126],{"class":1074},[1053,8418,8419],{"class":1055,"line":2374},[1053,8420,8175],{"class":1095},[1053,8422,8423,8425,8427,8429,8431,8434,8436],{"class":1055,"line":2384},[1053,8424,7089],{"class":1445},[1053,8426,7168],{"class":5951},[1053,8428,5893],{"class":1074},[1053,8430,1168],{"class":1160},[1053,8432,8433],{"class":1164},"registration_step_3",[1053,8435,1168],{"class":1160},[1053,8437,5993],{"class":1074},[1053,8439,8440,8442],{"class":1055,"line":2398},[1053,8441,6047],{"class":1445},[1053,8443,1075],{"class":1074},[1053,8445,8446,8448,8450,8452,8454,8456,8458,8460,8462,8464,8466,8468],{"class":1055,"line":2419},[1053,8447,8208],{"class":1095},[1053,8449,1151],{"class":1074},[1053,8451,7480],{"class":1095},[1053,8453,5942],{"class":1074},[1053,8455,8217],{"class":5951},[1053,8457,5893],{"class":1074},[1053,8459,5897],{"class":5951},[1053,8461,1375],{"class":1074},[1053,8463,1174],{"class":1160},[1053,8465,8402],{"class":1164},[1053,8467,1168],{"class":1160},[1053,8469,5993],{"class":1074},[1053,8471,8472,8474,8476,8478,8480,8482,8484,8486],{"class":1055,"line":2440},[1053,8473,8093],{"class":1095},[1053,8475,1151],{"class":1074},[1053,8477,8355],{"class":5951},[1053,8479,5893],{"class":1074},[1053,8481,8244],{"class":6510},[1053,8483,1151],{"class":1074},[1053,8485,8249],{"class":5951},[1053,8487,5993],{"class":1074},[1053,8489,8490],{"class":1055,"line":2455},[1053,8491,1136],{"class":1095},[1053,8493,8494],{"class":1055,"line":2468},[1053,8495,8496],{"class":1059},"        # Get previous step data for display\n",[1053,8498,8499,8502,8504,8506,8508,8510,8512,8514,8516,8518,8520,8522],{"class":1055,"line":2480},[1053,8500,8501],{"class":1095},"        personal_info ",[1053,8503,1151],{"class":1074},[1053,8505,7480],{"class":1095},[1053,8507,5942],{"class":1074},[1053,8509,8217],{"class":5951},[1053,8511,5893],{"class":1074},[1053,8513,5897],{"class":5951},[1053,8515,1375],{"class":1074},[1053,8517,1174],{"class":1160},[1053,8519,8155],{"class":1164},[1053,8521,1168],{"class":1160},[1053,8523,5993],{"class":1074},[1053,8525,8526],{"class":1055,"line":2492},[1053,8527,1136],{"class":1095},[1053,8529,8530,8532,8534,8536,8538,8540,8542,8545,8547,8549],{"class":1055,"line":2503},[1053,8531,1446],{"class":1445},[1053,8533,7439],{"class":5951},[1053,8535,5893],{"class":1074},[1053,8537,5897],{"class":5951},[1053,8539,1375],{"class":1074},[1053,8541,1174],{"class":1160},[1053,8543,8544],{"class":1164},"registration/step2.html",[1053,8546,1168],{"class":1160},[1053,8548,1375],{"class":1074},[1053,8550,1154],{"class":1074},[1053,8552,8553,8555,8557,8559,8561,8563],{"class":1055,"line":2509},[1053,8554,1161],{"class":1160},[1053,8556,8283],{"class":1164},[1053,8558,1168],{"class":1160},[1053,8560,1171],{"class":1074},[1053,8562,8119],{"class":5951},[1053,8564,1182],{"class":1074},[1053,8566,8567,8569,8571,8573,8575],{"class":1055,"line":2514},[1053,8568,1161],{"class":1160},[1053,8570,8155],{"class":1164},[1053,8572,1168],{"class":1160},[1053,8574,1171],{"class":1074},[1053,8576,8577],{"class":5951}," personal_info\n",[1053,8579,8580],{"class":1055,"line":2528},[1053,8581,8582],{"class":1074},"        })\n",[1053,8584,8585],{"class":1055,"line":2548},[1053,8586,1096],{"class":1095},[1053,8588,8589,8591,8594,8596,8598,8600,8602],{"class":1055,"line":2562},[1053,8590,1112],{"class":1066},[1053,8592,8593],{"class":1115}," step_3_confirmation",[1053,8595,5893],{"class":1074},[1053,8597,8049],{"class":8048},[1053,8599,1375],{"class":1074},[1053,8601,5939],{"class":5896},[1053,8603,5916],{"class":1074},[1053,8605,8606,8608,8611],{"class":1055,"line":2574},[1053,8607,1125],{"class":1081},[1053,8609,8610],{"class":1085},"Step 3: Confirmation and submission",[1053,8612,1089],{"class":1081},[1053,8614,8615],{"class":1055,"line":2586},[1053,8616,1136],{"class":1095},[1053,8618,8619,8622,8624,8626,8628,8631,8633,8635],{"class":1055,"line":2598},[1053,8620,8621],{"class":1095},"        all_data ",[1053,8623,1151],{"class":1074},[1053,8625,7480],{"class":1095},[1053,8627,5942],{"class":1074},[1053,8629,8630],{"class":5951},"get_all_data",[1053,8632,5893],{"class":1074},[1053,8634,5897],{"class":5951},[1053,8636,5993],{"class":1074},[1053,8638,8639],{"class":1055,"line":2610},[1053,8640,1136],{"class":1095},[1053,8642,8643,8645,8647,8649,8651,8653,8655,8657,8659],{"class":1055,"line":2620},[1053,8644,6002],{"class":1445},[1053,8646,5939],{"class":1095},[1053,8648,5942],{"class":1074},[1053,8650,1165],{"class":5945},[1053,8652,6841],{"class":5910},[1053,8654,1174],{"class":1160},[1053,8656,1290],{"class":1164},[1053,8658,1168],{"class":1160},[1053,8660,1075],{"class":1074},[1053,8662,8663],{"class":1055,"line":2625},[1053,8664,8665],{"class":1059},"            # Create user account\n",[1053,8667,8668,8671,8673],{"class":1055,"line":2630},[1053,8669,8670],{"class":1095},"            user_data ",[1053,8672,1151],{"class":1074},[1053,8674,1154],{"class":1074},[1053,8676,8677,8680,8683,8685,8687,8689,8691,8693,8695,8697],{"class":1055,"line":2644},[1053,8678,8679],{"class":5910},"                **",[1053,8681,8682],{"class":1095},"all_data",[1053,8684,5942],{"class":1074},[1053,8686,5952],{"class":5951},[1053,8688,5893],{"class":1074},[1053,8690,1168],{"class":1160},[1053,8692,8155],{"class":1164},[1053,8694,1168],{"class":1160},[1053,8696,1375],{"class":1074},[1053,8698,8699],{"class":1074}," {}),\n",[1053,8701,8702,8704,8706,8708,8710,8712,8714,8716,8718,8720],{"class":1055,"line":2664},[1053,8703,8679],{"class":5910},[1053,8705,8682],{"class":1095},[1053,8707,5942],{"class":1074},[1053,8709,5952],{"class":5951},[1053,8711,5893],{"class":1074},[1053,8713,1168],{"class":1160},[1053,8715,8402],{"class":1164},[1053,8717,1168],{"class":1160},[1053,8719,1375],{"class":1074},[1053,8721,5966],{"class":1074},[1053,8723,8724],{"class":1055,"line":2685},[1053,8725,2283],{"class":1074},[1053,8727,8728],{"class":1055,"line":2699},[1053,8729,4277],{"class":1095},[1053,8731,8732,8735],{"class":1055,"line":2738},[1053,8733,8734],{"class":1445},"            try",[1053,8736,1075],{"class":1074},[1053,8738,8739],{"class":1055,"line":2766},[1053,8740,8741],{"class":1059},"                # Create user\n",[1053,8743,8744,8747,8749,8752,8754,8756,8758,8761,8763,8766,8769],{"class":1055,"line":2771},[1053,8745,8746],{"class":1095},"                user ",[1053,8748,1151],{"class":1074},[1053,8750,8751],{"class":1095}," User",[1053,8753,5942],{"class":1074},[1053,8755,6500],{"class":5945},[1053,8757,5942],{"class":1074},[1053,8759,8760],{"class":5951},"create_user",[1053,8762,5893],{"class":1074},[1053,8764,8765],{"class":5910},"**",[1053,8767,8768],{"class":5951},"user_data",[1053,8770,5993],{"class":1074},[1053,8772,8773],{"class":1055,"line":2776},[1053,8774,8175],{"class":1095},[1053,8776,8777],{"class":1055,"line":2781},[1053,8778,8779],{"class":1059},"                # Clear wizard data\n",[1053,8781,8782,8784,8786,8789,8791,8793],{"class":1055,"line":2786},[1053,8783,8136],{"class":1095},[1053,8785,5942],{"class":1074},[1053,8787,8788],{"class":5951},"clear_wizard_data",[1053,8790,5893],{"class":1074},[1053,8792,5897],{"class":5951},[1053,8794,5993],{"class":1074},[1053,8796,8797],{"class":1055,"line":2794},[1053,8798,8175],{"class":1095},[1053,8800,8801,8804,8806,8808,8810,8812,8814,8816,8819,8821],{"class":1055,"line":2799},[1053,8802,8803],{"class":1095},"                messages",[1053,8805,5942],{"class":1074},[1053,8807,6988],{"class":5951},[1053,8809,5893],{"class":1074},[1053,8811,5897],{"class":5951},[1053,8813,1375],{"class":1074},[1053,8815,1174],{"class":1160},[1053,8817,8818],{"class":1164},"Registration completed successfully!",[1053,8820,1168],{"class":1160},[1053,8822,5993],{"class":1074},[1053,8824,8825,8827,8829,8831,8833,8836,8838],{"class":1055,"line":2806},[1053,8826,7089],{"class":1445},[1053,8828,7168],{"class":5951},[1053,8830,5893],{"class":1074},[1053,8832,1168],{"class":1160},[1053,8834,8835],{"class":1164},"login",[1053,8837,1168],{"class":1160},[1053,8839,5993],{"class":1074},[1053,8841,8842],{"class":1055,"line":2816},[1053,8843,4277],{"class":1095},[1053,8845,8846,8849,8852,8855,8858],{"class":1055,"line":2826},[1053,8847,8848],{"class":1445},"            except",[1053,8850,8851],{"class":1105}," Exception",[1053,8853,8854],{"class":1445}," as",[1053,8856,8857],{"class":1095}," e",[1053,8859,1075],{"class":1074},[1053,8861,8862,8864,8866,8868,8870,8872,8874,8876,8879,8881,8884,8886,8888],{"class":1055,"line":2831},[1053,8863,8803],{"class":1095},[1053,8865,5942],{"class":1074},[1053,8867,7214],{"class":5951},[1053,8869,5893],{"class":1074},[1053,8871,5897],{"class":5951},[1053,8873,1375],{"class":1074},[1053,8875,7137],{"class":1066},[1053,8877,8878],{"class":1164},"'Registration failed: ",[1053,8880,7010],{"class":3990},[1053,8882,8883],{"class":5951},"e",[1053,8885,7020],{"class":3990},[1053,8887,1168],{"class":1164},[1053,8889,5993],{"class":1074},[1053,8891,8892],{"class":1055,"line":2837},[1053,8893,1136],{"class":1095},[1053,8895,8896,8898,8900,8902,8904,8906,8908,8911,8913,8915],{"class":1055,"line":2848},[1053,8897,1446],{"class":1445},[1053,8899,7439],{"class":5951},[1053,8901,5893],{"class":1074},[1053,8903,5897],{"class":5951},[1053,8905,1375],{"class":1074},[1053,8907,1174],{"class":1160},[1053,8909,8910],{"class":1164},"registration/step3.html",[1053,8912,1168],{"class":1160},[1053,8914,1375],{"class":1074},[1053,8916,1154],{"class":1074},[1053,8918,8919,8921,8923,8925,8927],{"class":1055,"line":2854},[1053,8920,1161],{"class":1160},[1053,8922,8682],{"class":1164},[1053,8924,1168],{"class":1160},[1053,8926,1171],{"class":1074},[1053,8928,8929],{"class":5951}," all_data\n",[1053,8931,8932],{"class":1055,"line":2860},[1053,8933,8582],{"class":1074},[1030,8935,8937],{"id":8936},"session-security-and-best-practices","Session Security and Best Practices",[1038,8939,8941],{"id":8940},"session-security-implementation","Session Security Implementation",[1043,8943,8945],{"className":1045,"code":8944,"language":1047,"meta":1048,"style":1048},"# Advanced session security\nclass SessionSecurity:\n    \"\"\"Implement advanced session security measures\"\"\"\n    \n    @staticmethod\n    def secure_session_middleware():\n        \"\"\"Custom middleware for enhanced session security\"\"\"\n        \n        class SecureSessionMiddleware:\n            \"\"\"Enhanced session security middleware\"\"\"\n            \n            def __init__(self, get_response):\n                self.get_response = get_response\n            \n            def __call__(self, request):\n                # Validate session before processing\n                if not self.validate_session_security(request):\n                    return self.handle_security_violation(request)\n                \n                response = self.get_response(request)\n                \n                # Update session security data\n                self.update_session_security(request)\n                \n                return response\n            \n            def validate_session_security(self, request):\n                \"\"\"Validate session security\"\"\"\n                \n                if not hasattr(request, 'session'):\n                    return True\n                \n                # Check session age\n                if self.is_session_expired(request):\n                    return False\n                \n                # Check IP consistency\n                if not self.validate_ip_consistency(request):\n                    return False\n                \n                # Check user agent consistency\n                if not self.validate_user_agent(request):\n                    return False\n                \n                return True\n            \n            def is_session_expired(self, request):\n                \"\"\"Check if session has exceeded maximum age\"\"\"\n                \n                session_start = request.session.get('_session_start')\n                if not session_start:\n                    return False\n                \n                start_time = datetime.fromisoformat(session_start)\n                max_age = timedelta(hours=24)  # 24 hour maximum\n                \n                return timezone.now() - start_time > max_age\n            \n            def validate_ip_consistency(self, request):\n                \"\"\"Validate IP address consistency\"\"\"\n                \n                stored_ip = request.session.get('_session_ip')\n                current_ip = request.META.get('REMOTE_ADDR')\n                \n                if stored_ip and stored_ip != current_ip:\n                    # Log security event\n                    logger.warning(\n                        f\"Session IP mismatch: stored={stored_ip}, current={current_ip}\"\n                    )\n                    return False\n                \n                return True\n            \n            def validate_user_agent(self, request):\n                \"\"\"Validate user agent consistency\"\"\"\n                \n                stored_ua = request.session.get('_session_user_agent')\n                current_ua = request.META.get('HTTP_USER_AGENT', '')\n                \n                if stored_ua and stored_ua != current_ua:\n                    logger.warning(\"Session user agent mismatch\")\n                    return False\n                \n                return True\n            \n            def handle_security_violation(self, request):\n                \"\"\"Handle session security violation\"\"\"\n                \n                # Clear session\n                request.session.flush()\n                \n                # Redirect to login with message\n                messages.warning(\n                    request,\n                    'Your session was terminated for security reasons.'\n                )\n                \n                return redirect('login')\n            \n            def update_session_security(self, request):\n                \"\"\"Update session security data\"\"\"\n                \n                if hasattr(request, 'session'):\n                    # Set session start time if not exists\n                    if '_session_start' not in request.session:\n                        request.session['_session_start'] = timezone.now().isoformat()\n                    \n                    # Update IP and user agent\n                    request.session['_session_ip'] = request.META.get('REMOTE_ADDR')\n                    request.session['_session_user_agent'] = request.META.get('HTTP_USER_AGENT', '')\n                    \n                    # Update last activity\n                    request.session['_last_activity'] = timezone.now().isoformat()\n        \n        return SecureSessionMiddleware\n    \n    @staticmethod\n    def session_cleanup_management():\n        \"\"\"Manage session cleanup and maintenance\"\"\"\n        \n        # Management command for session cleanup\n        class SessionCleanupCommand:\n            \"\"\"Clean up expired sessions\"\"\"\n            \n            def handle(self):\n                \"\"\"Clean expired sessions from database\"\"\"\n                \n                from django.contrib.sessions.models import Session\n                \n                # Delete expired sessions\n                expired_sessions = Session.objects.filter(\n                    expire_date__lt=timezone.now()\n                )\n                \n                count = expired_sessions.count()\n                expired_sessions.delete()\n                \n                print(f\"Cleaned up {count} expired sessions\")\n                \n                # Clean up orphaned session data\n                self.cleanup_orphaned_data()\n            \n            def cleanup_orphaned_data(self):\n                \"\"\"Clean up orphaned session-related data\"\"\"\n                \n                # Example: Clean up cart data for expired sessions\n                from django.core.cache import cache\n                \n                # This would depend on your specific implementation\n                # Example cleanup logic here\n                pass\n        \n        return SessionCleanupCommand\n",[1050,8946,8947,8952,8961,8970,8974,8980,8989,8998,9002,9012,9022,9026,9045,9061,9065,9082,9087,9108,9126,9130,9149,9153,9158,9173,9177,9184,9188,9205,9215,9219,9242,9248,9252,9257,9274,9280,9284,9289,9308,9314,9318,9323,9342,9348,9352,9358,9362,9379,9388,9392,9420,9431,9437,9441,9463,9488,9492,9517,9521,9538,9547,9551,9579,9608,9612,9632,9637,9649,9676,9681,9687,9691,9697,9701,9718,9727,9731,9759,9792,9796,9814,9833,9839,9843,9849,9853,9870,9879,9883,9888,9903,9907,9912,9922,9928,9937,9941,9945,9961,9965,9982,9991,9995,10015,10020,10043,10076,10081,10086,10126,10170,10174,10179,10212,10216,10223,10227,10233,10242,10251,10255,10260,10269,10278,10282,10295,10304,10308,10334,10338,10343,10363,10379,10383,10387,10404,10416,10420,10444,10448,10453,10464,10468,10481,10490,10494,10499,10520,10524,10529,10534,10539,10543],{"__ignoreMap":1048},[1053,8948,8949],{"class":1055,"line":1056},[1053,8950,8951],{"class":1059},"# Advanced session security\n",[1053,8953,8954,8956,8959],{"class":1055,"line":1063},[1053,8955,1067],{"class":1066},[1053,8957,8958],{"class":1070}," SessionSecurity",[1053,8960,1075],{"class":1074},[1053,8962,8963,8965,8968],{"class":1055,"line":1078},[1053,8964,1082],{"class":1081},[1053,8966,8967],{"class":1085},"Implement advanced session security measures",[1053,8969,1089],{"class":1081},[1053,8971,8972],{"class":1055,"line":1092},[1053,8973,1096],{"class":1095},[1053,8975,8976,8978],{"class":1055,"line":1099},[1053,8977,1102],{"class":1074},[1053,8979,1106],{"class":1105},[1053,8981,8982,8984,8987],{"class":1055,"line":1109},[1053,8983,1112],{"class":1066},[1053,8985,8986],{"class":1115}," secure_session_middleware",[1053,8988,1119],{"class":1074},[1053,8990,8991,8993,8996],{"class":1055,"line":1122},[1053,8992,1125],{"class":1081},[1053,8994,8995],{"class":1085},"Custom middleware for enhanced session security",[1053,8997,1089],{"class":1081},[1053,8999,9000],{"class":1055,"line":1133},[1053,9001,1136],{"class":1095},[1053,9003,9004,9007,9010],{"class":1055,"line":1139},[1053,9005,9006],{"class":1066},"        class",[1053,9008,9009],{"class":1070}," SecureSessionMiddleware",[1053,9011,1075],{"class":1074},[1053,9013,9014,9017,9020],{"class":1055,"line":1145},[1053,9015,9016],{"class":1081},"            \"\"\"",[1053,9018,9019],{"class":1085},"Enhanced session security middleware",[1053,9021,1089],{"class":1081},[1053,9023,9024],{"class":1055,"line":1157},[1053,9025,4277],{"class":1095},[1053,9027,9028,9031,9034,9036,9038,9040,9043],{"class":1055,"line":1185},[1053,9029,9030],{"class":1066},"            def",[1053,9032,9033],{"class":6169}," __init__",[1053,9035,5893],{"class":1074},[1053,9037,8049],{"class":8048},[1053,9039,1375],{"class":1074},[1053,9041,9042],{"class":5896}," get_response",[1053,9044,5916],{"class":1074},[1053,9046,9047,9051,9053,9056,9058],{"class":1055,"line":1206},[1053,9048,9050],{"class":9049},"se3Ec","                self",[1053,9052,5942],{"class":1074},[1053,9054,9055],{"class":5945},"get_response",[1053,9057,6062],{"class":1074},[1053,9059,9060],{"class":1095}," get_response\n",[1053,9062,9063],{"class":1055,"line":1240},[1053,9064,4277],{"class":1095},[1053,9066,9067,9069,9072,9074,9076,9078,9080],{"class":1055,"line":1256},[1053,9068,9030],{"class":1066},[1053,9070,9071],{"class":6169}," __call__",[1053,9073,5893],{"class":1074},[1053,9075,8049],{"class":8048},[1053,9077,1375],{"class":1074},[1053,9079,5939],{"class":5896},[1053,9081,5916],{"class":1074},[1053,9083,9084],{"class":1055,"line":1262},[1053,9085,9086],{"class":1059},"                # Validate session before processing\n",[1053,9088,9089,9092,9094,9097,9099,9102,9104,9106],{"class":1055,"line":1267},[1053,9090,9091],{"class":1445},"                if",[1053,9093,6420],{"class":5910},[1053,9095,9096],{"class":9049}," self",[1053,9098,5942],{"class":1074},[1053,9100,9101],{"class":5951},"validate_session_security",[1053,9103,5893],{"class":1074},[1053,9105,5897],{"class":5951},[1053,9107,5916],{"class":1074},[1053,9109,9110,9113,9115,9117,9120,9122,9124],{"class":1055,"line":1277},[1053,9111,9112],{"class":1445},"                    return",[1053,9114,9096],{"class":9049},[1053,9116,5942],{"class":1074},[1053,9118,9119],{"class":5951},"handle_security_violation",[1053,9121,5893],{"class":1074},[1053,9123,5897],{"class":5951},[1053,9125,5993],{"class":1074},[1053,9127,9128],{"class":1055,"line":1297},[1053,9129,8175],{"class":1095},[1053,9131,9132,9135,9137,9139,9141,9143,9145,9147],{"class":1055,"line":1317},[1053,9133,9134],{"class":1095},"                response ",[1053,9136,1151],{"class":1074},[1053,9138,9096],{"class":9049},[1053,9140,5942],{"class":1074},[1053,9142,9055],{"class":5951},[1053,9144,5893],{"class":1074},[1053,9146,5897],{"class":5951},[1053,9148,5993],{"class":1074},[1053,9150,9151],{"class":1055,"line":1346},[1053,9152,8175],{"class":1095},[1053,9154,9155],{"class":1055,"line":1397},[1053,9156,9157],{"class":1059},"                # Update session security data\n",[1053,9159,9160,9162,9164,9167,9169,9171],{"class":1055,"line":1402},[1053,9161,9050],{"class":9049},[1053,9163,5942],{"class":1074},[1053,9165,9166],{"class":5951},"update_session_security",[1053,9168,5893],{"class":1074},[1053,9170,5897],{"class":5951},[1053,9172,5993],{"class":1074},[1053,9174,9175],{"class":1055,"line":1407},[1053,9176,8175],{"class":1095},[1053,9178,9179,9181],{"class":1055,"line":1413},[1053,9180,7089],{"class":1445},[1053,9182,9183],{"class":1095}," response\n",[1053,9185,9186],{"class":1055,"line":1419},[1053,9187,4277],{"class":1095},[1053,9189,9190,9192,9195,9197,9199,9201,9203],{"class":1055,"line":1425},[1053,9191,9030],{"class":1066},[1053,9193,9194],{"class":1115}," validate_session_security",[1053,9196,5893],{"class":1074},[1053,9198,8049],{"class":8048},[1053,9200,1375],{"class":1074},[1053,9202,5939],{"class":5896},[1053,9204,5916],{"class":1074},[1053,9206,9207,9210,9213],{"class":1055,"line":1431},[1053,9208,9209],{"class":1081},"                \"\"\"",[1053,9211,9212],{"class":1085},"Validate session security",[1053,9214,1089],{"class":1081},[1053,9216,9217],{"class":1055,"line":1437},[1053,9218,8175],{"class":1095},[1053,9220,9221,9223,9225,9228,9230,9232,9234,9236,9238,9240],{"class":1055,"line":1442},[1053,9222,9091],{"class":1445},[1053,9224,6420],{"class":5910},[1053,9226,9227],{"class":6169}," hasattr",[1053,9229,5893],{"class":1074},[1053,9231,5897],{"class":5951},[1053,9233,1375],{"class":1074},[1053,9235,1174],{"class":1160},[1053,9237,5946],{"class":1164},[1053,9239,1168],{"class":1160},[1053,9241,5916],{"class":1074},[1053,9243,9244,9246],{"class":1055,"line":1458},[1053,9245,9112],{"class":1445},[1053,9247,6327],{"class":1252},[1053,9249,9250],{"class":1055,"line":1463},[1053,9251,8175],{"class":1095},[1053,9253,9254],{"class":1055,"line":1470},[1053,9255,9256],{"class":1059},"                # Check session age\n",[1053,9258,9259,9261,9263,9265,9268,9270,9272],{"class":1055,"line":1480},[1053,9260,9091],{"class":1445},[1053,9262,9096],{"class":9049},[1053,9264,5942],{"class":1074},[1053,9266,9267],{"class":5951},"is_session_expired",[1053,9269,5893],{"class":1074},[1053,9271,5897],{"class":5951},[1053,9273,5916],{"class":1074},[1053,9275,9276,9278],{"class":1055,"line":1490},[1053,9277,9112],{"class":1445},[1053,9279,6345],{"class":1252},[1053,9281,9282],{"class":1055,"line":1495},[1053,9283,8175],{"class":1095},[1053,9285,9286],{"class":1055,"line":1505},[1053,9287,9288],{"class":1059},"                # Check IP consistency\n",[1053,9290,9291,9293,9295,9297,9299,9302,9304,9306],{"class":1055,"line":1519},[1053,9292,9091],{"class":1445},[1053,9294,6420],{"class":5910},[1053,9296,9096],{"class":9049},[1053,9298,5942],{"class":1074},[1053,9300,9301],{"class":5951},"validate_ip_consistency",[1053,9303,5893],{"class":1074},[1053,9305,5897],{"class":5951},[1053,9307,5916],{"class":1074},[1053,9309,9310,9312],{"class":1055,"line":1541},[1053,9311,9112],{"class":1445},[1053,9313,6345],{"class":1252},[1053,9315,9316],{"class":1055,"line":1584},[1053,9317,8175],{"class":1095},[1053,9319,9320],{"class":1055,"line":1625},[1053,9321,9322],{"class":1059},"                # Check user agent consistency\n",[1053,9324,9325,9327,9329,9331,9333,9336,9338,9340],{"class":1055,"line":1667},[1053,9326,9091],{"class":1445},[1053,9328,6420],{"class":5910},[1053,9330,9096],{"class":9049},[1053,9332,5942],{"class":1074},[1053,9334,9335],{"class":5951},"validate_user_agent",[1053,9337,5893],{"class":1074},[1053,9339,5897],{"class":5951},[1053,9341,5916],{"class":1074},[1053,9343,9344,9346],{"class":1055,"line":1673},[1053,9345,9112],{"class":1445},[1053,9347,6345],{"class":1252},[1053,9349,9350],{"class":1055,"line":1687},[1053,9351,8175],{"class":1095},[1053,9353,9354,9356],{"class":1055,"line":1707},[1053,9355,7089],{"class":1445},[1053,9357,6327],{"class":1252},[1053,9359,9360],{"class":1055,"line":1747},[1053,9361,4277],{"class":1095},[1053,9363,9364,9366,9369,9371,9373,9375,9377],{"class":1055,"line":1778},[1053,9365,9030],{"class":1066},[1053,9367,9368],{"class":1115}," is_session_expired",[1053,9370,5893],{"class":1074},[1053,9372,8049],{"class":8048},[1053,9374,1375],{"class":1074},[1053,9376,5939],{"class":5896},[1053,9378,5916],{"class":1074},[1053,9380,9381,9383,9386],{"class":1055,"line":1818},[1053,9382,9209],{"class":1081},[1053,9384,9385],{"class":1085},"Check if session has exceeded maximum age",[1053,9387,1089],{"class":1081},[1053,9389,9390],{"class":1055,"line":1823},[1053,9391,8175],{"class":1095},[1053,9393,9394,9397,9399,9401,9403,9405,9407,9409,9411,9413,9416,9418],{"class":1055,"line":1837},[1053,9395,9396],{"class":1095},"                session_start ",[1053,9398,1151],{"class":1074},[1053,9400,5939],{"class":1095},[1053,9402,5942],{"class":1074},[1053,9404,5946],{"class":5945},[1053,9406,5942],{"class":1074},[1053,9408,5952],{"class":5951},[1053,9410,5893],{"class":1074},[1053,9412,1168],{"class":1160},[1053,9414,9415],{"class":1164},"_session_start",[1053,9417,1168],{"class":1160},[1053,9419,5993],{"class":1074},[1053,9421,9422,9424,9426,9429],{"class":1055,"line":1857},[1053,9423,9091],{"class":1445},[1053,9425,6420],{"class":5910},[1053,9427,9428],{"class":1095}," session_start",[1053,9430,1075],{"class":1074},[1053,9432,9433,9435],{"class":1055,"line":1896},[1053,9434,9112],{"class":1445},[1053,9436,6345],{"class":1252},[1053,9438,9439],{"class":1055,"line":1936},[1053,9440,8175],{"class":1095},[1053,9442,9443,9446,9448,9451,9453,9456,9458,9461],{"class":1055,"line":1975},[1053,9444,9445],{"class":1095},"                start_time ",[1053,9447,1151],{"class":1074},[1053,9449,9450],{"class":1095}," datetime",[1053,9452,5942],{"class":1074},[1053,9454,9455],{"class":5951},"fromisoformat",[1053,9457,5893],{"class":1074},[1053,9459,9460],{"class":5951},"session_start",[1053,9462,5993],{"class":1074},[1053,9464,9465,9468,9470,9473,9475,9478,9480,9483,9485],{"class":1055,"line":1980},[1053,9466,9467],{"class":1095},"                max_age ",[1053,9469,1151],{"class":1074},[1053,9471,9472],{"class":5951}," timedelta",[1053,9474,5893],{"class":1074},[1053,9476,9477],{"class":6510},"hours",[1053,9479,1151],{"class":1074},[1053,9481,9482],{"class":4316},"24",[1053,9484,7073],{"class":1074},[1053,9486,9487],{"class":1059},"  # 24 hour maximum\n",[1053,9489,9490],{"class":1055,"line":1994},[1053,9491,8175],{"class":1095},[1053,9493,9494,9496,9498,9500,9502,9505,9508,9511,9514],{"class":1055,"line":2014},[1053,9495,7089],{"class":1445},[1053,9497,6092],{"class":1095},[1053,9499,5942],{"class":1074},[1053,9501,6097],{"class":5951},[1053,9503,9504],{"class":1074},"()",[1053,9506,9507],{"class":5910}," -",[1053,9509,9510],{"class":1095}," start_time ",[1053,9512,9513],{"class":5910},">",[1053,9515,9516],{"class":1095}," max_age\n",[1053,9518,9519],{"class":1055,"line":2045},[1053,9520,4277],{"class":1095},[1053,9522,9523,9525,9528,9530,9532,9534,9536],{"class":1055,"line":2085},[1053,9524,9030],{"class":1066},[1053,9526,9527],{"class":1115}," validate_ip_consistency",[1053,9529,5893],{"class":1074},[1053,9531,8049],{"class":8048},[1053,9533,1375],{"class":1074},[1053,9535,5939],{"class":5896},[1053,9537,5916],{"class":1074},[1053,9539,9540,9542,9545],{"class":1055,"line":2124},[1053,9541,9209],{"class":1081},[1053,9543,9544],{"class":1085},"Validate IP address consistency",[1053,9546,1089],{"class":1081},[1053,9548,9549],{"class":1055,"line":2129},[1053,9550,8175],{"class":1095},[1053,9552,9553,9556,9558,9560,9562,9564,9566,9568,9570,9572,9575,9577],{"class":1055,"line":2143},[1053,9554,9555],{"class":1095},"                stored_ip ",[1053,9557,1151],{"class":1074},[1053,9559,5939],{"class":1095},[1053,9561,5942],{"class":1074},[1053,9563,5946],{"class":5945},[1053,9565,5942],{"class":1074},[1053,9567,5952],{"class":5951},[1053,9569,5893],{"class":1074},[1053,9571,1168],{"class":1160},[1053,9573,9574],{"class":1164},"_session_ip",[1053,9576,1168],{"class":1160},[1053,9578,5993],{"class":1074},[1053,9580,9581,9584,9586,9588,9590,9593,9595,9597,9599,9601,9604,9606],{"class":1055,"line":2163},[1053,9582,9583],{"class":1095},"                current_ip ",[1053,9585,1151],{"class":1074},[1053,9587,5939],{"class":1095},[1053,9589,5942],{"class":1074},[1053,9591,9592],{"class":6868},"META",[1053,9594,5942],{"class":1074},[1053,9596,5952],{"class":5951},[1053,9598,5893],{"class":1074},[1053,9600,1168],{"class":1160},[1053,9602,9603],{"class":1164},"REMOTE_ADDR",[1053,9605,1168],{"class":1160},[1053,9607,5993],{"class":1074},[1053,9609,9610],{"class":1055,"line":2201},[1053,9611,8175],{"class":1095},[1053,9613,9614,9616,9619,9622,9624,9627,9630],{"class":1055,"line":2241},[1053,9615,9091],{"class":1445},[1053,9617,9618],{"class":1095}," stored_ip ",[1053,9620,9621],{"class":5910},"and",[1053,9623,9618],{"class":1095},[1053,9625,9626],{"class":5910},"!=",[1053,9628,9629],{"class":1095}," current_ip",[1053,9631,1075],{"class":1074},[1053,9633,9634],{"class":1055,"line":2280},[1053,9635,9636],{"class":1059},"                    # Log security event\n",[1053,9638,9639,9642,9644,9647],{"class":1055,"line":2286},[1053,9640,9641],{"class":1095},"                    logger",[1053,9643,5942],{"class":1074},[1053,9645,9646],{"class":5951},"warning",[1053,9648,6957],{"class":1074},[1053,9650,9651,9654,9657,9659,9662,9664,9667,9669,9672,9674],{"class":1055,"line":2291},[1053,9652,9653],{"class":1066},"                        f",[1053,9655,9656],{"class":1164},"\"Session IP mismatch: stored=",[1053,9658,7010],{"class":3990},[1053,9660,9661],{"class":5951},"stored_ip",[1053,9663,7020],{"class":3990},[1053,9665,9666],{"class":1164},", current=",[1053,9668,7010],{"class":3990},[1053,9670,9671],{"class":5951},"current_ip",[1053,9673,7020],{"class":3990},[1053,9675,1455],{"class":1164},[1053,9677,9678],{"class":1055,"line":2296},[1053,9679,9680],{"class":1074},"                    )\n",[1053,9682,9683,9685],{"class":1055,"line":2304},[1053,9684,9112],{"class":1445},[1053,9686,6345],{"class":1252},[1053,9688,9689],{"class":1055,"line":2311},[1053,9690,8175],{"class":1095},[1053,9692,9693,9695],{"class":1055,"line":2317},[1053,9694,7089],{"class":1445},[1053,9696,6327],{"class":1252},[1053,9698,9699],{"class":1055,"line":2327},[1053,9700,4277],{"class":1095},[1053,9702,9703,9705,9708,9710,9712,9714,9716],{"class":1055,"line":2337},[1053,9704,9030],{"class":1066},[1053,9706,9707],{"class":1115}," validate_user_agent",[1053,9709,5893],{"class":1074},[1053,9711,8049],{"class":8048},[1053,9713,1375],{"class":1074},[1053,9715,5939],{"class":5896},[1053,9717,5916],{"class":1074},[1053,9719,9720,9722,9725],{"class":1055,"line":2342},[1053,9721,9209],{"class":1081},[1053,9723,9724],{"class":1085},"Validate user agent consistency",[1053,9726,1089],{"class":1081},[1053,9728,9729],{"class":1055,"line":2349},[1053,9730,8175],{"class":1095},[1053,9732,9733,9736,9738,9740,9742,9744,9746,9748,9750,9752,9755,9757],{"class":1055,"line":2359},[1053,9734,9735],{"class":1095},"                stored_ua ",[1053,9737,1151],{"class":1074},[1053,9739,5939],{"class":1095},[1053,9741,5942],{"class":1074},[1053,9743,5946],{"class":5945},[1053,9745,5942],{"class":1074},[1053,9747,5952],{"class":5951},[1053,9749,5893],{"class":1074},[1053,9751,1168],{"class":1160},[1053,9753,9754],{"class":1164},"_session_user_agent",[1053,9756,1168],{"class":1160},[1053,9758,5993],{"class":1074},[1053,9760,9761,9764,9766,9768,9770,9772,9774,9776,9778,9780,9783,9785,9787,9790],{"class":1055,"line":2369},[1053,9762,9763],{"class":1095},"                current_ua ",[1053,9765,1151],{"class":1074},[1053,9767,5939],{"class":1095},[1053,9769,5942],{"class":1074},[1053,9771,9592],{"class":6868},[1053,9773,5942],{"class":1074},[1053,9775,5952],{"class":5951},[1053,9777,5893],{"class":1074},[1053,9779,1168],{"class":1160},[1053,9781,9782],{"class":1164},"HTTP_USER_AGENT",[1053,9784,1168],{"class":1160},[1053,9786,1375],{"class":1074},[1053,9788,9789],{"class":1160}," ''",[1053,9791,5993],{"class":1074},[1053,9793,9794],{"class":1055,"line":2374},[1053,9795,8175],{"class":1095},[1053,9797,9798,9800,9803,9805,9807,9809,9812],{"class":1055,"line":2384},[1053,9799,9091],{"class":1445},[1053,9801,9802],{"class":1095}," stored_ua ",[1053,9804,9621],{"class":5910},[1053,9806,9802],{"class":1095},[1053,9808,9626],{"class":5910},[1053,9810,9811],{"class":1095}," current_ua",[1053,9813,1075],{"class":1074},[1053,9815,9816,9818,9820,9822,9824,9826,9829,9831],{"class":1055,"line":2398},[1053,9817,9641],{"class":1095},[1053,9819,5942],{"class":1074},[1053,9821,9646],{"class":5951},[1053,9823,5893],{"class":1074},[1053,9825,5465],{"class":1160},[1053,9827,9828],{"class":1164},"Session user agent mismatch",[1053,9830,5465],{"class":1160},[1053,9832,5993],{"class":1074},[1053,9834,9835,9837],{"class":1055,"line":2419},[1053,9836,9112],{"class":1445},[1053,9838,6345],{"class":1252},[1053,9840,9841],{"class":1055,"line":2440},[1053,9842,8175],{"class":1095},[1053,9844,9845,9847],{"class":1055,"line":2455},[1053,9846,7089],{"class":1445},[1053,9848,6327],{"class":1252},[1053,9850,9851],{"class":1055,"line":2468},[1053,9852,4277],{"class":1095},[1053,9854,9855,9857,9860,9862,9864,9866,9868],{"class":1055,"line":2480},[1053,9856,9030],{"class":1066},[1053,9858,9859],{"class":1115}," handle_security_violation",[1053,9861,5893],{"class":1074},[1053,9863,8049],{"class":8048},[1053,9865,1375],{"class":1074},[1053,9867,5939],{"class":5896},[1053,9869,5916],{"class":1074},[1053,9871,9872,9874,9877],{"class":1055,"line":2492},[1053,9873,9209],{"class":1081},[1053,9875,9876],{"class":1085},"Handle session security violation",[1053,9878,1089],{"class":1081},[1053,9880,9881],{"class":1055,"line":2503},[1053,9882,8175],{"class":1095},[1053,9884,9885],{"class":1055,"line":2509},[1053,9886,9887],{"class":1059},"                # Clear session\n",[1053,9889,9890,9892,9894,9896,9898,9901],{"class":1055,"line":2514},[1053,9891,6962],{"class":1095},[1053,9893,5942],{"class":1074},[1053,9895,5946],{"class":5945},[1053,9897,5942],{"class":1074},[1053,9899,9900],{"class":5951},"flush",[1053,9902,6106],{"class":1074},[1053,9904,9905],{"class":1055,"line":2528},[1053,9906,8175],{"class":1095},[1053,9908,9909],{"class":1055,"line":2548},[1053,9910,9911],{"class":1059},"                # Redirect to login with message\n",[1053,9913,9914,9916,9918,9920],{"class":1055,"line":2562},[1053,9915,8803],{"class":1095},[1053,9917,5942],{"class":1074},[1053,9919,9646],{"class":5951},[1053,9921,6957],{"class":1074},[1053,9923,9924,9926],{"class":1055,"line":2574},[1053,9925,8148],{"class":5951},[1053,9927,1182],{"class":1074},[1053,9929,9930,9932,9935],{"class":1055,"line":2586},[1053,9931,2458],{"class":1160},[1053,9933,9934],{"class":1164},"Your session was terminated for security reasons.",[1053,9936,2500],{"class":1160},[1053,9938,9939],{"class":1055,"line":2598},[1053,9940,4126],{"class":1074},[1053,9942,9943],{"class":1055,"line":2610},[1053,9944,8175],{"class":1095},[1053,9946,9947,9949,9951,9953,9955,9957,9959],{"class":1055,"line":2620},[1053,9948,7089],{"class":1445},[1053,9950,7168],{"class":5951},[1053,9952,5893],{"class":1074},[1053,9954,1168],{"class":1160},[1053,9956,8835],{"class":1164},[1053,9958,1168],{"class":1160},[1053,9960,5993],{"class":1074},[1053,9962,9963],{"class":1055,"line":2625},[1053,9964,4277],{"class":1095},[1053,9966,9967,9969,9972,9974,9976,9978,9980],{"class":1055,"line":2630},[1053,9968,9030],{"class":1066},[1053,9970,9971],{"class":1115}," update_session_security",[1053,9973,5893],{"class":1074},[1053,9975,8049],{"class":8048},[1053,9977,1375],{"class":1074},[1053,9979,5939],{"class":5896},[1053,9981,5916],{"class":1074},[1053,9983,9984,9986,9989],{"class":1055,"line":2644},[1053,9985,9209],{"class":1081},[1053,9987,9988],{"class":1085},"Update session security data",[1053,9990,1089],{"class":1081},[1053,9992,9993],{"class":1055,"line":2664},[1053,9994,8175],{"class":1095},[1053,9996,9997,9999,10001,10003,10005,10007,10009,10011,10013],{"class":1055,"line":2685},[1053,9998,9091],{"class":1445},[1053,10000,9227],{"class":6169},[1053,10002,5893],{"class":1074},[1053,10004,5897],{"class":5951},[1053,10006,1375],{"class":1074},[1053,10008,1174],{"class":1160},[1053,10010,5946],{"class":1164},[1053,10012,1168],{"class":1160},[1053,10014,5916],{"class":1074},[1053,10016,10017],{"class":1055,"line":2699},[1053,10018,10019],{"class":1059},"                    # Set session start time if not exists\n",[1053,10021,10022,10025,10027,10029,10031,10033,10035,10037,10039,10041],{"class":1055,"line":2738},[1053,10023,10024],{"class":1445},"                    if",[1053,10026,1174],{"class":1160},[1053,10028,9415],{"class":1164},[1053,10030,1168],{"class":1160},[1053,10032,6420],{"class":5910},[1053,10034,6743],{"class":5910},[1053,10036,5939],{"class":1095},[1053,10038,5942],{"class":1074},[1053,10040,5946],{"class":5945},[1053,10042,1075],{"class":1074},[1053,10044,10045,10048,10050,10052,10054,10056,10058,10060,10062,10064,10066,10068,10070,10072,10074],{"class":1055,"line":2766},[1053,10046,10047],{"class":1095},"                        request",[1053,10049,5942],{"class":1074},[1053,10051,5946],{"class":5945},[1053,10053,6021],{"class":1074},[1053,10055,1168],{"class":1160},[1053,10057,9415],{"class":1164},[1053,10059,1168],{"class":1160},[1053,10061,6036],{"class":1074},[1053,10063,6062],{"class":1074},[1053,10065,6092],{"class":1095},[1053,10067,5942],{"class":1074},[1053,10069,6097],{"class":5951},[1053,10071,6100],{"class":1074},[1053,10073,6103],{"class":5951},[1053,10075,6106],{"class":1074},[1053,10077,10078],{"class":1055,"line":2771},[1053,10079,10080],{"class":1095},"                    \n",[1053,10082,10083],{"class":1055,"line":2776},[1053,10084,10085],{"class":1059},"                    # Update IP and user agent\n",[1053,10087,10088,10090,10092,10094,10096,10098,10100,10102,10104,10106,10108,10110,10112,10114,10116,10118,10120,10122,10124],{"class":1055,"line":2781},[1053,10089,8148],{"class":1095},[1053,10091,5942],{"class":1074},[1053,10093,5946],{"class":5945},[1053,10095,6021],{"class":1074},[1053,10097,1168],{"class":1160},[1053,10099,9574],{"class":1164},[1053,10101,1168],{"class":1160},[1053,10103,6036],{"class":1074},[1053,10105,6062],{"class":1074},[1053,10107,5939],{"class":1095},[1053,10109,5942],{"class":1074},[1053,10111,9592],{"class":6868},[1053,10113,5942],{"class":1074},[1053,10115,5952],{"class":5951},[1053,10117,5893],{"class":1074},[1053,10119,1168],{"class":1160},[1053,10121,9603],{"class":1164},[1053,10123,1168],{"class":1160},[1053,10125,5993],{"class":1074},[1053,10127,10128,10130,10132,10134,10136,10138,10140,10142,10144,10146,10148,10150,10152,10154,10156,10158,10160,10162,10164,10166,10168],{"class":1055,"line":2786},[1053,10129,8148],{"class":1095},[1053,10131,5942],{"class":1074},[1053,10133,5946],{"class":5945},[1053,10135,6021],{"class":1074},[1053,10137,1168],{"class":1160},[1053,10139,9754],{"class":1164},[1053,10141,1168],{"class":1160},[1053,10143,6036],{"class":1074},[1053,10145,6062],{"class":1074},[1053,10147,5939],{"class":1095},[1053,10149,5942],{"class":1074},[1053,10151,9592],{"class":6868},[1053,10153,5942],{"class":1074},[1053,10155,5952],{"class":5951},[1053,10157,5893],{"class":1074},[1053,10159,1168],{"class":1160},[1053,10161,9782],{"class":1164},[1053,10163,1168],{"class":1160},[1053,10165,1375],{"class":1074},[1053,10167,9789],{"class":1160},[1053,10169,5993],{"class":1074},[1053,10171,10172],{"class":1055,"line":2794},[1053,10173,10080],{"class":1095},[1053,10175,10176],{"class":1055,"line":2799},[1053,10177,10178],{"class":1059},"                    # Update last activity\n",[1053,10180,10181,10183,10185,10187,10189,10191,10194,10196,10198,10200,10202,10204,10206,10208,10210],{"class":1055,"line":2806},[1053,10182,8148],{"class":1095},[1053,10184,5942],{"class":1074},[1053,10186,5946],{"class":5945},[1053,10188,6021],{"class":1074},[1053,10190,1168],{"class":1160},[1053,10192,10193],{"class":1164},"_last_activity",[1053,10195,1168],{"class":1160},[1053,10197,6036],{"class":1074},[1053,10199,6062],{"class":1074},[1053,10201,6092],{"class":1095},[1053,10203,5942],{"class":1074},[1053,10205,6097],{"class":5951},[1053,10207,6100],{"class":1074},[1053,10209,6103],{"class":5951},[1053,10211,6106],{"class":1074},[1053,10213,10214],{"class":1055,"line":2816},[1053,10215,1136],{"class":1095},[1053,10217,10218,10220],{"class":1055,"line":2826},[1053,10219,1446],{"class":1445},[1053,10221,10222],{"class":1095}," SecureSessionMiddleware\n",[1053,10224,10225],{"class":1055,"line":2831},[1053,10226,1096],{"class":1095},[1053,10228,10229,10231],{"class":1055,"line":2837},[1053,10230,1102],{"class":1074},[1053,10232,1106],{"class":1105},[1053,10234,10235,10237,10240],{"class":1055,"line":2848},[1053,10236,1112],{"class":1066},[1053,10238,10239],{"class":1115}," session_cleanup_management",[1053,10241,1119],{"class":1074},[1053,10243,10244,10246,10249],{"class":1055,"line":2854},[1053,10245,1125],{"class":1081},[1053,10247,10248],{"class":1085},"Manage session cleanup and maintenance",[1053,10250,1089],{"class":1081},[1053,10252,10253],{"class":1055,"line":2860},[1053,10254,1136],{"class":1095},[1053,10256,10257],{"class":1055,"line":2866},[1053,10258,10259],{"class":1059},"        # Management command for session cleanup\n",[1053,10261,10262,10264,10267],{"class":1055,"line":2872},[1053,10263,9006],{"class":1066},[1053,10265,10266],{"class":1070}," SessionCleanupCommand",[1053,10268,1075],{"class":1074},[1053,10270,10271,10273,10276],{"class":1055,"line":2878},[1053,10272,9016],{"class":1081},[1053,10274,10275],{"class":1085},"Clean up expired sessions",[1053,10277,1089],{"class":1081},[1053,10279,10280],{"class":1055,"line":2883},[1053,10281,4277],{"class":1095},[1053,10283,10284,10286,10289,10291,10293],{"class":1055,"line":2889},[1053,10285,9030],{"class":1066},[1053,10287,10288],{"class":1115}," handle",[1053,10290,5893],{"class":1074},[1053,10292,8049],{"class":8048},[1053,10294,5916],{"class":1074},[1053,10296,10297,10299,10302],{"class":1055,"line":2895},[1053,10298,9209],{"class":1081},[1053,10300,10301],{"class":1085},"Clean expired sessions from database",[1053,10303,1089],{"class":1081},[1053,10305,10306],{"class":1055,"line":2901},[1053,10307,8175],{"class":1095},[1053,10309,10310,10313,10316,10318,10321,10323,10325,10327,10329,10331],{"class":1055,"line":2907},[1053,10311,10312],{"class":1445},"                from",[1053,10314,10315],{"class":1095}," django",[1053,10317,5942],{"class":1074},[1053,10319,10320],{"class":1095},"contrib",[1053,10322,5942],{"class":1074},[1053,10324,1678],{"class":1095},[1053,10326,5942],{"class":1074},[1053,10328,6453],{"class":1095},[1053,10330,6456],{"class":1445},[1053,10332,10333],{"class":1095}," Session\n",[1053,10335,10336],{"class":1055,"line":2913},[1053,10337,8175],{"class":1095},[1053,10339,10340],{"class":1055,"line":2919},[1053,10341,10342],{"class":1059},"                # Delete expired sessions\n",[1053,10344,10345,10348,10350,10353,10355,10357,10359,10361],{"class":1055,"line":2925},[1053,10346,10347],{"class":1095},"                expired_sessions ",[1053,10349,1151],{"class":1074},[1053,10351,10352],{"class":1095}," Session",[1053,10354,5942],{"class":1074},[1053,10356,6500],{"class":5945},[1053,10358,5942],{"class":1074},[1053,10360,6505],{"class":5951},[1053,10362,6957],{"class":1074},[1053,10364,10365,10368,10370,10373,10375,10377],{"class":1055,"line":2931},[1053,10366,10367],{"class":6510},"                    expire_date__lt",[1053,10369,1151],{"class":1074},[1053,10371,10372],{"class":5951},"timezone",[1053,10374,5942],{"class":1074},[1053,10376,6097],{"class":5951},[1053,10378,6106],{"class":1074},[1053,10380,10381],{"class":1055,"line":2936},[1053,10382,4126],{"class":1074},[1053,10384,10385],{"class":1055,"line":2942},[1053,10386,8175],{"class":1095},[1053,10388,10389,10392,10394,10397,10399,10402],{"class":1055,"line":2948},[1053,10390,10391],{"class":1095},"                count ",[1053,10393,1151],{"class":1074},[1053,10395,10396],{"class":1095}," expired_sessions",[1053,10398,5942],{"class":1074},[1053,10400,10401],{"class":5951},"count",[1053,10403,6106],{"class":1074},[1053,10405,10406,10409,10411,10414],{"class":1055,"line":2954},[1053,10407,10408],{"class":1095},"                expired_sessions",[1053,10410,5942],{"class":1074},[1053,10412,10413],{"class":5951},"delete",[1053,10415,6106],{"class":1074},[1053,10417,10418],{"class":1055,"line":2960},[1053,10419,8175],{"class":1095},[1053,10421,10422,10425,10427,10430,10433,10435,10437,10439,10442],{"class":1055,"line":2966},[1053,10423,10424],{"class":6169},"                print",[1053,10426,5893],{"class":1074},[1053,10428,10429],{"class":1066},"f",[1053,10431,10432],{"class":1164},"\"Cleaned up ",[1053,10434,7010],{"class":3990},[1053,10436,10401],{"class":5951},[1053,10438,7020],{"class":3990},[1053,10440,10441],{"class":1164}," expired sessions\"",[1053,10443,5993],{"class":1074},[1053,10445,10446],{"class":1055,"line":2972},[1053,10447,8175],{"class":1095},[1053,10449,10450],{"class":1055,"line":2978},[1053,10451,10452],{"class":1059},"                # Clean up orphaned session data\n",[1053,10454,10455,10457,10459,10462],{"class":1055,"line":2983},[1053,10456,9050],{"class":9049},[1053,10458,5942],{"class":1074},[1053,10460,10461],{"class":5951},"cleanup_orphaned_data",[1053,10463,6106],{"class":1074},[1053,10465,10466],{"class":1055,"line":2989},[1053,10467,4277],{"class":1095},[1053,10469,10470,10472,10475,10477,10479],{"class":1055,"line":2995},[1053,10471,9030],{"class":1066},[1053,10473,10474],{"class":1115}," cleanup_orphaned_data",[1053,10476,5893],{"class":1074},[1053,10478,8049],{"class":8048},[1053,10480,5916],{"class":1074},[1053,10482,10483,10485,10488],{"class":1055,"line":3001},[1053,10484,9209],{"class":1081},[1053,10486,10487],{"class":1085},"Clean up orphaned session-related data",[1053,10489,1089],{"class":1081},[1053,10491,10492],{"class":1055,"line":3007},[1053,10493,8175],{"class":1095},[1053,10495,10496],{"class":1055,"line":3013},[1053,10497,10498],{"class":1059},"                # Example: Clean up cart data for expired sessions\n",[1053,10500,10501,10503,10505,10507,10510,10512,10515,10517],{"class":1055,"line":3018},[1053,10502,10312],{"class":1445},[1053,10504,10315],{"class":1095},[1053,10506,5942],{"class":1074},[1053,10508,10509],{"class":1095},"core",[1053,10511,5942],{"class":1074},[1053,10513,10514],{"class":1095},"cache ",[1053,10516,6456],{"class":1445},[1053,10518,10519],{"class":1095}," cache\n",[1053,10521,10522],{"class":1055,"line":3026},[1053,10523,8175],{"class":1095},[1053,10525,10526],{"class":1055,"line":3031},[1053,10527,10528],{"class":1059},"                # This would depend on your specific implementation\n",[1053,10530,10531],{"class":1055,"line":3037},[1053,10532,10533],{"class":1059},"                # Example cleanup logic here\n",[1053,10535,10536],{"class":1055,"line":3047},[1053,10537,10538],{"class":1445},"                pass\n",[1053,10540,10541],{"class":1055,"line":3057},[1053,10542,1136],{"class":1095},[1053,10544,10545,10547],{"class":1055,"line":3062},[1053,10546,1446],{"class":1445},[1053,10548,10549],{"class":1095}," SessionCleanupCommand\n",[1026,10551,10552],{},"Sessions, cookies, and state management are fundamental to creating interactive web applications. Django's session framework provides secure, flexible, and scalable solutions for maintaining user state across requests while protecting against common security vulnerabilities.",[10554,10555,10556],"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 .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 .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .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 .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}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 .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .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 .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--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 .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}",{"title":1048,"searchDepth":1056,"depth":1063,"links":10558},[10559,10562,10565,10569],{"id":1032,"depth":1063,"text":1033,"children":10560},[10561],{"id":1040,"depth":1078,"text":1041},{"id":4170,"depth":1063,"text":4171,"children":10563},[10564],{"id":4174,"depth":1078,"text":4175},{"id":5840,"depth":1063,"text":5841,"children":10566},[10567,10568],{"id":5844,"depth":1078,"text":5845},{"id":7462,"depth":1078,"text":7463},{"id":8936,"depth":1063,"text":8937,"children":10570},[10571],{"id":8940,"depth":1078,"text":8941},"md",null,{},{"title":445,"description":1028},"Rf3KdfLKIUeqipRy6JUMrcc7eZ0ys1_jOYWgwYSFYNU",[10578,10580],{"title":436,"path":437,"stem":438,"description":10579,"children":-1},"Implementing robust security measures in Django authentication and authorization systems is crucial for protecting user data and maintaining application integrity. Understanding and applying security best practices helps prevent common vulnerabilities and ensures your authentication system remains secure against evolving threats.",{"title":447,"path":448,"stem":449,"description":10581,"children":-1},"Sessions provide a way to store information about a user across multiple HTTP requests. Unlike cookies, which store data on the client side, sessions store data on the server and use a session identifier to link the client to their data.",1772474931243]