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