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