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