[{"data":1,"prerenderedAt":15994},["ShallowReactive",2],{"navigation":3,"/microservices-with-django/best-practices":1016,"/microservices-with-django/best-practices-surround":15989},[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":921,"body":1018,"description":1028,"extension":15984,"links":15985,"meta":15986,"navigation":1268,"path":922,"seo":15987,"stem":923,"__hash__":15988},"docs/27.microservices-with-django/12.best-practices.md",{"type":1019,"value":1020,"toc":15962},"minimark",[1021,1025,1029,1034,1039,1042,1381,1385,1388,1983,1987,1990,2451,2455,2459,2462,3283,3287,3290,5172,5176,5179,6706,6710,6713,9008,9012,9016,9019,11478,11482,11485,12578,12582,12585,14454,14458,14462,15866,15870,15873,15879,15892,15897,15911,15916,15930,15935,15955,15958],[1022,1023,921],"h1",{"id":1024},"best-practices",[1026,1027,1028],"p",{},"This section consolidates essential best practices for developing, deploying, and maintaining Django microservices. Following these practices ensures scalable, maintainable, and reliable microservices architecture.",[1030,1031,1033],"h2",{"id":1032},"design-principles","Design Principles",[1035,1036,1038],"h3",{"id":1037},"_1-single-responsibility-principle","1. Single Responsibility Principle",[1026,1040,1041],{},"Each microservice should have a single, well-defined responsibility:",[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","# Good: User service focused on user management\nclass UserService:\n    \"\"\"Handles all user-related operations\"\"\"\n    \n    def create_user(self, user_data):\n        \"\"\"Create new user account\"\"\"\n        pass\n    \n    def authenticate_user(self, credentials):\n        \"\"\"Authenticate user credentials\"\"\"\n        pass\n    \n    def update_user_profile(self, user_id, profile_data):\n        \"\"\"Update user profile information\"\"\"\n        pass\n    \n    def deactivate_user(self, user_id):\n        \"\"\"Deactivate user account\"\"\"\n        pass\n\n# Bad: Mixed responsibilities\nclass UserOrderPaymentService:\n    \"\"\"Handles users, orders, and payments - too many responsibilities\"\"\"\n    \n    def create_user(self, user_data):\n        pass\n    \n    def create_order(self, order_data):\n        pass\n    \n    def process_payment(self, payment_data):\n        pass\n","python","",[1050,1051,1052,1061,1076,1090,1097,1124,1135,1142,1147,1166,1176,1181,1186,1210,1220,1225,1230,1248,1258,1263,1270,1276,1286,1296,1301,1318,1323,1328,1347,1352,1357,1376],"code",{"__ignoreMap":1048},[1053,1054,1057],"span",{"class":1055,"line":1056},"line",1,[1053,1058,1060],{"class":1059},"s9Tkl","# Good: User service focused on user management\n",[1053,1062,1064,1068,1072],{"class":1055,"line":1063},2,[1053,1065,1067],{"class":1066},"s5Kfy","class",[1053,1069,1071],{"class":1070},"sD-vU"," UserService",[1053,1073,1075],{"class":1074},"soVBu",":\n",[1053,1077,1079,1083,1087],{"class":1055,"line":1078},3,[1053,1080,1082],{"class":1081},"sm7ve","    \"\"\"",[1053,1084,1086],{"class":1085},"sVyVU","Handles all user-related operations",[1053,1088,1089],{"class":1081},"\"\"\"\n",[1053,1091,1093],{"class":1055,"line":1092},4,[1053,1094,1096],{"class":1095},"sftqT","    \n",[1053,1098,1100,1103,1107,1110,1114,1117,1121],{"class":1055,"line":1099},5,[1053,1101,1102],{"class":1066},"    def",[1053,1104,1106],{"class":1105},"sljsM"," create_user",[1053,1108,1109],{"class":1074},"(",[1053,1111,1113],{"class":1112},"sRjD_","self",[1053,1115,1116],{"class":1074},",",[1053,1118,1120],{"class":1119},"sCyAa"," user_data",[1053,1122,1123],{"class":1074},"):\n",[1053,1125,1127,1130,1133],{"class":1055,"line":1126},6,[1053,1128,1129],{"class":1081},"        \"\"\"",[1053,1131,1132],{"class":1085},"Create new user account",[1053,1134,1089],{"class":1081},[1053,1136,1138],{"class":1055,"line":1137},7,[1053,1139,1141],{"class":1140},"siDh9","        pass\n",[1053,1143,1145],{"class":1055,"line":1144},8,[1053,1146,1096],{"class":1095},[1053,1148,1150,1152,1155,1157,1159,1161,1164],{"class":1055,"line":1149},9,[1053,1151,1102],{"class":1066},[1053,1153,1154],{"class":1105}," authenticate_user",[1053,1156,1109],{"class":1074},[1053,1158,1113],{"class":1112},[1053,1160,1116],{"class":1074},[1053,1162,1163],{"class":1119}," credentials",[1053,1165,1123],{"class":1074},[1053,1167,1169,1171,1174],{"class":1055,"line":1168},10,[1053,1170,1129],{"class":1081},[1053,1172,1173],{"class":1085},"Authenticate user credentials",[1053,1175,1089],{"class":1081},[1053,1177,1179],{"class":1055,"line":1178},11,[1053,1180,1141],{"class":1140},[1053,1182,1184],{"class":1055,"line":1183},12,[1053,1185,1096],{"class":1095},[1053,1187,1189,1191,1194,1196,1198,1200,1203,1205,1208],{"class":1055,"line":1188},13,[1053,1190,1102],{"class":1066},[1053,1192,1193],{"class":1105}," update_user_profile",[1053,1195,1109],{"class":1074},[1053,1197,1113],{"class":1112},[1053,1199,1116],{"class":1074},[1053,1201,1202],{"class":1119}," user_id",[1053,1204,1116],{"class":1074},[1053,1206,1207],{"class":1119}," profile_data",[1053,1209,1123],{"class":1074},[1053,1211,1213,1215,1218],{"class":1055,"line":1212},14,[1053,1214,1129],{"class":1081},[1053,1216,1217],{"class":1085},"Update user profile information",[1053,1219,1089],{"class":1081},[1053,1221,1223],{"class":1055,"line":1222},15,[1053,1224,1141],{"class":1140},[1053,1226,1228],{"class":1055,"line":1227},16,[1053,1229,1096],{"class":1095},[1053,1231,1233,1235,1238,1240,1242,1244,1246],{"class":1055,"line":1232},17,[1053,1234,1102],{"class":1066},[1053,1236,1237],{"class":1105}," deactivate_user",[1053,1239,1109],{"class":1074},[1053,1241,1113],{"class":1112},[1053,1243,1116],{"class":1074},[1053,1245,1202],{"class":1119},[1053,1247,1123],{"class":1074},[1053,1249,1251,1253,1256],{"class":1055,"line":1250},18,[1053,1252,1129],{"class":1081},[1053,1254,1255],{"class":1085},"Deactivate user account",[1053,1257,1089],{"class":1081},[1053,1259,1261],{"class":1055,"line":1260},19,[1053,1262,1141],{"class":1140},[1053,1264,1266],{"class":1055,"line":1265},20,[1053,1267,1269],{"emptyLinePlaceholder":1268},true,"\n",[1053,1271,1273],{"class":1055,"line":1272},21,[1053,1274,1275],{"class":1059},"# Bad: Mixed responsibilities\n",[1053,1277,1279,1281,1284],{"class":1055,"line":1278},22,[1053,1280,1067],{"class":1066},[1053,1282,1283],{"class":1070}," UserOrderPaymentService",[1053,1285,1075],{"class":1074},[1053,1287,1289,1291,1294],{"class":1055,"line":1288},23,[1053,1290,1082],{"class":1081},[1053,1292,1293],{"class":1085},"Handles users, orders, and payments - too many responsibilities",[1053,1295,1089],{"class":1081},[1053,1297,1299],{"class":1055,"line":1298},24,[1053,1300,1096],{"class":1095},[1053,1302,1304,1306,1308,1310,1312,1314,1316],{"class":1055,"line":1303},25,[1053,1305,1102],{"class":1066},[1053,1307,1106],{"class":1105},[1053,1309,1109],{"class":1074},[1053,1311,1113],{"class":1112},[1053,1313,1116],{"class":1074},[1053,1315,1120],{"class":1119},[1053,1317,1123],{"class":1074},[1053,1319,1321],{"class":1055,"line":1320},26,[1053,1322,1141],{"class":1140},[1053,1324,1326],{"class":1055,"line":1325},27,[1053,1327,1096],{"class":1095},[1053,1329,1331,1333,1336,1338,1340,1342,1345],{"class":1055,"line":1330},28,[1053,1332,1102],{"class":1066},[1053,1334,1335],{"class":1105}," create_order",[1053,1337,1109],{"class":1074},[1053,1339,1113],{"class":1112},[1053,1341,1116],{"class":1074},[1053,1343,1344],{"class":1119}," order_data",[1053,1346,1123],{"class":1074},[1053,1348,1350],{"class":1055,"line":1349},29,[1053,1351,1141],{"class":1140},[1053,1353,1355],{"class":1055,"line":1354},30,[1053,1356,1096],{"class":1095},[1053,1358,1360,1362,1365,1367,1369,1371,1374],{"class":1055,"line":1359},31,[1053,1361,1102],{"class":1066},[1053,1363,1364],{"class":1105}," process_payment",[1053,1366,1109],{"class":1074},[1053,1368,1113],{"class":1112},[1053,1370,1116],{"class":1074},[1053,1372,1373],{"class":1119}," payment_data",[1053,1375,1123],{"class":1074},[1053,1377,1379],{"class":1055,"line":1378},32,[1053,1380,1141],{"class":1140},[1035,1382,1384],{"id":1383},"_2-database-per-service","2. Database per Service",[1026,1386,1387],{},"Each service should own its data:",[1043,1389,1391],{"className":1045,"code":1390,"language":1047,"meta":1048,"style":1048},"# User Service Database\n# settings.py\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.postgresql',\n        'NAME': 'user_service_db',\n        'USER': 'user_service_user',\n        'PASSWORD': 'user_service_password',\n        'HOST': 'user-db.internal',\n        'PORT': '5432',\n    }\n}\n\n# Order Service Database\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.postgresql',\n        'NAME': 'order_service_db',\n        'USER': 'order_service_user',\n        'PASSWORD': 'order_service_password',\n        'HOST': 'order-db.internal',\n        'PORT': '5432',\n    }\n}\n\n# Never access another service's database directly\n# Bad: Order service accessing user database\ndef get_user_orders(user_id):\n    # Don't do this - accessing user database from order service\n    user = User.objects.using('user_db').get(id=user_id)\n    return user.orders.all()\n\n# Good: Use API calls between services\ndef get_user_orders(user_id):\n    # Validate user exists via API call\n    user_client = ServiceClient('user-service')\n    user_data = user_client.get(f'/api/v1/users/{user_id}/')\n    \n    if user_data:\n        return Order.objects.filter(user_id=user_id)\n    else:\n        raise ValueError(\"User not found\")\n",[1050,1392,1393,1398,1403,1415,1433,1456,1476,1496,1516,1536,1556,1561,1566,1570,1575,1583,1595,1613,1632,1651,1670,1689,1707,1711,1715,1719,1724,1729,1744,1749,1801,1822,1826,1832,1845,1851,1873,1910,1915,1925,1953,1961],{"__ignoreMap":1048},[1053,1394,1395],{"class":1055,"line":1056},[1053,1396,1397],{"class":1059},"# User Service Database\n",[1053,1399,1400],{"class":1055,"line":1063},[1053,1401,1402],{"class":1059},"# settings.py\n",[1053,1404,1405,1409,1412],{"class":1055,"line":1078},[1053,1406,1408],{"class":1407},"se3Ec","DATABASES",[1053,1410,1411],{"class":1074}," =",[1053,1413,1414],{"class":1074}," {\n",[1053,1416,1417,1421,1425,1428,1431],{"class":1055,"line":1092},[1053,1418,1420],{"class":1419},"sbYkP","    '",[1053,1422,1424],{"class":1423},"sTbE_","default",[1053,1426,1427],{"class":1419},"'",[1053,1429,1430],{"class":1074},":",[1053,1432,1414],{"class":1074},[1053,1434,1435,1438,1441,1443,1445,1448,1451,1453],{"class":1055,"line":1099},[1053,1436,1437],{"class":1419},"        '",[1053,1439,1440],{"class":1423},"ENGINE",[1053,1442,1427],{"class":1419},[1053,1444,1430],{"class":1074},[1053,1446,1447],{"class":1419}," '",[1053,1449,1450],{"class":1423},"django.db.backends.postgresql",[1053,1452,1427],{"class":1419},[1053,1454,1455],{"class":1074},",\n",[1053,1457,1458,1460,1463,1465,1467,1469,1472,1474],{"class":1055,"line":1126},[1053,1459,1437],{"class":1419},[1053,1461,1462],{"class":1423},"NAME",[1053,1464,1427],{"class":1419},[1053,1466,1430],{"class":1074},[1053,1468,1447],{"class":1419},[1053,1470,1471],{"class":1423},"user_service_db",[1053,1473,1427],{"class":1419},[1053,1475,1455],{"class":1074},[1053,1477,1478,1480,1483,1485,1487,1489,1492,1494],{"class":1055,"line":1137},[1053,1479,1437],{"class":1419},[1053,1481,1482],{"class":1423},"USER",[1053,1484,1427],{"class":1419},[1053,1486,1430],{"class":1074},[1053,1488,1447],{"class":1419},[1053,1490,1491],{"class":1423},"user_service_user",[1053,1493,1427],{"class":1419},[1053,1495,1455],{"class":1074},[1053,1497,1498,1500,1503,1505,1507,1509,1512,1514],{"class":1055,"line":1144},[1053,1499,1437],{"class":1419},[1053,1501,1502],{"class":1423},"PASSWORD",[1053,1504,1427],{"class":1419},[1053,1506,1430],{"class":1074},[1053,1508,1447],{"class":1419},[1053,1510,1511],{"class":1423},"user_service_password",[1053,1513,1427],{"class":1419},[1053,1515,1455],{"class":1074},[1053,1517,1518,1520,1523,1525,1527,1529,1532,1534],{"class":1055,"line":1149},[1053,1519,1437],{"class":1419},[1053,1521,1522],{"class":1423},"HOST",[1053,1524,1427],{"class":1419},[1053,1526,1430],{"class":1074},[1053,1528,1447],{"class":1419},[1053,1530,1531],{"class":1423},"user-db.internal",[1053,1533,1427],{"class":1419},[1053,1535,1455],{"class":1074},[1053,1537,1538,1540,1543,1545,1547,1549,1552,1554],{"class":1055,"line":1168},[1053,1539,1437],{"class":1419},[1053,1541,1542],{"class":1423},"PORT",[1053,1544,1427],{"class":1419},[1053,1546,1430],{"class":1074},[1053,1548,1447],{"class":1419},[1053,1550,1551],{"class":1423},"5432",[1053,1553,1427],{"class":1419},[1053,1555,1455],{"class":1074},[1053,1557,1558],{"class":1055,"line":1178},[1053,1559,1560],{"class":1074},"    }\n",[1053,1562,1563],{"class":1055,"line":1183},[1053,1564,1565],{"class":1074},"}\n",[1053,1567,1568],{"class":1055,"line":1188},[1053,1569,1269],{"emptyLinePlaceholder":1268},[1053,1571,1572],{"class":1055,"line":1212},[1053,1573,1574],{"class":1059},"# Order Service Database\n",[1053,1576,1577,1579,1581],{"class":1055,"line":1222},[1053,1578,1408],{"class":1407},[1053,1580,1411],{"class":1074},[1053,1582,1414],{"class":1074},[1053,1584,1585,1587,1589,1591,1593],{"class":1055,"line":1227},[1053,1586,1420],{"class":1419},[1053,1588,1424],{"class":1423},[1053,1590,1427],{"class":1419},[1053,1592,1430],{"class":1074},[1053,1594,1414],{"class":1074},[1053,1596,1597,1599,1601,1603,1605,1607,1609,1611],{"class":1055,"line":1232},[1053,1598,1437],{"class":1419},[1053,1600,1440],{"class":1423},[1053,1602,1427],{"class":1419},[1053,1604,1430],{"class":1074},[1053,1606,1447],{"class":1419},[1053,1608,1450],{"class":1423},[1053,1610,1427],{"class":1419},[1053,1612,1455],{"class":1074},[1053,1614,1615,1617,1619,1621,1623,1625,1628,1630],{"class":1055,"line":1250},[1053,1616,1437],{"class":1419},[1053,1618,1462],{"class":1423},[1053,1620,1427],{"class":1419},[1053,1622,1430],{"class":1074},[1053,1624,1447],{"class":1419},[1053,1626,1627],{"class":1423},"order_service_db",[1053,1629,1427],{"class":1419},[1053,1631,1455],{"class":1074},[1053,1633,1634,1636,1638,1640,1642,1644,1647,1649],{"class":1055,"line":1260},[1053,1635,1437],{"class":1419},[1053,1637,1482],{"class":1423},[1053,1639,1427],{"class":1419},[1053,1641,1430],{"class":1074},[1053,1643,1447],{"class":1419},[1053,1645,1646],{"class":1423},"order_service_user",[1053,1648,1427],{"class":1419},[1053,1650,1455],{"class":1074},[1053,1652,1653,1655,1657,1659,1661,1663,1666,1668],{"class":1055,"line":1265},[1053,1654,1437],{"class":1419},[1053,1656,1502],{"class":1423},[1053,1658,1427],{"class":1419},[1053,1660,1430],{"class":1074},[1053,1662,1447],{"class":1419},[1053,1664,1665],{"class":1423},"order_service_password",[1053,1667,1427],{"class":1419},[1053,1669,1455],{"class":1074},[1053,1671,1672,1674,1676,1678,1680,1682,1685,1687],{"class":1055,"line":1272},[1053,1673,1437],{"class":1419},[1053,1675,1522],{"class":1423},[1053,1677,1427],{"class":1419},[1053,1679,1430],{"class":1074},[1053,1681,1447],{"class":1419},[1053,1683,1684],{"class":1423},"order-db.internal",[1053,1686,1427],{"class":1419},[1053,1688,1455],{"class":1074},[1053,1690,1691,1693,1695,1697,1699,1701,1703,1705],{"class":1055,"line":1278},[1053,1692,1437],{"class":1419},[1053,1694,1542],{"class":1423},[1053,1696,1427],{"class":1419},[1053,1698,1430],{"class":1074},[1053,1700,1447],{"class":1419},[1053,1702,1551],{"class":1423},[1053,1704,1427],{"class":1419},[1053,1706,1455],{"class":1074},[1053,1708,1709],{"class":1055,"line":1288},[1053,1710,1560],{"class":1074},[1053,1712,1713],{"class":1055,"line":1298},[1053,1714,1565],{"class":1074},[1053,1716,1717],{"class":1055,"line":1303},[1053,1718,1269],{"emptyLinePlaceholder":1268},[1053,1720,1721],{"class":1055,"line":1320},[1053,1722,1723],{"class":1059},"# Never access another service's database directly\n",[1053,1725,1726],{"class":1055,"line":1325},[1053,1727,1728],{"class":1059},"# Bad: Order service accessing user database\n",[1053,1730,1731,1734,1737,1739,1742],{"class":1055,"line":1330},[1053,1732,1733],{"class":1066},"def",[1053,1735,1736],{"class":1105}," get_user_orders",[1053,1738,1109],{"class":1074},[1053,1740,1741],{"class":1119},"user_id",[1053,1743,1123],{"class":1074},[1053,1745,1746],{"class":1055,"line":1349},[1053,1747,1748],{"class":1059},"    # Don't do this - accessing user database from order service\n",[1053,1750,1751,1754,1757,1760,1763,1767,1769,1773,1775,1777,1780,1782,1785,1788,1790,1794,1796,1798],{"class":1055,"line":1354},[1053,1752,1753],{"class":1095},"    user ",[1053,1755,1756],{"class":1074},"=",[1053,1758,1759],{"class":1095}," User",[1053,1761,1762],{"class":1074},".",[1053,1764,1766],{"class":1765},"sBPpx","objects",[1053,1768,1762],{"class":1074},[1053,1770,1772],{"class":1771},"siWMO","using",[1053,1774,1109],{"class":1074},[1053,1776,1427],{"class":1419},[1053,1778,1779],{"class":1423},"user_db",[1053,1781,1427],{"class":1419},[1053,1783,1784],{"class":1074},").",[1053,1786,1787],{"class":1771},"get",[1053,1789,1109],{"class":1074},[1053,1791,1793],{"class":1792},"sqOPj","id",[1053,1795,1756],{"class":1074},[1053,1797,1741],{"class":1771},[1053,1799,1800],{"class":1074},")\n",[1053,1802,1803,1806,1809,1811,1814,1816,1819],{"class":1055,"line":1359},[1053,1804,1805],{"class":1140},"    return",[1053,1807,1808],{"class":1095}," user",[1053,1810,1762],{"class":1074},[1053,1812,1813],{"class":1765},"orders",[1053,1815,1762],{"class":1074},[1053,1817,1818],{"class":1771},"all",[1053,1820,1821],{"class":1074},"()\n",[1053,1823,1824],{"class":1055,"line":1378},[1053,1825,1269],{"emptyLinePlaceholder":1268},[1053,1827,1829],{"class":1055,"line":1828},33,[1053,1830,1831],{"class":1059},"# Good: Use API calls between services\n",[1053,1833,1835,1837,1839,1841,1843],{"class":1055,"line":1834},34,[1053,1836,1733],{"class":1066},[1053,1838,1736],{"class":1105},[1053,1840,1109],{"class":1074},[1053,1842,1741],{"class":1119},[1053,1844,1123],{"class":1074},[1053,1846,1848],{"class":1055,"line":1847},35,[1053,1849,1850],{"class":1059},"    # Validate user exists via API call\n",[1053,1852,1854,1857,1859,1862,1864,1866,1869,1871],{"class":1055,"line":1853},36,[1053,1855,1856],{"class":1095},"    user_client ",[1053,1858,1756],{"class":1074},[1053,1860,1861],{"class":1771}," ServiceClient",[1053,1863,1109],{"class":1074},[1053,1865,1427],{"class":1419},[1053,1867,1868],{"class":1423},"user-service",[1053,1870,1427],{"class":1419},[1053,1872,1800],{"class":1074},[1053,1874,1876,1879,1881,1884,1886,1888,1890,1893,1896,1900,1902,1905,1908],{"class":1055,"line":1875},37,[1053,1877,1878],{"class":1095},"    user_data ",[1053,1880,1756],{"class":1074},[1053,1882,1883],{"class":1095}," user_client",[1053,1885,1762],{"class":1074},[1053,1887,1787],{"class":1771},[1053,1889,1109],{"class":1074},[1053,1891,1892],{"class":1066},"f",[1053,1894,1895],{"class":1423},"'/api/v1/users/",[1053,1897,1899],{"class":1898},"s3h35","{",[1053,1901,1741],{"class":1771},[1053,1903,1904],{"class":1898},"}",[1053,1906,1907],{"class":1423},"/'",[1053,1909,1800],{"class":1074},[1053,1911,1913],{"class":1055,"line":1912},38,[1053,1914,1096],{"class":1095},[1053,1916,1918,1921,1923],{"class":1055,"line":1917},39,[1053,1919,1920],{"class":1140},"    if",[1053,1922,1120],{"class":1095},[1053,1924,1075],{"class":1074},[1053,1926,1928,1931,1934,1936,1938,1940,1943,1945,1947,1949,1951],{"class":1055,"line":1927},40,[1053,1929,1930],{"class":1140},"        return",[1053,1932,1933],{"class":1095}," Order",[1053,1935,1762],{"class":1074},[1053,1937,1766],{"class":1765},[1053,1939,1762],{"class":1074},[1053,1941,1942],{"class":1771},"filter",[1053,1944,1109],{"class":1074},[1053,1946,1741],{"class":1792},[1053,1948,1756],{"class":1074},[1053,1950,1741],{"class":1771},[1053,1952,1800],{"class":1074},[1053,1954,1956,1959],{"class":1055,"line":1955},41,[1053,1957,1958],{"class":1140},"    else",[1053,1960,1075],{"class":1074},[1053,1962,1964,1967,1971,1973,1976,1979,1981],{"class":1055,"line":1963},42,[1053,1965,1966],{"class":1140},"        raise",[1053,1968,1970],{"class":1969},"sa2tF"," ValueError",[1053,1972,1109],{"class":1074},[1053,1974,1975],{"class":1419},"\"",[1053,1977,1978],{"class":1423},"User not found",[1053,1980,1975],{"class":1419},[1053,1982,1800],{"class":1074},[1035,1984,1986],{"id":1985},"_3-api-first-design","3. API-First Design",[1026,1988,1989],{},"Design APIs before implementation:",[1043,1991,1993],{"className":1045,"code":1992,"language":1047,"meta":1048,"style":1048},"# api_specification.py\n\"\"\"\nUser Service API Specification\n\nBase URL: /api/v1/users/\n\nEndpoints:\n- GET    /                    # List users\n- POST   /                    # Create user\n- GET    /{id}/               # Get user details\n- PUT    /{id}/               # Update user\n- DELETE /{id}/               # Delete user\n- POST   /{id}/activate/      # Activate user\n- POST   /{id}/deactivate/    # Deactivate user\n- GET    /{id}/profile/       # Get user profile\n- PUT    /{id}/profile/       # Update user profile\n\nRequest/Response formats defined in OpenAPI specification\n\"\"\"\n\nfrom drf_spectacular.utils import extend_schema, OpenApiExample\n\nclass UserViewSet(ModelViewSet):\n    \n    @extend_schema(\n        summary=\"Create new user\",\n        description=\"Create a new user account with the provided information\",\n        request=UserCreateSerializer,\n        responses={\n            201: UserSerializer,\n            400: OpenApiExample(\n                'Validation Error',\n                value={'email': ['This field must be unique.']}\n            )\n        },\n        examples=[\n            OpenApiExample(\n                'User Creation',\n                value={\n                    'username': 'johndoe',\n                    'email': 'john@example.com',\n                    'first_name': 'John',\n                    'last_name': 'Doe'\n                }\n            )\n        ]\n    )\n    def create(self, request):\n        return super().create(request)\n",[1050,1994,1995,2000,2004,2009,2013,2018,2022,2027,2032,2037,2042,2047,2052,2057,2062,2067,2072,2076,2081,2085,2089,2113,2117,2132,2136,2147,2163,2179,2191,2199,2212,2224,2236,2266,2271,2276,2284,2291,2302,2308,2329,2348,2368,2388,2394,2399,2405,2411,2430],{"__ignoreMap":1048},[1053,1996,1997],{"class":1055,"line":1056},[1053,1998,1999],{"class":1059},"# api_specification.py\n",[1053,2001,2002],{"class":1055,"line":1063},[1053,2003,1089],{"class":1081},[1053,2005,2006],{"class":1055,"line":1078},[1053,2007,2008],{"class":1085},"User Service API Specification\n",[1053,2010,2011],{"class":1055,"line":1092},[1053,2012,1269],{"emptyLinePlaceholder":1268},[1053,2014,2015],{"class":1055,"line":1099},[1053,2016,2017],{"class":1085},"Base URL: /api/v1/users/\n",[1053,2019,2020],{"class":1055,"line":1126},[1053,2021,1269],{"emptyLinePlaceholder":1268},[1053,2023,2024],{"class":1055,"line":1137},[1053,2025,2026],{"class":1085},"Endpoints:\n",[1053,2028,2029],{"class":1055,"line":1144},[1053,2030,2031],{"class":1085},"- GET    /                    # List users\n",[1053,2033,2034],{"class":1055,"line":1149},[1053,2035,2036],{"class":1085},"- POST   /                    # Create user\n",[1053,2038,2039],{"class":1055,"line":1168},[1053,2040,2041],{"class":1085},"- GET    /{id}/               # Get user details\n",[1053,2043,2044],{"class":1055,"line":1178},[1053,2045,2046],{"class":1085},"- PUT    /{id}/               # Update user\n",[1053,2048,2049],{"class":1055,"line":1183},[1053,2050,2051],{"class":1085},"- DELETE /{id}/               # Delete user\n",[1053,2053,2054],{"class":1055,"line":1188},[1053,2055,2056],{"class":1085},"- POST   /{id}/activate/      # Activate user\n",[1053,2058,2059],{"class":1055,"line":1212},[1053,2060,2061],{"class":1085},"- POST   /{id}/deactivate/    # Deactivate user\n",[1053,2063,2064],{"class":1055,"line":1222},[1053,2065,2066],{"class":1085},"- GET    /{id}/profile/       # Get user profile\n",[1053,2068,2069],{"class":1055,"line":1227},[1053,2070,2071],{"class":1085},"- PUT    /{id}/profile/       # Update user profile\n",[1053,2073,2074],{"class":1055,"line":1232},[1053,2075,1269],{"emptyLinePlaceholder":1268},[1053,2077,2078],{"class":1055,"line":1250},[1053,2079,2080],{"class":1085},"Request/Response formats defined in OpenAPI specification\n",[1053,2082,2083],{"class":1055,"line":1260},[1053,2084,1089],{"class":1081},[1053,2086,2087],{"class":1055,"line":1265},[1053,2088,1269],{"emptyLinePlaceholder":1268},[1053,2090,2091,2094,2097,2099,2102,2105,2108,2110],{"class":1055,"line":1272},[1053,2092,2093],{"class":1140},"from",[1053,2095,2096],{"class":1095}," drf_spectacular",[1053,2098,1762],{"class":1074},[1053,2100,2101],{"class":1095},"utils ",[1053,2103,2104],{"class":1140},"import",[1053,2106,2107],{"class":1095}," extend_schema",[1053,2109,1116],{"class":1074},[1053,2111,2112],{"class":1095}," OpenApiExample\n",[1053,2114,2115],{"class":1055,"line":1278},[1053,2116,1269],{"emptyLinePlaceholder":1268},[1053,2118,2119,2121,2124,2126,2130],{"class":1055,"line":1288},[1053,2120,1067],{"class":1066},[1053,2122,2123],{"class":1070}," UserViewSet",[1053,2125,1109],{"class":1074},[1053,2127,2129],{"class":2128},"sYn-s","ModelViewSet",[1053,2131,1123],{"class":1074},[1053,2133,2134],{"class":1055,"line":1298},[1053,2135,1096],{"class":1095},[1053,2137,2138,2141,2144],{"class":1055,"line":1303},[1053,2139,2140],{"class":1074},"    @",[1053,2142,2143],{"class":1105},"extend_schema",[1053,2145,2146],{"class":1074},"(\n",[1053,2148,2149,2152,2154,2156,2159,2161],{"class":1055,"line":1320},[1053,2150,2151],{"class":1792},"        summary",[1053,2153,1756],{"class":1074},[1053,2155,1975],{"class":1419},[1053,2157,2158],{"class":1423},"Create new user",[1053,2160,1975],{"class":1419},[1053,2162,1455],{"class":1074},[1053,2164,2165,2168,2170,2172,2175,2177],{"class":1055,"line":1325},[1053,2166,2167],{"class":1792},"        description",[1053,2169,1756],{"class":1074},[1053,2171,1975],{"class":1419},[1053,2173,2174],{"class":1423},"Create a new user account with the provided information",[1053,2176,1975],{"class":1419},[1053,2178,1455],{"class":1074},[1053,2180,2181,2184,2186,2189],{"class":1055,"line":1330},[1053,2182,2183],{"class":1792},"        request",[1053,2185,1756],{"class":1074},[1053,2187,2188],{"class":1771},"UserCreateSerializer",[1053,2190,1455],{"class":1074},[1053,2192,2193,2196],{"class":1055,"line":1349},[1053,2194,2195],{"class":1792},"        responses",[1053,2197,2198],{"class":1074},"={\n",[1053,2200,2201,2205,2207,2210],{"class":1055,"line":1354},[1053,2202,2204],{"class":2203},"s7CZa","            201",[1053,2206,1430],{"class":1074},[1053,2208,2209],{"class":1771}," UserSerializer",[1053,2211,1455],{"class":1074},[1053,2213,2214,2217,2219,2222],{"class":1055,"line":1359},[1053,2215,2216],{"class":2203},"            400",[1053,2218,1430],{"class":1074},[1053,2220,2221],{"class":1771}," OpenApiExample",[1053,2223,2146],{"class":1074},[1053,2225,2226,2229,2232,2234],{"class":1055,"line":1378},[1053,2227,2228],{"class":1419},"                '",[1053,2230,2231],{"class":1423},"Validation Error",[1053,2233,1427],{"class":1419},[1053,2235,1455],{"class":1074},[1053,2237,2238,2241,2244,2246,2249,2251,2253,2256,2258,2261,2263],{"class":1055,"line":1828},[1053,2239,2240],{"class":1792},"                value",[1053,2242,2243],{"class":1074},"={",[1053,2245,1427],{"class":1419},[1053,2247,2248],{"class":1423},"email",[1053,2250,1427],{"class":1419},[1053,2252,1430],{"class":1074},[1053,2254,2255],{"class":1074}," [",[1053,2257,1427],{"class":1419},[1053,2259,2260],{"class":1423},"This field must be unique.",[1053,2262,1427],{"class":1419},[1053,2264,2265],{"class":1074},"]}\n",[1053,2267,2268],{"class":1055,"line":1834},[1053,2269,2270],{"class":1074},"            )\n",[1053,2272,2273],{"class":1055,"line":1847},[1053,2274,2275],{"class":1074},"        },\n",[1053,2277,2278,2281],{"class":1055,"line":1853},[1053,2279,2280],{"class":1792},"        examples",[1053,2282,2283],{"class":1074},"=[\n",[1053,2285,2286,2289],{"class":1055,"line":1875},[1053,2287,2288],{"class":1771},"            OpenApiExample",[1053,2290,2146],{"class":1074},[1053,2292,2293,2295,2298,2300],{"class":1055,"line":1912},[1053,2294,2228],{"class":1419},[1053,2296,2297],{"class":1423},"User Creation",[1053,2299,1427],{"class":1419},[1053,2301,1455],{"class":1074},[1053,2303,2304,2306],{"class":1055,"line":1917},[1053,2305,2240],{"class":1792},[1053,2307,2198],{"class":1074},[1053,2309,2310,2313,2316,2318,2320,2322,2325,2327],{"class":1055,"line":1927},[1053,2311,2312],{"class":1419},"                    '",[1053,2314,2315],{"class":1423},"username",[1053,2317,1427],{"class":1419},[1053,2319,1430],{"class":1074},[1053,2321,1447],{"class":1419},[1053,2323,2324],{"class":1423},"johndoe",[1053,2326,1427],{"class":1419},[1053,2328,1455],{"class":1074},[1053,2330,2331,2333,2335,2337,2339,2341,2344,2346],{"class":1055,"line":1955},[1053,2332,2312],{"class":1419},[1053,2334,2248],{"class":1423},[1053,2336,1427],{"class":1419},[1053,2338,1430],{"class":1074},[1053,2340,1447],{"class":1419},[1053,2342,2343],{"class":1423},"john@example.com",[1053,2345,1427],{"class":1419},[1053,2347,1455],{"class":1074},[1053,2349,2350,2352,2355,2357,2359,2361,2364,2366],{"class":1055,"line":1963},[1053,2351,2312],{"class":1419},[1053,2353,2354],{"class":1423},"first_name",[1053,2356,1427],{"class":1419},[1053,2358,1430],{"class":1074},[1053,2360,1447],{"class":1419},[1053,2362,2363],{"class":1423},"John",[1053,2365,1427],{"class":1419},[1053,2367,1455],{"class":1074},[1053,2369,2371,2373,2376,2378,2380,2382,2385],{"class":1055,"line":2370},43,[1053,2372,2312],{"class":1419},[1053,2374,2375],{"class":1423},"last_name",[1053,2377,1427],{"class":1419},[1053,2379,1430],{"class":1074},[1053,2381,1447],{"class":1419},[1053,2383,2384],{"class":1423},"Doe",[1053,2386,2387],{"class":1419},"'\n",[1053,2389,2391],{"class":1055,"line":2390},44,[1053,2392,2393],{"class":1074},"                }\n",[1053,2395,2397],{"class":1055,"line":2396},45,[1053,2398,2270],{"class":1074},[1053,2400,2402],{"class":1055,"line":2401},46,[1053,2403,2404],{"class":1074},"        ]\n",[1053,2406,2408],{"class":1055,"line":2407},47,[1053,2409,2410],{"class":1074},"    )\n",[1053,2412,2414,2416,2419,2421,2423,2425,2428],{"class":1055,"line":2413},48,[1053,2415,1102],{"class":1066},[1053,2417,2418],{"class":1105}," create",[1053,2420,1109],{"class":1074},[1053,2422,1113],{"class":1112},[1053,2424,1116],{"class":1074},[1053,2426,2427],{"class":1119}," request",[1053,2429,1123],{"class":1074},[1053,2431,2433,2435,2438,2441,2444,2446,2449],{"class":1055,"line":2432},49,[1053,2434,1930],{"class":1140},[1053,2436,2437],{"class":1969}," super",[1053,2439,2440],{"class":1074},"().",[1053,2442,2443],{"class":1771},"create",[1053,2445,1109],{"class":1074},[1053,2447,2448],{"class":1771},"request",[1053,2450,1800],{"class":1074},[1030,2452,2454],{"id":2453},"development-best-practices","Development Best Practices",[1035,2456,2458],{"id":2457},"_1-configuration-management","1. Configuration Management",[1026,2460,2461],{},"Use environment-based configuration:",[1043,2463,2465],{"className":1045,"code":2464,"language":1047,"meta":1048,"style":1048},"# settings.py\nimport os\nfrom decouple import config, Csv\n\n# Environment-based settings\nDEBUG = config('DEBUG', default=False, cast=bool)\nSECRET_KEY = config('SECRET_KEY')\nALLOWED_HOSTS = config('ALLOWED_HOSTS', default='', cast=Csv())\n\n# Database configuration\nDATABASE_URL = config('DATABASE_URL')\nDATABASES = {\n    'default': dj_database_url.parse(DATABASE_URL)\n}\n\n# External service URLs\nUSER_SERVICE_URL = config('USER_SERVICE_URL', default='http://user-service:8000')\nPRODUCT_SERVICE_URL = config('PRODUCT_SERVICE_URL', default='http://product-service:8000')\nORDER_SERVICE_URL = config('ORDER_SERVICE_URL', default='http://order-service:8000')\n\n# Feature flags\nENABLE_CACHING = config('ENABLE_CACHING', default=True, cast=bool)\nENABLE_ASYNC_PROCESSING = config('ENABLE_ASYNC_PROCESSING', default=True, cast=bool)\nENABLE_METRICS = config('ENABLE_METRICS', default=True, cast=bool)\n\n# Service-specific configuration\nSERVICE_NAME = config('SERVICE_NAME', default='user-service')\nSERVICE_VERSION = config('SERVICE_VERSION', default='1.0.0')\nSERVICE_ENVIRONMENT = config('SERVICE_ENVIRONMENT', default='development')\n\n# Logging configuration\nLOGGING = {\n    'version': 1,\n    'disable_existing_loggers': False,\n    'formatters': {\n        'json': {\n            'format': '{\"timestamp\": \"%(asctime)s\", \"level\": \"%(levelname)s\", \"service\": \"' + SERVICE_NAME + '\", \"message\": \"%(message)s\"}',\n        },\n    },\n    'handlers': {\n        'console': {\n            'class': 'logging.StreamHandler',\n            'formatter': 'json',\n        },\n    },\n    'root': {\n        'handlers': ['console'],\n        'level': config('LOG_LEVEL', default='INFO'),\n    },\n}\n",[1050,2466,2467,2471,2478,2495,2499,2504,2544,2563,2601,2605,2610,2629,2637,2662,2666,2670,2675,2707,2739,2771,2775,2780,2816,2851,2886,2890,2895,2926,2958,2990,2994,2999,3008,3024,3040,3053,3066,3121,3125,3130,3143,3156,3175,3194,3198,3202,3215,3236,3274,3278],{"__ignoreMap":1048},[1053,2468,2469],{"class":1055,"line":1056},[1053,2470,1402],{"class":1059},[1053,2472,2473,2475],{"class":1055,"line":1063},[1053,2474,2104],{"class":1140},[1053,2476,2477],{"class":1095}," os\n",[1053,2479,2480,2482,2485,2487,2490,2492],{"class":1055,"line":1078},[1053,2481,2093],{"class":1140},[1053,2483,2484],{"class":1095}," decouple ",[1053,2486,2104],{"class":1140},[1053,2488,2489],{"class":1095}," config",[1053,2491,1116],{"class":1074},[1053,2493,2494],{"class":1095}," Csv\n",[1053,2496,2497],{"class":1055,"line":1092},[1053,2498,1269],{"emptyLinePlaceholder":1268},[1053,2500,2501],{"class":1055,"line":1099},[1053,2502,2503],{"class":1059},"# Environment-based settings\n",[1053,2505,2506,2509,2511,2513,2515,2517,2519,2521,2523,2526,2528,2532,2534,2537,2539,2542],{"class":1055,"line":1126},[1053,2507,2508],{"class":1407},"DEBUG",[1053,2510,1411],{"class":1074},[1053,2512,2489],{"class":1771},[1053,2514,1109],{"class":1074},[1053,2516,1427],{"class":1419},[1053,2518,2508],{"class":1423},[1053,2520,1427],{"class":1419},[1053,2522,1116],{"class":1074},[1053,2524,2525],{"class":1792}," default",[1053,2527,1756],{"class":1074},[1053,2529,2531],{"class":2530},"s8XtY","False",[1053,2533,1116],{"class":1074},[1053,2535,2536],{"class":1792}," cast",[1053,2538,1756],{"class":1074},[1053,2540,2541],{"class":1969},"bool",[1053,2543,1800],{"class":1074},[1053,2545,2546,2549,2551,2553,2555,2557,2559,2561],{"class":1055,"line":1137},[1053,2547,2548],{"class":1407},"SECRET_KEY",[1053,2550,1411],{"class":1074},[1053,2552,2489],{"class":1771},[1053,2554,1109],{"class":1074},[1053,2556,1427],{"class":1419},[1053,2558,2548],{"class":1423},[1053,2560,1427],{"class":1419},[1053,2562,1800],{"class":1074},[1053,2564,2565,2568,2570,2572,2574,2576,2578,2580,2582,2584,2586,2589,2591,2593,2595,2598],{"class":1055,"line":1144},[1053,2566,2567],{"class":1407},"ALLOWED_HOSTS",[1053,2569,1411],{"class":1074},[1053,2571,2489],{"class":1771},[1053,2573,1109],{"class":1074},[1053,2575,1427],{"class":1419},[1053,2577,2567],{"class":1423},[1053,2579,1427],{"class":1419},[1053,2581,1116],{"class":1074},[1053,2583,2525],{"class":1792},[1053,2585,1756],{"class":1074},[1053,2587,2588],{"class":1419},"''",[1053,2590,1116],{"class":1074},[1053,2592,2536],{"class":1792},[1053,2594,1756],{"class":1074},[1053,2596,2597],{"class":1771},"Csv",[1053,2599,2600],{"class":1074},"())\n",[1053,2602,2603],{"class":1055,"line":1149},[1053,2604,1269],{"emptyLinePlaceholder":1268},[1053,2606,2607],{"class":1055,"line":1168},[1053,2608,2609],{"class":1059},"# Database configuration\n",[1053,2611,2612,2615,2617,2619,2621,2623,2625,2627],{"class":1055,"line":1178},[1053,2613,2614],{"class":1407},"DATABASE_URL",[1053,2616,1411],{"class":1074},[1053,2618,2489],{"class":1771},[1053,2620,1109],{"class":1074},[1053,2622,1427],{"class":1419},[1053,2624,2614],{"class":1423},[1053,2626,1427],{"class":1419},[1053,2628,1800],{"class":1074},[1053,2630,2631,2633,2635],{"class":1055,"line":1183},[1053,2632,1408],{"class":1407},[1053,2634,1411],{"class":1074},[1053,2636,1414],{"class":1074},[1053,2638,2639,2641,2643,2645,2647,2650,2652,2655,2657,2660],{"class":1055,"line":1188},[1053,2640,1420],{"class":1419},[1053,2642,1424],{"class":1423},[1053,2644,1427],{"class":1419},[1053,2646,1430],{"class":1074},[1053,2648,2649],{"class":1095}," dj_database_url",[1053,2651,1762],{"class":1074},[1053,2653,2654],{"class":1771},"parse",[1053,2656,1109],{"class":1074},[1053,2658,2614],{"class":2659},"s6DHA",[1053,2661,1800],{"class":1074},[1053,2663,2664],{"class":1055,"line":1212},[1053,2665,1565],{"class":1074},[1053,2667,2668],{"class":1055,"line":1222},[1053,2669,1269],{"emptyLinePlaceholder":1268},[1053,2671,2672],{"class":1055,"line":1227},[1053,2673,2674],{"class":1059},"# External service URLs\n",[1053,2676,2677,2680,2682,2684,2686,2688,2690,2692,2694,2696,2698,2700,2703,2705],{"class":1055,"line":1232},[1053,2678,2679],{"class":1407},"USER_SERVICE_URL",[1053,2681,1411],{"class":1074},[1053,2683,2489],{"class":1771},[1053,2685,1109],{"class":1074},[1053,2687,1427],{"class":1419},[1053,2689,2679],{"class":1423},[1053,2691,1427],{"class":1419},[1053,2693,1116],{"class":1074},[1053,2695,2525],{"class":1792},[1053,2697,1756],{"class":1074},[1053,2699,1427],{"class":1419},[1053,2701,2702],{"class":1423},"http://user-service:8000",[1053,2704,1427],{"class":1419},[1053,2706,1800],{"class":1074},[1053,2708,2709,2712,2714,2716,2718,2720,2722,2724,2726,2728,2730,2732,2735,2737],{"class":1055,"line":1250},[1053,2710,2711],{"class":1407},"PRODUCT_SERVICE_URL",[1053,2713,1411],{"class":1074},[1053,2715,2489],{"class":1771},[1053,2717,1109],{"class":1074},[1053,2719,1427],{"class":1419},[1053,2721,2711],{"class":1423},[1053,2723,1427],{"class":1419},[1053,2725,1116],{"class":1074},[1053,2727,2525],{"class":1792},[1053,2729,1756],{"class":1074},[1053,2731,1427],{"class":1419},[1053,2733,2734],{"class":1423},"http://product-service:8000",[1053,2736,1427],{"class":1419},[1053,2738,1800],{"class":1074},[1053,2740,2741,2744,2746,2748,2750,2752,2754,2756,2758,2760,2762,2764,2767,2769],{"class":1055,"line":1260},[1053,2742,2743],{"class":1407},"ORDER_SERVICE_URL",[1053,2745,1411],{"class":1074},[1053,2747,2489],{"class":1771},[1053,2749,1109],{"class":1074},[1053,2751,1427],{"class":1419},[1053,2753,2743],{"class":1423},[1053,2755,1427],{"class":1419},[1053,2757,1116],{"class":1074},[1053,2759,2525],{"class":1792},[1053,2761,1756],{"class":1074},[1053,2763,1427],{"class":1419},[1053,2765,2766],{"class":1423},"http://order-service:8000",[1053,2768,1427],{"class":1419},[1053,2770,1800],{"class":1074},[1053,2772,2773],{"class":1055,"line":1265},[1053,2774,1269],{"emptyLinePlaceholder":1268},[1053,2776,2777],{"class":1055,"line":1272},[1053,2778,2779],{"class":1059},"# Feature flags\n",[1053,2781,2782,2785,2787,2789,2791,2793,2795,2797,2799,2801,2803,2806,2808,2810,2812,2814],{"class":1055,"line":1278},[1053,2783,2784],{"class":1407},"ENABLE_CACHING",[1053,2786,1411],{"class":1074},[1053,2788,2489],{"class":1771},[1053,2790,1109],{"class":1074},[1053,2792,1427],{"class":1419},[1053,2794,2784],{"class":1423},[1053,2796,1427],{"class":1419},[1053,2798,1116],{"class":1074},[1053,2800,2525],{"class":1792},[1053,2802,1756],{"class":1074},[1053,2804,2805],{"class":2530},"True",[1053,2807,1116],{"class":1074},[1053,2809,2536],{"class":1792},[1053,2811,1756],{"class":1074},[1053,2813,2541],{"class":1969},[1053,2815,1800],{"class":1074},[1053,2817,2818,2821,2823,2825,2827,2829,2831,2833,2835,2837,2839,2841,2843,2845,2847,2849],{"class":1055,"line":1288},[1053,2819,2820],{"class":1407},"ENABLE_ASYNC_PROCESSING",[1053,2822,1411],{"class":1074},[1053,2824,2489],{"class":1771},[1053,2826,1109],{"class":1074},[1053,2828,1427],{"class":1419},[1053,2830,2820],{"class":1423},[1053,2832,1427],{"class":1419},[1053,2834,1116],{"class":1074},[1053,2836,2525],{"class":1792},[1053,2838,1756],{"class":1074},[1053,2840,2805],{"class":2530},[1053,2842,1116],{"class":1074},[1053,2844,2536],{"class":1792},[1053,2846,1756],{"class":1074},[1053,2848,2541],{"class":1969},[1053,2850,1800],{"class":1074},[1053,2852,2853,2856,2858,2860,2862,2864,2866,2868,2870,2872,2874,2876,2878,2880,2882,2884],{"class":1055,"line":1298},[1053,2854,2855],{"class":1407},"ENABLE_METRICS",[1053,2857,1411],{"class":1074},[1053,2859,2489],{"class":1771},[1053,2861,1109],{"class":1074},[1053,2863,1427],{"class":1419},[1053,2865,2855],{"class":1423},[1053,2867,1427],{"class":1419},[1053,2869,1116],{"class":1074},[1053,2871,2525],{"class":1792},[1053,2873,1756],{"class":1074},[1053,2875,2805],{"class":2530},[1053,2877,1116],{"class":1074},[1053,2879,2536],{"class":1792},[1053,2881,1756],{"class":1074},[1053,2883,2541],{"class":1969},[1053,2885,1800],{"class":1074},[1053,2887,2888],{"class":1055,"line":1303},[1053,2889,1269],{"emptyLinePlaceholder":1268},[1053,2891,2892],{"class":1055,"line":1320},[1053,2893,2894],{"class":1059},"# Service-specific configuration\n",[1053,2896,2897,2900,2902,2904,2906,2908,2910,2912,2914,2916,2918,2920,2922,2924],{"class":1055,"line":1325},[1053,2898,2899],{"class":1407},"SERVICE_NAME",[1053,2901,1411],{"class":1074},[1053,2903,2489],{"class":1771},[1053,2905,1109],{"class":1074},[1053,2907,1427],{"class":1419},[1053,2909,2899],{"class":1423},[1053,2911,1427],{"class":1419},[1053,2913,1116],{"class":1074},[1053,2915,2525],{"class":1792},[1053,2917,1756],{"class":1074},[1053,2919,1427],{"class":1419},[1053,2921,1868],{"class":1423},[1053,2923,1427],{"class":1419},[1053,2925,1800],{"class":1074},[1053,2927,2928,2931,2933,2935,2937,2939,2941,2943,2945,2947,2949,2951,2954,2956],{"class":1055,"line":1330},[1053,2929,2930],{"class":1407},"SERVICE_VERSION",[1053,2932,1411],{"class":1074},[1053,2934,2489],{"class":1771},[1053,2936,1109],{"class":1074},[1053,2938,1427],{"class":1419},[1053,2940,2930],{"class":1423},[1053,2942,1427],{"class":1419},[1053,2944,1116],{"class":1074},[1053,2946,2525],{"class":1792},[1053,2948,1756],{"class":1074},[1053,2950,1427],{"class":1419},[1053,2952,2953],{"class":1423},"1.0.0",[1053,2955,1427],{"class":1419},[1053,2957,1800],{"class":1074},[1053,2959,2960,2963,2965,2967,2969,2971,2973,2975,2977,2979,2981,2983,2986,2988],{"class":1055,"line":1349},[1053,2961,2962],{"class":1407},"SERVICE_ENVIRONMENT",[1053,2964,1411],{"class":1074},[1053,2966,2489],{"class":1771},[1053,2968,1109],{"class":1074},[1053,2970,1427],{"class":1419},[1053,2972,2962],{"class":1423},[1053,2974,1427],{"class":1419},[1053,2976,1116],{"class":1074},[1053,2978,2525],{"class":1792},[1053,2980,1756],{"class":1074},[1053,2982,1427],{"class":1419},[1053,2984,2985],{"class":1423},"development",[1053,2987,1427],{"class":1419},[1053,2989,1800],{"class":1074},[1053,2991,2992],{"class":1055,"line":1354},[1053,2993,1269],{"emptyLinePlaceholder":1268},[1053,2995,2996],{"class":1055,"line":1359},[1053,2997,2998],{"class":1059},"# Logging configuration\n",[1053,3000,3001,3004,3006],{"class":1055,"line":1378},[1053,3002,3003],{"class":1407},"LOGGING",[1053,3005,1411],{"class":1074},[1053,3007,1414],{"class":1074},[1053,3009,3010,3012,3015,3017,3019,3022],{"class":1055,"line":1828},[1053,3011,1420],{"class":1419},[1053,3013,3014],{"class":1423},"version",[1053,3016,1427],{"class":1419},[1053,3018,1430],{"class":1074},[1053,3020,3021],{"class":2203}," 1",[1053,3023,1455],{"class":1074},[1053,3025,3026,3028,3031,3033,3035,3038],{"class":1055,"line":1834},[1053,3027,1420],{"class":1419},[1053,3029,3030],{"class":1423},"disable_existing_loggers",[1053,3032,1427],{"class":1419},[1053,3034,1430],{"class":1074},[1053,3036,3037],{"class":2530}," False",[1053,3039,1455],{"class":1074},[1053,3041,3042,3044,3047,3049,3051],{"class":1055,"line":1847},[1053,3043,1420],{"class":1419},[1053,3045,3046],{"class":1423},"formatters",[1053,3048,1427],{"class":1419},[1053,3050,1430],{"class":1074},[1053,3052,1414],{"class":1074},[1053,3054,3055,3057,3060,3062,3064],{"class":1055,"line":1853},[1053,3056,1437],{"class":1419},[1053,3058,3059],{"class":1423},"json",[1053,3061,1427],{"class":1419},[1053,3063,1430],{"class":1074},[1053,3065,1414],{"class":1074},[1053,3067,3068,3071,3074,3076,3078,3080,3083,3086,3089,3092,3095,3097,3101,3104,3106,3108,3111,3114,3117,3119],{"class":1055,"line":1875},[1053,3069,3070],{"class":1419},"            '",[1053,3072,3073],{"class":1423},"format",[1053,3075,1427],{"class":1419},[1053,3077,1430],{"class":1074},[1053,3079,1447],{"class":1419},[1053,3081,3082],{"class":1423},"{\"timestamp\": \"",[1053,3084,3085],{"class":1898},"%(asctime)s",[1053,3087,3088],{"class":1423},"\", \"level\": \"",[1053,3090,3091],{"class":1898},"%(levelname)s",[1053,3093,3094],{"class":1423},"\", \"service\": \"",[1053,3096,1427],{"class":1419},[1053,3098,3100],{"class":3099},"sVsLi"," +",[1053,3102,3103],{"class":1407}," SERVICE_NAME",[1053,3105,3100],{"class":3099},[1053,3107,1447],{"class":1419},[1053,3109,3110],{"class":1423},"\", \"message\": \"",[1053,3112,3113],{"class":1898},"%(message)s",[1053,3115,3116],{"class":1423},"\"}",[1053,3118,1427],{"class":1419},[1053,3120,1455],{"class":1074},[1053,3122,3123],{"class":1055,"line":1912},[1053,3124,2275],{"class":1074},[1053,3126,3127],{"class":1055,"line":1917},[1053,3128,3129],{"class":1074},"    },\n",[1053,3131,3132,3134,3137,3139,3141],{"class":1055,"line":1927},[1053,3133,1420],{"class":1419},[1053,3135,3136],{"class":1423},"handlers",[1053,3138,1427],{"class":1419},[1053,3140,1430],{"class":1074},[1053,3142,1414],{"class":1074},[1053,3144,3145,3147,3150,3152,3154],{"class":1055,"line":1955},[1053,3146,1437],{"class":1419},[1053,3148,3149],{"class":1423},"console",[1053,3151,1427],{"class":1419},[1053,3153,1430],{"class":1074},[1053,3155,1414],{"class":1074},[1053,3157,3158,3160,3162,3164,3166,3168,3171,3173],{"class":1055,"line":1963},[1053,3159,3070],{"class":1419},[1053,3161,1067],{"class":1423},[1053,3163,1427],{"class":1419},[1053,3165,1430],{"class":1074},[1053,3167,1447],{"class":1419},[1053,3169,3170],{"class":1423},"logging.StreamHandler",[1053,3172,1427],{"class":1419},[1053,3174,1455],{"class":1074},[1053,3176,3177,3179,3182,3184,3186,3188,3190,3192],{"class":1055,"line":2370},[1053,3178,3070],{"class":1419},[1053,3180,3181],{"class":1423},"formatter",[1053,3183,1427],{"class":1419},[1053,3185,1430],{"class":1074},[1053,3187,1447],{"class":1419},[1053,3189,3059],{"class":1423},[1053,3191,1427],{"class":1419},[1053,3193,1455],{"class":1074},[1053,3195,3196],{"class":1055,"line":2390},[1053,3197,2275],{"class":1074},[1053,3199,3200],{"class":1055,"line":2396},[1053,3201,3129],{"class":1074},[1053,3203,3204,3206,3209,3211,3213],{"class":1055,"line":2401},[1053,3205,1420],{"class":1419},[1053,3207,3208],{"class":1423},"root",[1053,3210,1427],{"class":1419},[1053,3212,1430],{"class":1074},[1053,3214,1414],{"class":1074},[1053,3216,3217,3219,3221,3223,3225,3227,3229,3231,3233],{"class":1055,"line":2407},[1053,3218,1437],{"class":1419},[1053,3220,3136],{"class":1423},[1053,3222,1427],{"class":1419},[1053,3224,1430],{"class":1074},[1053,3226,2255],{"class":1074},[1053,3228,1427],{"class":1419},[1053,3230,3149],{"class":1423},[1053,3232,1427],{"class":1419},[1053,3234,3235],{"class":1074},"],\n",[1053,3237,3238,3240,3243,3245,3247,3249,3251,3253,3256,3258,3260,3262,3264,3266,3269,3271],{"class":1055,"line":2413},[1053,3239,1437],{"class":1419},[1053,3241,3242],{"class":1423},"level",[1053,3244,1427],{"class":1419},[1053,3246,1430],{"class":1074},[1053,3248,2489],{"class":1771},[1053,3250,1109],{"class":1074},[1053,3252,1427],{"class":1419},[1053,3254,3255],{"class":1423},"LOG_LEVEL",[1053,3257,1427],{"class":1419},[1053,3259,1116],{"class":1074},[1053,3261,2525],{"class":1792},[1053,3263,1756],{"class":1074},[1053,3265,1427],{"class":1419},[1053,3267,3268],{"class":1423},"INFO",[1053,3270,1427],{"class":1419},[1053,3272,3273],{"class":1074},"),\n",[1053,3275,3276],{"class":1055,"line":2432},[1053,3277,3129],{"class":1074},[1053,3279,3281],{"class":1055,"line":3280},50,[1053,3282,1565],{"class":1074},[1035,3284,3286],{"id":3285},"_2-error-handling","2. Error Handling",[1026,3288,3289],{},"Implement consistent error handling:",[1043,3291,3293],{"className":1045,"code":3292,"language":1047,"meta":1048,"style":1048},"# exceptions.py\nfrom rest_framework.views import exception_handler\nfrom rest_framework.response import Response\nfrom rest_framework import status\nimport logging\nimport uuid\n\nlogger = logging.getLogger(__name__)\n\nclass ServiceException(Exception):\n    \"\"\"Base exception for service errors\"\"\"\n    \n    def __init__(self, message, error_code=None, details=None):\n        self.message = message\n        self.error_code = error_code or 'SERVICE_ERROR'\n        self.details = details or {}\n        super().__init__(self.message)\n\nclass ValidationException(ServiceException):\n    \"\"\"Validation error exception\"\"\"\n    \n    def __init__(self, message, field_errors=None):\n        super().__init__(message, 'VALIDATION_ERROR', {'field_errors': field_errors or {}})\n\nclass BusinessLogicException(ServiceException):\n    \"\"\"Business logic error exception\"\"\"\n    \n    def __init__(self, message, business_rule=None):\n        super().__init__(message, 'BUSINESS_LOGIC_ERROR', {'business_rule': business_rule})\n\nclass ExternalServiceException(ServiceException):\n    \"\"\"External service error exception\"\"\"\n    \n    def __init__(self, message, service_name, status_code=None):\n        super().__init__(\n            message, \n            'EXTERNAL_SERVICE_ERROR', \n            {'service_name': service_name, 'status_code': status_code}\n        )\n\ndef custom_exception_handler(exc, context):\n    \"\"\"Custom exception handler for consistent error responses\"\"\"\n    \n    # Generate correlation ID for error tracking\n    correlation_id = str(uuid.uuid4())\n    \n    # Handle custom service exceptions\n    if isinstance(exc, ServiceException):\n        error_response = {\n            'error': {\n                'code': exc.error_code,\n                'message': exc.message,\n                'details': exc.details,\n                'correlation_id': correlation_id,\n                'service': settings.SERVICE_NAME,\n                'timestamp': timezone.now().isoformat()\n            }\n        }\n        \n        # Log the error\n        logger.error(f\"Service error [{correlation_id}]: {exc.message}\", extra={\n            'error_code': exc.error_code,\n            'details': exc.details,\n            'correlation_id': correlation_id\n        })\n        \n        # Determine HTTP status code\n        status_code = status.HTTP_400_BAD_REQUEST\n        if exc.error_code == 'EXTERNAL_SERVICE_ERROR':\n            status_code = status.HTTP_502_BAD_GATEWAY\n        elif exc.error_code == 'BUSINESS_LOGIC_ERROR':\n            status_code = status.HTTP_422_UNPROCESSABLE_ENTITY\n        \n        return Response(error_response, status=status_code)\n    \n    # Handle Django REST framework exceptions\n    response = exception_handler(exc, context)\n    \n    if response is not None:\n        # Enhance DRF error responses\n        custom_response_data = {\n            'error': {\n                'code': 'VALIDATION_ERROR' if response.status_code == 400 else 'API_ERROR',\n                'message': 'Request validation failed' if response.status_code == 400 else 'API error occurred',\n                'details': response.data,\n                'correlation_id': correlation_id,\n                'service': settings.SERVICE_NAME,\n                'timestamp': timezone.now().isoformat()\n            }\n        }\n        \n        # Log the error\n        logger.warning(f\"API error [{correlation_id}]: {response.status_code}\", extra={\n            'status_code': response.status_code,\n            'details': response.data,\n            'correlation_id': correlation_id\n        })\n        \n        response.data = custom_response_data\n    \n    return response\n\n# Usage in views\nclass UserViewSet(ModelViewSet):\n    \n    def create(self, request):\n        \"\"\"Create user with proper error handling\"\"\"\n        try:\n            # Validate business rules\n            if User.objects.filter(email=request.data.get('email')).exists():\n                raise BusinessLogicException(\n                    \"User with this email already exists\",\n                    business_rule=\"unique_email\"\n                )\n            \n            # Validate with external service\n            validation_result = self.validate_with_external_service(request.data)\n            if not validation_result['valid']:\n                raise ExternalServiceException(\n                    \"External validation failed\",\n                    service_name=\"validation-service\",\n                    status_code=validation_result.get('status_code')\n                )\n            \n            return super().create(request)\n            \n        except ServiceException:\n            raise  # Re-raise service exceptions\n        except Exception as e:\n            # Log unexpected errors\n            logger.exception(\"Unexpected error in user creation\")\n            raise ServiceException(\n                \"An unexpected error occurred\",\n                error_code=\"INTERNAL_ERROR\"\n            )\n",[1050,3294,3295,3300,3317,3333,3345,3352,3359,3363,3386,3390,3404,3413,3417,3455,3470,3494,3513,3533,3537,3551,3560,3564,3589,3632,3636,3649,3658,3662,3687,3726,3730,3743,3752,3756,3786,3796,3806,3819,3850,3855,3859,3878,3887,3891,3896,3918,3922,3927,3944,3953,3966,3986,4005,4024,4041,4063,4090,4096,4102,4108,4114,4159,4178,4197,4211,4217,4222,4228,4244,4267,4282,4304,4318,4323,4346,4351,4357,4378,4383,4402,4408,4418,4431,4475,4516,4536,4551,4570,4593,4598,4603,4608,4613,4657,4676,4695,4708,4713,4718,4733,4738,4746,4751,4757,4770,4775,4792,4802,4810,4816,4865,4875,4888,4904,4910,4916,4922,4948,4971,4980,4992,5009,5034,5039,5044,5062,5067,5077,5086,5102,5108,5130,5139,5152,5167],{"__ignoreMap":1048},[1053,3296,3297],{"class":1055,"line":1056},[1053,3298,3299],{"class":1059},"# exceptions.py\n",[1053,3301,3302,3304,3307,3309,3312,3314],{"class":1055,"line":1063},[1053,3303,2093],{"class":1140},[1053,3305,3306],{"class":1095}," rest_framework",[1053,3308,1762],{"class":1074},[1053,3310,3311],{"class":1095},"views ",[1053,3313,2104],{"class":1140},[1053,3315,3316],{"class":1095}," exception_handler\n",[1053,3318,3319,3321,3323,3325,3328,3330],{"class":1055,"line":1078},[1053,3320,2093],{"class":1140},[1053,3322,3306],{"class":1095},[1053,3324,1762],{"class":1074},[1053,3326,3327],{"class":1095},"response ",[1053,3329,2104],{"class":1140},[1053,3331,3332],{"class":1095}," Response\n",[1053,3334,3335,3337,3340,3342],{"class":1055,"line":1092},[1053,3336,2093],{"class":1140},[1053,3338,3339],{"class":1095}," rest_framework ",[1053,3341,2104],{"class":1140},[1053,3343,3344],{"class":1095}," status\n",[1053,3346,3347,3349],{"class":1055,"line":1099},[1053,3348,2104],{"class":1140},[1053,3350,3351],{"class":1095}," logging\n",[1053,3353,3354,3356],{"class":1055,"line":1126},[1053,3355,2104],{"class":1140},[1053,3357,3358],{"class":1095}," uuid\n",[1053,3360,3361],{"class":1055,"line":1137},[1053,3362,1269],{"emptyLinePlaceholder":1268},[1053,3364,3365,3368,3370,3373,3375,3378,3380,3384],{"class":1055,"line":1144},[1053,3366,3367],{"class":1095},"logger ",[1053,3369,1756],{"class":1074},[1053,3371,3372],{"class":1095}," logging",[1053,3374,1762],{"class":1074},[1053,3376,3377],{"class":1771},"getLogger",[1053,3379,1109],{"class":1074},[1053,3381,3383],{"class":3382},"s131V","__name__",[1053,3385,1800],{"class":1074},[1053,3387,3388],{"class":1055,"line":1149},[1053,3389,1269],{"emptyLinePlaceholder":1268},[1053,3391,3392,3394,3397,3399,3402],{"class":1055,"line":1168},[1053,3393,1067],{"class":1066},[1053,3395,3396],{"class":1070}," ServiceException",[1053,3398,1109],{"class":1074},[1053,3400,3401],{"class":1969},"Exception",[1053,3403,1123],{"class":1074},[1053,3405,3406,3408,3411],{"class":1055,"line":1178},[1053,3407,1082],{"class":1081},[1053,3409,3410],{"class":1085},"Base exception for service errors",[1053,3412,1089],{"class":1081},[1053,3414,3415],{"class":1055,"line":1183},[1053,3416,1096],{"class":1095},[1053,3418,3419,3421,3425,3427,3429,3431,3434,3436,3439,3441,3444,3446,3449,3451,3453],{"class":1055,"line":1188},[1053,3420,1102],{"class":1066},[1053,3422,3424],{"class":3423},"sJdAF"," __init__",[1053,3426,1109],{"class":1074},[1053,3428,1113],{"class":1112},[1053,3430,1116],{"class":1074},[1053,3432,3433],{"class":1119}," message",[1053,3435,1116],{"class":1074},[1053,3437,3438],{"class":1119}," error_code",[1053,3440,1756],{"class":3099},[1053,3442,3443],{"class":2530},"None",[1053,3445,1116],{"class":1074},[1053,3447,3448],{"class":1119}," details",[1053,3450,1756],{"class":3099},[1053,3452,3443],{"class":2530},[1053,3454,1123],{"class":1074},[1053,3456,3457,3460,3462,3465,3467],{"class":1055,"line":1212},[1053,3458,3459],{"class":1407},"        self",[1053,3461,1762],{"class":1074},[1053,3463,3464],{"class":1765},"message",[1053,3466,1411],{"class":1074},[1053,3468,3469],{"class":1095}," message\n",[1053,3471,3472,3474,3476,3479,3481,3484,3487,3489,3492],{"class":1055,"line":1222},[1053,3473,3459],{"class":1407},[1053,3475,1762],{"class":1074},[1053,3477,3478],{"class":1765},"error_code",[1053,3480,1411],{"class":1074},[1053,3482,3483],{"class":1095}," error_code ",[1053,3485,3486],{"class":3099},"or",[1053,3488,1447],{"class":1419},[1053,3490,3491],{"class":1423},"SERVICE_ERROR",[1053,3493,2387],{"class":1419},[1053,3495,3496,3498,3500,3503,3505,3508,3510],{"class":1055,"line":1227},[1053,3497,3459],{"class":1407},[1053,3499,1762],{"class":1074},[1053,3501,3502],{"class":1765},"details",[1053,3504,1411],{"class":1074},[1053,3506,3507],{"class":1095}," details ",[1053,3509,3486],{"class":3099},[1053,3511,3512],{"class":1074}," {}\n",[1053,3514,3515,3518,3520,3523,3525,3527,3529,3531],{"class":1055,"line":1232},[1053,3516,3517],{"class":1969},"        super",[1053,3519,2440],{"class":1074},[1053,3521,3522],{"class":3423},"__init__",[1053,3524,1109],{"class":1074},[1053,3526,1113],{"class":1407},[1053,3528,1762],{"class":1074},[1053,3530,3464],{"class":1765},[1053,3532,1800],{"class":1074},[1053,3534,3535],{"class":1055,"line":1250},[1053,3536,1269],{"emptyLinePlaceholder":1268},[1053,3538,3539,3541,3544,3546,3549],{"class":1055,"line":1260},[1053,3540,1067],{"class":1066},[1053,3542,3543],{"class":1070}," ValidationException",[1053,3545,1109],{"class":1074},[1053,3547,3548],{"class":2128},"ServiceException",[1053,3550,1123],{"class":1074},[1053,3552,3553,3555,3558],{"class":1055,"line":1265},[1053,3554,1082],{"class":1081},[1053,3556,3557],{"class":1085},"Validation error exception",[1053,3559,1089],{"class":1081},[1053,3561,3562],{"class":1055,"line":1272},[1053,3563,1096],{"class":1095},[1053,3565,3566,3568,3570,3572,3574,3576,3578,3580,3583,3585,3587],{"class":1055,"line":1278},[1053,3567,1102],{"class":1066},[1053,3569,3424],{"class":3423},[1053,3571,1109],{"class":1074},[1053,3573,1113],{"class":1112},[1053,3575,1116],{"class":1074},[1053,3577,3433],{"class":1119},[1053,3579,1116],{"class":1074},[1053,3581,3582],{"class":1119}," field_errors",[1053,3584,1756],{"class":3099},[1053,3586,3443],{"class":2530},[1053,3588,1123],{"class":1074},[1053,3590,3591,3593,3595,3597,3599,3601,3603,3605,3608,3610,3612,3615,3617,3620,3622,3624,3627,3629],{"class":1055,"line":1288},[1053,3592,3517],{"class":1969},[1053,3594,2440],{"class":1074},[1053,3596,3522],{"class":3423},[1053,3598,1109],{"class":1074},[1053,3600,3464],{"class":1771},[1053,3602,1116],{"class":1074},[1053,3604,1447],{"class":1419},[1053,3606,3607],{"class":1423},"VALIDATION_ERROR",[1053,3609,1427],{"class":1419},[1053,3611,1116],{"class":1074},[1053,3613,3614],{"class":1074}," {",[1053,3616,1427],{"class":1419},[1053,3618,3619],{"class":1423},"field_errors",[1053,3621,1427],{"class":1419},[1053,3623,1430],{"class":1074},[1053,3625,3626],{"class":1771}," field_errors ",[1053,3628,3486],{"class":3099},[1053,3630,3631],{"class":1074}," {}})\n",[1053,3633,3634],{"class":1055,"line":1298},[1053,3635,1269],{"emptyLinePlaceholder":1268},[1053,3637,3638,3640,3643,3645,3647],{"class":1055,"line":1303},[1053,3639,1067],{"class":1066},[1053,3641,3642],{"class":1070}," BusinessLogicException",[1053,3644,1109],{"class":1074},[1053,3646,3548],{"class":2128},[1053,3648,1123],{"class":1074},[1053,3650,3651,3653,3656],{"class":1055,"line":1320},[1053,3652,1082],{"class":1081},[1053,3654,3655],{"class":1085},"Business logic error exception",[1053,3657,1089],{"class":1081},[1053,3659,3660],{"class":1055,"line":1325},[1053,3661,1096],{"class":1095},[1053,3663,3664,3666,3668,3670,3672,3674,3676,3678,3681,3683,3685],{"class":1055,"line":1330},[1053,3665,1102],{"class":1066},[1053,3667,3424],{"class":3423},[1053,3669,1109],{"class":1074},[1053,3671,1113],{"class":1112},[1053,3673,1116],{"class":1074},[1053,3675,3433],{"class":1119},[1053,3677,1116],{"class":1074},[1053,3679,3680],{"class":1119}," business_rule",[1053,3682,1756],{"class":3099},[1053,3684,3443],{"class":2530},[1053,3686,1123],{"class":1074},[1053,3688,3689,3691,3693,3695,3697,3699,3701,3703,3706,3708,3710,3712,3714,3717,3719,3721,3723],{"class":1055,"line":1349},[1053,3690,3517],{"class":1969},[1053,3692,2440],{"class":1074},[1053,3694,3522],{"class":3423},[1053,3696,1109],{"class":1074},[1053,3698,3464],{"class":1771},[1053,3700,1116],{"class":1074},[1053,3702,1447],{"class":1419},[1053,3704,3705],{"class":1423},"BUSINESS_LOGIC_ERROR",[1053,3707,1427],{"class":1419},[1053,3709,1116],{"class":1074},[1053,3711,3614],{"class":1074},[1053,3713,1427],{"class":1419},[1053,3715,3716],{"class":1423},"business_rule",[1053,3718,1427],{"class":1419},[1053,3720,1430],{"class":1074},[1053,3722,3680],{"class":1771},[1053,3724,3725],{"class":1074},"})\n",[1053,3727,3728],{"class":1055,"line":1354},[1053,3729,1269],{"emptyLinePlaceholder":1268},[1053,3731,3732,3734,3737,3739,3741],{"class":1055,"line":1359},[1053,3733,1067],{"class":1066},[1053,3735,3736],{"class":1070}," ExternalServiceException",[1053,3738,1109],{"class":1074},[1053,3740,3548],{"class":2128},[1053,3742,1123],{"class":1074},[1053,3744,3745,3747,3750],{"class":1055,"line":1378},[1053,3746,1082],{"class":1081},[1053,3748,3749],{"class":1085},"External service error exception",[1053,3751,1089],{"class":1081},[1053,3753,3754],{"class":1055,"line":1828},[1053,3755,1096],{"class":1095},[1053,3757,3758,3760,3762,3764,3766,3768,3770,3772,3775,3777,3780,3782,3784],{"class":1055,"line":1834},[1053,3759,1102],{"class":1066},[1053,3761,3424],{"class":3423},[1053,3763,1109],{"class":1074},[1053,3765,1113],{"class":1112},[1053,3767,1116],{"class":1074},[1053,3769,3433],{"class":1119},[1053,3771,1116],{"class":1074},[1053,3773,3774],{"class":1119}," service_name",[1053,3776,1116],{"class":1074},[1053,3778,3779],{"class":1119}," status_code",[1053,3781,1756],{"class":3099},[1053,3783,3443],{"class":2530},[1053,3785,1123],{"class":1074},[1053,3787,3788,3790,3792,3794],{"class":1055,"line":1847},[1053,3789,3517],{"class":1969},[1053,3791,2440],{"class":1074},[1053,3793,3522],{"class":3423},[1053,3795,2146],{"class":1074},[1053,3797,3798,3801,3803],{"class":1055,"line":1853},[1053,3799,3800],{"class":1771},"            message",[1053,3802,1116],{"class":1074},[1053,3804,3805],{"class":1771}," \n",[1053,3807,3808,3810,3813,3815,3817],{"class":1055,"line":1875},[1053,3809,3070],{"class":1419},[1053,3811,3812],{"class":1423},"EXTERNAL_SERVICE_ERROR",[1053,3814,1427],{"class":1419},[1053,3816,1116],{"class":1074},[1053,3818,3805],{"class":1771},[1053,3820,3821,3824,3826,3829,3831,3833,3835,3837,3839,3842,3844,3846,3848],{"class":1055,"line":1912},[1053,3822,3823],{"class":1074},"            {",[1053,3825,1427],{"class":1419},[1053,3827,3828],{"class":1423},"service_name",[1053,3830,1427],{"class":1419},[1053,3832,1430],{"class":1074},[1053,3834,3774],{"class":1771},[1053,3836,1116],{"class":1074},[1053,3838,1447],{"class":1419},[1053,3840,3841],{"class":1423},"status_code",[1053,3843,1427],{"class":1419},[1053,3845,1430],{"class":1074},[1053,3847,3779],{"class":1771},[1053,3849,1565],{"class":1074},[1053,3851,3852],{"class":1055,"line":1917},[1053,3853,3854],{"class":1074},"        )\n",[1053,3856,3857],{"class":1055,"line":1927},[1053,3858,1269],{"emptyLinePlaceholder":1268},[1053,3860,3861,3863,3866,3868,3871,3873,3876],{"class":1055,"line":1955},[1053,3862,1733],{"class":1066},[1053,3864,3865],{"class":1105}," custom_exception_handler",[1053,3867,1109],{"class":1074},[1053,3869,3870],{"class":1119},"exc",[1053,3872,1116],{"class":1074},[1053,3874,3875],{"class":1119}," context",[1053,3877,1123],{"class":1074},[1053,3879,3880,3882,3885],{"class":1055,"line":1963},[1053,3881,1082],{"class":1081},[1053,3883,3884],{"class":1085},"Custom exception handler for consistent error responses",[1053,3886,1089],{"class":1081},[1053,3888,3889],{"class":1055,"line":2370},[1053,3890,1096],{"class":1095},[1053,3892,3893],{"class":1055,"line":2390},[1053,3894,3895],{"class":1059},"    # Generate correlation ID for error tracking\n",[1053,3897,3898,3901,3903,3906,3908,3911,3913,3916],{"class":1055,"line":2396},[1053,3899,3900],{"class":1095},"    correlation_id ",[1053,3902,1756],{"class":1074},[1053,3904,3905],{"class":1969}," str",[1053,3907,1109],{"class":1074},[1053,3909,3910],{"class":1771},"uuid",[1053,3912,1762],{"class":1074},[1053,3914,3915],{"class":1771},"uuid4",[1053,3917,2600],{"class":1074},[1053,3919,3920],{"class":1055,"line":2401},[1053,3921,1096],{"class":1095},[1053,3923,3924],{"class":1055,"line":2407},[1053,3925,3926],{"class":1059},"    # Handle custom service exceptions\n",[1053,3928,3929,3931,3934,3936,3938,3940,3942],{"class":1055,"line":2413},[1053,3930,1920],{"class":1140},[1053,3932,3933],{"class":3423}," isinstance",[1053,3935,1109],{"class":1074},[1053,3937,3870],{"class":1771},[1053,3939,1116],{"class":1074},[1053,3941,3396],{"class":1771},[1053,3943,1123],{"class":1074},[1053,3945,3946,3949,3951],{"class":1055,"line":2432},[1053,3947,3948],{"class":1095},"        error_response ",[1053,3950,1756],{"class":1074},[1053,3952,1414],{"class":1074},[1053,3954,3955,3957,3960,3962,3964],{"class":1055,"line":3280},[1053,3956,3070],{"class":1419},[1053,3958,3959],{"class":1423},"error",[1053,3961,1427],{"class":1419},[1053,3963,1430],{"class":1074},[1053,3965,1414],{"class":1074},[1053,3967,3969,3971,3973,3975,3977,3980,3982,3984],{"class":1055,"line":3968},51,[1053,3970,2228],{"class":1419},[1053,3972,1050],{"class":1423},[1053,3974,1427],{"class":1419},[1053,3976,1430],{"class":1074},[1053,3978,3979],{"class":1095}," exc",[1053,3981,1762],{"class":1074},[1053,3983,3478],{"class":1765},[1053,3985,1455],{"class":1074},[1053,3987,3989,3991,3993,3995,3997,3999,4001,4003],{"class":1055,"line":3988},52,[1053,3990,2228],{"class":1419},[1053,3992,3464],{"class":1423},[1053,3994,1427],{"class":1419},[1053,3996,1430],{"class":1074},[1053,3998,3979],{"class":1095},[1053,4000,1762],{"class":1074},[1053,4002,3464],{"class":1765},[1053,4004,1455],{"class":1074},[1053,4006,4008,4010,4012,4014,4016,4018,4020,4022],{"class":1055,"line":4007},53,[1053,4009,2228],{"class":1419},[1053,4011,3502],{"class":1423},[1053,4013,1427],{"class":1419},[1053,4015,1430],{"class":1074},[1053,4017,3979],{"class":1095},[1053,4019,1762],{"class":1074},[1053,4021,3502],{"class":1765},[1053,4023,1455],{"class":1074},[1053,4025,4027,4029,4032,4034,4036,4039],{"class":1055,"line":4026},54,[1053,4028,2228],{"class":1419},[1053,4030,4031],{"class":1423},"correlation_id",[1053,4033,1427],{"class":1419},[1053,4035,1430],{"class":1074},[1053,4037,4038],{"class":1095}," correlation_id",[1053,4040,1455],{"class":1074},[1053,4042,4044,4046,4049,4051,4053,4056,4058,4061],{"class":1055,"line":4043},55,[1053,4045,2228],{"class":1419},[1053,4047,4048],{"class":1423},"service",[1053,4050,1427],{"class":1419},[1053,4052,1430],{"class":1074},[1053,4054,4055],{"class":1095}," settings",[1053,4057,1762],{"class":1074},[1053,4059,2899],{"class":4060},"sFGJz",[1053,4062,1455],{"class":1074},[1053,4064,4066,4068,4071,4073,4075,4078,4080,4083,4085,4088],{"class":1055,"line":4065},56,[1053,4067,2228],{"class":1419},[1053,4069,4070],{"class":1423},"timestamp",[1053,4072,1427],{"class":1419},[1053,4074,1430],{"class":1074},[1053,4076,4077],{"class":1095}," timezone",[1053,4079,1762],{"class":1074},[1053,4081,4082],{"class":1771},"now",[1053,4084,2440],{"class":1074},[1053,4086,4087],{"class":1771},"isoformat",[1053,4089,1821],{"class":1074},[1053,4091,4093],{"class":1055,"line":4092},57,[1053,4094,4095],{"class":1074},"            }\n",[1053,4097,4099],{"class":1055,"line":4098},58,[1053,4100,4101],{"class":1074},"        }\n",[1053,4103,4105],{"class":1055,"line":4104},59,[1053,4106,4107],{"class":1095},"        \n",[1053,4109,4111],{"class":1055,"line":4110},60,[1053,4112,4113],{"class":1059},"        # Log the error\n",[1053,4115,4117,4120,4122,4124,4126,4128,4131,4133,4135,4137,4140,4142,4144,4146,4148,4150,4152,4154,4157],{"class":1055,"line":4116},61,[1053,4118,4119],{"class":1095},"        logger",[1053,4121,1762],{"class":1074},[1053,4123,3959],{"class":1771},[1053,4125,1109],{"class":1074},[1053,4127,1892],{"class":1066},[1053,4129,4130],{"class":1423},"\"Service error [",[1053,4132,1899],{"class":1898},[1053,4134,4031],{"class":1771},[1053,4136,1904],{"class":1898},[1053,4138,4139],{"class":1423},"]: ",[1053,4141,1899],{"class":1898},[1053,4143,3870],{"class":1771},[1053,4145,1762],{"class":1074},[1053,4147,3464],{"class":1765},[1053,4149,1904],{"class":1898},[1053,4151,1975],{"class":1423},[1053,4153,1116],{"class":1074},[1053,4155,4156],{"class":1792}," extra",[1053,4158,2198],{"class":1074},[1053,4160,4162,4164,4166,4168,4170,4172,4174,4176],{"class":1055,"line":4161},62,[1053,4163,3070],{"class":1419},[1053,4165,3478],{"class":1423},[1053,4167,1427],{"class":1419},[1053,4169,1430],{"class":1074},[1053,4171,3979],{"class":1771},[1053,4173,1762],{"class":1074},[1053,4175,3478],{"class":1765},[1053,4177,1455],{"class":1074},[1053,4179,4181,4183,4185,4187,4189,4191,4193,4195],{"class":1055,"line":4180},63,[1053,4182,3070],{"class":1419},[1053,4184,3502],{"class":1423},[1053,4186,1427],{"class":1419},[1053,4188,1430],{"class":1074},[1053,4190,3979],{"class":1771},[1053,4192,1762],{"class":1074},[1053,4194,3502],{"class":1765},[1053,4196,1455],{"class":1074},[1053,4198,4200,4202,4204,4206,4208],{"class":1055,"line":4199},64,[1053,4201,3070],{"class":1419},[1053,4203,4031],{"class":1423},[1053,4205,1427],{"class":1419},[1053,4207,1430],{"class":1074},[1053,4209,4210],{"class":1771}," correlation_id\n",[1053,4212,4214],{"class":1055,"line":4213},65,[1053,4215,4216],{"class":1074},"        })\n",[1053,4218,4220],{"class":1055,"line":4219},66,[1053,4221,4107],{"class":1095},[1053,4223,4225],{"class":1055,"line":4224},67,[1053,4226,4227],{"class":1059},"        # Determine HTTP status code\n",[1053,4229,4231,4234,4236,4239,4241],{"class":1055,"line":4230},68,[1053,4232,4233],{"class":1095},"        status_code ",[1053,4235,1756],{"class":1074},[1053,4237,4238],{"class":1095}," status",[1053,4240,1762],{"class":1074},[1053,4242,4243],{"class":4060},"HTTP_400_BAD_REQUEST\n",[1053,4245,4247,4250,4252,4254,4256,4259,4261,4263,4265],{"class":1055,"line":4246},69,[1053,4248,4249],{"class":1140},"        if",[1053,4251,3979],{"class":1095},[1053,4253,1762],{"class":1074},[1053,4255,3478],{"class":1765},[1053,4257,4258],{"class":3099}," ==",[1053,4260,1447],{"class":1419},[1053,4262,3812],{"class":1423},[1053,4264,1427],{"class":1419},[1053,4266,1075],{"class":1074},[1053,4268,4270,4273,4275,4277,4279],{"class":1055,"line":4269},70,[1053,4271,4272],{"class":1095},"            status_code ",[1053,4274,1756],{"class":1074},[1053,4276,4238],{"class":1095},[1053,4278,1762],{"class":1074},[1053,4280,4281],{"class":4060},"HTTP_502_BAD_GATEWAY\n",[1053,4283,4285,4288,4290,4292,4294,4296,4298,4300,4302],{"class":1055,"line":4284},71,[1053,4286,4287],{"class":1140},"        elif",[1053,4289,3979],{"class":1095},[1053,4291,1762],{"class":1074},[1053,4293,3478],{"class":1765},[1053,4295,4258],{"class":3099},[1053,4297,1447],{"class":1419},[1053,4299,3705],{"class":1423},[1053,4301,1427],{"class":1419},[1053,4303,1075],{"class":1074},[1053,4305,4307,4309,4311,4313,4315],{"class":1055,"line":4306},72,[1053,4308,4272],{"class":1095},[1053,4310,1756],{"class":1074},[1053,4312,4238],{"class":1095},[1053,4314,1762],{"class":1074},[1053,4316,4317],{"class":4060},"HTTP_422_UNPROCESSABLE_ENTITY\n",[1053,4319,4321],{"class":1055,"line":4320},73,[1053,4322,4107],{"class":1095},[1053,4324,4326,4328,4331,4333,4336,4338,4340,4342,4344],{"class":1055,"line":4325},74,[1053,4327,1930],{"class":1140},[1053,4329,4330],{"class":1771}," Response",[1053,4332,1109],{"class":1074},[1053,4334,4335],{"class":1771},"error_response",[1053,4337,1116],{"class":1074},[1053,4339,4238],{"class":1792},[1053,4341,1756],{"class":1074},[1053,4343,3841],{"class":1771},[1053,4345,1800],{"class":1074},[1053,4347,4349],{"class":1055,"line":4348},75,[1053,4350,1096],{"class":1095},[1053,4352,4354],{"class":1055,"line":4353},76,[1053,4355,4356],{"class":1059},"    # Handle Django REST framework exceptions\n",[1053,4358,4360,4363,4365,4368,4370,4372,4374,4376],{"class":1055,"line":4359},77,[1053,4361,4362],{"class":1095},"    response ",[1053,4364,1756],{"class":1074},[1053,4366,4367],{"class":1771}," exception_handler",[1053,4369,1109],{"class":1074},[1053,4371,3870],{"class":1771},[1053,4373,1116],{"class":1074},[1053,4375,3875],{"class":1771},[1053,4377,1800],{"class":1074},[1053,4379,4381],{"class":1055,"line":4380},78,[1053,4382,1096],{"class":1095},[1053,4384,4386,4388,4391,4394,4397,4400],{"class":1055,"line":4385},79,[1053,4387,1920],{"class":1140},[1053,4389,4390],{"class":1095}," response ",[1053,4392,4393],{"class":3099},"is",[1053,4395,4396],{"class":3099}," not",[1053,4398,4399],{"class":2530}," None",[1053,4401,1075],{"class":1074},[1053,4403,4405],{"class":1055,"line":4404},80,[1053,4406,4407],{"class":1059},"        # Enhance DRF error responses\n",[1053,4409,4411,4414,4416],{"class":1055,"line":4410},81,[1053,4412,4413],{"class":1095},"        custom_response_data ",[1053,4415,1756],{"class":1074},[1053,4417,1414],{"class":1074},[1053,4419,4421,4423,4425,4427,4429],{"class":1055,"line":4420},82,[1053,4422,3070],{"class":1419},[1053,4424,3959],{"class":1423},[1053,4426,1427],{"class":1419},[1053,4428,1430],{"class":1074},[1053,4430,1414],{"class":1074},[1053,4432,4434,4436,4438,4440,4442,4444,4446,4448,4451,4454,4456,4458,4460,4463,4466,4468,4471,4473],{"class":1055,"line":4433},83,[1053,4435,2228],{"class":1419},[1053,4437,1050],{"class":1423},[1053,4439,1427],{"class":1419},[1053,4441,1430],{"class":1074},[1053,4443,1447],{"class":1419},[1053,4445,3607],{"class":1423},[1053,4447,1427],{"class":1419},[1053,4449,4450],{"class":1140}," if",[1053,4452,4453],{"class":1095}," response",[1053,4455,1762],{"class":1074},[1053,4457,3841],{"class":1765},[1053,4459,4258],{"class":3099},[1053,4461,4462],{"class":2203}," 400",[1053,4464,4465],{"class":1140}," else",[1053,4467,1447],{"class":1419},[1053,4469,4470],{"class":1423},"API_ERROR",[1053,4472,1427],{"class":1419},[1053,4474,1455],{"class":1074},[1053,4476,4478,4480,4482,4484,4486,4488,4491,4493,4495,4497,4499,4501,4503,4505,4507,4509,4512,4514],{"class":1055,"line":4477},84,[1053,4479,2228],{"class":1419},[1053,4481,3464],{"class":1423},[1053,4483,1427],{"class":1419},[1053,4485,1430],{"class":1074},[1053,4487,1447],{"class":1419},[1053,4489,4490],{"class":1423},"Request validation failed",[1053,4492,1427],{"class":1419},[1053,4494,4450],{"class":1140},[1053,4496,4453],{"class":1095},[1053,4498,1762],{"class":1074},[1053,4500,3841],{"class":1765},[1053,4502,4258],{"class":3099},[1053,4504,4462],{"class":2203},[1053,4506,4465],{"class":1140},[1053,4508,1447],{"class":1419},[1053,4510,4511],{"class":1423},"API error occurred",[1053,4513,1427],{"class":1419},[1053,4515,1455],{"class":1074},[1053,4517,4519,4521,4523,4525,4527,4529,4531,4534],{"class":1055,"line":4518},85,[1053,4520,2228],{"class":1419},[1053,4522,3502],{"class":1423},[1053,4524,1427],{"class":1419},[1053,4526,1430],{"class":1074},[1053,4528,4453],{"class":1095},[1053,4530,1762],{"class":1074},[1053,4532,4533],{"class":1765},"data",[1053,4535,1455],{"class":1074},[1053,4537,4539,4541,4543,4545,4547,4549],{"class":1055,"line":4538},86,[1053,4540,2228],{"class":1419},[1053,4542,4031],{"class":1423},[1053,4544,1427],{"class":1419},[1053,4546,1430],{"class":1074},[1053,4548,4038],{"class":1095},[1053,4550,1455],{"class":1074},[1053,4552,4554,4556,4558,4560,4562,4564,4566,4568],{"class":1055,"line":4553},87,[1053,4555,2228],{"class":1419},[1053,4557,4048],{"class":1423},[1053,4559,1427],{"class":1419},[1053,4561,1430],{"class":1074},[1053,4563,4055],{"class":1095},[1053,4565,1762],{"class":1074},[1053,4567,2899],{"class":4060},[1053,4569,1455],{"class":1074},[1053,4571,4573,4575,4577,4579,4581,4583,4585,4587,4589,4591],{"class":1055,"line":4572},88,[1053,4574,2228],{"class":1419},[1053,4576,4070],{"class":1423},[1053,4578,1427],{"class":1419},[1053,4580,1430],{"class":1074},[1053,4582,4077],{"class":1095},[1053,4584,1762],{"class":1074},[1053,4586,4082],{"class":1771},[1053,4588,2440],{"class":1074},[1053,4590,4087],{"class":1771},[1053,4592,1821],{"class":1074},[1053,4594,4596],{"class":1055,"line":4595},89,[1053,4597,4095],{"class":1074},[1053,4599,4601],{"class":1055,"line":4600},90,[1053,4602,4101],{"class":1074},[1053,4604,4606],{"class":1055,"line":4605},91,[1053,4607,4107],{"class":1095},[1053,4609,4611],{"class":1055,"line":4610},92,[1053,4612,4113],{"class":1059},[1053,4614,4616,4618,4620,4623,4625,4627,4630,4632,4634,4636,4638,4640,4643,4645,4647,4649,4651,4653,4655],{"class":1055,"line":4615},93,[1053,4617,4119],{"class":1095},[1053,4619,1762],{"class":1074},[1053,4621,4622],{"class":1771},"warning",[1053,4624,1109],{"class":1074},[1053,4626,1892],{"class":1066},[1053,4628,4629],{"class":1423},"\"API error [",[1053,4631,1899],{"class":1898},[1053,4633,4031],{"class":1771},[1053,4635,1904],{"class":1898},[1053,4637,4139],{"class":1423},[1053,4639,1899],{"class":1898},[1053,4641,4642],{"class":1771},"response",[1053,4644,1762],{"class":1074},[1053,4646,3841],{"class":1765},[1053,4648,1904],{"class":1898},[1053,4650,1975],{"class":1423},[1053,4652,1116],{"class":1074},[1053,4654,4156],{"class":1792},[1053,4656,2198],{"class":1074},[1053,4658,4660,4662,4664,4666,4668,4670,4672,4674],{"class":1055,"line":4659},94,[1053,4661,3070],{"class":1419},[1053,4663,3841],{"class":1423},[1053,4665,1427],{"class":1419},[1053,4667,1430],{"class":1074},[1053,4669,4453],{"class":1771},[1053,4671,1762],{"class":1074},[1053,4673,3841],{"class":1765},[1053,4675,1455],{"class":1074},[1053,4677,4679,4681,4683,4685,4687,4689,4691,4693],{"class":1055,"line":4678},95,[1053,4680,3070],{"class":1419},[1053,4682,3502],{"class":1423},[1053,4684,1427],{"class":1419},[1053,4686,1430],{"class":1074},[1053,4688,4453],{"class":1771},[1053,4690,1762],{"class":1074},[1053,4692,4533],{"class":1765},[1053,4694,1455],{"class":1074},[1053,4696,4698,4700,4702,4704,4706],{"class":1055,"line":4697},96,[1053,4699,3070],{"class":1419},[1053,4701,4031],{"class":1423},[1053,4703,1427],{"class":1419},[1053,4705,1430],{"class":1074},[1053,4707,4210],{"class":1771},[1053,4709,4711],{"class":1055,"line":4710},97,[1053,4712,4216],{"class":1074},[1053,4714,4716],{"class":1055,"line":4715},98,[1053,4717,4107],{"class":1095},[1053,4719,4721,4724,4726,4728,4730],{"class":1055,"line":4720},99,[1053,4722,4723],{"class":1095},"        response",[1053,4725,1762],{"class":1074},[1053,4727,4533],{"class":1765},[1053,4729,1411],{"class":1074},[1053,4731,4732],{"class":1095}," custom_response_data\n",[1053,4734,4736],{"class":1055,"line":4735},100,[1053,4737,1096],{"class":1095},[1053,4739,4741,4743],{"class":1055,"line":4740},101,[1053,4742,1805],{"class":1140},[1053,4744,4745],{"class":1095}," response\n",[1053,4747,4749],{"class":1055,"line":4748},102,[1053,4750,1269],{"emptyLinePlaceholder":1268},[1053,4752,4754],{"class":1055,"line":4753},103,[1053,4755,4756],{"class":1059},"# Usage in views\n",[1053,4758,4760,4762,4764,4766,4768],{"class":1055,"line":4759},104,[1053,4761,1067],{"class":1066},[1053,4763,2123],{"class":1070},[1053,4765,1109],{"class":1074},[1053,4767,2129],{"class":2128},[1053,4769,1123],{"class":1074},[1053,4771,4773],{"class":1055,"line":4772},105,[1053,4774,1096],{"class":1095},[1053,4776,4778,4780,4782,4784,4786,4788,4790],{"class":1055,"line":4777},106,[1053,4779,1102],{"class":1066},[1053,4781,2418],{"class":1105},[1053,4783,1109],{"class":1074},[1053,4785,1113],{"class":1112},[1053,4787,1116],{"class":1074},[1053,4789,2427],{"class":1119},[1053,4791,1123],{"class":1074},[1053,4793,4795,4797,4800],{"class":1055,"line":4794},107,[1053,4796,1129],{"class":1081},[1053,4798,4799],{"class":1085},"Create user with proper error handling",[1053,4801,1089],{"class":1081},[1053,4803,4805,4808],{"class":1055,"line":4804},108,[1053,4806,4807],{"class":1140},"        try",[1053,4809,1075],{"class":1074},[1053,4811,4813],{"class":1055,"line":4812},109,[1053,4814,4815],{"class":1059},"            # Validate business rules\n",[1053,4817,4819,4822,4824,4826,4828,4830,4832,4834,4836,4838,4840,4842,4844,4846,4848,4850,4852,4854,4856,4859,4862],{"class":1055,"line":4818},110,[1053,4820,4821],{"class":1140},"            if",[1053,4823,1759],{"class":1095},[1053,4825,1762],{"class":1074},[1053,4827,1766],{"class":1765},[1053,4829,1762],{"class":1074},[1053,4831,1942],{"class":1771},[1053,4833,1109],{"class":1074},[1053,4835,2248],{"class":1792},[1053,4837,1756],{"class":1074},[1053,4839,2448],{"class":1771},[1053,4841,1762],{"class":1074},[1053,4843,4533],{"class":1765},[1053,4845,1762],{"class":1074},[1053,4847,1787],{"class":1771},[1053,4849,1109],{"class":1074},[1053,4851,1427],{"class":1419},[1053,4853,2248],{"class":1423},[1053,4855,1427],{"class":1419},[1053,4857,4858],{"class":1074},")).",[1053,4860,4861],{"class":1771},"exists",[1053,4863,4864],{"class":1074},"():\n",[1053,4866,4868,4871,4873],{"class":1055,"line":4867},111,[1053,4869,4870],{"class":1140},"                raise",[1053,4872,3642],{"class":1771},[1053,4874,2146],{"class":1074},[1053,4876,4878,4881,4884,4886],{"class":1055,"line":4877},112,[1053,4879,4880],{"class":1419},"                    \"",[1053,4882,4883],{"class":1423},"User with this email already exists",[1053,4885,1975],{"class":1419},[1053,4887,1455],{"class":1074},[1053,4889,4891,4894,4896,4898,4901],{"class":1055,"line":4890},113,[1053,4892,4893],{"class":1792},"                    business_rule",[1053,4895,1756],{"class":1074},[1053,4897,1975],{"class":1419},[1053,4899,4900],{"class":1423},"unique_email",[1053,4902,4903],{"class":1419},"\"\n",[1053,4905,4907],{"class":1055,"line":4906},114,[1053,4908,4909],{"class":1074},"                )\n",[1053,4911,4913],{"class":1055,"line":4912},115,[1053,4914,4915],{"class":1095},"            \n",[1053,4917,4919],{"class":1055,"line":4918},116,[1053,4920,4921],{"class":1059},"            # Validate with external service\n",[1053,4923,4925,4928,4930,4933,4935,4938,4940,4942,4944,4946],{"class":1055,"line":4924},117,[1053,4926,4927],{"class":1095},"            validation_result ",[1053,4929,1756],{"class":1074},[1053,4931,4932],{"class":1407}," self",[1053,4934,1762],{"class":1074},[1053,4936,4937],{"class":1771},"validate_with_external_service",[1053,4939,1109],{"class":1074},[1053,4941,2448],{"class":1771},[1053,4943,1762],{"class":1074},[1053,4945,4533],{"class":1765},[1053,4947,1800],{"class":1074},[1053,4949,4951,4953,4955,4958,4961,4963,4966,4968],{"class":1055,"line":4950},118,[1053,4952,4821],{"class":1140},[1053,4954,4396],{"class":3099},[1053,4956,4957],{"class":1095}," validation_result",[1053,4959,4960],{"class":1074},"[",[1053,4962,1427],{"class":1419},[1053,4964,4965],{"class":1423},"valid",[1053,4967,1427],{"class":1419},[1053,4969,4970],{"class":1074},"]:\n",[1053,4972,4974,4976,4978],{"class":1055,"line":4973},119,[1053,4975,4870],{"class":1140},[1053,4977,3736],{"class":1771},[1053,4979,2146],{"class":1074},[1053,4981,4983,4985,4988,4990],{"class":1055,"line":4982},120,[1053,4984,4880],{"class":1419},[1053,4986,4987],{"class":1423},"External validation failed",[1053,4989,1975],{"class":1419},[1053,4991,1455],{"class":1074},[1053,4993,4995,4998,5000,5002,5005,5007],{"class":1055,"line":4994},121,[1053,4996,4997],{"class":1792},"                    service_name",[1053,4999,1756],{"class":1074},[1053,5001,1975],{"class":1419},[1053,5003,5004],{"class":1423},"validation-service",[1053,5006,1975],{"class":1419},[1053,5008,1455],{"class":1074},[1053,5010,5012,5015,5017,5020,5022,5024,5026,5028,5030,5032],{"class":1055,"line":5011},122,[1053,5013,5014],{"class":1792},"                    status_code",[1053,5016,1756],{"class":1074},[1053,5018,5019],{"class":1771},"validation_result",[1053,5021,1762],{"class":1074},[1053,5023,1787],{"class":1771},[1053,5025,1109],{"class":1074},[1053,5027,1427],{"class":1419},[1053,5029,3841],{"class":1423},[1053,5031,1427],{"class":1419},[1053,5033,1800],{"class":1074},[1053,5035,5037],{"class":1055,"line":5036},123,[1053,5038,4909],{"class":1074},[1053,5040,5042],{"class":1055,"line":5041},124,[1053,5043,4915],{"class":1095},[1053,5045,5047,5050,5052,5054,5056,5058,5060],{"class":1055,"line":5046},125,[1053,5048,5049],{"class":1140},"            return",[1053,5051,2437],{"class":1969},[1053,5053,2440],{"class":1074},[1053,5055,2443],{"class":1771},[1053,5057,1109],{"class":1074},[1053,5059,2448],{"class":1771},[1053,5061,1800],{"class":1074},[1053,5063,5065],{"class":1055,"line":5064},126,[1053,5066,4915],{"class":1095},[1053,5068,5070,5073,5075],{"class":1055,"line":5069},127,[1053,5071,5072],{"class":1140},"        except",[1053,5074,3396],{"class":1095},[1053,5076,1075],{"class":1074},[1053,5078,5080,5083],{"class":1055,"line":5079},128,[1053,5081,5082],{"class":1140},"            raise",[1053,5084,5085],{"class":1059},"  # Re-raise service exceptions\n",[1053,5087,5089,5091,5094,5097,5100],{"class":1055,"line":5088},129,[1053,5090,5072],{"class":1140},[1053,5092,5093],{"class":1969}," Exception",[1053,5095,5096],{"class":1140}," as",[1053,5098,5099],{"class":1095}," e",[1053,5101,1075],{"class":1074},[1053,5103,5105],{"class":1055,"line":5104},130,[1053,5106,5107],{"class":1059},"            # Log unexpected errors\n",[1053,5109,5111,5114,5116,5119,5121,5123,5126,5128],{"class":1055,"line":5110},131,[1053,5112,5113],{"class":1095},"            logger",[1053,5115,1762],{"class":1074},[1053,5117,5118],{"class":1771},"exception",[1053,5120,1109],{"class":1074},[1053,5122,1975],{"class":1419},[1053,5124,5125],{"class":1423},"Unexpected error in user creation",[1053,5127,1975],{"class":1419},[1053,5129,1800],{"class":1074},[1053,5131,5133,5135,5137],{"class":1055,"line":5132},132,[1053,5134,5082],{"class":1140},[1053,5136,3396],{"class":1771},[1053,5138,2146],{"class":1074},[1053,5140,5142,5145,5148,5150],{"class":1055,"line":5141},133,[1053,5143,5144],{"class":1419},"                \"",[1053,5146,5147],{"class":1423},"An unexpected error occurred",[1053,5149,1975],{"class":1419},[1053,5151,1455],{"class":1074},[1053,5153,5155,5158,5160,5162,5165],{"class":1055,"line":5154},134,[1053,5156,5157],{"class":1792},"                error_code",[1053,5159,1756],{"class":1074},[1053,5161,1975],{"class":1419},[1053,5163,5164],{"class":1423},"INTERNAL_ERROR",[1053,5166,4903],{"class":1419},[1053,5168,5170],{"class":1055,"line":5169},135,[1053,5171,2270],{"class":1074},[1035,5173,5175],{"id":5174},"_3-logging-and-observability","3. Logging and Observability",[1026,5177,5178],{},"Implement structured logging:",[1043,5180,5182],{"className":1045,"code":5181,"language":1047,"meta":1048,"style":1048},"# logging_utils.py\nimport logging\nimport json\nimport time\nfrom django.utils.deprecation import MiddlewareMixin\nfrom django.conf import settings\n\nclass StructuredLogger:\n    \"\"\"Structured logging utility\"\"\"\n    \n    def __init__(self, name):\n        self.logger = logging.getLogger(name)\n    \n    def log(self, level, message, **kwargs):\n        \"\"\"Log structured message\"\"\"\n        log_data = {\n            'timestamp': time.time(),\n            'service': settings.SERVICE_NAME,\n            'version': settings.SERVICE_VERSION,\n            'environment': settings.SERVICE_ENVIRONMENT,\n            'message': message,\n            **kwargs\n        }\n        \n        self.logger.log(level, json.dumps(log_data))\n    \n    def info(self, message, **kwargs):\n        self.log(logging.INFO, message, **kwargs)\n    \n    def warning(self, message, **kwargs):\n        self.log(logging.WARNING, message, **kwargs)\n    \n    def error(self, message, **kwargs):\n        self.log(logging.ERROR, message, **kwargs)\n    \n    def debug(self, message, **kwargs):\n        self.log(logging.DEBUG, message, **kwargs)\n\nclass RequestLoggingMiddleware(MiddlewareMixin):\n    \"\"\"Log all requests with structured data\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n        self.logger = StructuredLogger('requests')\n    \n    def __call__(self, request):\n        start_time = time.time()\n        \n        # Log request\n        self.logger.info(\"Request started\", \n            method=request.method,\n            path=request.path,\n            user_agent=request.META.get('HTTP_USER_AGENT'),\n            ip_address=self.get_client_ip(request),\n            correlation_id=getattr(request, 'correlation_id', None)\n        )\n        \n        response = self.get_response(request)\n        \n        # Log response\n        duration = time.time() - start_time\n        self.logger.info(\"Request completed\",\n            method=request.method,\n            path=request.path,\n            status_code=response.status_code,\n            duration_ms=duration * 1000,\n            correlation_id=getattr(request, 'correlation_id', None)\n        )\n        \n        return response\n    \n    def get_client_ip(self, request):\n        \"\"\"Get client IP address\"\"\"\n        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')\n        if x_forwarded_for:\n            ip = x_forwarded_for.split(',')[0]\n        else:\n            ip = request.META.get('REMOTE_ADDR')\n        return ip\n\n# Business logic logging\nclass UserService:\n    \"\"\"User service with structured logging\"\"\"\n    \n    def __init__(self):\n        self.logger = StructuredLogger('user_service')\n    \n    def create_user(self, user_data):\n        \"\"\"Create user with logging\"\"\"\n        self.logger.info(\"Creating user\", \n            username=user_data.get('username'),\n            email=user_data.get('email')\n        )\n        \n        try:\n            user = User.objects.create_user(**user_data)\n            \n            self.logger.info(\"User created successfully\",\n                user_id=user.id,\n                username=user.username\n            )\n            \n            return user\n            \n        except Exception as e:\n            self.logger.error(\"User creation failed\",\n                error=str(e),\n                username=user_data.get('username'),\n                email=user_data.get('email')\n            )\n            raise\n",[1050,5183,5184,5189,5195,5202,5209,5231,5247,5251,5260,5269,5273,5290,5314,5318,5348,5357,5366,5387,5405,5423,5442,5456,5464,5468,5472,5507,5511,5534,5563,5567,5590,5619,5623,5646,5675,5679,5702,5730,5734,5748,5757,5761,5778,5792,5815,5819,5836,5851,5855,5860,5886,5902,5918,5947,5967,5995,5999,6003,6022,6026,6031,6053,6076,6090,6104,6119,6137,6163,6167,6171,6177,6181,6198,6207,6235,6244,6275,6282,6309,6316,6320,6325,6333,6342,6346,6358,6381,6385,6401,6410,6435,6459,6482,6486,6490,6496,6523,6527,6551,6567,6581,6585,6589,6596,6600,6612,6635,6652,6674,6697,6701],{"__ignoreMap":1048},[1053,5185,5186],{"class":1055,"line":1056},[1053,5187,5188],{"class":1059},"# logging_utils.py\n",[1053,5190,5191,5193],{"class":1055,"line":1063},[1053,5192,2104],{"class":1140},[1053,5194,3351],{"class":1095},[1053,5196,5197,5199],{"class":1055,"line":1078},[1053,5198,2104],{"class":1140},[1053,5200,5201],{"class":1095}," json\n",[1053,5203,5204,5206],{"class":1055,"line":1092},[1053,5205,2104],{"class":1140},[1053,5207,5208],{"class":1095}," time\n",[1053,5210,5211,5213,5216,5218,5221,5223,5226,5228],{"class":1055,"line":1099},[1053,5212,2093],{"class":1140},[1053,5214,5215],{"class":1095}," django",[1053,5217,1762],{"class":1074},[1053,5219,5220],{"class":1095},"utils",[1053,5222,1762],{"class":1074},[1053,5224,5225],{"class":1095},"deprecation ",[1053,5227,2104],{"class":1140},[1053,5229,5230],{"class":1095}," MiddlewareMixin\n",[1053,5232,5233,5235,5237,5239,5242,5244],{"class":1055,"line":1126},[1053,5234,2093],{"class":1140},[1053,5236,5215],{"class":1095},[1053,5238,1762],{"class":1074},[1053,5240,5241],{"class":1095},"conf ",[1053,5243,2104],{"class":1140},[1053,5245,5246],{"class":1095}," settings\n",[1053,5248,5249],{"class":1055,"line":1137},[1053,5250,1269],{"emptyLinePlaceholder":1268},[1053,5252,5253,5255,5258],{"class":1055,"line":1144},[1053,5254,1067],{"class":1066},[1053,5256,5257],{"class":1070}," StructuredLogger",[1053,5259,1075],{"class":1074},[1053,5261,5262,5264,5267],{"class":1055,"line":1149},[1053,5263,1082],{"class":1081},[1053,5265,5266],{"class":1085},"Structured logging utility",[1053,5268,1089],{"class":1081},[1053,5270,5271],{"class":1055,"line":1168},[1053,5272,1096],{"class":1095},[1053,5274,5275,5277,5279,5281,5283,5285,5288],{"class":1055,"line":1178},[1053,5276,1102],{"class":1066},[1053,5278,3424],{"class":3423},[1053,5280,1109],{"class":1074},[1053,5282,1113],{"class":1112},[1053,5284,1116],{"class":1074},[1053,5286,5287],{"class":1119}," name",[1053,5289,1123],{"class":1074},[1053,5291,5292,5294,5296,5299,5301,5303,5305,5307,5309,5312],{"class":1055,"line":1183},[1053,5293,3459],{"class":1407},[1053,5295,1762],{"class":1074},[1053,5297,5298],{"class":1765},"logger",[1053,5300,1411],{"class":1074},[1053,5302,3372],{"class":1095},[1053,5304,1762],{"class":1074},[1053,5306,3377],{"class":1771},[1053,5308,1109],{"class":1074},[1053,5310,5311],{"class":1771},"name",[1053,5313,1800],{"class":1074},[1053,5315,5316],{"class":1055,"line":1188},[1053,5317,1096],{"class":1095},[1053,5319,5320,5322,5325,5327,5329,5331,5334,5336,5338,5340,5343,5346],{"class":1055,"line":1212},[1053,5321,1102],{"class":1066},[1053,5323,5324],{"class":1105}," log",[1053,5326,1109],{"class":1074},[1053,5328,1113],{"class":1112},[1053,5330,1116],{"class":1074},[1053,5332,5333],{"class":1119}," level",[1053,5335,1116],{"class":1074},[1053,5337,3433],{"class":1119},[1053,5339,1116],{"class":1074},[1053,5341,5342],{"class":3099}," **",[1053,5344,5345],{"class":1119},"kwargs",[1053,5347,1123],{"class":1074},[1053,5349,5350,5352,5355],{"class":1055,"line":1222},[1053,5351,1129],{"class":1081},[1053,5353,5354],{"class":1085},"Log structured message",[1053,5356,1089],{"class":1081},[1053,5358,5359,5362,5364],{"class":1055,"line":1227},[1053,5360,5361],{"class":1095},"        log_data ",[1053,5363,1756],{"class":1074},[1053,5365,1414],{"class":1074},[1053,5367,5368,5370,5372,5374,5376,5379,5381,5384],{"class":1055,"line":1232},[1053,5369,3070],{"class":1419},[1053,5371,4070],{"class":1423},[1053,5373,1427],{"class":1419},[1053,5375,1430],{"class":1074},[1053,5377,5378],{"class":1095}," time",[1053,5380,1762],{"class":1074},[1053,5382,5383],{"class":1771},"time",[1053,5385,5386],{"class":1074},"(),\n",[1053,5388,5389,5391,5393,5395,5397,5399,5401,5403],{"class":1055,"line":1250},[1053,5390,3070],{"class":1419},[1053,5392,4048],{"class":1423},[1053,5394,1427],{"class":1419},[1053,5396,1430],{"class":1074},[1053,5398,4055],{"class":1095},[1053,5400,1762],{"class":1074},[1053,5402,2899],{"class":4060},[1053,5404,1455],{"class":1074},[1053,5406,5407,5409,5411,5413,5415,5417,5419,5421],{"class":1055,"line":1260},[1053,5408,3070],{"class":1419},[1053,5410,3014],{"class":1423},[1053,5412,1427],{"class":1419},[1053,5414,1430],{"class":1074},[1053,5416,4055],{"class":1095},[1053,5418,1762],{"class":1074},[1053,5420,2930],{"class":4060},[1053,5422,1455],{"class":1074},[1053,5424,5425,5427,5430,5432,5434,5436,5438,5440],{"class":1055,"line":1265},[1053,5426,3070],{"class":1419},[1053,5428,5429],{"class":1423},"environment",[1053,5431,1427],{"class":1419},[1053,5433,1430],{"class":1074},[1053,5435,4055],{"class":1095},[1053,5437,1762],{"class":1074},[1053,5439,2962],{"class":4060},[1053,5441,1455],{"class":1074},[1053,5443,5444,5446,5448,5450,5452,5454],{"class":1055,"line":1272},[1053,5445,3070],{"class":1419},[1053,5447,3464],{"class":1423},[1053,5449,1427],{"class":1419},[1053,5451,1430],{"class":1074},[1053,5453,3433],{"class":1095},[1053,5455,1455],{"class":1074},[1053,5457,5458,5461],{"class":1055,"line":1278},[1053,5459,5460],{"class":3099},"            **",[1053,5462,5463],{"class":1095},"kwargs\n",[1053,5465,5466],{"class":1055,"line":1288},[1053,5467,4101],{"class":1074},[1053,5469,5470],{"class":1055,"line":1298},[1053,5471,4107],{"class":1095},[1053,5473,5474,5476,5478,5480,5482,5485,5487,5489,5491,5494,5496,5499,5501,5504],{"class":1055,"line":1303},[1053,5475,3459],{"class":1407},[1053,5477,1762],{"class":1074},[1053,5479,5298],{"class":1765},[1053,5481,1762],{"class":1074},[1053,5483,5484],{"class":1771},"log",[1053,5486,1109],{"class":1074},[1053,5488,3242],{"class":1771},[1053,5490,1116],{"class":1074},[1053,5492,5493],{"class":1771}," json",[1053,5495,1762],{"class":1074},[1053,5497,5498],{"class":1771},"dumps",[1053,5500,1109],{"class":1074},[1053,5502,5503],{"class":1771},"log_data",[1053,5505,5506],{"class":1074},"))\n",[1053,5508,5509],{"class":1055,"line":1320},[1053,5510,1096],{"class":1095},[1053,5512,5513,5515,5518,5520,5522,5524,5526,5528,5530,5532],{"class":1055,"line":1325},[1053,5514,1102],{"class":1066},[1053,5516,5517],{"class":1105}," info",[1053,5519,1109],{"class":1074},[1053,5521,1113],{"class":1112},[1053,5523,1116],{"class":1074},[1053,5525,3433],{"class":1119},[1053,5527,1116],{"class":1074},[1053,5529,5342],{"class":3099},[1053,5531,5345],{"class":1119},[1053,5533,1123],{"class":1074},[1053,5535,5536,5538,5540,5542,5544,5547,5549,5551,5553,5555,5557,5559,5561],{"class":1055,"line":1330},[1053,5537,3459],{"class":1407},[1053,5539,1762],{"class":1074},[1053,5541,5484],{"class":1771},[1053,5543,1109],{"class":1074},[1053,5545,5546],{"class":1771},"logging",[1053,5548,1762],{"class":1074},[1053,5550,3268],{"class":4060},[1053,5552,1116],{"class":1074},[1053,5554,3433],{"class":1771},[1053,5556,1116],{"class":1074},[1053,5558,5342],{"class":3099},[1053,5560,5345],{"class":1771},[1053,5562,1800],{"class":1074},[1053,5564,5565],{"class":1055,"line":1349},[1053,5566,1096],{"class":1095},[1053,5568,5569,5571,5574,5576,5578,5580,5582,5584,5586,5588],{"class":1055,"line":1354},[1053,5570,1102],{"class":1066},[1053,5572,5573],{"class":1105}," warning",[1053,5575,1109],{"class":1074},[1053,5577,1113],{"class":1112},[1053,5579,1116],{"class":1074},[1053,5581,3433],{"class":1119},[1053,5583,1116],{"class":1074},[1053,5585,5342],{"class":3099},[1053,5587,5345],{"class":1119},[1053,5589,1123],{"class":1074},[1053,5591,5592,5594,5596,5598,5600,5602,5604,5607,5609,5611,5613,5615,5617],{"class":1055,"line":1359},[1053,5593,3459],{"class":1407},[1053,5595,1762],{"class":1074},[1053,5597,5484],{"class":1771},[1053,5599,1109],{"class":1074},[1053,5601,5546],{"class":1771},[1053,5603,1762],{"class":1074},[1053,5605,5606],{"class":4060},"WARNING",[1053,5608,1116],{"class":1074},[1053,5610,3433],{"class":1771},[1053,5612,1116],{"class":1074},[1053,5614,5342],{"class":3099},[1053,5616,5345],{"class":1771},[1053,5618,1800],{"class":1074},[1053,5620,5621],{"class":1055,"line":1378},[1053,5622,1096],{"class":1095},[1053,5624,5625,5627,5630,5632,5634,5636,5638,5640,5642,5644],{"class":1055,"line":1828},[1053,5626,1102],{"class":1066},[1053,5628,5629],{"class":1105}," error",[1053,5631,1109],{"class":1074},[1053,5633,1113],{"class":1112},[1053,5635,1116],{"class":1074},[1053,5637,3433],{"class":1119},[1053,5639,1116],{"class":1074},[1053,5641,5342],{"class":3099},[1053,5643,5345],{"class":1119},[1053,5645,1123],{"class":1074},[1053,5647,5648,5650,5652,5654,5656,5658,5660,5663,5665,5667,5669,5671,5673],{"class":1055,"line":1834},[1053,5649,3459],{"class":1407},[1053,5651,1762],{"class":1074},[1053,5653,5484],{"class":1771},[1053,5655,1109],{"class":1074},[1053,5657,5546],{"class":1771},[1053,5659,1762],{"class":1074},[1053,5661,5662],{"class":4060},"ERROR",[1053,5664,1116],{"class":1074},[1053,5666,3433],{"class":1771},[1053,5668,1116],{"class":1074},[1053,5670,5342],{"class":3099},[1053,5672,5345],{"class":1771},[1053,5674,1800],{"class":1074},[1053,5676,5677],{"class":1055,"line":1847},[1053,5678,1096],{"class":1095},[1053,5680,5681,5683,5686,5688,5690,5692,5694,5696,5698,5700],{"class":1055,"line":1853},[1053,5682,1102],{"class":1066},[1053,5684,5685],{"class":1105}," debug",[1053,5687,1109],{"class":1074},[1053,5689,1113],{"class":1112},[1053,5691,1116],{"class":1074},[1053,5693,3433],{"class":1119},[1053,5695,1116],{"class":1074},[1053,5697,5342],{"class":3099},[1053,5699,5345],{"class":1119},[1053,5701,1123],{"class":1074},[1053,5703,5704,5706,5708,5710,5712,5714,5716,5718,5720,5722,5724,5726,5728],{"class":1055,"line":1875},[1053,5705,3459],{"class":1407},[1053,5707,1762],{"class":1074},[1053,5709,5484],{"class":1771},[1053,5711,1109],{"class":1074},[1053,5713,5546],{"class":1771},[1053,5715,1762],{"class":1074},[1053,5717,2508],{"class":4060},[1053,5719,1116],{"class":1074},[1053,5721,3433],{"class":1771},[1053,5723,1116],{"class":1074},[1053,5725,5342],{"class":3099},[1053,5727,5345],{"class":1771},[1053,5729,1800],{"class":1074},[1053,5731,5732],{"class":1055,"line":1912},[1053,5733,1269],{"emptyLinePlaceholder":1268},[1053,5735,5736,5738,5741,5743,5746],{"class":1055,"line":1917},[1053,5737,1067],{"class":1066},[1053,5739,5740],{"class":1070}," RequestLoggingMiddleware",[1053,5742,1109],{"class":1074},[1053,5744,5745],{"class":2128},"MiddlewareMixin",[1053,5747,1123],{"class":1074},[1053,5749,5750,5752,5755],{"class":1055,"line":1927},[1053,5751,1082],{"class":1081},[1053,5753,5754],{"class":1085},"Log all requests with structured data",[1053,5756,1089],{"class":1081},[1053,5758,5759],{"class":1055,"line":1955},[1053,5760,1096],{"class":1095},[1053,5762,5763,5765,5767,5769,5771,5773,5776],{"class":1055,"line":1963},[1053,5764,1102],{"class":1066},[1053,5766,3424],{"class":3423},[1053,5768,1109],{"class":1074},[1053,5770,1113],{"class":1112},[1053,5772,1116],{"class":1074},[1053,5774,5775],{"class":1119}," get_response",[1053,5777,1123],{"class":1074},[1053,5779,5780,5782,5784,5787,5789],{"class":1055,"line":2370},[1053,5781,3459],{"class":1407},[1053,5783,1762],{"class":1074},[1053,5785,5786],{"class":1765},"get_response",[1053,5788,1411],{"class":1074},[1053,5790,5791],{"class":1095}," get_response\n",[1053,5793,5794,5796,5798,5800,5802,5804,5806,5808,5811,5813],{"class":1055,"line":2390},[1053,5795,3459],{"class":1407},[1053,5797,1762],{"class":1074},[1053,5799,5298],{"class":1765},[1053,5801,1411],{"class":1074},[1053,5803,5257],{"class":1771},[1053,5805,1109],{"class":1074},[1053,5807,1427],{"class":1419},[1053,5809,5810],{"class":1423},"requests",[1053,5812,1427],{"class":1419},[1053,5814,1800],{"class":1074},[1053,5816,5817],{"class":1055,"line":2396},[1053,5818,1096],{"class":1095},[1053,5820,5821,5823,5826,5828,5830,5832,5834],{"class":1055,"line":2401},[1053,5822,1102],{"class":1066},[1053,5824,5825],{"class":3423}," __call__",[1053,5827,1109],{"class":1074},[1053,5829,1113],{"class":1112},[1053,5831,1116],{"class":1074},[1053,5833,2427],{"class":1119},[1053,5835,1123],{"class":1074},[1053,5837,5838,5841,5843,5845,5847,5849],{"class":1055,"line":2407},[1053,5839,5840],{"class":1095},"        start_time ",[1053,5842,1756],{"class":1074},[1053,5844,5378],{"class":1095},[1053,5846,1762],{"class":1074},[1053,5848,5383],{"class":1771},[1053,5850,1821],{"class":1074},[1053,5852,5853],{"class":1055,"line":2413},[1053,5854,4107],{"class":1095},[1053,5856,5857],{"class":1055,"line":2432},[1053,5858,5859],{"class":1059},"        # Log request\n",[1053,5861,5862,5864,5866,5868,5870,5873,5875,5877,5880,5882,5884],{"class":1055,"line":3280},[1053,5863,3459],{"class":1407},[1053,5865,1762],{"class":1074},[1053,5867,5298],{"class":1765},[1053,5869,1762],{"class":1074},[1053,5871,5872],{"class":1771},"info",[1053,5874,1109],{"class":1074},[1053,5876,1975],{"class":1419},[1053,5878,5879],{"class":1423},"Request started",[1053,5881,1975],{"class":1419},[1053,5883,1116],{"class":1074},[1053,5885,3805],{"class":1771},[1053,5887,5888,5891,5893,5895,5897,5900],{"class":1055,"line":3968},[1053,5889,5890],{"class":1792},"            method",[1053,5892,1756],{"class":1074},[1053,5894,2448],{"class":1771},[1053,5896,1762],{"class":1074},[1053,5898,5899],{"class":1765},"method",[1053,5901,1455],{"class":1074},[1053,5903,5904,5907,5909,5911,5913,5916],{"class":1055,"line":3988},[1053,5905,5906],{"class":1792},"            path",[1053,5908,1756],{"class":1074},[1053,5910,2448],{"class":1771},[1053,5912,1762],{"class":1074},[1053,5914,5915],{"class":1765},"path",[1053,5917,1455],{"class":1074},[1053,5919,5920,5923,5925,5927,5929,5932,5934,5936,5938,5940,5943,5945],{"class":1055,"line":4007},[1053,5921,5922],{"class":1792},"            user_agent",[1053,5924,1756],{"class":1074},[1053,5926,2448],{"class":1771},[1053,5928,1762],{"class":1074},[1053,5930,5931],{"class":4060},"META",[1053,5933,1762],{"class":1074},[1053,5935,1787],{"class":1771},[1053,5937,1109],{"class":1074},[1053,5939,1427],{"class":1419},[1053,5941,5942],{"class":1423},"HTTP_USER_AGENT",[1053,5944,1427],{"class":1419},[1053,5946,3273],{"class":1074},[1053,5948,5949,5952,5954,5956,5958,5961,5963,5965],{"class":1055,"line":4026},[1053,5950,5951],{"class":1792},"            ip_address",[1053,5953,1756],{"class":1074},[1053,5955,1113],{"class":1407},[1053,5957,1762],{"class":1074},[1053,5959,5960],{"class":1771},"get_client_ip",[1053,5962,1109],{"class":1074},[1053,5964,2448],{"class":1771},[1053,5966,3273],{"class":1074},[1053,5968,5969,5972,5974,5977,5979,5981,5983,5985,5987,5989,5991,5993],{"class":1055,"line":4043},[1053,5970,5971],{"class":1792},"            correlation_id",[1053,5973,1756],{"class":1074},[1053,5975,5976],{"class":3423},"getattr",[1053,5978,1109],{"class":1074},[1053,5980,2448],{"class":1771},[1053,5982,1116],{"class":1074},[1053,5984,1447],{"class":1419},[1053,5986,4031],{"class":1423},[1053,5988,1427],{"class":1419},[1053,5990,1116],{"class":1074},[1053,5992,4399],{"class":2530},[1053,5994,1800],{"class":1074},[1053,5996,5997],{"class":1055,"line":4065},[1053,5998,3854],{"class":1074},[1053,6000,6001],{"class":1055,"line":4092},[1053,6002,4107],{"class":1095},[1053,6004,6005,6008,6010,6012,6014,6016,6018,6020],{"class":1055,"line":4098},[1053,6006,6007],{"class":1095},"        response ",[1053,6009,1756],{"class":1074},[1053,6011,4932],{"class":1407},[1053,6013,1762],{"class":1074},[1053,6015,5786],{"class":1771},[1053,6017,1109],{"class":1074},[1053,6019,2448],{"class":1771},[1053,6021,1800],{"class":1074},[1053,6023,6024],{"class":1055,"line":4104},[1053,6025,4107],{"class":1095},[1053,6027,6028],{"class":1055,"line":4110},[1053,6029,6030],{"class":1059},"        # Log response\n",[1053,6032,6033,6036,6038,6040,6042,6044,6047,6050],{"class":1055,"line":4116},[1053,6034,6035],{"class":1095},"        duration ",[1053,6037,1756],{"class":1074},[1053,6039,5378],{"class":1095},[1053,6041,1762],{"class":1074},[1053,6043,5383],{"class":1771},[1053,6045,6046],{"class":1074},"()",[1053,6048,6049],{"class":3099}," -",[1053,6051,6052],{"class":1095}," start_time\n",[1053,6054,6055,6057,6059,6061,6063,6065,6067,6069,6072,6074],{"class":1055,"line":4161},[1053,6056,3459],{"class":1407},[1053,6058,1762],{"class":1074},[1053,6060,5298],{"class":1765},[1053,6062,1762],{"class":1074},[1053,6064,5872],{"class":1771},[1053,6066,1109],{"class":1074},[1053,6068,1975],{"class":1419},[1053,6070,6071],{"class":1423},"Request completed",[1053,6073,1975],{"class":1419},[1053,6075,1455],{"class":1074},[1053,6077,6078,6080,6082,6084,6086,6088],{"class":1055,"line":4180},[1053,6079,5890],{"class":1792},[1053,6081,1756],{"class":1074},[1053,6083,2448],{"class":1771},[1053,6085,1762],{"class":1074},[1053,6087,5899],{"class":1765},[1053,6089,1455],{"class":1074},[1053,6091,6092,6094,6096,6098,6100,6102],{"class":1055,"line":4199},[1053,6093,5906],{"class":1792},[1053,6095,1756],{"class":1074},[1053,6097,2448],{"class":1771},[1053,6099,1762],{"class":1074},[1053,6101,5915],{"class":1765},[1053,6103,1455],{"class":1074},[1053,6105,6106,6109,6111,6113,6115,6117],{"class":1055,"line":4213},[1053,6107,6108],{"class":1792},"            status_code",[1053,6110,1756],{"class":1074},[1053,6112,4642],{"class":1771},[1053,6114,1762],{"class":1074},[1053,6116,3841],{"class":1765},[1053,6118,1455],{"class":1074},[1053,6120,6121,6124,6126,6129,6132,6135],{"class":1055,"line":4219},[1053,6122,6123],{"class":1792},"            duration_ms",[1053,6125,1756],{"class":1074},[1053,6127,6128],{"class":1771},"duration ",[1053,6130,6131],{"class":3099},"*",[1053,6133,6134],{"class":2203}," 1000",[1053,6136,1455],{"class":1074},[1053,6138,6139,6141,6143,6145,6147,6149,6151,6153,6155,6157,6159,6161],{"class":1055,"line":4224},[1053,6140,5971],{"class":1792},[1053,6142,1756],{"class":1074},[1053,6144,5976],{"class":3423},[1053,6146,1109],{"class":1074},[1053,6148,2448],{"class":1771},[1053,6150,1116],{"class":1074},[1053,6152,1447],{"class":1419},[1053,6154,4031],{"class":1423},[1053,6156,1427],{"class":1419},[1053,6158,1116],{"class":1074},[1053,6160,4399],{"class":2530},[1053,6162,1800],{"class":1074},[1053,6164,6165],{"class":1055,"line":4230},[1053,6166,3854],{"class":1074},[1053,6168,6169],{"class":1055,"line":4246},[1053,6170,4107],{"class":1095},[1053,6172,6173,6175],{"class":1055,"line":4269},[1053,6174,1930],{"class":1140},[1053,6176,4745],{"class":1095},[1053,6178,6179],{"class":1055,"line":4284},[1053,6180,1096],{"class":1095},[1053,6182,6183,6185,6188,6190,6192,6194,6196],{"class":1055,"line":4306},[1053,6184,1102],{"class":1066},[1053,6186,6187],{"class":1105}," get_client_ip",[1053,6189,1109],{"class":1074},[1053,6191,1113],{"class":1112},[1053,6193,1116],{"class":1074},[1053,6195,2427],{"class":1119},[1053,6197,1123],{"class":1074},[1053,6199,6200,6202,6205],{"class":1055,"line":4320},[1053,6201,1129],{"class":1081},[1053,6203,6204],{"class":1085},"Get client IP address",[1053,6206,1089],{"class":1081},[1053,6208,6209,6212,6214,6216,6218,6220,6222,6224,6226,6228,6231,6233],{"class":1055,"line":4325},[1053,6210,6211],{"class":1095},"        x_forwarded_for ",[1053,6213,1756],{"class":1074},[1053,6215,2427],{"class":1095},[1053,6217,1762],{"class":1074},[1053,6219,5931],{"class":4060},[1053,6221,1762],{"class":1074},[1053,6223,1787],{"class":1771},[1053,6225,1109],{"class":1074},[1053,6227,1427],{"class":1419},[1053,6229,6230],{"class":1423},"HTTP_X_FORWARDED_FOR",[1053,6232,1427],{"class":1419},[1053,6234,1800],{"class":1074},[1053,6236,6237,6239,6242],{"class":1055,"line":4348},[1053,6238,4249],{"class":1140},[1053,6240,6241],{"class":1095}," x_forwarded_for",[1053,6243,1075],{"class":1074},[1053,6245,6246,6249,6251,6253,6255,6258,6260,6262,6264,6266,6269,6272],{"class":1055,"line":4353},[1053,6247,6248],{"class":1095},"            ip ",[1053,6250,1756],{"class":1074},[1053,6252,6241],{"class":1095},[1053,6254,1762],{"class":1074},[1053,6256,6257],{"class":1771},"split",[1053,6259,1109],{"class":1074},[1053,6261,1427],{"class":1419},[1053,6263,1116],{"class":1423},[1053,6265,1427],{"class":1419},[1053,6267,6268],{"class":1074},")[",[1053,6270,6271],{"class":2203},"0",[1053,6273,6274],{"class":1074},"]\n",[1053,6276,6277,6280],{"class":1055,"line":4359},[1053,6278,6279],{"class":1140},"        else",[1053,6281,1075],{"class":1074},[1053,6283,6284,6286,6288,6290,6292,6294,6296,6298,6300,6302,6305,6307],{"class":1055,"line":4380},[1053,6285,6248],{"class":1095},[1053,6287,1756],{"class":1074},[1053,6289,2427],{"class":1095},[1053,6291,1762],{"class":1074},[1053,6293,5931],{"class":4060},[1053,6295,1762],{"class":1074},[1053,6297,1787],{"class":1771},[1053,6299,1109],{"class":1074},[1053,6301,1427],{"class":1419},[1053,6303,6304],{"class":1423},"REMOTE_ADDR",[1053,6306,1427],{"class":1419},[1053,6308,1800],{"class":1074},[1053,6310,6311,6313],{"class":1055,"line":4385},[1053,6312,1930],{"class":1140},[1053,6314,6315],{"class":1095}," ip\n",[1053,6317,6318],{"class":1055,"line":4404},[1053,6319,1269],{"emptyLinePlaceholder":1268},[1053,6321,6322],{"class":1055,"line":4410},[1053,6323,6324],{"class":1059},"# Business logic logging\n",[1053,6326,6327,6329,6331],{"class":1055,"line":4420},[1053,6328,1067],{"class":1066},[1053,6330,1071],{"class":1070},[1053,6332,1075],{"class":1074},[1053,6334,6335,6337,6340],{"class":1055,"line":4433},[1053,6336,1082],{"class":1081},[1053,6338,6339],{"class":1085},"User service with structured logging",[1053,6341,1089],{"class":1081},[1053,6343,6344],{"class":1055,"line":4477},[1053,6345,1096],{"class":1095},[1053,6347,6348,6350,6352,6354,6356],{"class":1055,"line":4518},[1053,6349,1102],{"class":1066},[1053,6351,3424],{"class":3423},[1053,6353,1109],{"class":1074},[1053,6355,1113],{"class":1112},[1053,6357,1123],{"class":1074},[1053,6359,6360,6362,6364,6366,6368,6370,6372,6374,6377,6379],{"class":1055,"line":4538},[1053,6361,3459],{"class":1407},[1053,6363,1762],{"class":1074},[1053,6365,5298],{"class":1765},[1053,6367,1411],{"class":1074},[1053,6369,5257],{"class":1771},[1053,6371,1109],{"class":1074},[1053,6373,1427],{"class":1419},[1053,6375,6376],{"class":1423},"user_service",[1053,6378,1427],{"class":1419},[1053,6380,1800],{"class":1074},[1053,6382,6383],{"class":1055,"line":4553},[1053,6384,1096],{"class":1095},[1053,6386,6387,6389,6391,6393,6395,6397,6399],{"class":1055,"line":4572},[1053,6388,1102],{"class":1066},[1053,6390,1106],{"class":1105},[1053,6392,1109],{"class":1074},[1053,6394,1113],{"class":1112},[1053,6396,1116],{"class":1074},[1053,6398,1120],{"class":1119},[1053,6400,1123],{"class":1074},[1053,6402,6403,6405,6408],{"class":1055,"line":4595},[1053,6404,1129],{"class":1081},[1053,6406,6407],{"class":1085},"Create user with logging",[1053,6409,1089],{"class":1081},[1053,6411,6412,6414,6416,6418,6420,6422,6424,6426,6429,6431,6433],{"class":1055,"line":4600},[1053,6413,3459],{"class":1407},[1053,6415,1762],{"class":1074},[1053,6417,5298],{"class":1765},[1053,6419,1762],{"class":1074},[1053,6421,5872],{"class":1771},[1053,6423,1109],{"class":1074},[1053,6425,1975],{"class":1419},[1053,6427,6428],{"class":1423},"Creating user",[1053,6430,1975],{"class":1419},[1053,6432,1116],{"class":1074},[1053,6434,3805],{"class":1771},[1053,6436,6437,6440,6442,6445,6447,6449,6451,6453,6455,6457],{"class":1055,"line":4605},[1053,6438,6439],{"class":1792},"            username",[1053,6441,1756],{"class":1074},[1053,6443,6444],{"class":1771},"user_data",[1053,6446,1762],{"class":1074},[1053,6448,1787],{"class":1771},[1053,6450,1109],{"class":1074},[1053,6452,1427],{"class":1419},[1053,6454,2315],{"class":1423},[1053,6456,1427],{"class":1419},[1053,6458,3273],{"class":1074},[1053,6460,6461,6464,6466,6468,6470,6472,6474,6476,6478,6480],{"class":1055,"line":4610},[1053,6462,6463],{"class":1792},"            email",[1053,6465,1756],{"class":1074},[1053,6467,6444],{"class":1771},[1053,6469,1762],{"class":1074},[1053,6471,1787],{"class":1771},[1053,6473,1109],{"class":1074},[1053,6475,1427],{"class":1419},[1053,6477,2248],{"class":1423},[1053,6479,1427],{"class":1419},[1053,6481,1800],{"class":1074},[1053,6483,6484],{"class":1055,"line":4615},[1053,6485,3854],{"class":1074},[1053,6487,6488],{"class":1055,"line":4659},[1053,6489,4107],{"class":1095},[1053,6491,6492,6494],{"class":1055,"line":4678},[1053,6493,4807],{"class":1140},[1053,6495,1075],{"class":1074},[1053,6497,6498,6501,6503,6505,6507,6509,6511,6514,6516,6519,6521],{"class":1055,"line":4697},[1053,6499,6500],{"class":1095},"            user ",[1053,6502,1756],{"class":1074},[1053,6504,1759],{"class":1095},[1053,6506,1762],{"class":1074},[1053,6508,1766],{"class":1765},[1053,6510,1762],{"class":1074},[1053,6512,6513],{"class":1771},"create_user",[1053,6515,1109],{"class":1074},[1053,6517,6518],{"class":3099},"**",[1053,6520,6444],{"class":1771},[1053,6522,1800],{"class":1074},[1053,6524,6525],{"class":1055,"line":4710},[1053,6526,4915],{"class":1095},[1053,6528,6529,6532,6534,6536,6538,6540,6542,6544,6547,6549],{"class":1055,"line":4715},[1053,6530,6531],{"class":1407},"            self",[1053,6533,1762],{"class":1074},[1053,6535,5298],{"class":1765},[1053,6537,1762],{"class":1074},[1053,6539,5872],{"class":1771},[1053,6541,1109],{"class":1074},[1053,6543,1975],{"class":1419},[1053,6545,6546],{"class":1423},"User created successfully",[1053,6548,1975],{"class":1419},[1053,6550,1455],{"class":1074},[1053,6552,6553,6556,6558,6561,6563,6565],{"class":1055,"line":4720},[1053,6554,6555],{"class":1792},"                user_id",[1053,6557,1756],{"class":1074},[1053,6559,6560],{"class":1771},"user",[1053,6562,1762],{"class":1074},[1053,6564,1793],{"class":1765},[1053,6566,1455],{"class":1074},[1053,6568,6569,6572,6574,6576,6578],{"class":1055,"line":4735},[1053,6570,6571],{"class":1792},"                username",[1053,6573,1756],{"class":1074},[1053,6575,6560],{"class":1771},[1053,6577,1762],{"class":1074},[1053,6579,6580],{"class":1765},"username\n",[1053,6582,6583],{"class":1055,"line":4740},[1053,6584,2270],{"class":1074},[1053,6586,6587],{"class":1055,"line":4748},[1053,6588,4915],{"class":1095},[1053,6590,6591,6593],{"class":1055,"line":4753},[1053,6592,5049],{"class":1140},[1053,6594,6595],{"class":1095}," user\n",[1053,6597,6598],{"class":1055,"line":4759},[1053,6599,4915],{"class":1095},[1053,6601,6602,6604,6606,6608,6610],{"class":1055,"line":4772},[1053,6603,5072],{"class":1140},[1053,6605,5093],{"class":1969},[1053,6607,5096],{"class":1140},[1053,6609,5099],{"class":1095},[1053,6611,1075],{"class":1074},[1053,6613,6614,6616,6618,6620,6622,6624,6626,6628,6631,6633],{"class":1055,"line":4777},[1053,6615,6531],{"class":1407},[1053,6617,1762],{"class":1074},[1053,6619,5298],{"class":1765},[1053,6621,1762],{"class":1074},[1053,6623,3959],{"class":1771},[1053,6625,1109],{"class":1074},[1053,6627,1975],{"class":1419},[1053,6629,6630],{"class":1423},"User creation failed",[1053,6632,1975],{"class":1419},[1053,6634,1455],{"class":1074},[1053,6636,6637,6640,6642,6645,6647,6650],{"class":1055,"line":4794},[1053,6638,6639],{"class":1792},"                error",[1053,6641,1756],{"class":1074},[1053,6643,6644],{"class":1969},"str",[1053,6646,1109],{"class":1074},[1053,6648,6649],{"class":1771},"e",[1053,6651,3273],{"class":1074},[1053,6653,6654,6656,6658,6660,6662,6664,6666,6668,6670,6672],{"class":1055,"line":4804},[1053,6655,6571],{"class":1792},[1053,6657,1756],{"class":1074},[1053,6659,6444],{"class":1771},[1053,6661,1762],{"class":1074},[1053,6663,1787],{"class":1771},[1053,6665,1109],{"class":1074},[1053,6667,1427],{"class":1419},[1053,6669,2315],{"class":1423},[1053,6671,1427],{"class":1419},[1053,6673,3273],{"class":1074},[1053,6675,6676,6679,6681,6683,6685,6687,6689,6691,6693,6695],{"class":1055,"line":4812},[1053,6677,6678],{"class":1792},"                email",[1053,6680,1756],{"class":1074},[1053,6682,6444],{"class":1771},[1053,6684,1762],{"class":1074},[1053,6686,1787],{"class":1771},[1053,6688,1109],{"class":1074},[1053,6690,1427],{"class":1419},[1053,6692,2248],{"class":1423},[1053,6694,1427],{"class":1419},[1053,6696,1800],{"class":1074},[1053,6698,6699],{"class":1055,"line":4818},[1053,6700,2270],{"class":1074},[1053,6702,6703],{"class":1055,"line":4867},[1053,6704,6705],{"class":1140},"            raise\n",[1035,6707,6709],{"id":6708},"_4-testing-strategy","4. Testing Strategy",[1026,6711,6712],{},"Implement comprehensive testing:",[1043,6714,6716],{"className":1045,"code":6715,"language":1047,"meta":1048,"style":1048},"# test_strategy.py\nimport pytest\nfrom django.test import TestCase, TransactionTestCase\nfrom rest_framework.test import APITestCase\nfrom unittest.mock import patch, Mock\nimport responses\n\nclass BaseTestCase(TestCase):\n    \"\"\"Base test case with common utilities\"\"\"\n    \n    def setUp(self):\n        self.user = self.create_test_user()\n    \n    def create_test_user(self, **kwargs):\n        \"\"\"Create test user with defaults\"\"\"\n        defaults = {\n            'username': 'testuser',\n            'email': 'test@example.com',\n            'first_name': 'Test',\n            'last_name': 'User'\n        }\n        defaults.update(kwargs)\n        return User.objects.create_user(**defaults)\n    \n    def assert_error_response(self, response, error_code, status_code):\n        \"\"\"Assert error response format\"\"\"\n        self.assertEqual(response.status_code, status_code)\n        self.assertIn('error', response.data)\n        self.assertEqual(response.data['error']['code'], error_code)\n\nclass UserServiceTest(BaseTestCase):\n    \"\"\"Unit tests for user service\"\"\"\n    \n    def test_create_user_success(self):\n        \"\"\"Test successful user creation\"\"\"\n        user_data = {\n            'username': 'newuser',\n            'email': 'new@example.com',\n            'first_name': 'New',\n            'last_name': 'User'\n        }\n        \n        service = UserService()\n        user = service.create_user(user_data)\n        \n        self.assertEqual(user.username, 'newuser')\n        self.assertEqual(user.email, 'new@example.com')\n        self.assertTrue(User.objects.filter(username='newuser').exists())\n    \n    def test_create_user_duplicate_email(self):\n        \"\"\"Test user creation with duplicate email\"\"\"\n        user_data = {\n            'username': 'newuser',\n            'email': 'test@example.com',  # Duplicate email\n            'first_name': 'New',\n            'last_name': 'User'\n        }\n        \n        service = UserService()\n        \n        with self.assertRaises(BusinessLogicException) as context:\n            service.create_user(user_data)\n        \n        self.assertEqual(context.exception.error_code, 'BUSINESS_LOGIC_ERROR')\n\nclass UserAPITest(APITestCase):\n    \"\"\"Integration tests for user API\"\"\"\n    \n    def setUp(self):\n        super().setUp()\n        self.user = self.create_test_user()\n        self.client.force_authenticate(user=self.user)\n    \n    def test_list_users(self):\n        \"\"\"Test user list endpoint\"\"\"\n        response = self.client.get('/api/v1/users/')\n        \n        self.assertEqual(response.status_code, 200)\n        self.assertIn('results', response.data)\n        self.assertIn('pagination', response.data)\n    \n    @responses.activate\n    def test_create_user_with_external_validation(self):\n        \"\"\"Test user creation with external service validation\"\"\"\n        # Mock external service response\n        responses.add(\n            responses.POST,\n            'http://validation-service:8000/api/v1/validate/',\n            json={'valid': True, 'score': 0.95},\n            status=200\n        )\n        \n        user_data = {\n            'username': 'validuser',\n            'email': 'valid@example.com',\n            'first_name': 'Valid',\n            'last_name': 'User'\n        }\n        \n        response = self.client.post('/api/v1/users/', user_data)\n        \n        self.assertEqual(response.status_code, 201)\n        self.assertEqual(response.data['username'], 'validuser')\n\nclass UserIntegrationTest(TransactionTestCase):\n    \"\"\"Integration tests with database transactions\"\"\"\n    \n    def test_user_creation_with_profile(self):\n        \"\"\"Test user creation creates profile atomically\"\"\"\n        user_data = {\n            'username': 'profileuser',\n            'email': 'profile@example.com'\n        }\n        \n        service = UserService()\n        user = service.create_user(user_data)\n        \n        # Profile should be created automatically\n        self.assertTrue(hasattr(user, 'profile'))\n        self.assertIsNotNone(user.profile)\n\n# Performance tests\nclass UserPerformanceTest(TestCase):\n    \"\"\"Performance tests for user operations\"\"\"\n    \n    def test_user_list_performance(self):\n        \"\"\"Test user list performance with large dataset\"\"\"\n        # Create 1000 test users\n        users = [\n            User(username=f'user{i}', email=f'user{i}@example.com')\n            for i in range(1000)\n        ]\n        User.objects.bulk_create(users)\n        \n        # Test query performance\n        import time\n        start_time = time.time()\n        \n        user_list = list(User.objects.all()[:20])\n        \n        end_time = time.time()\n        query_time = end_time - start_time\n        \n        # Should complete within 100ms\n        self.assertLess(query_time, 0.1)\n        self.assertEqual(len(user_list), 20)\n\n# Contract tests\nclass UserContractTest(TestCase):\n    \"\"\"Contract tests for API compatibility\"\"\"\n    \n    def test_user_response_schema(self):\n        \"\"\"Test user response matches expected schema\"\"\"\n        user = self.create_test_user()\n        \n        from .serializers import UserSerializer\n        serializer = UserSerializer(user)\n        data = serializer.data\n        \n        # Verify required fields\n        required_fields = ['id', 'username', 'email', 'first_name', 'last_name']\n        for field in required_fields:\n            self.assertIn(field, data)\n        \n        # Verify field types\n        self.assertIsInstance(data['id'], int)\n        self.assertIsInstance(data['username'], str)\n        self.assertIsInstance(data['email'], str)\n",[1050,6717,6718,6723,6730,6751,6766,6788,6795,6799,6813,6822,6826,6839,6858,6862,6881,6890,6899,6918,6937,6956,6973,6977,6993,7016,7020,7045,7054,7077,7104,7144,7148,7162,7171,7175,7188,7197,7206,7225,7244,7263,7279,7283,7287,7298,7318,7322,7348,7374,7413,7417,7430,7439,7447,7465,7486,7504,7520,7524,7528,7538,7542,7568,7583,7587,7618,7622,7636,7645,7649,7661,7672,7690,7718,7722,7735,7744,7771,7775,7798,7825,7852,7856,7868,7881,7890,7895,7906,7918,7929,7964,7974,7978,7982,7990,8009,8028,8047,8063,8067,8071,8102,8106,8129,8163,8167,8181,8190,8194,8207,8216,8224,8243,8260,8264,8268,8278,8296,8300,8305,8333,8352,8356,8361,8374,8383,8387,8400,8409,8414,8424,8471,8492,8496,8517,8521,8526,8534,8549,8554,8586,8591,8607,8623,8628,8634,8656,8683,8688,8694,8708,8718,8723,8737,8747,8762,8767,8784,8800,8816,8821,8827,8877,8893,8914,8919,8925,8954,8981],{"__ignoreMap":1048},[1053,6719,6720],{"class":1055,"line":1056},[1053,6721,6722],{"class":1059},"# test_strategy.py\n",[1053,6724,6725,6727],{"class":1055,"line":1063},[1053,6726,2104],{"class":1140},[1053,6728,6729],{"class":1095}," pytest\n",[1053,6731,6732,6734,6736,6738,6741,6743,6746,6748],{"class":1055,"line":1078},[1053,6733,2093],{"class":1140},[1053,6735,5215],{"class":1095},[1053,6737,1762],{"class":1074},[1053,6739,6740],{"class":1095},"test ",[1053,6742,2104],{"class":1140},[1053,6744,6745],{"class":1095}," TestCase",[1053,6747,1116],{"class":1074},[1053,6749,6750],{"class":1095}," TransactionTestCase\n",[1053,6752,6753,6755,6757,6759,6761,6763],{"class":1055,"line":1092},[1053,6754,2093],{"class":1140},[1053,6756,3306],{"class":1095},[1053,6758,1762],{"class":1074},[1053,6760,6740],{"class":1095},[1053,6762,2104],{"class":1140},[1053,6764,6765],{"class":1095}," APITestCase\n",[1053,6767,6768,6770,6773,6775,6778,6780,6783,6785],{"class":1055,"line":1099},[1053,6769,2093],{"class":1140},[1053,6771,6772],{"class":1095}," unittest",[1053,6774,1762],{"class":1074},[1053,6776,6777],{"class":1095},"mock ",[1053,6779,2104],{"class":1140},[1053,6781,6782],{"class":1095}," patch",[1053,6784,1116],{"class":1074},[1053,6786,6787],{"class":1095}," Mock\n",[1053,6789,6790,6792],{"class":1055,"line":1126},[1053,6791,2104],{"class":1140},[1053,6793,6794],{"class":1095}," responses\n",[1053,6796,6797],{"class":1055,"line":1137},[1053,6798,1269],{"emptyLinePlaceholder":1268},[1053,6800,6801,6803,6806,6808,6811],{"class":1055,"line":1144},[1053,6802,1067],{"class":1066},[1053,6804,6805],{"class":1070}," BaseTestCase",[1053,6807,1109],{"class":1074},[1053,6809,6810],{"class":2128},"TestCase",[1053,6812,1123],{"class":1074},[1053,6814,6815,6817,6820],{"class":1055,"line":1149},[1053,6816,1082],{"class":1081},[1053,6818,6819],{"class":1085},"Base test case with common utilities",[1053,6821,1089],{"class":1081},[1053,6823,6824],{"class":1055,"line":1168},[1053,6825,1096],{"class":1095},[1053,6827,6828,6830,6833,6835,6837],{"class":1055,"line":1178},[1053,6829,1102],{"class":1066},[1053,6831,6832],{"class":1105}," setUp",[1053,6834,1109],{"class":1074},[1053,6836,1113],{"class":1112},[1053,6838,1123],{"class":1074},[1053,6840,6841,6843,6845,6847,6849,6851,6853,6856],{"class":1055,"line":1183},[1053,6842,3459],{"class":1407},[1053,6844,1762],{"class":1074},[1053,6846,6560],{"class":1765},[1053,6848,1411],{"class":1074},[1053,6850,4932],{"class":1407},[1053,6852,1762],{"class":1074},[1053,6854,6855],{"class":1771},"create_test_user",[1053,6857,1821],{"class":1074},[1053,6859,6860],{"class":1055,"line":1188},[1053,6861,1096],{"class":1095},[1053,6863,6864,6866,6869,6871,6873,6875,6877,6879],{"class":1055,"line":1212},[1053,6865,1102],{"class":1066},[1053,6867,6868],{"class":1105}," create_test_user",[1053,6870,1109],{"class":1074},[1053,6872,1113],{"class":1112},[1053,6874,1116],{"class":1074},[1053,6876,5342],{"class":3099},[1053,6878,5345],{"class":1119},[1053,6880,1123],{"class":1074},[1053,6882,6883,6885,6888],{"class":1055,"line":1222},[1053,6884,1129],{"class":1081},[1053,6886,6887],{"class":1085},"Create test user with defaults",[1053,6889,1089],{"class":1081},[1053,6891,6892,6895,6897],{"class":1055,"line":1227},[1053,6893,6894],{"class":1095},"        defaults ",[1053,6896,1756],{"class":1074},[1053,6898,1414],{"class":1074},[1053,6900,6901,6903,6905,6907,6909,6911,6914,6916],{"class":1055,"line":1232},[1053,6902,3070],{"class":1419},[1053,6904,2315],{"class":1423},[1053,6906,1427],{"class":1419},[1053,6908,1430],{"class":1074},[1053,6910,1447],{"class":1419},[1053,6912,6913],{"class":1423},"testuser",[1053,6915,1427],{"class":1419},[1053,6917,1455],{"class":1074},[1053,6919,6920,6922,6924,6926,6928,6930,6933,6935],{"class":1055,"line":1250},[1053,6921,3070],{"class":1419},[1053,6923,2248],{"class":1423},[1053,6925,1427],{"class":1419},[1053,6927,1430],{"class":1074},[1053,6929,1447],{"class":1419},[1053,6931,6932],{"class":1423},"test@example.com",[1053,6934,1427],{"class":1419},[1053,6936,1455],{"class":1074},[1053,6938,6939,6941,6943,6945,6947,6949,6952,6954],{"class":1055,"line":1260},[1053,6940,3070],{"class":1419},[1053,6942,2354],{"class":1423},[1053,6944,1427],{"class":1419},[1053,6946,1430],{"class":1074},[1053,6948,1447],{"class":1419},[1053,6950,6951],{"class":1423},"Test",[1053,6953,1427],{"class":1419},[1053,6955,1455],{"class":1074},[1053,6957,6958,6960,6962,6964,6966,6968,6971],{"class":1055,"line":1265},[1053,6959,3070],{"class":1419},[1053,6961,2375],{"class":1423},[1053,6963,1427],{"class":1419},[1053,6965,1430],{"class":1074},[1053,6967,1447],{"class":1419},[1053,6969,6970],{"class":1423},"User",[1053,6972,2387],{"class":1419},[1053,6974,6975],{"class":1055,"line":1272},[1053,6976,4101],{"class":1074},[1053,6978,6979,6982,6984,6987,6989,6991],{"class":1055,"line":1278},[1053,6980,6981],{"class":1095},"        defaults",[1053,6983,1762],{"class":1074},[1053,6985,6986],{"class":1771},"update",[1053,6988,1109],{"class":1074},[1053,6990,5345],{"class":1771},[1053,6992,1800],{"class":1074},[1053,6994,6995,6997,6999,7001,7003,7005,7007,7009,7011,7014],{"class":1055,"line":1288},[1053,6996,1930],{"class":1140},[1053,6998,1759],{"class":1095},[1053,7000,1762],{"class":1074},[1053,7002,1766],{"class":1765},[1053,7004,1762],{"class":1074},[1053,7006,6513],{"class":1771},[1053,7008,1109],{"class":1074},[1053,7010,6518],{"class":3099},[1053,7012,7013],{"class":1771},"defaults",[1053,7015,1800],{"class":1074},[1053,7017,7018],{"class":1055,"line":1298},[1053,7019,1096],{"class":1095},[1053,7021,7022,7024,7027,7029,7031,7033,7035,7037,7039,7041,7043],{"class":1055,"line":1303},[1053,7023,1102],{"class":1066},[1053,7025,7026],{"class":1105}," assert_error_response",[1053,7028,1109],{"class":1074},[1053,7030,1113],{"class":1112},[1053,7032,1116],{"class":1074},[1053,7034,4453],{"class":1119},[1053,7036,1116],{"class":1074},[1053,7038,3438],{"class":1119},[1053,7040,1116],{"class":1074},[1053,7042,3779],{"class":1119},[1053,7044,1123],{"class":1074},[1053,7046,7047,7049,7052],{"class":1055,"line":1320},[1053,7048,1129],{"class":1081},[1053,7050,7051],{"class":1085},"Assert error response format",[1053,7053,1089],{"class":1081},[1053,7055,7056,7058,7060,7063,7065,7067,7069,7071,7073,7075],{"class":1055,"line":1325},[1053,7057,3459],{"class":1407},[1053,7059,1762],{"class":1074},[1053,7061,7062],{"class":1771},"assertEqual",[1053,7064,1109],{"class":1074},[1053,7066,4642],{"class":1771},[1053,7068,1762],{"class":1074},[1053,7070,3841],{"class":1765},[1053,7072,1116],{"class":1074},[1053,7074,3779],{"class":1771},[1053,7076,1800],{"class":1074},[1053,7078,7079,7081,7083,7086,7088,7090,7092,7094,7096,7098,7100,7102],{"class":1055,"line":1330},[1053,7080,3459],{"class":1407},[1053,7082,1762],{"class":1074},[1053,7084,7085],{"class":1771},"assertIn",[1053,7087,1109],{"class":1074},[1053,7089,1427],{"class":1419},[1053,7091,3959],{"class":1423},[1053,7093,1427],{"class":1419},[1053,7095,1116],{"class":1074},[1053,7097,4453],{"class":1771},[1053,7099,1762],{"class":1074},[1053,7101,4533],{"class":1765},[1053,7103,1800],{"class":1074},[1053,7105,7106,7108,7110,7112,7114,7116,7118,7120,7122,7124,7126,7128,7131,7133,7135,7137,7140,7142],{"class":1055,"line":1349},[1053,7107,3459],{"class":1407},[1053,7109,1762],{"class":1074},[1053,7111,7062],{"class":1771},[1053,7113,1109],{"class":1074},[1053,7115,4642],{"class":1771},[1053,7117,1762],{"class":1074},[1053,7119,4533],{"class":1765},[1053,7121,4960],{"class":1074},[1053,7123,1427],{"class":1419},[1053,7125,3959],{"class":1423},[1053,7127,1427],{"class":1419},[1053,7129,7130],{"class":1074},"][",[1053,7132,1427],{"class":1419},[1053,7134,1050],{"class":1423},[1053,7136,1427],{"class":1419},[1053,7138,7139],{"class":1074},"],",[1053,7141,3438],{"class":1771},[1053,7143,1800],{"class":1074},[1053,7145,7146],{"class":1055,"line":1354},[1053,7147,1269],{"emptyLinePlaceholder":1268},[1053,7149,7150,7152,7155,7157,7160],{"class":1055,"line":1359},[1053,7151,1067],{"class":1066},[1053,7153,7154],{"class":1070}," UserServiceTest",[1053,7156,1109],{"class":1074},[1053,7158,7159],{"class":2128},"BaseTestCase",[1053,7161,1123],{"class":1074},[1053,7163,7164,7166,7169],{"class":1055,"line":1378},[1053,7165,1082],{"class":1081},[1053,7167,7168],{"class":1085},"Unit tests for user service",[1053,7170,1089],{"class":1081},[1053,7172,7173],{"class":1055,"line":1828},[1053,7174,1096],{"class":1095},[1053,7176,7177,7179,7182,7184,7186],{"class":1055,"line":1834},[1053,7178,1102],{"class":1066},[1053,7180,7181],{"class":1105}," test_create_user_success",[1053,7183,1109],{"class":1074},[1053,7185,1113],{"class":1112},[1053,7187,1123],{"class":1074},[1053,7189,7190,7192,7195],{"class":1055,"line":1847},[1053,7191,1129],{"class":1081},[1053,7193,7194],{"class":1085},"Test successful user creation",[1053,7196,1089],{"class":1081},[1053,7198,7199,7202,7204],{"class":1055,"line":1853},[1053,7200,7201],{"class":1095},"        user_data ",[1053,7203,1756],{"class":1074},[1053,7205,1414],{"class":1074},[1053,7207,7208,7210,7212,7214,7216,7218,7221,7223],{"class":1055,"line":1875},[1053,7209,3070],{"class":1419},[1053,7211,2315],{"class":1423},[1053,7213,1427],{"class":1419},[1053,7215,1430],{"class":1074},[1053,7217,1447],{"class":1419},[1053,7219,7220],{"class":1423},"newuser",[1053,7222,1427],{"class":1419},[1053,7224,1455],{"class":1074},[1053,7226,7227,7229,7231,7233,7235,7237,7240,7242],{"class":1055,"line":1912},[1053,7228,3070],{"class":1419},[1053,7230,2248],{"class":1423},[1053,7232,1427],{"class":1419},[1053,7234,1430],{"class":1074},[1053,7236,1447],{"class":1419},[1053,7238,7239],{"class":1423},"new@example.com",[1053,7241,1427],{"class":1419},[1053,7243,1455],{"class":1074},[1053,7245,7246,7248,7250,7252,7254,7256,7259,7261],{"class":1055,"line":1917},[1053,7247,3070],{"class":1419},[1053,7249,2354],{"class":1423},[1053,7251,1427],{"class":1419},[1053,7253,1430],{"class":1074},[1053,7255,1447],{"class":1419},[1053,7257,7258],{"class":1423},"New",[1053,7260,1427],{"class":1419},[1053,7262,1455],{"class":1074},[1053,7264,7265,7267,7269,7271,7273,7275,7277],{"class":1055,"line":1927},[1053,7266,3070],{"class":1419},[1053,7268,2375],{"class":1423},[1053,7270,1427],{"class":1419},[1053,7272,1430],{"class":1074},[1053,7274,1447],{"class":1419},[1053,7276,6970],{"class":1423},[1053,7278,2387],{"class":1419},[1053,7280,7281],{"class":1055,"line":1955},[1053,7282,4101],{"class":1074},[1053,7284,7285],{"class":1055,"line":1963},[1053,7286,4107],{"class":1095},[1053,7288,7289,7292,7294,7296],{"class":1055,"line":2370},[1053,7290,7291],{"class":1095},"        service ",[1053,7293,1756],{"class":1074},[1053,7295,1071],{"class":1771},[1053,7297,1821],{"class":1074},[1053,7299,7300,7303,7305,7308,7310,7312,7314,7316],{"class":1055,"line":2390},[1053,7301,7302],{"class":1095},"        user ",[1053,7304,1756],{"class":1074},[1053,7306,7307],{"class":1095}," service",[1053,7309,1762],{"class":1074},[1053,7311,6513],{"class":1771},[1053,7313,1109],{"class":1074},[1053,7315,6444],{"class":1771},[1053,7317,1800],{"class":1074},[1053,7319,7320],{"class":1055,"line":2396},[1053,7321,4107],{"class":1095},[1053,7323,7324,7326,7328,7330,7332,7334,7336,7338,7340,7342,7344,7346],{"class":1055,"line":2401},[1053,7325,3459],{"class":1407},[1053,7327,1762],{"class":1074},[1053,7329,7062],{"class":1771},[1053,7331,1109],{"class":1074},[1053,7333,6560],{"class":1771},[1053,7335,1762],{"class":1074},[1053,7337,2315],{"class":1765},[1053,7339,1116],{"class":1074},[1053,7341,1447],{"class":1419},[1053,7343,7220],{"class":1423},[1053,7345,1427],{"class":1419},[1053,7347,1800],{"class":1074},[1053,7349,7350,7352,7354,7356,7358,7360,7362,7364,7366,7368,7370,7372],{"class":1055,"line":2407},[1053,7351,3459],{"class":1407},[1053,7353,1762],{"class":1074},[1053,7355,7062],{"class":1771},[1053,7357,1109],{"class":1074},[1053,7359,6560],{"class":1771},[1053,7361,1762],{"class":1074},[1053,7363,2248],{"class":1765},[1053,7365,1116],{"class":1074},[1053,7367,1447],{"class":1419},[1053,7369,7239],{"class":1423},[1053,7371,1427],{"class":1419},[1053,7373,1800],{"class":1074},[1053,7375,7376,7378,7380,7383,7385,7387,7389,7391,7393,7395,7397,7399,7401,7403,7405,7407,7409,7411],{"class":1055,"line":2413},[1053,7377,3459],{"class":1407},[1053,7379,1762],{"class":1074},[1053,7381,7382],{"class":1771},"assertTrue",[1053,7384,1109],{"class":1074},[1053,7386,6970],{"class":1771},[1053,7388,1762],{"class":1074},[1053,7390,1766],{"class":1765},[1053,7392,1762],{"class":1074},[1053,7394,1942],{"class":1771},[1053,7396,1109],{"class":1074},[1053,7398,2315],{"class":1792},[1053,7400,1756],{"class":1074},[1053,7402,1427],{"class":1419},[1053,7404,7220],{"class":1423},[1053,7406,1427],{"class":1419},[1053,7408,1784],{"class":1074},[1053,7410,4861],{"class":1771},[1053,7412,2600],{"class":1074},[1053,7414,7415],{"class":1055,"line":2432},[1053,7416,1096],{"class":1095},[1053,7418,7419,7421,7424,7426,7428],{"class":1055,"line":3280},[1053,7420,1102],{"class":1066},[1053,7422,7423],{"class":1105}," test_create_user_duplicate_email",[1053,7425,1109],{"class":1074},[1053,7427,1113],{"class":1112},[1053,7429,1123],{"class":1074},[1053,7431,7432,7434,7437],{"class":1055,"line":3968},[1053,7433,1129],{"class":1081},[1053,7435,7436],{"class":1085},"Test user creation with duplicate email",[1053,7438,1089],{"class":1081},[1053,7440,7441,7443,7445],{"class":1055,"line":3988},[1053,7442,7201],{"class":1095},[1053,7444,1756],{"class":1074},[1053,7446,1414],{"class":1074},[1053,7448,7449,7451,7453,7455,7457,7459,7461,7463],{"class":1055,"line":4007},[1053,7450,3070],{"class":1419},[1053,7452,2315],{"class":1423},[1053,7454,1427],{"class":1419},[1053,7456,1430],{"class":1074},[1053,7458,1447],{"class":1419},[1053,7460,7220],{"class":1423},[1053,7462,1427],{"class":1419},[1053,7464,1455],{"class":1074},[1053,7466,7467,7469,7471,7473,7475,7477,7479,7481,7483],{"class":1055,"line":4026},[1053,7468,3070],{"class":1419},[1053,7470,2248],{"class":1423},[1053,7472,1427],{"class":1419},[1053,7474,1430],{"class":1074},[1053,7476,1447],{"class":1419},[1053,7478,6932],{"class":1423},[1053,7480,1427],{"class":1419},[1053,7482,1116],{"class":1074},[1053,7484,7485],{"class":1059},"  # Duplicate email\n",[1053,7487,7488,7490,7492,7494,7496,7498,7500,7502],{"class":1055,"line":4043},[1053,7489,3070],{"class":1419},[1053,7491,2354],{"class":1423},[1053,7493,1427],{"class":1419},[1053,7495,1430],{"class":1074},[1053,7497,1447],{"class":1419},[1053,7499,7258],{"class":1423},[1053,7501,1427],{"class":1419},[1053,7503,1455],{"class":1074},[1053,7505,7506,7508,7510,7512,7514,7516,7518],{"class":1055,"line":4065},[1053,7507,3070],{"class":1419},[1053,7509,2375],{"class":1423},[1053,7511,1427],{"class":1419},[1053,7513,1430],{"class":1074},[1053,7515,1447],{"class":1419},[1053,7517,6970],{"class":1423},[1053,7519,2387],{"class":1419},[1053,7521,7522],{"class":1055,"line":4092},[1053,7523,4101],{"class":1074},[1053,7525,7526],{"class":1055,"line":4098},[1053,7527,4107],{"class":1095},[1053,7529,7530,7532,7534,7536],{"class":1055,"line":4104},[1053,7531,7291],{"class":1095},[1053,7533,1756],{"class":1074},[1053,7535,1071],{"class":1771},[1053,7537,1821],{"class":1074},[1053,7539,7540],{"class":1055,"line":4110},[1053,7541,4107],{"class":1095},[1053,7543,7544,7547,7549,7551,7554,7556,7559,7562,7564,7566],{"class":1055,"line":4116},[1053,7545,7546],{"class":1140},"        with",[1053,7548,4932],{"class":1407},[1053,7550,1762],{"class":1074},[1053,7552,7553],{"class":1771},"assertRaises",[1053,7555,1109],{"class":1074},[1053,7557,7558],{"class":1771},"BusinessLogicException",[1053,7560,7561],{"class":1074},")",[1053,7563,5096],{"class":1140},[1053,7565,3875],{"class":1095},[1053,7567,1075],{"class":1074},[1053,7569,7570,7573,7575,7577,7579,7581],{"class":1055,"line":4161},[1053,7571,7572],{"class":1095},"            service",[1053,7574,1762],{"class":1074},[1053,7576,6513],{"class":1771},[1053,7578,1109],{"class":1074},[1053,7580,6444],{"class":1771},[1053,7582,1800],{"class":1074},[1053,7584,7585],{"class":1055,"line":4180},[1053,7586,4107],{"class":1095},[1053,7588,7589,7591,7593,7595,7597,7600,7602,7604,7606,7608,7610,7612,7614,7616],{"class":1055,"line":4199},[1053,7590,3459],{"class":1407},[1053,7592,1762],{"class":1074},[1053,7594,7062],{"class":1771},[1053,7596,1109],{"class":1074},[1053,7598,7599],{"class":1771},"context",[1053,7601,1762],{"class":1074},[1053,7603,5118],{"class":1765},[1053,7605,1762],{"class":1074},[1053,7607,3478],{"class":1765},[1053,7609,1116],{"class":1074},[1053,7611,1447],{"class":1419},[1053,7613,3705],{"class":1423},[1053,7615,1427],{"class":1419},[1053,7617,1800],{"class":1074},[1053,7619,7620],{"class":1055,"line":4213},[1053,7621,1269],{"emptyLinePlaceholder":1268},[1053,7623,7624,7626,7629,7631,7634],{"class":1055,"line":4219},[1053,7625,1067],{"class":1066},[1053,7627,7628],{"class":1070}," UserAPITest",[1053,7630,1109],{"class":1074},[1053,7632,7633],{"class":2128},"APITestCase",[1053,7635,1123],{"class":1074},[1053,7637,7638,7640,7643],{"class":1055,"line":4224},[1053,7639,1082],{"class":1081},[1053,7641,7642],{"class":1085},"Integration tests for user API",[1053,7644,1089],{"class":1081},[1053,7646,7647],{"class":1055,"line":4230},[1053,7648,1096],{"class":1095},[1053,7650,7651,7653,7655,7657,7659],{"class":1055,"line":4246},[1053,7652,1102],{"class":1066},[1053,7654,6832],{"class":1105},[1053,7656,1109],{"class":1074},[1053,7658,1113],{"class":1112},[1053,7660,1123],{"class":1074},[1053,7662,7663,7665,7667,7670],{"class":1055,"line":4269},[1053,7664,3517],{"class":1969},[1053,7666,2440],{"class":1074},[1053,7668,7669],{"class":1771},"setUp",[1053,7671,1821],{"class":1074},[1053,7673,7674,7676,7678,7680,7682,7684,7686,7688],{"class":1055,"line":4284},[1053,7675,3459],{"class":1407},[1053,7677,1762],{"class":1074},[1053,7679,6560],{"class":1765},[1053,7681,1411],{"class":1074},[1053,7683,4932],{"class":1407},[1053,7685,1762],{"class":1074},[1053,7687,6855],{"class":1771},[1053,7689,1821],{"class":1074},[1053,7691,7692,7694,7696,7699,7701,7704,7706,7708,7710,7712,7714,7716],{"class":1055,"line":4306},[1053,7693,3459],{"class":1407},[1053,7695,1762],{"class":1074},[1053,7697,7698],{"class":1765},"client",[1053,7700,1762],{"class":1074},[1053,7702,7703],{"class":1771},"force_authenticate",[1053,7705,1109],{"class":1074},[1053,7707,6560],{"class":1792},[1053,7709,1756],{"class":1074},[1053,7711,1113],{"class":1407},[1053,7713,1762],{"class":1074},[1053,7715,6560],{"class":1765},[1053,7717,1800],{"class":1074},[1053,7719,7720],{"class":1055,"line":4320},[1053,7721,1096],{"class":1095},[1053,7723,7724,7726,7729,7731,7733],{"class":1055,"line":4325},[1053,7725,1102],{"class":1066},[1053,7727,7728],{"class":1105}," test_list_users",[1053,7730,1109],{"class":1074},[1053,7732,1113],{"class":1112},[1053,7734,1123],{"class":1074},[1053,7736,7737,7739,7742],{"class":1055,"line":4348},[1053,7738,1129],{"class":1081},[1053,7740,7741],{"class":1085},"Test user list endpoint",[1053,7743,1089],{"class":1081},[1053,7745,7746,7748,7750,7752,7754,7756,7758,7760,7762,7764,7767,7769],{"class":1055,"line":4353},[1053,7747,6007],{"class":1095},[1053,7749,1756],{"class":1074},[1053,7751,4932],{"class":1407},[1053,7753,1762],{"class":1074},[1053,7755,7698],{"class":1765},[1053,7757,1762],{"class":1074},[1053,7759,1787],{"class":1771},[1053,7761,1109],{"class":1074},[1053,7763,1427],{"class":1419},[1053,7765,7766],{"class":1423},"/api/v1/users/",[1053,7768,1427],{"class":1419},[1053,7770,1800],{"class":1074},[1053,7772,7773],{"class":1055,"line":4359},[1053,7774,4107],{"class":1095},[1053,7776,7777,7779,7781,7783,7785,7787,7789,7791,7793,7796],{"class":1055,"line":4380},[1053,7778,3459],{"class":1407},[1053,7780,1762],{"class":1074},[1053,7782,7062],{"class":1771},[1053,7784,1109],{"class":1074},[1053,7786,4642],{"class":1771},[1053,7788,1762],{"class":1074},[1053,7790,3841],{"class":1765},[1053,7792,1116],{"class":1074},[1053,7794,7795],{"class":2203}," 200",[1053,7797,1800],{"class":1074},[1053,7799,7800,7802,7804,7806,7808,7810,7813,7815,7817,7819,7821,7823],{"class":1055,"line":4385},[1053,7801,3459],{"class":1407},[1053,7803,1762],{"class":1074},[1053,7805,7085],{"class":1771},[1053,7807,1109],{"class":1074},[1053,7809,1427],{"class":1419},[1053,7811,7812],{"class":1423},"results",[1053,7814,1427],{"class":1419},[1053,7816,1116],{"class":1074},[1053,7818,4453],{"class":1771},[1053,7820,1762],{"class":1074},[1053,7822,4533],{"class":1765},[1053,7824,1800],{"class":1074},[1053,7826,7827,7829,7831,7833,7835,7837,7840,7842,7844,7846,7848,7850],{"class":1055,"line":4404},[1053,7828,3459],{"class":1407},[1053,7830,1762],{"class":1074},[1053,7832,7085],{"class":1771},[1053,7834,1109],{"class":1074},[1053,7836,1427],{"class":1419},[1053,7838,7839],{"class":1423},"pagination",[1053,7841,1427],{"class":1419},[1053,7843,1116],{"class":1074},[1053,7845,4453],{"class":1771},[1053,7847,1762],{"class":1074},[1053,7849,4533],{"class":1765},[1053,7851,1800],{"class":1074},[1053,7853,7854],{"class":1055,"line":4410},[1053,7855,1096],{"class":1095},[1053,7857,7858,7860,7863,7865],{"class":1055,"line":4420},[1053,7859,2140],{"class":1074},[1053,7861,7862],{"class":1105},"responses",[1053,7864,1762],{"class":1074},[1053,7866,7867],{"class":1105},"activate\n",[1053,7869,7870,7872,7875,7877,7879],{"class":1055,"line":4433},[1053,7871,1102],{"class":1066},[1053,7873,7874],{"class":1105}," test_create_user_with_external_validation",[1053,7876,1109],{"class":1074},[1053,7878,1113],{"class":1112},[1053,7880,1123],{"class":1074},[1053,7882,7883,7885,7888],{"class":1055,"line":4477},[1053,7884,1129],{"class":1081},[1053,7886,7887],{"class":1085},"Test user creation with external service validation",[1053,7889,1089],{"class":1081},[1053,7891,7892],{"class":1055,"line":4518},[1053,7893,7894],{"class":1059},"        # Mock external service response\n",[1053,7896,7897,7899,7901,7904],{"class":1055,"line":4538},[1053,7898,2195],{"class":1095},[1053,7900,1762],{"class":1074},[1053,7902,7903],{"class":1771},"add",[1053,7905,2146],{"class":1074},[1053,7907,7908,7911,7913,7916],{"class":1055,"line":4553},[1053,7909,7910],{"class":1771},"            responses",[1053,7912,1762],{"class":1074},[1053,7914,7915],{"class":4060},"POST",[1053,7917,1455],{"class":1074},[1053,7919,7920,7922,7925,7927],{"class":1055,"line":4572},[1053,7921,3070],{"class":1419},[1053,7923,7924],{"class":1423},"http://validation-service:8000/api/v1/validate/",[1053,7926,1427],{"class":1419},[1053,7928,1455],{"class":1074},[1053,7930,7931,7934,7936,7938,7940,7942,7944,7947,7949,7951,7954,7956,7958,7961],{"class":1055,"line":4595},[1053,7932,7933],{"class":1792},"            json",[1053,7935,2243],{"class":1074},[1053,7937,1427],{"class":1419},[1053,7939,4965],{"class":1423},[1053,7941,1427],{"class":1419},[1053,7943,1430],{"class":1074},[1053,7945,7946],{"class":2530}," True",[1053,7948,1116],{"class":1074},[1053,7950,1447],{"class":1419},[1053,7952,7953],{"class":1423},"score",[1053,7955,1427],{"class":1419},[1053,7957,1430],{"class":1074},[1053,7959,7960],{"class":2203}," 0.95",[1053,7962,7963],{"class":1074},"},\n",[1053,7965,7966,7969,7971],{"class":1055,"line":4600},[1053,7967,7968],{"class":1792},"            status",[1053,7970,1756],{"class":1074},[1053,7972,7973],{"class":2203},"200\n",[1053,7975,7976],{"class":1055,"line":4605},[1053,7977,3854],{"class":1074},[1053,7979,7980],{"class":1055,"line":4610},[1053,7981,4107],{"class":1095},[1053,7983,7984,7986,7988],{"class":1055,"line":4615},[1053,7985,7201],{"class":1095},[1053,7987,1756],{"class":1074},[1053,7989,1414],{"class":1074},[1053,7991,7992,7994,7996,7998,8000,8002,8005,8007],{"class":1055,"line":4659},[1053,7993,3070],{"class":1419},[1053,7995,2315],{"class":1423},[1053,7997,1427],{"class":1419},[1053,7999,1430],{"class":1074},[1053,8001,1447],{"class":1419},[1053,8003,8004],{"class":1423},"validuser",[1053,8006,1427],{"class":1419},[1053,8008,1455],{"class":1074},[1053,8010,8011,8013,8015,8017,8019,8021,8024,8026],{"class":1055,"line":4678},[1053,8012,3070],{"class":1419},[1053,8014,2248],{"class":1423},[1053,8016,1427],{"class":1419},[1053,8018,1430],{"class":1074},[1053,8020,1447],{"class":1419},[1053,8022,8023],{"class":1423},"valid@example.com",[1053,8025,1427],{"class":1419},[1053,8027,1455],{"class":1074},[1053,8029,8030,8032,8034,8036,8038,8040,8043,8045],{"class":1055,"line":4697},[1053,8031,3070],{"class":1419},[1053,8033,2354],{"class":1423},[1053,8035,1427],{"class":1419},[1053,8037,1430],{"class":1074},[1053,8039,1447],{"class":1419},[1053,8041,8042],{"class":1423},"Valid",[1053,8044,1427],{"class":1419},[1053,8046,1455],{"class":1074},[1053,8048,8049,8051,8053,8055,8057,8059,8061],{"class":1055,"line":4710},[1053,8050,3070],{"class":1419},[1053,8052,2375],{"class":1423},[1053,8054,1427],{"class":1419},[1053,8056,1430],{"class":1074},[1053,8058,1447],{"class":1419},[1053,8060,6970],{"class":1423},[1053,8062,2387],{"class":1419},[1053,8064,8065],{"class":1055,"line":4715},[1053,8066,4101],{"class":1074},[1053,8068,8069],{"class":1055,"line":4720},[1053,8070,4107],{"class":1095},[1053,8072,8073,8075,8077,8079,8081,8083,8085,8088,8090,8092,8094,8096,8098,8100],{"class":1055,"line":4735},[1053,8074,6007],{"class":1095},[1053,8076,1756],{"class":1074},[1053,8078,4932],{"class":1407},[1053,8080,1762],{"class":1074},[1053,8082,7698],{"class":1765},[1053,8084,1762],{"class":1074},[1053,8086,8087],{"class":1771},"post",[1053,8089,1109],{"class":1074},[1053,8091,1427],{"class":1419},[1053,8093,7766],{"class":1423},[1053,8095,1427],{"class":1419},[1053,8097,1116],{"class":1074},[1053,8099,1120],{"class":1771},[1053,8101,1800],{"class":1074},[1053,8103,8104],{"class":1055,"line":4740},[1053,8105,4107],{"class":1095},[1053,8107,8108,8110,8112,8114,8116,8118,8120,8122,8124,8127],{"class":1055,"line":4748},[1053,8109,3459],{"class":1407},[1053,8111,1762],{"class":1074},[1053,8113,7062],{"class":1771},[1053,8115,1109],{"class":1074},[1053,8117,4642],{"class":1771},[1053,8119,1762],{"class":1074},[1053,8121,3841],{"class":1765},[1053,8123,1116],{"class":1074},[1053,8125,8126],{"class":2203}," 201",[1053,8128,1800],{"class":1074},[1053,8130,8131,8133,8135,8137,8139,8141,8143,8145,8147,8149,8151,8153,8155,8157,8159,8161],{"class":1055,"line":4753},[1053,8132,3459],{"class":1407},[1053,8134,1762],{"class":1074},[1053,8136,7062],{"class":1771},[1053,8138,1109],{"class":1074},[1053,8140,4642],{"class":1771},[1053,8142,1762],{"class":1074},[1053,8144,4533],{"class":1765},[1053,8146,4960],{"class":1074},[1053,8148,1427],{"class":1419},[1053,8150,2315],{"class":1423},[1053,8152,1427],{"class":1419},[1053,8154,7139],{"class":1074},[1053,8156,1447],{"class":1419},[1053,8158,8004],{"class":1423},[1053,8160,1427],{"class":1419},[1053,8162,1800],{"class":1074},[1053,8164,8165],{"class":1055,"line":4759},[1053,8166,1269],{"emptyLinePlaceholder":1268},[1053,8168,8169,8171,8174,8176,8179],{"class":1055,"line":4772},[1053,8170,1067],{"class":1066},[1053,8172,8173],{"class":1070}," UserIntegrationTest",[1053,8175,1109],{"class":1074},[1053,8177,8178],{"class":2128},"TransactionTestCase",[1053,8180,1123],{"class":1074},[1053,8182,8183,8185,8188],{"class":1055,"line":4777},[1053,8184,1082],{"class":1081},[1053,8186,8187],{"class":1085},"Integration tests with database transactions",[1053,8189,1089],{"class":1081},[1053,8191,8192],{"class":1055,"line":4794},[1053,8193,1096],{"class":1095},[1053,8195,8196,8198,8201,8203,8205],{"class":1055,"line":4804},[1053,8197,1102],{"class":1066},[1053,8199,8200],{"class":1105}," test_user_creation_with_profile",[1053,8202,1109],{"class":1074},[1053,8204,1113],{"class":1112},[1053,8206,1123],{"class":1074},[1053,8208,8209,8211,8214],{"class":1055,"line":4812},[1053,8210,1129],{"class":1081},[1053,8212,8213],{"class":1085},"Test user creation creates profile atomically",[1053,8215,1089],{"class":1081},[1053,8217,8218,8220,8222],{"class":1055,"line":4818},[1053,8219,7201],{"class":1095},[1053,8221,1756],{"class":1074},[1053,8223,1414],{"class":1074},[1053,8225,8226,8228,8230,8232,8234,8236,8239,8241],{"class":1055,"line":4867},[1053,8227,3070],{"class":1419},[1053,8229,2315],{"class":1423},[1053,8231,1427],{"class":1419},[1053,8233,1430],{"class":1074},[1053,8235,1447],{"class":1419},[1053,8237,8238],{"class":1423},"profileuser",[1053,8240,1427],{"class":1419},[1053,8242,1455],{"class":1074},[1053,8244,8245,8247,8249,8251,8253,8255,8258],{"class":1055,"line":4877},[1053,8246,3070],{"class":1419},[1053,8248,2248],{"class":1423},[1053,8250,1427],{"class":1419},[1053,8252,1430],{"class":1074},[1053,8254,1447],{"class":1419},[1053,8256,8257],{"class":1423},"profile@example.com",[1053,8259,2387],{"class":1419},[1053,8261,8262],{"class":1055,"line":4890},[1053,8263,4101],{"class":1074},[1053,8265,8266],{"class":1055,"line":4906},[1053,8267,4107],{"class":1095},[1053,8269,8270,8272,8274,8276],{"class":1055,"line":4912},[1053,8271,7291],{"class":1095},[1053,8273,1756],{"class":1074},[1053,8275,1071],{"class":1771},[1053,8277,1821],{"class":1074},[1053,8279,8280,8282,8284,8286,8288,8290,8292,8294],{"class":1055,"line":4918},[1053,8281,7302],{"class":1095},[1053,8283,1756],{"class":1074},[1053,8285,7307],{"class":1095},[1053,8287,1762],{"class":1074},[1053,8289,6513],{"class":1771},[1053,8291,1109],{"class":1074},[1053,8293,6444],{"class":1771},[1053,8295,1800],{"class":1074},[1053,8297,8298],{"class":1055,"line":4924},[1053,8299,4107],{"class":1095},[1053,8301,8302],{"class":1055,"line":4950},[1053,8303,8304],{"class":1059},"        # Profile should be created automatically\n",[1053,8306,8307,8309,8311,8313,8315,8318,8320,8322,8324,8326,8329,8331],{"class":1055,"line":4973},[1053,8308,3459],{"class":1407},[1053,8310,1762],{"class":1074},[1053,8312,7382],{"class":1771},[1053,8314,1109],{"class":1074},[1053,8316,8317],{"class":3423},"hasattr",[1053,8319,1109],{"class":1074},[1053,8321,6560],{"class":1771},[1053,8323,1116],{"class":1074},[1053,8325,1447],{"class":1419},[1053,8327,8328],{"class":1423},"profile",[1053,8330,1427],{"class":1419},[1053,8332,5506],{"class":1074},[1053,8334,8335,8337,8339,8342,8344,8346,8348,8350],{"class":1055,"line":4982},[1053,8336,3459],{"class":1407},[1053,8338,1762],{"class":1074},[1053,8340,8341],{"class":1771},"assertIsNotNone",[1053,8343,1109],{"class":1074},[1053,8345,6560],{"class":1771},[1053,8347,1762],{"class":1074},[1053,8349,8328],{"class":1765},[1053,8351,1800],{"class":1074},[1053,8353,8354],{"class":1055,"line":4994},[1053,8355,1269],{"emptyLinePlaceholder":1268},[1053,8357,8358],{"class":1055,"line":5011},[1053,8359,8360],{"class":1059},"# Performance tests\n",[1053,8362,8363,8365,8368,8370,8372],{"class":1055,"line":5036},[1053,8364,1067],{"class":1066},[1053,8366,8367],{"class":1070}," UserPerformanceTest",[1053,8369,1109],{"class":1074},[1053,8371,6810],{"class":2128},[1053,8373,1123],{"class":1074},[1053,8375,8376,8378,8381],{"class":1055,"line":5041},[1053,8377,1082],{"class":1081},[1053,8379,8380],{"class":1085},"Performance tests for user operations",[1053,8382,1089],{"class":1081},[1053,8384,8385],{"class":1055,"line":5046},[1053,8386,1096],{"class":1095},[1053,8388,8389,8391,8394,8396,8398],{"class":1055,"line":5064},[1053,8390,1102],{"class":1066},[1053,8392,8393],{"class":1105}," test_user_list_performance",[1053,8395,1109],{"class":1074},[1053,8397,1113],{"class":1112},[1053,8399,1123],{"class":1074},[1053,8401,8402,8404,8407],{"class":1055,"line":5069},[1053,8403,1129],{"class":1081},[1053,8405,8406],{"class":1085},"Test user list performance with large dataset",[1053,8408,1089],{"class":1081},[1053,8410,8411],{"class":1055,"line":5079},[1053,8412,8413],{"class":1059},"        # Create 1000 test users\n",[1053,8415,8416,8419,8421],{"class":1055,"line":5088},[1053,8417,8418],{"class":1095},"        users ",[1053,8420,1756],{"class":1074},[1053,8422,8423],{"class":1074}," [\n",[1053,8425,8426,8429,8431,8433,8435,8437,8440,8442,8445,8447,8449,8451,8454,8456,8458,8460,8462,8464,8466,8469],{"class":1055,"line":5104},[1053,8427,8428],{"class":1771},"            User",[1053,8430,1109],{"class":1074},[1053,8432,2315],{"class":1792},[1053,8434,1756],{"class":1074},[1053,8436,1892],{"class":1066},[1053,8438,8439],{"class":1423},"'user",[1053,8441,1899],{"class":1898},[1053,8443,8444],{"class":1771},"i",[1053,8446,1904],{"class":1898},[1053,8448,1427],{"class":1423},[1053,8450,1116],{"class":1074},[1053,8452,8453],{"class":1792}," email",[1053,8455,1756],{"class":1074},[1053,8457,1892],{"class":1066},[1053,8459,8439],{"class":1423},[1053,8461,1899],{"class":1898},[1053,8463,8444],{"class":1771},[1053,8465,1904],{"class":1898},[1053,8467,8468],{"class":1423},"@example.com'",[1053,8470,1800],{"class":1074},[1053,8472,8473,8476,8479,8482,8485,8487,8490],{"class":1055,"line":5110},[1053,8474,8475],{"class":1140},"            for",[1053,8477,8478],{"class":1095}," i ",[1053,8480,8481],{"class":1140},"in",[1053,8483,8484],{"class":3423}," range",[1053,8486,1109],{"class":1074},[1053,8488,8489],{"class":2203},"1000",[1053,8491,1800],{"class":1074},[1053,8493,8494],{"class":1055,"line":5132},[1053,8495,2404],{"class":1074},[1053,8497,8498,8501,8503,8505,8507,8510,8512,8515],{"class":1055,"line":5141},[1053,8499,8500],{"class":1095},"        User",[1053,8502,1762],{"class":1074},[1053,8504,1766],{"class":1765},[1053,8506,1762],{"class":1074},[1053,8508,8509],{"class":1771},"bulk_create",[1053,8511,1109],{"class":1074},[1053,8513,8514],{"class":1771},"users",[1053,8516,1800],{"class":1074},[1053,8518,8519],{"class":1055,"line":5154},[1053,8520,4107],{"class":1095},[1053,8522,8523],{"class":1055,"line":5169},[1053,8524,8525],{"class":1059},"        # Test query performance\n",[1053,8527,8529,8532],{"class":1055,"line":8528},136,[1053,8530,8531],{"class":1140},"        import",[1053,8533,5208],{"class":1095},[1053,8535,8537,8539,8541,8543,8545,8547],{"class":1055,"line":8536},137,[1053,8538,5840],{"class":1095},[1053,8540,1756],{"class":1074},[1053,8542,5378],{"class":1095},[1053,8544,1762],{"class":1074},[1053,8546,5383],{"class":1771},[1053,8548,1821],{"class":1074},[1053,8550,8552],{"class":1055,"line":8551},138,[1053,8553,4107],{"class":1095},[1053,8555,8557,8560,8562,8565,8567,8569,8571,8573,8575,8577,8580,8583],{"class":1055,"line":8556},139,[1053,8558,8559],{"class":1095},"        user_list ",[1053,8561,1756],{"class":1074},[1053,8563,8564],{"class":1969}," list",[1053,8566,1109],{"class":1074},[1053,8568,6970],{"class":1771},[1053,8570,1762],{"class":1074},[1053,8572,1766],{"class":1765},[1053,8574,1762],{"class":1074},[1053,8576,1818],{"class":1771},[1053,8578,8579],{"class":1074},"()[:",[1053,8581,8582],{"class":2203},"20",[1053,8584,8585],{"class":1074},"])\n",[1053,8587,8589],{"class":1055,"line":8588},140,[1053,8590,4107],{"class":1095},[1053,8592,8594,8597,8599,8601,8603,8605],{"class":1055,"line":8593},141,[1053,8595,8596],{"class":1095},"        end_time ",[1053,8598,1756],{"class":1074},[1053,8600,5378],{"class":1095},[1053,8602,1762],{"class":1074},[1053,8604,5383],{"class":1771},[1053,8606,1821],{"class":1074},[1053,8608,8610,8613,8615,8618,8621],{"class":1055,"line":8609},142,[1053,8611,8612],{"class":1095},"        query_time ",[1053,8614,1756],{"class":1074},[1053,8616,8617],{"class":1095}," end_time ",[1053,8619,8620],{"class":3099},"-",[1053,8622,6052],{"class":1095},[1053,8624,8626],{"class":1055,"line":8625},143,[1053,8627,4107],{"class":1095},[1053,8629,8631],{"class":1055,"line":8630},144,[1053,8632,8633],{"class":1059},"        # Should complete within 100ms\n",[1053,8635,8637,8639,8641,8644,8646,8649,8651,8654],{"class":1055,"line":8636},145,[1053,8638,3459],{"class":1407},[1053,8640,1762],{"class":1074},[1053,8642,8643],{"class":1771},"assertLess",[1053,8645,1109],{"class":1074},[1053,8647,8648],{"class":1771},"query_time",[1053,8650,1116],{"class":1074},[1053,8652,8653],{"class":2203}," 0.1",[1053,8655,1800],{"class":1074},[1053,8657,8659,8661,8663,8665,8667,8670,8672,8675,8678,8681],{"class":1055,"line":8658},146,[1053,8660,3459],{"class":1407},[1053,8662,1762],{"class":1074},[1053,8664,7062],{"class":1771},[1053,8666,1109],{"class":1074},[1053,8668,8669],{"class":3423},"len",[1053,8671,1109],{"class":1074},[1053,8673,8674],{"class":1771},"user_list",[1053,8676,8677],{"class":1074},"),",[1053,8679,8680],{"class":2203}," 20",[1053,8682,1800],{"class":1074},[1053,8684,8686],{"class":1055,"line":8685},147,[1053,8687,1269],{"emptyLinePlaceholder":1268},[1053,8689,8691],{"class":1055,"line":8690},148,[1053,8692,8693],{"class":1059},"# Contract tests\n",[1053,8695,8697,8699,8702,8704,8706],{"class":1055,"line":8696},149,[1053,8698,1067],{"class":1066},[1053,8700,8701],{"class":1070}," UserContractTest",[1053,8703,1109],{"class":1074},[1053,8705,6810],{"class":2128},[1053,8707,1123],{"class":1074},[1053,8709,8711,8713,8716],{"class":1055,"line":8710},150,[1053,8712,1082],{"class":1081},[1053,8714,8715],{"class":1085},"Contract tests for API compatibility",[1053,8717,1089],{"class":1081},[1053,8719,8721],{"class":1055,"line":8720},151,[1053,8722,1096],{"class":1095},[1053,8724,8726,8728,8731,8733,8735],{"class":1055,"line":8725},152,[1053,8727,1102],{"class":1066},[1053,8729,8730],{"class":1105}," test_user_response_schema",[1053,8732,1109],{"class":1074},[1053,8734,1113],{"class":1112},[1053,8736,1123],{"class":1074},[1053,8738,8740,8742,8745],{"class":1055,"line":8739},153,[1053,8741,1129],{"class":1081},[1053,8743,8744],{"class":1085},"Test user response matches expected schema",[1053,8746,1089],{"class":1081},[1053,8748,8750,8752,8754,8756,8758,8760],{"class":1055,"line":8749},154,[1053,8751,7302],{"class":1095},[1053,8753,1756],{"class":1074},[1053,8755,4932],{"class":1407},[1053,8757,1762],{"class":1074},[1053,8759,6855],{"class":1771},[1053,8761,1821],{"class":1074},[1053,8763,8765],{"class":1055,"line":8764},155,[1053,8766,4107],{"class":1095},[1053,8768,8770,8773,8776,8779,8781],{"class":1055,"line":8769},156,[1053,8771,8772],{"class":1140},"        from",[1053,8774,8775],{"class":1074}," .",[1053,8777,8778],{"class":1095},"serializers ",[1053,8780,2104],{"class":1140},[1053,8782,8783],{"class":1095}," UserSerializer\n",[1053,8785,8787,8790,8792,8794,8796,8798],{"class":1055,"line":8786},157,[1053,8788,8789],{"class":1095},"        serializer ",[1053,8791,1756],{"class":1074},[1053,8793,2209],{"class":1771},[1053,8795,1109],{"class":1074},[1053,8797,6560],{"class":1771},[1053,8799,1800],{"class":1074},[1053,8801,8803,8806,8808,8811,8813],{"class":1055,"line":8802},158,[1053,8804,8805],{"class":1095},"        data ",[1053,8807,1756],{"class":1074},[1053,8809,8810],{"class":1095}," serializer",[1053,8812,1762],{"class":1074},[1053,8814,8815],{"class":1765},"data\n",[1053,8817,8819],{"class":1055,"line":8818},159,[1053,8820,4107],{"class":1095},[1053,8822,8824],{"class":1055,"line":8823},160,[1053,8825,8826],{"class":1059},"        # Verify required fields\n",[1053,8828,8830,8833,8835,8837,8839,8841,8843,8845,8847,8849,8851,8853,8855,8857,8859,8861,8863,8865,8867,8869,8871,8873,8875],{"class":1055,"line":8829},161,[1053,8831,8832],{"class":1095},"        required_fields ",[1053,8834,1756],{"class":1074},[1053,8836,2255],{"class":1074},[1053,8838,1427],{"class":1419},[1053,8840,1793],{"class":1423},[1053,8842,1427],{"class":1419},[1053,8844,1116],{"class":1074},[1053,8846,1447],{"class":1419},[1053,8848,2315],{"class":1423},[1053,8850,1427],{"class":1419},[1053,8852,1116],{"class":1074},[1053,8854,1447],{"class":1419},[1053,8856,2248],{"class":1423},[1053,8858,1427],{"class":1419},[1053,8860,1116],{"class":1074},[1053,8862,1447],{"class":1419},[1053,8864,2354],{"class":1423},[1053,8866,1427],{"class":1419},[1053,8868,1116],{"class":1074},[1053,8870,1447],{"class":1419},[1053,8872,2375],{"class":1423},[1053,8874,1427],{"class":1419},[1053,8876,6274],{"class":1074},[1053,8878,8880,8883,8886,8888,8891],{"class":1055,"line":8879},162,[1053,8881,8882],{"class":1140},"        for",[1053,8884,8885],{"class":1095}," field ",[1053,8887,8481],{"class":1140},[1053,8889,8890],{"class":1095}," required_fields",[1053,8892,1075],{"class":1074},[1053,8894,8896,8898,8900,8902,8904,8907,8909,8912],{"class":1055,"line":8895},163,[1053,8897,6531],{"class":1407},[1053,8899,1762],{"class":1074},[1053,8901,7085],{"class":1771},[1053,8903,1109],{"class":1074},[1053,8905,8906],{"class":1771},"field",[1053,8908,1116],{"class":1074},[1053,8910,8911],{"class":1771}," data",[1053,8913,1800],{"class":1074},[1053,8915,8917],{"class":1055,"line":8916},164,[1053,8918,4107],{"class":1095},[1053,8920,8922],{"class":1055,"line":8921},165,[1053,8923,8924],{"class":1059},"        # Verify field types\n",[1053,8926,8928,8930,8932,8935,8937,8939,8941,8943,8945,8947,8949,8952],{"class":1055,"line":8927},166,[1053,8929,3459],{"class":1407},[1053,8931,1762],{"class":1074},[1053,8933,8934],{"class":1771},"assertIsInstance",[1053,8936,1109],{"class":1074},[1053,8938,4533],{"class":1771},[1053,8940,4960],{"class":1074},[1053,8942,1427],{"class":1419},[1053,8944,1793],{"class":1423},[1053,8946,1427],{"class":1419},[1053,8948,7139],{"class":1074},[1053,8950,8951],{"class":1969}," int",[1053,8953,1800],{"class":1074},[1053,8955,8957,8959,8961,8963,8965,8967,8969,8971,8973,8975,8977,8979],{"class":1055,"line":8956},167,[1053,8958,3459],{"class":1407},[1053,8960,1762],{"class":1074},[1053,8962,8934],{"class":1771},[1053,8964,1109],{"class":1074},[1053,8966,4533],{"class":1771},[1053,8968,4960],{"class":1074},[1053,8970,1427],{"class":1419},[1053,8972,2315],{"class":1423},[1053,8974,1427],{"class":1419},[1053,8976,7139],{"class":1074},[1053,8978,3905],{"class":1969},[1053,8980,1800],{"class":1074},[1053,8982,8984,8986,8988,8990,8992,8994,8996,8998,9000,9002,9004,9006],{"class":1055,"line":8983},168,[1053,8985,3459],{"class":1407},[1053,8987,1762],{"class":1074},[1053,8989,8934],{"class":1771},[1053,8991,1109],{"class":1074},[1053,8993,4533],{"class":1771},[1053,8995,4960],{"class":1074},[1053,8997,1427],{"class":1419},[1053,8999,2248],{"class":1423},[1053,9001,1427],{"class":1419},[1053,9003,7139],{"class":1074},[1053,9005,3905],{"class":1969},[1053,9007,1800],{"class":1074},[1030,9009,9011],{"id":9010},"deployment-best-practices","Deployment Best Practices",[1035,9013,9015],{"id":9014},"_1-health-checks","1. Health Checks",[1026,9017,9018],{},"Implement comprehensive health checks:",[1043,9020,9022],{"className":1045,"code":9021,"language":1047,"meta":1048,"style":1048},"# health_checks.py\nfrom django.http import JsonResponse\nfrom django.db import connection\nfrom django.core.cache import cache\nfrom django.conf import settings\nimport time\nimport requests\n\nclass HealthChecker:\n    \"\"\"Comprehensive health check implementation\"\"\"\n    \n    def __init__(self):\n        self.checks = {\n            'database': self.check_database,\n            'cache': self.check_cache,\n            'external_services': self.check_external_services,\n            'disk_space': self.check_disk_space,\n            'memory': self.check_memory\n        }\n    \n    def check_all(self):\n        \"\"\"Run all health checks\"\"\"\n        results = {}\n        overall_healthy = True\n        \n        for check_name, check_func in self.checks.items():\n            try:\n                result = check_func()\n                results[check_name] = result\n                \n                if not result.get('healthy', False):\n                    overall_healthy = False\n                    \n            except Exception as e:\n                results[check_name] = {\n                    'healthy': False,\n                    'error': str(e)\n                }\n                overall_healthy = False\n        \n        return {\n            'healthy': overall_healthy,\n            'service': settings.SERVICE_NAME,\n            'version': settings.SERVICE_VERSION,\n            'timestamp': time.time(),\n            'checks': results\n        }\n    \n    def check_database(self):\n        \"\"\"Check database connectivity\"\"\"\n        try:\n            with connection.cursor() as cursor:\n                cursor.execute(\"SELECT 1\")\n                result = cursor.fetchone()\n            \n            return {\n                'healthy': True,\n                'response_time_ms': 0  # Could measure actual response time\n            }\n            \n        except Exception as e:\n            return {\n                'healthy': False,\n                'error': str(e)\n            }\n    \n    def check_cache(self):\n        \"\"\"Check cache connectivity\"\"\"\n        try:\n            test_key = f\"health_check_{int(time.time())}\"\n            test_value = \"health_check_value\"\n            \n            # Test set and get\n            cache.set(test_key, test_value, timeout=60)\n            retrieved_value = cache.get(test_key)\n            cache.delete(test_key)\n            \n            if retrieved_value != test_value:\n                return {\n                    'healthy': False,\n                    'error': 'Cache value mismatch'\n                }\n            \n            return {\n                'healthy': True,\n                'response_time_ms': 0\n            }\n            \n        except Exception as e:\n            return {\n                'healthy': False,\n                'error': str(e)\n            }\n    \n    def check_external_services(self):\n        \"\"\"Check external service dependencies\"\"\"\n        external_services = getattr(settings, 'EXTERNAL_SERVICES', {})\n        service_results = {}\n        \n        for service_name, service_url in external_services.items():\n            try:\n                response = requests.get(\n                    f\"{service_url}/health/\",\n                    timeout=5\n                )\n                \n                service_results[service_name] = {\n                    'healthy': response.status_code == 200,\n                    'status_code': response.status_code,\n                    'response_time_ms': response.elapsed.total_seconds() * 1000\n                }\n                \n            except requests.RequestException as e:\n                service_results[service_name] = {\n                    'healthy': False,\n                    'error': str(e)\n                }\n        \n        overall_healthy = all(\n            result['healthy'] for result in service_results.values()\n        )\n        \n        return {\n            'healthy': overall_healthy,\n            'services': service_results\n        }\n    \n    def check_disk_space(self):\n        \"\"\"Check available disk space\"\"\"\n        try:\n            import shutil\n            \n            total, used, free = shutil.disk_usage('/')\n            free_percentage = (free / total) * 100\n            \n            return {\n                'healthy': free_percentage > 10,  # Alert if less than 10% free\n                'free_percentage': free_percentage,\n                'free_bytes': free,\n                'total_bytes': total\n            }\n            \n        except Exception as e:\n            return {\n                'healthy': False,\n                'error': str(e)\n            }\n    \n    def check_memory(self):\n        \"\"\"Check memory usage\"\"\"\n        try:\n            import psutil\n            \n            memory = psutil.virtual_memory()\n            \n            return {\n                'healthy': memory.percent \u003C 90,  # Alert if more than 90% used\n                'used_percentage': memory.percent,\n                'available_bytes': memory.available,\n                'total_bytes': memory.total\n            }\n            \n        except Exception as e:\n            return {\n                'healthy': False,\n                'error': str(e)\n            }\n\n# Health check views\nhealth_checker = HealthChecker()\n\ndef health_check(request):\n    \"\"\"Basic health check endpoint\"\"\"\n    result = health_checker.check_all()\n    status_code = 200 if result['healthy'] else 503\n    \n    return JsonResponse(result, status=status_code)\n\ndef readiness_check(request):\n    \"\"\"Readiness check for Kubernetes\"\"\"\n    # Check if service is ready to receive traffic\n    result = health_checker.check_all()\n    \n    # Service is ready if database and cache are healthy\n    ready = (\n        result['checks'].get('database', {}).get('healthy', False) and\n        result['checks'].get('cache', {}).get('healthy', False)\n    )\n    \n    status_code = 200 if ready else 503\n    \n    return JsonResponse({\n        'ready': ready,\n        'service': settings.SERVICE_NAME,\n        'timestamp': time.time()\n    }, status=status_code)\n\ndef liveness_check(request):\n    \"\"\"Liveness check for Kubernetes\"\"\"\n    # Simple check to see if the service is alive\n    return JsonResponse({\n        'alive': True,\n        'service': settings.SERVICE_NAME,\n        'timestamp': time.time()\n    })\n",[1050,9023,9024,9029,9045,9061,9082,9096,9102,9109,9113,9122,9131,9135,9147,9160,9180,9200,9220,9240,9258,9262,9266,9279,9288,9297,9307,9311,9338,9345,9357,9375,9380,9409,9419,9424,9437,9451,9465,9483,9487,9496,9500,9506,9521,9539,9557,9575,9588,9592,9596,9609,9618,9624,9646,9667,9682,9686,9692,9706,9723,9727,9731,9743,9749,9763,9781,9785,9789,9802,9811,9817,9850,9865,9869,9874,9906,9926,9941,9945,9959,9966,9980,9997,10001,10005,10011,10025,10038,10042,10046,10058,10064,10078,10096,10100,10104,10117,10126,10155,10164,10168,10190,10196,10212,10231,10241,10245,10249,10264,10286,10304,10334,10338,10342,10359,10373,10387,10405,10409,10413,10424,10457,10461,10465,10471,10485,10499,10503,10507,10520,10529,10535,10543,10547,10583,10608,10612,10618,10642,10658,10674,10688,10692,10696,10708,10714,10728,10746,10750,10754,10767,10776,10782,10789,10793,10810,10814,10820,10849,10868,10888,10905,10909,10913,10925,10931,10945,10963,10967,10971,10977,10989,10994,11008,11018,11036,11065,11070,11093,11098,11112,11122,11128,11143,11148,11154,11165,11216,11261,11266,11271,11290,11295,11305,11322,11341,11360,11374,11379,11393,11403,11409,11418,11434,11453,11472],{"__ignoreMap":1048},[1053,9025,9026],{"class":1055,"line":1056},[1053,9027,9028],{"class":1059},"# health_checks.py\n",[1053,9030,9031,9033,9035,9037,9040,9042],{"class":1055,"line":1063},[1053,9032,2093],{"class":1140},[1053,9034,5215],{"class":1095},[1053,9036,1762],{"class":1074},[1053,9038,9039],{"class":1095},"http ",[1053,9041,2104],{"class":1140},[1053,9043,9044],{"class":1095}," JsonResponse\n",[1053,9046,9047,9049,9051,9053,9056,9058],{"class":1055,"line":1078},[1053,9048,2093],{"class":1140},[1053,9050,5215],{"class":1095},[1053,9052,1762],{"class":1074},[1053,9054,9055],{"class":1095},"db ",[1053,9057,2104],{"class":1140},[1053,9059,9060],{"class":1095}," connection\n",[1053,9062,9063,9065,9067,9069,9072,9074,9077,9079],{"class":1055,"line":1092},[1053,9064,2093],{"class":1140},[1053,9066,5215],{"class":1095},[1053,9068,1762],{"class":1074},[1053,9070,9071],{"class":1095},"core",[1053,9073,1762],{"class":1074},[1053,9075,9076],{"class":1095},"cache ",[1053,9078,2104],{"class":1140},[1053,9080,9081],{"class":1095}," cache\n",[1053,9083,9084,9086,9088,9090,9092,9094],{"class":1055,"line":1099},[1053,9085,2093],{"class":1140},[1053,9087,5215],{"class":1095},[1053,9089,1762],{"class":1074},[1053,9091,5241],{"class":1095},[1053,9093,2104],{"class":1140},[1053,9095,5246],{"class":1095},[1053,9097,9098,9100],{"class":1055,"line":1126},[1053,9099,2104],{"class":1140},[1053,9101,5208],{"class":1095},[1053,9103,9104,9106],{"class":1055,"line":1137},[1053,9105,2104],{"class":1140},[1053,9107,9108],{"class":1095}," requests\n",[1053,9110,9111],{"class":1055,"line":1144},[1053,9112,1269],{"emptyLinePlaceholder":1268},[1053,9114,9115,9117,9120],{"class":1055,"line":1149},[1053,9116,1067],{"class":1066},[1053,9118,9119],{"class":1070}," HealthChecker",[1053,9121,1075],{"class":1074},[1053,9123,9124,9126,9129],{"class":1055,"line":1168},[1053,9125,1082],{"class":1081},[1053,9127,9128],{"class":1085},"Comprehensive health check implementation",[1053,9130,1089],{"class":1081},[1053,9132,9133],{"class":1055,"line":1178},[1053,9134,1096],{"class":1095},[1053,9136,9137,9139,9141,9143,9145],{"class":1055,"line":1183},[1053,9138,1102],{"class":1066},[1053,9140,3424],{"class":3423},[1053,9142,1109],{"class":1074},[1053,9144,1113],{"class":1112},[1053,9146,1123],{"class":1074},[1053,9148,9149,9151,9153,9156,9158],{"class":1055,"line":1188},[1053,9150,3459],{"class":1407},[1053,9152,1762],{"class":1074},[1053,9154,9155],{"class":1765},"checks",[1053,9157,1411],{"class":1074},[1053,9159,1414],{"class":1074},[1053,9161,9162,9164,9167,9169,9171,9173,9175,9178],{"class":1055,"line":1212},[1053,9163,3070],{"class":1419},[1053,9165,9166],{"class":1423},"database",[1053,9168,1427],{"class":1419},[1053,9170,1430],{"class":1074},[1053,9172,4932],{"class":1407},[1053,9174,1762],{"class":1074},[1053,9176,9177],{"class":1765},"check_database",[1053,9179,1455],{"class":1074},[1053,9181,9182,9184,9187,9189,9191,9193,9195,9198],{"class":1055,"line":1222},[1053,9183,3070],{"class":1419},[1053,9185,9186],{"class":1423},"cache",[1053,9188,1427],{"class":1419},[1053,9190,1430],{"class":1074},[1053,9192,4932],{"class":1407},[1053,9194,1762],{"class":1074},[1053,9196,9197],{"class":1765},"check_cache",[1053,9199,1455],{"class":1074},[1053,9201,9202,9204,9207,9209,9211,9213,9215,9218],{"class":1055,"line":1227},[1053,9203,3070],{"class":1419},[1053,9205,9206],{"class":1423},"external_services",[1053,9208,1427],{"class":1419},[1053,9210,1430],{"class":1074},[1053,9212,4932],{"class":1407},[1053,9214,1762],{"class":1074},[1053,9216,9217],{"class":1765},"check_external_services",[1053,9219,1455],{"class":1074},[1053,9221,9222,9224,9227,9229,9231,9233,9235,9238],{"class":1055,"line":1232},[1053,9223,3070],{"class":1419},[1053,9225,9226],{"class":1423},"disk_space",[1053,9228,1427],{"class":1419},[1053,9230,1430],{"class":1074},[1053,9232,4932],{"class":1407},[1053,9234,1762],{"class":1074},[1053,9236,9237],{"class":1765},"check_disk_space",[1053,9239,1455],{"class":1074},[1053,9241,9242,9244,9247,9249,9251,9253,9255],{"class":1055,"line":1250},[1053,9243,3070],{"class":1419},[1053,9245,9246],{"class":1423},"memory",[1053,9248,1427],{"class":1419},[1053,9250,1430],{"class":1074},[1053,9252,4932],{"class":1407},[1053,9254,1762],{"class":1074},[1053,9256,9257],{"class":1765},"check_memory\n",[1053,9259,9260],{"class":1055,"line":1260},[1053,9261,4101],{"class":1074},[1053,9263,9264],{"class":1055,"line":1265},[1053,9265,1096],{"class":1095},[1053,9267,9268,9270,9273,9275,9277],{"class":1055,"line":1272},[1053,9269,1102],{"class":1066},[1053,9271,9272],{"class":1105}," check_all",[1053,9274,1109],{"class":1074},[1053,9276,1113],{"class":1112},[1053,9278,1123],{"class":1074},[1053,9280,9281,9283,9286],{"class":1055,"line":1278},[1053,9282,1129],{"class":1081},[1053,9284,9285],{"class":1085},"Run all health checks",[1053,9287,1089],{"class":1081},[1053,9289,9290,9293,9295],{"class":1055,"line":1288},[1053,9291,9292],{"class":1095},"        results ",[1053,9294,1756],{"class":1074},[1053,9296,3512],{"class":1074},[1053,9298,9299,9302,9304],{"class":1055,"line":1298},[1053,9300,9301],{"class":1095},"        overall_healthy ",[1053,9303,1756],{"class":1074},[1053,9305,9306],{"class":2530}," True\n",[1053,9308,9309],{"class":1055,"line":1303},[1053,9310,4107],{"class":1095},[1053,9312,9313,9315,9318,9320,9323,9325,9327,9329,9331,9333,9336],{"class":1055,"line":1320},[1053,9314,8882],{"class":1140},[1053,9316,9317],{"class":1095}," check_name",[1053,9319,1116],{"class":1074},[1053,9321,9322],{"class":1095}," check_func ",[1053,9324,8481],{"class":1140},[1053,9326,4932],{"class":1407},[1053,9328,1762],{"class":1074},[1053,9330,9155],{"class":1765},[1053,9332,1762],{"class":1074},[1053,9334,9335],{"class":1771},"items",[1053,9337,4864],{"class":1074},[1053,9339,9340,9343],{"class":1055,"line":1325},[1053,9341,9342],{"class":1140},"            try",[1053,9344,1075],{"class":1074},[1053,9346,9347,9350,9352,9355],{"class":1055,"line":1330},[1053,9348,9349],{"class":1095},"                result ",[1053,9351,1756],{"class":1074},[1053,9353,9354],{"class":1771}," check_func",[1053,9356,1821],{"class":1074},[1053,9358,9359,9362,9364,9367,9370,9372],{"class":1055,"line":1349},[1053,9360,9361],{"class":1095},"                results",[1053,9363,4960],{"class":1074},[1053,9365,9366],{"class":1095},"check_name",[1053,9368,9369],{"class":1074},"]",[1053,9371,1411],{"class":1074},[1053,9373,9374],{"class":1095}," result\n",[1053,9376,9377],{"class":1055,"line":1354},[1053,9378,9379],{"class":1095},"                \n",[1053,9381,9382,9385,9387,9390,9392,9394,9396,9398,9401,9403,9405,9407],{"class":1055,"line":1359},[1053,9383,9384],{"class":1140},"                if",[1053,9386,4396],{"class":3099},[1053,9388,9389],{"class":1095}," result",[1053,9391,1762],{"class":1074},[1053,9393,1787],{"class":1771},[1053,9395,1109],{"class":1074},[1053,9397,1427],{"class":1419},[1053,9399,9400],{"class":1423},"healthy",[1053,9402,1427],{"class":1419},[1053,9404,1116],{"class":1074},[1053,9406,3037],{"class":2530},[1053,9408,1123],{"class":1074},[1053,9410,9411,9414,9416],{"class":1055,"line":1378},[1053,9412,9413],{"class":1095},"                    overall_healthy ",[1053,9415,1756],{"class":1074},[1053,9417,9418],{"class":2530}," False\n",[1053,9420,9421],{"class":1055,"line":1828},[1053,9422,9423],{"class":1095},"                    \n",[1053,9425,9426,9429,9431,9433,9435],{"class":1055,"line":1834},[1053,9427,9428],{"class":1140},"            except",[1053,9430,5093],{"class":1969},[1053,9432,5096],{"class":1140},[1053,9434,5099],{"class":1095},[1053,9436,1075],{"class":1074},[1053,9438,9439,9441,9443,9445,9447,9449],{"class":1055,"line":1847},[1053,9440,9361],{"class":1095},[1053,9442,4960],{"class":1074},[1053,9444,9366],{"class":1095},[1053,9446,9369],{"class":1074},[1053,9448,1411],{"class":1074},[1053,9450,1414],{"class":1074},[1053,9452,9453,9455,9457,9459,9461,9463],{"class":1055,"line":1853},[1053,9454,2312],{"class":1419},[1053,9456,9400],{"class":1423},[1053,9458,1427],{"class":1419},[1053,9460,1430],{"class":1074},[1053,9462,3037],{"class":2530},[1053,9464,1455],{"class":1074},[1053,9466,9467,9469,9471,9473,9475,9477,9479,9481],{"class":1055,"line":1875},[1053,9468,2312],{"class":1419},[1053,9470,3959],{"class":1423},[1053,9472,1427],{"class":1419},[1053,9474,1430],{"class":1074},[1053,9476,3905],{"class":1969},[1053,9478,1109],{"class":1074},[1053,9480,6649],{"class":1771},[1053,9482,1800],{"class":1074},[1053,9484,9485],{"class":1055,"line":1912},[1053,9486,2393],{"class":1074},[1053,9488,9489,9492,9494],{"class":1055,"line":1917},[1053,9490,9491],{"class":1095},"                overall_healthy ",[1053,9493,1756],{"class":1074},[1053,9495,9418],{"class":2530},[1053,9497,9498],{"class":1055,"line":1927},[1053,9499,4107],{"class":1095},[1053,9501,9502,9504],{"class":1055,"line":1955},[1053,9503,1930],{"class":1140},[1053,9505,1414],{"class":1074},[1053,9507,9508,9510,9512,9514,9516,9519],{"class":1055,"line":1963},[1053,9509,3070],{"class":1419},[1053,9511,9400],{"class":1423},[1053,9513,1427],{"class":1419},[1053,9515,1430],{"class":1074},[1053,9517,9518],{"class":1095}," overall_healthy",[1053,9520,1455],{"class":1074},[1053,9522,9523,9525,9527,9529,9531,9533,9535,9537],{"class":1055,"line":2370},[1053,9524,3070],{"class":1419},[1053,9526,4048],{"class":1423},[1053,9528,1427],{"class":1419},[1053,9530,1430],{"class":1074},[1053,9532,4055],{"class":1095},[1053,9534,1762],{"class":1074},[1053,9536,2899],{"class":4060},[1053,9538,1455],{"class":1074},[1053,9540,9541,9543,9545,9547,9549,9551,9553,9555],{"class":1055,"line":2390},[1053,9542,3070],{"class":1419},[1053,9544,3014],{"class":1423},[1053,9546,1427],{"class":1419},[1053,9548,1430],{"class":1074},[1053,9550,4055],{"class":1095},[1053,9552,1762],{"class":1074},[1053,9554,2930],{"class":4060},[1053,9556,1455],{"class":1074},[1053,9558,9559,9561,9563,9565,9567,9569,9571,9573],{"class":1055,"line":2396},[1053,9560,3070],{"class":1419},[1053,9562,4070],{"class":1423},[1053,9564,1427],{"class":1419},[1053,9566,1430],{"class":1074},[1053,9568,5378],{"class":1095},[1053,9570,1762],{"class":1074},[1053,9572,5383],{"class":1771},[1053,9574,5386],{"class":1074},[1053,9576,9577,9579,9581,9583,9585],{"class":1055,"line":2401},[1053,9578,3070],{"class":1419},[1053,9580,9155],{"class":1423},[1053,9582,1427],{"class":1419},[1053,9584,1430],{"class":1074},[1053,9586,9587],{"class":1095}," results\n",[1053,9589,9590],{"class":1055,"line":2407},[1053,9591,4101],{"class":1074},[1053,9593,9594],{"class":1055,"line":2413},[1053,9595,1096],{"class":1095},[1053,9597,9598,9600,9603,9605,9607],{"class":1055,"line":2432},[1053,9599,1102],{"class":1066},[1053,9601,9602],{"class":1105}," check_database",[1053,9604,1109],{"class":1074},[1053,9606,1113],{"class":1112},[1053,9608,1123],{"class":1074},[1053,9610,9611,9613,9616],{"class":1055,"line":3280},[1053,9612,1129],{"class":1081},[1053,9614,9615],{"class":1085},"Check database connectivity",[1053,9617,1089],{"class":1081},[1053,9619,9620,9622],{"class":1055,"line":3968},[1053,9621,4807],{"class":1140},[1053,9623,1075],{"class":1074},[1053,9625,9626,9629,9632,9634,9637,9639,9641,9644],{"class":1055,"line":3988},[1053,9627,9628],{"class":1140},"            with",[1053,9630,9631],{"class":1095}," connection",[1053,9633,1762],{"class":1074},[1053,9635,9636],{"class":1771},"cursor",[1053,9638,6046],{"class":1074},[1053,9640,5096],{"class":1140},[1053,9642,9643],{"class":1095}," cursor",[1053,9645,1075],{"class":1074},[1053,9647,9648,9651,9653,9656,9658,9660,9663,9665],{"class":1055,"line":4007},[1053,9649,9650],{"class":1095},"                cursor",[1053,9652,1762],{"class":1074},[1053,9654,9655],{"class":1771},"execute",[1053,9657,1109],{"class":1074},[1053,9659,1975],{"class":1419},[1053,9661,9662],{"class":1423},"SELECT 1",[1053,9664,1975],{"class":1419},[1053,9666,1800],{"class":1074},[1053,9668,9669,9671,9673,9675,9677,9680],{"class":1055,"line":4026},[1053,9670,9349],{"class":1095},[1053,9672,1756],{"class":1074},[1053,9674,9643],{"class":1095},[1053,9676,1762],{"class":1074},[1053,9678,9679],{"class":1771},"fetchone",[1053,9681,1821],{"class":1074},[1053,9683,9684],{"class":1055,"line":4043},[1053,9685,4915],{"class":1095},[1053,9687,9688,9690],{"class":1055,"line":4065},[1053,9689,5049],{"class":1140},[1053,9691,1414],{"class":1074},[1053,9693,9694,9696,9698,9700,9702,9704],{"class":1055,"line":4092},[1053,9695,2228],{"class":1419},[1053,9697,9400],{"class":1423},[1053,9699,1427],{"class":1419},[1053,9701,1430],{"class":1074},[1053,9703,7946],{"class":2530},[1053,9705,1455],{"class":1074},[1053,9707,9708,9710,9713,9715,9717,9720],{"class":1055,"line":4098},[1053,9709,2228],{"class":1419},[1053,9711,9712],{"class":1423},"response_time_ms",[1053,9714,1427],{"class":1419},[1053,9716,1430],{"class":1074},[1053,9718,9719],{"class":2203}," 0",[1053,9721,9722],{"class":1059},"  # Could measure actual response time\n",[1053,9724,9725],{"class":1055,"line":4104},[1053,9726,4095],{"class":1074},[1053,9728,9729],{"class":1055,"line":4110},[1053,9730,4915],{"class":1095},[1053,9732,9733,9735,9737,9739,9741],{"class":1055,"line":4116},[1053,9734,5072],{"class":1140},[1053,9736,5093],{"class":1969},[1053,9738,5096],{"class":1140},[1053,9740,5099],{"class":1095},[1053,9742,1075],{"class":1074},[1053,9744,9745,9747],{"class":1055,"line":4161},[1053,9746,5049],{"class":1140},[1053,9748,1414],{"class":1074},[1053,9750,9751,9753,9755,9757,9759,9761],{"class":1055,"line":4180},[1053,9752,2228],{"class":1419},[1053,9754,9400],{"class":1423},[1053,9756,1427],{"class":1419},[1053,9758,1430],{"class":1074},[1053,9760,3037],{"class":2530},[1053,9762,1455],{"class":1074},[1053,9764,9765,9767,9769,9771,9773,9775,9777,9779],{"class":1055,"line":4199},[1053,9766,2228],{"class":1419},[1053,9768,3959],{"class":1423},[1053,9770,1427],{"class":1419},[1053,9772,1430],{"class":1074},[1053,9774,3905],{"class":1969},[1053,9776,1109],{"class":1074},[1053,9778,6649],{"class":1771},[1053,9780,1800],{"class":1074},[1053,9782,9783],{"class":1055,"line":4213},[1053,9784,4095],{"class":1074},[1053,9786,9787],{"class":1055,"line":4219},[1053,9788,1096],{"class":1095},[1053,9790,9791,9793,9796,9798,9800],{"class":1055,"line":4224},[1053,9792,1102],{"class":1066},[1053,9794,9795],{"class":1105}," check_cache",[1053,9797,1109],{"class":1074},[1053,9799,1113],{"class":1112},[1053,9801,1123],{"class":1074},[1053,9803,9804,9806,9809],{"class":1055,"line":4230},[1053,9805,1129],{"class":1081},[1053,9807,9808],{"class":1085},"Check cache connectivity",[1053,9810,1089],{"class":1081},[1053,9812,9813,9815],{"class":1055,"line":4246},[1053,9814,4807],{"class":1140},[1053,9816,1075],{"class":1074},[1053,9818,9819,9822,9824,9827,9830,9832,9835,9837,9839,9841,9843,9846,9848],{"class":1055,"line":4269},[1053,9820,9821],{"class":1095},"            test_key ",[1053,9823,1756],{"class":1074},[1053,9825,9826],{"class":1066}," f",[1053,9828,9829],{"class":1423},"\"health_check_",[1053,9831,1899],{"class":1898},[1053,9833,9834],{"class":1969},"int",[1053,9836,1109],{"class":1074},[1053,9838,5383],{"class":1771},[1053,9840,1762],{"class":1074},[1053,9842,5383],{"class":1771},[1053,9844,9845],{"class":1074},"())",[1053,9847,1904],{"class":1898},[1053,9849,4903],{"class":1423},[1053,9851,9852,9855,9857,9860,9863],{"class":1055,"line":4284},[1053,9853,9854],{"class":1095},"            test_value ",[1053,9856,1756],{"class":1074},[1053,9858,9859],{"class":1419}," \"",[1053,9861,9862],{"class":1423},"health_check_value",[1053,9864,4903],{"class":1419},[1053,9866,9867],{"class":1055,"line":4306},[1053,9868,4915],{"class":1095},[1053,9870,9871],{"class":1055,"line":4320},[1053,9872,9873],{"class":1059},"            # Test set and get\n",[1053,9875,9876,9879,9881,9884,9886,9889,9891,9894,9896,9899,9901,9904],{"class":1055,"line":4325},[1053,9877,9878],{"class":1095},"            cache",[1053,9880,1762],{"class":1074},[1053,9882,9883],{"class":1771},"set",[1053,9885,1109],{"class":1074},[1053,9887,9888],{"class":1771},"test_key",[1053,9890,1116],{"class":1074},[1053,9892,9893],{"class":1771}," test_value",[1053,9895,1116],{"class":1074},[1053,9897,9898],{"class":1792}," timeout",[1053,9900,1756],{"class":1074},[1053,9902,9903],{"class":2203},"60",[1053,9905,1800],{"class":1074},[1053,9907,9908,9911,9913,9916,9918,9920,9922,9924],{"class":1055,"line":4348},[1053,9909,9910],{"class":1095},"            retrieved_value ",[1053,9912,1756],{"class":1074},[1053,9914,9915],{"class":1095}," cache",[1053,9917,1762],{"class":1074},[1053,9919,1787],{"class":1771},[1053,9921,1109],{"class":1074},[1053,9923,9888],{"class":1771},[1053,9925,1800],{"class":1074},[1053,9927,9928,9930,9932,9935,9937,9939],{"class":1055,"line":4353},[1053,9929,9878],{"class":1095},[1053,9931,1762],{"class":1074},[1053,9933,9934],{"class":1771},"delete",[1053,9936,1109],{"class":1074},[1053,9938,9888],{"class":1771},[1053,9940,1800],{"class":1074},[1053,9942,9943],{"class":1055,"line":4359},[1053,9944,4915],{"class":1095},[1053,9946,9947,9949,9952,9955,9957],{"class":1055,"line":4380},[1053,9948,4821],{"class":1140},[1053,9950,9951],{"class":1095}," retrieved_value ",[1053,9953,9954],{"class":3099},"!=",[1053,9956,9893],{"class":1095},[1053,9958,1075],{"class":1074},[1053,9960,9961,9964],{"class":1055,"line":4385},[1053,9962,9963],{"class":1140},"                return",[1053,9965,1414],{"class":1074},[1053,9967,9968,9970,9972,9974,9976,9978],{"class":1055,"line":4404},[1053,9969,2312],{"class":1419},[1053,9971,9400],{"class":1423},[1053,9973,1427],{"class":1419},[1053,9975,1430],{"class":1074},[1053,9977,3037],{"class":2530},[1053,9979,1455],{"class":1074},[1053,9981,9982,9984,9986,9988,9990,9992,9995],{"class":1055,"line":4410},[1053,9983,2312],{"class":1419},[1053,9985,3959],{"class":1423},[1053,9987,1427],{"class":1419},[1053,9989,1430],{"class":1074},[1053,9991,1447],{"class":1419},[1053,9993,9994],{"class":1423},"Cache value mismatch",[1053,9996,2387],{"class":1419},[1053,9998,9999],{"class":1055,"line":4420},[1053,10000,2393],{"class":1074},[1053,10002,10003],{"class":1055,"line":4433},[1053,10004,4915],{"class":1095},[1053,10006,10007,10009],{"class":1055,"line":4477},[1053,10008,5049],{"class":1140},[1053,10010,1414],{"class":1074},[1053,10012,10013,10015,10017,10019,10021,10023],{"class":1055,"line":4518},[1053,10014,2228],{"class":1419},[1053,10016,9400],{"class":1423},[1053,10018,1427],{"class":1419},[1053,10020,1430],{"class":1074},[1053,10022,7946],{"class":2530},[1053,10024,1455],{"class":1074},[1053,10026,10027,10029,10031,10033,10035],{"class":1055,"line":4538},[1053,10028,2228],{"class":1419},[1053,10030,9712],{"class":1423},[1053,10032,1427],{"class":1419},[1053,10034,1430],{"class":1074},[1053,10036,10037],{"class":2203}," 0\n",[1053,10039,10040],{"class":1055,"line":4553},[1053,10041,4095],{"class":1074},[1053,10043,10044],{"class":1055,"line":4572},[1053,10045,4915],{"class":1095},[1053,10047,10048,10050,10052,10054,10056],{"class":1055,"line":4595},[1053,10049,5072],{"class":1140},[1053,10051,5093],{"class":1969},[1053,10053,5096],{"class":1140},[1053,10055,5099],{"class":1095},[1053,10057,1075],{"class":1074},[1053,10059,10060,10062],{"class":1055,"line":4600},[1053,10061,5049],{"class":1140},[1053,10063,1414],{"class":1074},[1053,10065,10066,10068,10070,10072,10074,10076],{"class":1055,"line":4605},[1053,10067,2228],{"class":1419},[1053,10069,9400],{"class":1423},[1053,10071,1427],{"class":1419},[1053,10073,1430],{"class":1074},[1053,10075,3037],{"class":2530},[1053,10077,1455],{"class":1074},[1053,10079,10080,10082,10084,10086,10088,10090,10092,10094],{"class":1055,"line":4610},[1053,10081,2228],{"class":1419},[1053,10083,3959],{"class":1423},[1053,10085,1427],{"class":1419},[1053,10087,1430],{"class":1074},[1053,10089,3905],{"class":1969},[1053,10091,1109],{"class":1074},[1053,10093,6649],{"class":1771},[1053,10095,1800],{"class":1074},[1053,10097,10098],{"class":1055,"line":4615},[1053,10099,4095],{"class":1074},[1053,10101,10102],{"class":1055,"line":4659},[1053,10103,1096],{"class":1095},[1053,10105,10106,10108,10111,10113,10115],{"class":1055,"line":4678},[1053,10107,1102],{"class":1066},[1053,10109,10110],{"class":1105}," check_external_services",[1053,10112,1109],{"class":1074},[1053,10114,1113],{"class":1112},[1053,10116,1123],{"class":1074},[1053,10118,10119,10121,10124],{"class":1055,"line":4697},[1053,10120,1129],{"class":1081},[1053,10122,10123],{"class":1085},"Check external service dependencies",[1053,10125,1089],{"class":1081},[1053,10127,10128,10131,10133,10136,10138,10141,10143,10145,10148,10150,10152],{"class":1055,"line":4710},[1053,10129,10130],{"class":1095},"        external_services ",[1053,10132,1756],{"class":1074},[1053,10134,10135],{"class":3423}," getattr",[1053,10137,1109],{"class":1074},[1053,10139,10140],{"class":1771},"settings",[1053,10142,1116],{"class":1074},[1053,10144,1447],{"class":1419},[1053,10146,10147],{"class":1423},"EXTERNAL_SERVICES",[1053,10149,1427],{"class":1419},[1053,10151,1116],{"class":1074},[1053,10153,10154],{"class":1074}," {})\n",[1053,10156,10157,10160,10162],{"class":1055,"line":4715},[1053,10158,10159],{"class":1095},"        service_results ",[1053,10161,1756],{"class":1074},[1053,10163,3512],{"class":1074},[1053,10165,10166],{"class":1055,"line":4720},[1053,10167,4107],{"class":1095},[1053,10169,10170,10172,10174,10176,10179,10181,10184,10186,10188],{"class":1055,"line":4735},[1053,10171,8882],{"class":1140},[1053,10173,3774],{"class":1095},[1053,10175,1116],{"class":1074},[1053,10177,10178],{"class":1095}," service_url ",[1053,10180,8481],{"class":1140},[1053,10182,10183],{"class":1095}," external_services",[1053,10185,1762],{"class":1074},[1053,10187,9335],{"class":1771},[1053,10189,4864],{"class":1074},[1053,10191,10192,10194],{"class":1055,"line":4740},[1053,10193,9342],{"class":1140},[1053,10195,1075],{"class":1074},[1053,10197,10198,10201,10203,10206,10208,10210],{"class":1055,"line":4748},[1053,10199,10200],{"class":1095},"                response ",[1053,10202,1756],{"class":1074},[1053,10204,10205],{"class":1095}," requests",[1053,10207,1762],{"class":1074},[1053,10209,1787],{"class":1771},[1053,10211,2146],{"class":1074},[1053,10213,10214,10217,10219,10221,10224,10226,10229],{"class":1055,"line":4753},[1053,10215,10216],{"class":1066},"                    f",[1053,10218,1975],{"class":1423},[1053,10220,1899],{"class":1898},[1053,10222,10223],{"class":1771},"service_url",[1053,10225,1904],{"class":1898},[1053,10227,10228],{"class":1423},"/health/\"",[1053,10230,1455],{"class":1074},[1053,10232,10233,10236,10238],{"class":1055,"line":4759},[1053,10234,10235],{"class":1792},"                    timeout",[1053,10237,1756],{"class":1074},[1053,10239,10240],{"class":2203},"5\n",[1053,10242,10243],{"class":1055,"line":4772},[1053,10244,4909],{"class":1074},[1053,10246,10247],{"class":1055,"line":4777},[1053,10248,9379],{"class":1095},[1053,10250,10251,10254,10256,10258,10260,10262],{"class":1055,"line":4794},[1053,10252,10253],{"class":1095},"                service_results",[1053,10255,4960],{"class":1074},[1053,10257,3828],{"class":1095},[1053,10259,9369],{"class":1074},[1053,10261,1411],{"class":1074},[1053,10263,1414],{"class":1074},[1053,10265,10266,10268,10270,10272,10274,10276,10278,10280,10282,10284],{"class":1055,"line":4804},[1053,10267,2312],{"class":1419},[1053,10269,9400],{"class":1423},[1053,10271,1427],{"class":1419},[1053,10273,1430],{"class":1074},[1053,10275,4453],{"class":1095},[1053,10277,1762],{"class":1074},[1053,10279,3841],{"class":1765},[1053,10281,4258],{"class":3099},[1053,10283,7795],{"class":2203},[1053,10285,1455],{"class":1074},[1053,10287,10288,10290,10292,10294,10296,10298,10300,10302],{"class":1055,"line":4812},[1053,10289,2312],{"class":1419},[1053,10291,3841],{"class":1423},[1053,10293,1427],{"class":1419},[1053,10295,1430],{"class":1074},[1053,10297,4453],{"class":1095},[1053,10299,1762],{"class":1074},[1053,10301,3841],{"class":1765},[1053,10303,1455],{"class":1074},[1053,10305,10306,10308,10310,10312,10314,10316,10318,10321,10323,10326,10328,10331],{"class":1055,"line":4818},[1053,10307,2312],{"class":1419},[1053,10309,9712],{"class":1423},[1053,10311,1427],{"class":1419},[1053,10313,1430],{"class":1074},[1053,10315,4453],{"class":1095},[1053,10317,1762],{"class":1074},[1053,10319,10320],{"class":1765},"elapsed",[1053,10322,1762],{"class":1074},[1053,10324,10325],{"class":1771},"total_seconds",[1053,10327,6046],{"class":1074},[1053,10329,10330],{"class":3099}," *",[1053,10332,10333],{"class":2203}," 1000\n",[1053,10335,10336],{"class":1055,"line":4867},[1053,10337,2393],{"class":1074},[1053,10339,10340],{"class":1055,"line":4877},[1053,10341,9379],{"class":1095},[1053,10343,10344,10346,10348,10350,10353,10355,10357],{"class":1055,"line":4890},[1053,10345,9428],{"class":1140},[1053,10347,10205],{"class":1095},[1053,10349,1762],{"class":1074},[1053,10351,10352],{"class":1765},"RequestException",[1053,10354,5096],{"class":1140},[1053,10356,5099],{"class":1095},[1053,10358,1075],{"class":1074},[1053,10360,10361,10363,10365,10367,10369,10371],{"class":1055,"line":4906},[1053,10362,10253],{"class":1095},[1053,10364,4960],{"class":1074},[1053,10366,3828],{"class":1095},[1053,10368,9369],{"class":1074},[1053,10370,1411],{"class":1074},[1053,10372,1414],{"class":1074},[1053,10374,10375,10377,10379,10381,10383,10385],{"class":1055,"line":4912},[1053,10376,2312],{"class":1419},[1053,10378,9400],{"class":1423},[1053,10380,1427],{"class":1419},[1053,10382,1430],{"class":1074},[1053,10384,3037],{"class":2530},[1053,10386,1455],{"class":1074},[1053,10388,10389,10391,10393,10395,10397,10399,10401,10403],{"class":1055,"line":4918},[1053,10390,2312],{"class":1419},[1053,10392,3959],{"class":1423},[1053,10394,1427],{"class":1419},[1053,10396,1430],{"class":1074},[1053,10398,3905],{"class":1969},[1053,10400,1109],{"class":1074},[1053,10402,6649],{"class":1771},[1053,10404,1800],{"class":1074},[1053,10406,10407],{"class":1055,"line":4924},[1053,10408,2393],{"class":1074},[1053,10410,10411],{"class":1055,"line":4950},[1053,10412,4107],{"class":1095},[1053,10414,10415,10417,10419,10422],{"class":1055,"line":4973},[1053,10416,9301],{"class":1095},[1053,10418,1756],{"class":1074},[1053,10420,10421],{"class":3423}," all",[1053,10423,2146],{"class":1074},[1053,10425,10426,10429,10431,10433,10435,10437,10439,10442,10445,10447,10450,10452,10455],{"class":1055,"line":4982},[1053,10427,10428],{"class":1771},"            result",[1053,10430,4960],{"class":1074},[1053,10432,1427],{"class":1419},[1053,10434,9400],{"class":1423},[1053,10436,1427],{"class":1419},[1053,10438,9369],{"class":1074},[1053,10440,10441],{"class":1140}," for",[1053,10443,10444],{"class":1771}," result ",[1053,10446,8481],{"class":1140},[1053,10448,10449],{"class":1771}," service_results",[1053,10451,1762],{"class":1074},[1053,10453,10454],{"class":1771},"values",[1053,10456,1821],{"class":1074},[1053,10458,10459],{"class":1055,"line":4994},[1053,10460,3854],{"class":1074},[1053,10462,10463],{"class":1055,"line":5011},[1053,10464,4107],{"class":1095},[1053,10466,10467,10469],{"class":1055,"line":5036},[1053,10468,1930],{"class":1140},[1053,10470,1414],{"class":1074},[1053,10472,10473,10475,10477,10479,10481,10483],{"class":1055,"line":5041},[1053,10474,3070],{"class":1419},[1053,10476,9400],{"class":1423},[1053,10478,1427],{"class":1419},[1053,10480,1430],{"class":1074},[1053,10482,9518],{"class":1095},[1053,10484,1455],{"class":1074},[1053,10486,10487,10489,10492,10494,10496],{"class":1055,"line":5046},[1053,10488,3070],{"class":1419},[1053,10490,10491],{"class":1423},"services",[1053,10493,1427],{"class":1419},[1053,10495,1430],{"class":1074},[1053,10497,10498],{"class":1095}," service_results\n",[1053,10500,10501],{"class":1055,"line":5064},[1053,10502,4101],{"class":1074},[1053,10504,10505],{"class":1055,"line":5069},[1053,10506,1096],{"class":1095},[1053,10508,10509,10511,10514,10516,10518],{"class":1055,"line":5079},[1053,10510,1102],{"class":1066},[1053,10512,10513],{"class":1105}," check_disk_space",[1053,10515,1109],{"class":1074},[1053,10517,1113],{"class":1112},[1053,10519,1123],{"class":1074},[1053,10521,10522,10524,10527],{"class":1055,"line":5088},[1053,10523,1129],{"class":1081},[1053,10525,10526],{"class":1085},"Check available disk space",[1053,10528,1089],{"class":1081},[1053,10530,10531,10533],{"class":1055,"line":5104},[1053,10532,4807],{"class":1140},[1053,10534,1075],{"class":1074},[1053,10536,10537,10540],{"class":1055,"line":5110},[1053,10538,10539],{"class":1140},"            import",[1053,10541,10542],{"class":1095}," shutil\n",[1053,10544,10545],{"class":1055,"line":5132},[1053,10546,4915],{"class":1095},[1053,10548,10549,10552,10554,10557,10559,10562,10564,10567,10569,10572,10574,10576,10579,10581],{"class":1055,"line":5141},[1053,10550,10551],{"class":1095},"            total",[1053,10553,1116],{"class":1074},[1053,10555,10556],{"class":1095}," used",[1053,10558,1116],{"class":1074},[1053,10560,10561],{"class":1095}," free ",[1053,10563,1756],{"class":1074},[1053,10565,10566],{"class":1095}," shutil",[1053,10568,1762],{"class":1074},[1053,10570,10571],{"class":1771},"disk_usage",[1053,10573,1109],{"class":1074},[1053,10575,1427],{"class":1419},[1053,10577,10578],{"class":1423},"/",[1053,10580,1427],{"class":1419},[1053,10582,1800],{"class":1074},[1053,10584,10585,10588,10590,10593,10596,10598,10601,10603,10605],{"class":1055,"line":5154},[1053,10586,10587],{"class":1095},"            free_percentage ",[1053,10589,1756],{"class":1074},[1053,10591,10592],{"class":1074}," (",[1053,10594,10595],{"class":1095},"free ",[1053,10597,10578],{"class":3099},[1053,10599,10600],{"class":1095}," total",[1053,10602,7561],{"class":1074},[1053,10604,10330],{"class":3099},[1053,10606,10607],{"class":2203}," 100\n",[1053,10609,10610],{"class":1055,"line":5169},[1053,10611,4915],{"class":1095},[1053,10613,10614,10616],{"class":1055,"line":8528},[1053,10615,5049],{"class":1140},[1053,10617,1414],{"class":1074},[1053,10619,10620,10622,10624,10626,10628,10631,10634,10637,10639],{"class":1055,"line":8536},[1053,10621,2228],{"class":1419},[1053,10623,9400],{"class":1423},[1053,10625,1427],{"class":1419},[1053,10627,1430],{"class":1074},[1053,10629,10630],{"class":1095}," free_percentage ",[1053,10632,10633],{"class":3099},">",[1053,10635,10636],{"class":2203}," 10",[1053,10638,1116],{"class":1074},[1053,10640,10641],{"class":1059},"  # Alert if less than 10% free\n",[1053,10643,10644,10646,10649,10651,10653,10656],{"class":1055,"line":8551},[1053,10645,2228],{"class":1419},[1053,10647,10648],{"class":1423},"free_percentage",[1053,10650,1427],{"class":1419},[1053,10652,1430],{"class":1074},[1053,10654,10655],{"class":1095}," free_percentage",[1053,10657,1455],{"class":1074},[1053,10659,10660,10662,10665,10667,10669,10672],{"class":1055,"line":8556},[1053,10661,2228],{"class":1419},[1053,10663,10664],{"class":1423},"free_bytes",[1053,10666,1427],{"class":1419},[1053,10668,1430],{"class":1074},[1053,10670,10671],{"class":1095}," free",[1053,10673,1455],{"class":1074},[1053,10675,10676,10678,10681,10683,10685],{"class":1055,"line":8588},[1053,10677,2228],{"class":1419},[1053,10679,10680],{"class":1423},"total_bytes",[1053,10682,1427],{"class":1419},[1053,10684,1430],{"class":1074},[1053,10686,10687],{"class":1095}," total\n",[1053,10689,10690],{"class":1055,"line":8593},[1053,10691,4095],{"class":1074},[1053,10693,10694],{"class":1055,"line":8609},[1053,10695,4915],{"class":1095},[1053,10697,10698,10700,10702,10704,10706],{"class":1055,"line":8625},[1053,10699,5072],{"class":1140},[1053,10701,5093],{"class":1969},[1053,10703,5096],{"class":1140},[1053,10705,5099],{"class":1095},[1053,10707,1075],{"class":1074},[1053,10709,10710,10712],{"class":1055,"line":8630},[1053,10711,5049],{"class":1140},[1053,10713,1414],{"class":1074},[1053,10715,10716,10718,10720,10722,10724,10726],{"class":1055,"line":8636},[1053,10717,2228],{"class":1419},[1053,10719,9400],{"class":1423},[1053,10721,1427],{"class":1419},[1053,10723,1430],{"class":1074},[1053,10725,3037],{"class":2530},[1053,10727,1455],{"class":1074},[1053,10729,10730,10732,10734,10736,10738,10740,10742,10744],{"class":1055,"line":8658},[1053,10731,2228],{"class":1419},[1053,10733,3959],{"class":1423},[1053,10735,1427],{"class":1419},[1053,10737,1430],{"class":1074},[1053,10739,3905],{"class":1969},[1053,10741,1109],{"class":1074},[1053,10743,6649],{"class":1771},[1053,10745,1800],{"class":1074},[1053,10747,10748],{"class":1055,"line":8685},[1053,10749,4095],{"class":1074},[1053,10751,10752],{"class":1055,"line":8690},[1053,10753,1096],{"class":1095},[1053,10755,10756,10758,10761,10763,10765],{"class":1055,"line":8696},[1053,10757,1102],{"class":1066},[1053,10759,10760],{"class":1105}," check_memory",[1053,10762,1109],{"class":1074},[1053,10764,1113],{"class":1112},[1053,10766,1123],{"class":1074},[1053,10768,10769,10771,10774],{"class":1055,"line":8710},[1053,10770,1129],{"class":1081},[1053,10772,10773],{"class":1085},"Check memory usage",[1053,10775,1089],{"class":1081},[1053,10777,10778,10780],{"class":1055,"line":8720},[1053,10779,4807],{"class":1140},[1053,10781,1075],{"class":1074},[1053,10783,10784,10786],{"class":1055,"line":8725},[1053,10785,10539],{"class":1140},[1053,10787,10788],{"class":1095}," psutil\n",[1053,10790,10791],{"class":1055,"line":8739},[1053,10792,4915],{"class":1095},[1053,10794,10795,10798,10800,10803,10805,10808],{"class":1055,"line":8749},[1053,10796,10797],{"class":1095},"            memory ",[1053,10799,1756],{"class":1074},[1053,10801,10802],{"class":1095}," psutil",[1053,10804,1762],{"class":1074},[1053,10806,10807],{"class":1771},"virtual_memory",[1053,10809,1821],{"class":1074},[1053,10811,10812],{"class":1055,"line":8764},[1053,10813,4915],{"class":1095},[1053,10815,10816,10818],{"class":1055,"line":8769},[1053,10817,5049],{"class":1140},[1053,10819,1414],{"class":1074},[1053,10821,10822,10824,10826,10828,10830,10833,10835,10838,10841,10844,10846],{"class":1055,"line":8786},[1053,10823,2228],{"class":1419},[1053,10825,9400],{"class":1423},[1053,10827,1427],{"class":1419},[1053,10829,1430],{"class":1074},[1053,10831,10832],{"class":1095}," memory",[1053,10834,1762],{"class":1074},[1053,10836,10837],{"class":1765},"percent",[1053,10839,10840],{"class":3099}," \u003C",[1053,10842,10843],{"class":2203}," 90",[1053,10845,1116],{"class":1074},[1053,10847,10848],{"class":1059},"  # Alert if more than 90% used\n",[1053,10850,10851,10853,10856,10858,10860,10862,10864,10866],{"class":1055,"line":8802},[1053,10852,2228],{"class":1419},[1053,10854,10855],{"class":1423},"used_percentage",[1053,10857,1427],{"class":1419},[1053,10859,1430],{"class":1074},[1053,10861,10832],{"class":1095},[1053,10863,1762],{"class":1074},[1053,10865,10837],{"class":1765},[1053,10867,1455],{"class":1074},[1053,10869,10870,10872,10875,10877,10879,10881,10883,10886],{"class":1055,"line":8818},[1053,10871,2228],{"class":1419},[1053,10873,10874],{"class":1423},"available_bytes",[1053,10876,1427],{"class":1419},[1053,10878,1430],{"class":1074},[1053,10880,10832],{"class":1095},[1053,10882,1762],{"class":1074},[1053,10884,10885],{"class":1765},"available",[1053,10887,1455],{"class":1074},[1053,10889,10890,10892,10894,10896,10898,10900,10902],{"class":1055,"line":8823},[1053,10891,2228],{"class":1419},[1053,10893,10680],{"class":1423},[1053,10895,1427],{"class":1419},[1053,10897,1430],{"class":1074},[1053,10899,10832],{"class":1095},[1053,10901,1762],{"class":1074},[1053,10903,10904],{"class":1765},"total\n",[1053,10906,10907],{"class":1055,"line":8829},[1053,10908,4095],{"class":1074},[1053,10910,10911],{"class":1055,"line":8879},[1053,10912,4915],{"class":1095},[1053,10914,10915,10917,10919,10921,10923],{"class":1055,"line":8895},[1053,10916,5072],{"class":1140},[1053,10918,5093],{"class":1969},[1053,10920,5096],{"class":1140},[1053,10922,5099],{"class":1095},[1053,10924,1075],{"class":1074},[1053,10926,10927,10929],{"class":1055,"line":8916},[1053,10928,5049],{"class":1140},[1053,10930,1414],{"class":1074},[1053,10932,10933,10935,10937,10939,10941,10943],{"class":1055,"line":8921},[1053,10934,2228],{"class":1419},[1053,10936,9400],{"class":1423},[1053,10938,1427],{"class":1419},[1053,10940,1430],{"class":1074},[1053,10942,3037],{"class":2530},[1053,10944,1455],{"class":1074},[1053,10946,10947,10949,10951,10953,10955,10957,10959,10961],{"class":1055,"line":8927},[1053,10948,2228],{"class":1419},[1053,10950,3959],{"class":1423},[1053,10952,1427],{"class":1419},[1053,10954,1430],{"class":1074},[1053,10956,3905],{"class":1969},[1053,10958,1109],{"class":1074},[1053,10960,6649],{"class":1771},[1053,10962,1800],{"class":1074},[1053,10964,10965],{"class":1055,"line":8956},[1053,10966,4095],{"class":1074},[1053,10968,10969],{"class":1055,"line":8983},[1053,10970,1269],{"emptyLinePlaceholder":1268},[1053,10972,10974],{"class":1055,"line":10973},169,[1053,10975,10976],{"class":1059},"# Health check views\n",[1053,10978,10980,10983,10985,10987],{"class":1055,"line":10979},170,[1053,10981,10982],{"class":1095},"health_checker ",[1053,10984,1756],{"class":1074},[1053,10986,9119],{"class":1771},[1053,10988,1821],{"class":1074},[1053,10990,10992],{"class":1055,"line":10991},171,[1053,10993,1269],{"emptyLinePlaceholder":1268},[1053,10995,10997,10999,11002,11004,11006],{"class":1055,"line":10996},172,[1053,10998,1733],{"class":1066},[1053,11000,11001],{"class":1105}," health_check",[1053,11003,1109],{"class":1074},[1053,11005,2448],{"class":1119},[1053,11007,1123],{"class":1074},[1053,11009,11011,11013,11016],{"class":1055,"line":11010},173,[1053,11012,1082],{"class":1081},[1053,11014,11015],{"class":1085},"Basic health check endpoint",[1053,11017,1089],{"class":1081},[1053,11019,11021,11024,11026,11029,11031,11034],{"class":1055,"line":11020},174,[1053,11022,11023],{"class":1095},"    result ",[1053,11025,1756],{"class":1074},[1053,11027,11028],{"class":1095}," health_checker",[1053,11030,1762],{"class":1074},[1053,11032,11033],{"class":1771},"check_all",[1053,11035,1821],{"class":1074},[1053,11037,11039,11042,11044,11046,11048,11050,11052,11054,11056,11058,11060,11062],{"class":1055,"line":11038},175,[1053,11040,11041],{"class":1095},"    status_code ",[1053,11043,1756],{"class":1074},[1053,11045,7795],{"class":2203},[1053,11047,4450],{"class":1140},[1053,11049,9389],{"class":1095},[1053,11051,4960],{"class":1074},[1053,11053,1427],{"class":1419},[1053,11055,9400],{"class":1423},[1053,11057,1427],{"class":1419},[1053,11059,9369],{"class":1074},[1053,11061,4465],{"class":1140},[1053,11063,11064],{"class":2203}," 503\n",[1053,11066,11068],{"class":1055,"line":11067},176,[1053,11069,1096],{"class":1095},[1053,11071,11073,11075,11078,11080,11083,11085,11087,11089,11091],{"class":1055,"line":11072},177,[1053,11074,1805],{"class":1140},[1053,11076,11077],{"class":1771}," JsonResponse",[1053,11079,1109],{"class":1074},[1053,11081,11082],{"class":1771},"result",[1053,11084,1116],{"class":1074},[1053,11086,4238],{"class":1792},[1053,11088,1756],{"class":1074},[1053,11090,3841],{"class":1771},[1053,11092,1800],{"class":1074},[1053,11094,11096],{"class":1055,"line":11095},178,[1053,11097,1269],{"emptyLinePlaceholder":1268},[1053,11099,11101,11103,11106,11108,11110],{"class":1055,"line":11100},179,[1053,11102,1733],{"class":1066},[1053,11104,11105],{"class":1105}," readiness_check",[1053,11107,1109],{"class":1074},[1053,11109,2448],{"class":1119},[1053,11111,1123],{"class":1074},[1053,11113,11115,11117,11120],{"class":1055,"line":11114},180,[1053,11116,1082],{"class":1081},[1053,11118,11119],{"class":1085},"Readiness check for Kubernetes",[1053,11121,1089],{"class":1081},[1053,11123,11125],{"class":1055,"line":11124},181,[1053,11126,11127],{"class":1059},"    # Check if service is ready to receive traffic\n",[1053,11129,11131,11133,11135,11137,11139,11141],{"class":1055,"line":11130},182,[1053,11132,11023],{"class":1095},[1053,11134,1756],{"class":1074},[1053,11136,11028],{"class":1095},[1053,11138,1762],{"class":1074},[1053,11140,11033],{"class":1771},[1053,11142,1821],{"class":1074},[1053,11144,11146],{"class":1055,"line":11145},183,[1053,11147,1096],{"class":1095},[1053,11149,11151],{"class":1055,"line":11150},184,[1053,11152,11153],{"class":1059},"    # Service is ready if database and cache are healthy\n",[1053,11155,11157,11160,11162],{"class":1055,"line":11156},185,[1053,11158,11159],{"class":1095},"    ready ",[1053,11161,1756],{"class":1074},[1053,11163,11164],{"class":1074}," (\n",[1053,11166,11168,11171,11173,11175,11177,11179,11182,11184,11186,11188,11190,11192,11194,11197,11199,11201,11203,11205,11207,11209,11211,11213],{"class":1055,"line":11167},186,[1053,11169,11170],{"class":1095},"        result",[1053,11172,4960],{"class":1074},[1053,11174,1427],{"class":1419},[1053,11176,9155],{"class":1423},[1053,11178,1427],{"class":1419},[1053,11180,11181],{"class":1074},"].",[1053,11183,1787],{"class":1771},[1053,11185,1109],{"class":1074},[1053,11187,1427],{"class":1419},[1053,11189,9166],{"class":1423},[1053,11191,1427],{"class":1419},[1053,11193,1116],{"class":1074},[1053,11195,11196],{"class":1074}," {}).",[1053,11198,1787],{"class":1771},[1053,11200,1109],{"class":1074},[1053,11202,1427],{"class":1419},[1053,11204,9400],{"class":1423},[1053,11206,1427],{"class":1419},[1053,11208,1116],{"class":1074},[1053,11210,3037],{"class":2530},[1053,11212,7561],{"class":1074},[1053,11214,11215],{"class":3099}," and\n",[1053,11217,11219,11221,11223,11225,11227,11229,11231,11233,11235,11237,11239,11241,11243,11245,11247,11249,11251,11253,11255,11257,11259],{"class":1055,"line":11218},187,[1053,11220,11170],{"class":1095},[1053,11222,4960],{"class":1074},[1053,11224,1427],{"class":1419},[1053,11226,9155],{"class":1423},[1053,11228,1427],{"class":1419},[1053,11230,11181],{"class":1074},[1053,11232,1787],{"class":1771},[1053,11234,1109],{"class":1074},[1053,11236,1427],{"class":1419},[1053,11238,9186],{"class":1423},[1053,11240,1427],{"class":1419},[1053,11242,1116],{"class":1074},[1053,11244,11196],{"class":1074},[1053,11246,1787],{"class":1771},[1053,11248,1109],{"class":1074},[1053,11250,1427],{"class":1419},[1053,11252,9400],{"class":1423},[1053,11254,1427],{"class":1419},[1053,11256,1116],{"class":1074},[1053,11258,3037],{"class":2530},[1053,11260,1800],{"class":1074},[1053,11262,11264],{"class":1055,"line":11263},188,[1053,11265,2410],{"class":1074},[1053,11267,11269],{"class":1055,"line":11268},189,[1053,11270,1096],{"class":1095},[1053,11272,11274,11276,11278,11280,11282,11285,11288],{"class":1055,"line":11273},190,[1053,11275,11041],{"class":1095},[1053,11277,1756],{"class":1074},[1053,11279,7795],{"class":2203},[1053,11281,4450],{"class":1140},[1053,11283,11284],{"class":1095}," ready ",[1053,11286,11287],{"class":1140},"else",[1053,11289,11064],{"class":2203},[1053,11291,11293],{"class":1055,"line":11292},191,[1053,11294,1096],{"class":1095},[1053,11296,11298,11300,11302],{"class":1055,"line":11297},192,[1053,11299,1805],{"class":1140},[1053,11301,11077],{"class":1771},[1053,11303,11304],{"class":1074},"({\n",[1053,11306,11308,11310,11313,11315,11317,11320],{"class":1055,"line":11307},193,[1053,11309,1437],{"class":1419},[1053,11311,11312],{"class":1423},"ready",[1053,11314,1427],{"class":1419},[1053,11316,1430],{"class":1074},[1053,11318,11319],{"class":1771}," ready",[1053,11321,1455],{"class":1074},[1053,11323,11325,11327,11329,11331,11333,11335,11337,11339],{"class":1055,"line":11324},194,[1053,11326,1437],{"class":1419},[1053,11328,4048],{"class":1423},[1053,11330,1427],{"class":1419},[1053,11332,1430],{"class":1074},[1053,11334,4055],{"class":1771},[1053,11336,1762],{"class":1074},[1053,11338,2899],{"class":4060},[1053,11340,1455],{"class":1074},[1053,11342,11344,11346,11348,11350,11352,11354,11356,11358],{"class":1055,"line":11343},195,[1053,11345,1437],{"class":1419},[1053,11347,4070],{"class":1423},[1053,11349,1427],{"class":1419},[1053,11351,1430],{"class":1074},[1053,11353,5378],{"class":1771},[1053,11355,1762],{"class":1074},[1053,11357,5383],{"class":1771},[1053,11359,1821],{"class":1074},[1053,11361,11363,11366,11368,11370,11372],{"class":1055,"line":11362},196,[1053,11364,11365],{"class":1074},"    },",[1053,11367,4238],{"class":1792},[1053,11369,1756],{"class":1074},[1053,11371,3841],{"class":1771},[1053,11373,1800],{"class":1074},[1053,11375,11377],{"class":1055,"line":11376},197,[1053,11378,1269],{"emptyLinePlaceholder":1268},[1053,11380,11382,11384,11387,11389,11391],{"class":1055,"line":11381},198,[1053,11383,1733],{"class":1066},[1053,11385,11386],{"class":1105}," liveness_check",[1053,11388,1109],{"class":1074},[1053,11390,2448],{"class":1119},[1053,11392,1123],{"class":1074},[1053,11394,11396,11398,11401],{"class":1055,"line":11395},199,[1053,11397,1082],{"class":1081},[1053,11399,11400],{"class":1085},"Liveness check for Kubernetes",[1053,11402,1089],{"class":1081},[1053,11404,11406],{"class":1055,"line":11405},200,[1053,11407,11408],{"class":1059},"    # Simple check to see if the service is alive\n",[1053,11410,11412,11414,11416],{"class":1055,"line":11411},201,[1053,11413,1805],{"class":1140},[1053,11415,11077],{"class":1771},[1053,11417,11304],{"class":1074},[1053,11419,11421,11423,11426,11428,11430,11432],{"class":1055,"line":11420},202,[1053,11422,1437],{"class":1419},[1053,11424,11425],{"class":1423},"alive",[1053,11427,1427],{"class":1419},[1053,11429,1430],{"class":1074},[1053,11431,7946],{"class":2530},[1053,11433,1455],{"class":1074},[1053,11435,11437,11439,11441,11443,11445,11447,11449,11451],{"class":1055,"line":11436},203,[1053,11438,1437],{"class":1419},[1053,11440,4048],{"class":1423},[1053,11442,1427],{"class":1419},[1053,11444,1430],{"class":1074},[1053,11446,4055],{"class":1771},[1053,11448,1762],{"class":1074},[1053,11450,2899],{"class":4060},[1053,11452,1455],{"class":1074},[1053,11454,11456,11458,11460,11462,11464,11466,11468,11470],{"class":1055,"line":11455},204,[1053,11457,1437],{"class":1419},[1053,11459,4070],{"class":1423},[1053,11461,1427],{"class":1419},[1053,11463,1430],{"class":1074},[1053,11465,5378],{"class":1771},[1053,11467,1762],{"class":1074},[1053,11469,5383],{"class":1771},[1053,11471,1821],{"class":1074},[1053,11473,11475],{"class":1055,"line":11474},205,[1053,11476,11477],{"class":1074},"    })\n",[1035,11479,11481],{"id":11480},"_2-graceful-shutdown","2. Graceful Shutdown",[1026,11483,11484],{},"Implement graceful shutdown handling:",[1043,11486,11488],{"className":1045,"code":11487,"language":1047,"meta":1048,"style":1048},"# graceful_shutdown.py\nimport signal\nimport sys\nimport threading\nimport time\nfrom django.core.management.base import BaseCommand\nfrom django.conf import settings\n\nclass GracefulShutdownHandler:\n    \"\"\"Handle graceful shutdown of the service\"\"\"\n    \n    def __init__(self):\n        self.shutdown_event = threading.Event()\n        self.active_requests = 0\n        self.request_lock = threading.Lock()\n        \n        # Register signal handlers\n        signal.signal(signal.SIGTERM, self.signal_handler)\n        signal.signal(signal.SIGINT, self.signal_handler)\n    \n    def signal_handler(self, signum, frame):\n        \"\"\"Handle shutdown signals\"\"\"\n        print(f\"Received signal {signum}, initiating graceful shutdown...\")\n        self.shutdown_event.set()\n        \n        # Wait for active requests to complete\n        self.wait_for_requests()\n        \n        # Perform cleanup\n        self.cleanup()\n        \n        print(\"Graceful shutdown completed\")\n        sys.exit(0)\n    \n    def request_started(self):\n        \"\"\"Called when a request starts\"\"\"\n        with self.request_lock:\n            self.active_requests += 1\n    \n    def request_finished(self):\n        \"\"\"Called when a request finishes\"\"\"\n        with self.request_lock:\n            self.active_requests -= 1\n    \n    def wait_for_requests(self, timeout=30):\n        \"\"\"Wait for active requests to complete\"\"\"\n        start_time = time.time()\n        \n        while self.active_requests > 0:\n            if time.time() - start_time > timeout:\n                print(f\"Timeout waiting for {self.active_requests} active requests\")\n                break\n            \n            print(f\"Waiting for {self.active_requests} active requests to complete...\")\n            time.sleep(1)\n    \n    def cleanup(self):\n        \"\"\"Perform cleanup tasks\"\"\"\n        # Close database connections\n        from django.db import connections\n        for conn in connections.all():\n            conn.close()\n        \n        # Close cache connections\n        from django.core.cache import caches\n        for cache in caches.all():\n            if hasattr(cache, 'close'):\n                cache.close()\n        \n        # Stop Celery workers gracefully\n        try:\n            from celery import current_app\n            current_app.control.shutdown()\n        except:\n            pass\n\n# Middleware to track active requests\nfrom django.utils.deprecation import MiddlewareMixin\n\nshutdown_handler = GracefulShutdownHandler()\n\nclass GracefulShutdownMiddleware(MiddlewareMixin):\n    \"\"\"Middleware to track active requests for graceful shutdown\"\"\"\n    \n    def __call__(self, request):\n        if shutdown_handler.shutdown_event.is_set():\n            # Service is shutting down, reject new requests\n            from django.http import HttpResponse\n            return HttpResponse(\"Service shutting down\", status=503)\n        \n        shutdown_handler.request_started()\n        \n        try:\n            response = self.get_response(request)\n            return response\n        finally:\n            shutdown_handler.request_finished()\n",[1050,11489,11490,11495,11502,11509,11516,11522,11547,11561,11565,11574,11583,11587,11599,11620,11633,11653,11657,11662,11692,11719,11723,11746,11755,11779,11793,11797,11802,11813,11817,11822,11833,11837,11852,11868,11872,11885,11894,11906,11920,11924,11937,11946,11958,11971,11975,11997,12006,12020,12024,12042,12065,12092,12097,12101,12128,12145,12149,12162,12171,12176,12191,12209,12221,12225,12230,12249,12267,12288,12299,12303,12308,12314,12327,12344,12350,12355,12359,12364,12382,12386,12397,12401,12414,12423,12427,12443,12461,12466,12481,12508,12512,12524,12528,12534,12553,12559,12566],{"__ignoreMap":1048},[1053,11491,11492],{"class":1055,"line":1056},[1053,11493,11494],{"class":1059},"# graceful_shutdown.py\n",[1053,11496,11497,11499],{"class":1055,"line":1063},[1053,11498,2104],{"class":1140},[1053,11500,11501],{"class":1095}," signal\n",[1053,11503,11504,11506],{"class":1055,"line":1078},[1053,11505,2104],{"class":1140},[1053,11507,11508],{"class":1095}," sys\n",[1053,11510,11511,11513],{"class":1055,"line":1092},[1053,11512,2104],{"class":1140},[1053,11514,11515],{"class":1095}," threading\n",[1053,11517,11518,11520],{"class":1055,"line":1099},[1053,11519,2104],{"class":1140},[1053,11521,5208],{"class":1095},[1053,11523,11524,11526,11528,11530,11532,11534,11537,11539,11542,11544],{"class":1055,"line":1126},[1053,11525,2093],{"class":1140},[1053,11527,5215],{"class":1095},[1053,11529,1762],{"class":1074},[1053,11531,9071],{"class":1095},[1053,11533,1762],{"class":1074},[1053,11535,11536],{"class":1095},"management",[1053,11538,1762],{"class":1074},[1053,11540,11541],{"class":1095},"base ",[1053,11543,2104],{"class":1140},[1053,11545,11546],{"class":1095}," BaseCommand\n",[1053,11548,11549,11551,11553,11555,11557,11559],{"class":1055,"line":1137},[1053,11550,2093],{"class":1140},[1053,11552,5215],{"class":1095},[1053,11554,1762],{"class":1074},[1053,11556,5241],{"class":1095},[1053,11558,2104],{"class":1140},[1053,11560,5246],{"class":1095},[1053,11562,11563],{"class":1055,"line":1144},[1053,11564,1269],{"emptyLinePlaceholder":1268},[1053,11566,11567,11569,11572],{"class":1055,"line":1149},[1053,11568,1067],{"class":1066},[1053,11570,11571],{"class":1070}," GracefulShutdownHandler",[1053,11573,1075],{"class":1074},[1053,11575,11576,11578,11581],{"class":1055,"line":1168},[1053,11577,1082],{"class":1081},[1053,11579,11580],{"class":1085},"Handle graceful shutdown of the service",[1053,11582,1089],{"class":1081},[1053,11584,11585],{"class":1055,"line":1178},[1053,11586,1096],{"class":1095},[1053,11588,11589,11591,11593,11595,11597],{"class":1055,"line":1183},[1053,11590,1102],{"class":1066},[1053,11592,3424],{"class":3423},[1053,11594,1109],{"class":1074},[1053,11596,1113],{"class":1112},[1053,11598,1123],{"class":1074},[1053,11600,11601,11603,11605,11608,11610,11613,11615,11618],{"class":1055,"line":1188},[1053,11602,3459],{"class":1407},[1053,11604,1762],{"class":1074},[1053,11606,11607],{"class":1765},"shutdown_event",[1053,11609,1411],{"class":1074},[1053,11611,11612],{"class":1095}," threading",[1053,11614,1762],{"class":1074},[1053,11616,11617],{"class":1771},"Event",[1053,11619,1821],{"class":1074},[1053,11621,11622,11624,11626,11629,11631],{"class":1055,"line":1212},[1053,11623,3459],{"class":1407},[1053,11625,1762],{"class":1074},[1053,11627,11628],{"class":1765},"active_requests",[1053,11630,1411],{"class":1074},[1053,11632,10037],{"class":2203},[1053,11634,11635,11637,11639,11642,11644,11646,11648,11651],{"class":1055,"line":1222},[1053,11636,3459],{"class":1407},[1053,11638,1762],{"class":1074},[1053,11640,11641],{"class":1765},"request_lock",[1053,11643,1411],{"class":1074},[1053,11645,11612],{"class":1095},[1053,11647,1762],{"class":1074},[1053,11649,11650],{"class":1771},"Lock",[1053,11652,1821],{"class":1074},[1053,11654,11655],{"class":1055,"line":1227},[1053,11656,4107],{"class":1095},[1053,11658,11659],{"class":1055,"line":1232},[1053,11660,11661],{"class":1059},"        # Register signal handlers\n",[1053,11663,11664,11667,11669,11672,11674,11676,11678,11681,11683,11685,11687,11690],{"class":1055,"line":1250},[1053,11665,11666],{"class":1095},"        signal",[1053,11668,1762],{"class":1074},[1053,11670,11671],{"class":1771},"signal",[1053,11673,1109],{"class":1074},[1053,11675,11671],{"class":1771},[1053,11677,1762],{"class":1074},[1053,11679,11680],{"class":4060},"SIGTERM",[1053,11682,1116],{"class":1074},[1053,11684,4932],{"class":1407},[1053,11686,1762],{"class":1074},[1053,11688,11689],{"class":1765},"signal_handler",[1053,11691,1800],{"class":1074},[1053,11693,11694,11696,11698,11700,11702,11704,11706,11709,11711,11713,11715,11717],{"class":1055,"line":1260},[1053,11695,11666],{"class":1095},[1053,11697,1762],{"class":1074},[1053,11699,11671],{"class":1771},[1053,11701,1109],{"class":1074},[1053,11703,11671],{"class":1771},[1053,11705,1762],{"class":1074},[1053,11707,11708],{"class":4060},"SIGINT",[1053,11710,1116],{"class":1074},[1053,11712,4932],{"class":1407},[1053,11714,1762],{"class":1074},[1053,11716,11689],{"class":1765},[1053,11718,1800],{"class":1074},[1053,11720,11721],{"class":1055,"line":1265},[1053,11722,1096],{"class":1095},[1053,11724,11725,11727,11730,11732,11734,11736,11739,11741,11744],{"class":1055,"line":1272},[1053,11726,1102],{"class":1066},[1053,11728,11729],{"class":1105}," signal_handler",[1053,11731,1109],{"class":1074},[1053,11733,1113],{"class":1112},[1053,11735,1116],{"class":1074},[1053,11737,11738],{"class":1119}," signum",[1053,11740,1116],{"class":1074},[1053,11742,11743],{"class":1119}," frame",[1053,11745,1123],{"class":1074},[1053,11747,11748,11750,11753],{"class":1055,"line":1278},[1053,11749,1129],{"class":1081},[1053,11751,11752],{"class":1085},"Handle shutdown signals",[1053,11754,1089],{"class":1081},[1053,11756,11757,11760,11762,11764,11767,11769,11772,11774,11777],{"class":1055,"line":1288},[1053,11758,11759],{"class":3423},"        print",[1053,11761,1109],{"class":1074},[1053,11763,1892],{"class":1066},[1053,11765,11766],{"class":1423},"\"Received signal ",[1053,11768,1899],{"class":1898},[1053,11770,11771],{"class":1771},"signum",[1053,11773,1904],{"class":1898},[1053,11775,11776],{"class":1423},", initiating graceful shutdown...\"",[1053,11778,1800],{"class":1074},[1053,11780,11781,11783,11785,11787,11789,11791],{"class":1055,"line":1298},[1053,11782,3459],{"class":1407},[1053,11784,1762],{"class":1074},[1053,11786,11607],{"class":1765},[1053,11788,1762],{"class":1074},[1053,11790,9883],{"class":1771},[1053,11792,1821],{"class":1074},[1053,11794,11795],{"class":1055,"line":1303},[1053,11796,4107],{"class":1095},[1053,11798,11799],{"class":1055,"line":1320},[1053,11800,11801],{"class":1059},"        # Wait for active requests to complete\n",[1053,11803,11804,11806,11808,11811],{"class":1055,"line":1325},[1053,11805,3459],{"class":1407},[1053,11807,1762],{"class":1074},[1053,11809,11810],{"class":1771},"wait_for_requests",[1053,11812,1821],{"class":1074},[1053,11814,11815],{"class":1055,"line":1330},[1053,11816,4107],{"class":1095},[1053,11818,11819],{"class":1055,"line":1349},[1053,11820,11821],{"class":1059},"        # Perform cleanup\n",[1053,11823,11824,11826,11828,11831],{"class":1055,"line":1354},[1053,11825,3459],{"class":1407},[1053,11827,1762],{"class":1074},[1053,11829,11830],{"class":1771},"cleanup",[1053,11832,1821],{"class":1074},[1053,11834,11835],{"class":1055,"line":1359},[1053,11836,4107],{"class":1095},[1053,11838,11839,11841,11843,11845,11848,11850],{"class":1055,"line":1378},[1053,11840,11759],{"class":3423},[1053,11842,1109],{"class":1074},[1053,11844,1975],{"class":1419},[1053,11846,11847],{"class":1423},"Graceful shutdown completed",[1053,11849,1975],{"class":1419},[1053,11851,1800],{"class":1074},[1053,11853,11854,11857,11859,11862,11864,11866],{"class":1055,"line":1828},[1053,11855,11856],{"class":1095},"        sys",[1053,11858,1762],{"class":1074},[1053,11860,11861],{"class":1771},"exit",[1053,11863,1109],{"class":1074},[1053,11865,6271],{"class":2203},[1053,11867,1800],{"class":1074},[1053,11869,11870],{"class":1055,"line":1834},[1053,11871,1096],{"class":1095},[1053,11873,11874,11876,11879,11881,11883],{"class":1055,"line":1847},[1053,11875,1102],{"class":1066},[1053,11877,11878],{"class":1105}," request_started",[1053,11880,1109],{"class":1074},[1053,11882,1113],{"class":1112},[1053,11884,1123],{"class":1074},[1053,11886,11887,11889,11892],{"class":1055,"line":1853},[1053,11888,1129],{"class":1081},[1053,11890,11891],{"class":1085},"Called when a request starts",[1053,11893,1089],{"class":1081},[1053,11895,11896,11898,11900,11902,11904],{"class":1055,"line":1875},[1053,11897,7546],{"class":1140},[1053,11899,4932],{"class":1407},[1053,11901,1762],{"class":1074},[1053,11903,11641],{"class":1765},[1053,11905,1075],{"class":1074},[1053,11907,11908,11910,11912,11914,11917],{"class":1055,"line":1912},[1053,11909,6531],{"class":1407},[1053,11911,1762],{"class":1074},[1053,11913,11628],{"class":1765},[1053,11915,11916],{"class":1074}," +=",[1053,11918,11919],{"class":2203}," 1\n",[1053,11921,11922],{"class":1055,"line":1917},[1053,11923,1096],{"class":1095},[1053,11925,11926,11928,11931,11933,11935],{"class":1055,"line":1927},[1053,11927,1102],{"class":1066},[1053,11929,11930],{"class":1105}," request_finished",[1053,11932,1109],{"class":1074},[1053,11934,1113],{"class":1112},[1053,11936,1123],{"class":1074},[1053,11938,11939,11941,11944],{"class":1055,"line":1955},[1053,11940,1129],{"class":1081},[1053,11942,11943],{"class":1085},"Called when a request finishes",[1053,11945,1089],{"class":1081},[1053,11947,11948,11950,11952,11954,11956],{"class":1055,"line":1963},[1053,11949,7546],{"class":1140},[1053,11951,4932],{"class":1407},[1053,11953,1762],{"class":1074},[1053,11955,11641],{"class":1765},[1053,11957,1075],{"class":1074},[1053,11959,11960,11962,11964,11966,11969],{"class":1055,"line":2370},[1053,11961,6531],{"class":1407},[1053,11963,1762],{"class":1074},[1053,11965,11628],{"class":1765},[1053,11967,11968],{"class":1074}," -=",[1053,11970,11919],{"class":2203},[1053,11972,11973],{"class":1055,"line":2390},[1053,11974,1096],{"class":1095},[1053,11976,11977,11979,11982,11984,11986,11988,11990,11992,11995],{"class":1055,"line":2396},[1053,11978,1102],{"class":1066},[1053,11980,11981],{"class":1105}," wait_for_requests",[1053,11983,1109],{"class":1074},[1053,11985,1113],{"class":1112},[1053,11987,1116],{"class":1074},[1053,11989,9898],{"class":1119},[1053,11991,1756],{"class":3099},[1053,11993,11994],{"class":2203},"30",[1053,11996,1123],{"class":1074},[1053,11998,11999,12001,12004],{"class":1055,"line":2401},[1053,12000,1129],{"class":1081},[1053,12002,12003],{"class":1085},"Wait for active requests to complete",[1053,12005,1089],{"class":1081},[1053,12007,12008,12010,12012,12014,12016,12018],{"class":1055,"line":2407},[1053,12009,5840],{"class":1095},[1053,12011,1756],{"class":1074},[1053,12013,5378],{"class":1095},[1053,12015,1762],{"class":1074},[1053,12017,5383],{"class":1771},[1053,12019,1821],{"class":1074},[1053,12021,12022],{"class":1055,"line":2413},[1053,12023,4107],{"class":1095},[1053,12025,12026,12029,12031,12033,12035,12038,12040],{"class":1055,"line":2432},[1053,12027,12028],{"class":1140},"        while",[1053,12030,4932],{"class":1407},[1053,12032,1762],{"class":1074},[1053,12034,11628],{"class":1765},[1053,12036,12037],{"class":3099}," >",[1053,12039,9719],{"class":2203},[1053,12041,1075],{"class":1074},[1053,12043,12044,12046,12048,12050,12052,12054,12056,12059,12061,12063],{"class":1055,"line":3280},[1053,12045,4821],{"class":1140},[1053,12047,5378],{"class":1095},[1053,12049,1762],{"class":1074},[1053,12051,5383],{"class":1771},[1053,12053,6046],{"class":1074},[1053,12055,6049],{"class":3099},[1053,12057,12058],{"class":1095}," start_time ",[1053,12060,10633],{"class":3099},[1053,12062,9898],{"class":1095},[1053,12064,1075],{"class":1074},[1053,12066,12067,12070,12072,12074,12077,12079,12081,12083,12085,12087,12090],{"class":1055,"line":3968},[1053,12068,12069],{"class":3423},"                print",[1053,12071,1109],{"class":1074},[1053,12073,1892],{"class":1066},[1053,12075,12076],{"class":1423},"\"Timeout waiting for ",[1053,12078,1899],{"class":1898},[1053,12080,1113],{"class":1407},[1053,12082,1762],{"class":1074},[1053,12084,11628],{"class":1765},[1053,12086,1904],{"class":1898},[1053,12088,12089],{"class":1423}," active requests\"",[1053,12091,1800],{"class":1074},[1053,12093,12094],{"class":1055,"line":3988},[1053,12095,12096],{"class":1140},"                break\n",[1053,12098,12099],{"class":1055,"line":4007},[1053,12100,4915],{"class":1095},[1053,12102,12103,12106,12108,12110,12113,12115,12117,12119,12121,12123,12126],{"class":1055,"line":4026},[1053,12104,12105],{"class":3423},"            print",[1053,12107,1109],{"class":1074},[1053,12109,1892],{"class":1066},[1053,12111,12112],{"class":1423},"\"Waiting for ",[1053,12114,1899],{"class":1898},[1053,12116,1113],{"class":1407},[1053,12118,1762],{"class":1074},[1053,12120,11628],{"class":1765},[1053,12122,1904],{"class":1898},[1053,12124,12125],{"class":1423}," active requests to complete...\"",[1053,12127,1800],{"class":1074},[1053,12129,12130,12133,12135,12138,12140,12143],{"class":1055,"line":4043},[1053,12131,12132],{"class":1095},"            time",[1053,12134,1762],{"class":1074},[1053,12136,12137],{"class":1771},"sleep",[1053,12139,1109],{"class":1074},[1053,12141,12142],{"class":2203},"1",[1053,12144,1800],{"class":1074},[1053,12146,12147],{"class":1055,"line":4065},[1053,12148,1096],{"class":1095},[1053,12150,12151,12153,12156,12158,12160],{"class":1055,"line":4092},[1053,12152,1102],{"class":1066},[1053,12154,12155],{"class":1105}," cleanup",[1053,12157,1109],{"class":1074},[1053,12159,1113],{"class":1112},[1053,12161,1123],{"class":1074},[1053,12163,12164,12166,12169],{"class":1055,"line":4098},[1053,12165,1129],{"class":1081},[1053,12167,12168],{"class":1085},"Perform cleanup tasks",[1053,12170,1089],{"class":1081},[1053,12172,12173],{"class":1055,"line":4104},[1053,12174,12175],{"class":1059},"        # Close database connections\n",[1053,12177,12178,12180,12182,12184,12186,12188],{"class":1055,"line":4110},[1053,12179,8772],{"class":1140},[1053,12181,5215],{"class":1095},[1053,12183,1762],{"class":1074},[1053,12185,9055],{"class":1095},[1053,12187,2104],{"class":1140},[1053,12189,12190],{"class":1095}," connections\n",[1053,12192,12193,12195,12198,12200,12203,12205,12207],{"class":1055,"line":4116},[1053,12194,8882],{"class":1140},[1053,12196,12197],{"class":1095}," conn ",[1053,12199,8481],{"class":1140},[1053,12201,12202],{"class":1095}," connections",[1053,12204,1762],{"class":1074},[1053,12206,1818],{"class":1771},[1053,12208,4864],{"class":1074},[1053,12210,12211,12214,12216,12219],{"class":1055,"line":4161},[1053,12212,12213],{"class":1095},"            conn",[1053,12215,1762],{"class":1074},[1053,12217,12218],{"class":1771},"close",[1053,12220,1821],{"class":1074},[1053,12222,12223],{"class":1055,"line":4180},[1053,12224,4107],{"class":1095},[1053,12226,12227],{"class":1055,"line":4199},[1053,12228,12229],{"class":1059},"        # Close cache connections\n",[1053,12231,12232,12234,12236,12238,12240,12242,12244,12246],{"class":1055,"line":4213},[1053,12233,8772],{"class":1140},[1053,12235,5215],{"class":1095},[1053,12237,1762],{"class":1074},[1053,12239,9071],{"class":1095},[1053,12241,1762],{"class":1074},[1053,12243,9076],{"class":1095},[1053,12245,2104],{"class":1140},[1053,12247,12248],{"class":1095}," caches\n",[1053,12250,12251,12253,12256,12258,12261,12263,12265],{"class":1055,"line":4219},[1053,12252,8882],{"class":1140},[1053,12254,12255],{"class":1095}," cache ",[1053,12257,8481],{"class":1140},[1053,12259,12260],{"class":1095}," caches",[1053,12262,1762],{"class":1074},[1053,12264,1818],{"class":1771},[1053,12266,4864],{"class":1074},[1053,12268,12269,12271,12274,12276,12278,12280,12282,12284,12286],{"class":1055,"line":4224},[1053,12270,4821],{"class":1140},[1053,12272,12273],{"class":3423}," hasattr",[1053,12275,1109],{"class":1074},[1053,12277,9186],{"class":1771},[1053,12279,1116],{"class":1074},[1053,12281,1447],{"class":1419},[1053,12283,12218],{"class":1423},[1053,12285,1427],{"class":1419},[1053,12287,1123],{"class":1074},[1053,12289,12290,12293,12295,12297],{"class":1055,"line":4230},[1053,12291,12292],{"class":1095},"                cache",[1053,12294,1762],{"class":1074},[1053,12296,12218],{"class":1771},[1053,12298,1821],{"class":1074},[1053,12300,12301],{"class":1055,"line":4246},[1053,12302,4107],{"class":1095},[1053,12304,12305],{"class":1055,"line":4269},[1053,12306,12307],{"class":1059},"        # Stop Celery workers gracefully\n",[1053,12309,12310,12312],{"class":1055,"line":4284},[1053,12311,4807],{"class":1140},[1053,12313,1075],{"class":1074},[1053,12315,12316,12319,12322,12324],{"class":1055,"line":4306},[1053,12317,12318],{"class":1140},"            from",[1053,12320,12321],{"class":1095}," celery ",[1053,12323,2104],{"class":1140},[1053,12325,12326],{"class":1095}," current_app\n",[1053,12328,12329,12332,12334,12337,12339,12342],{"class":1055,"line":4320},[1053,12330,12331],{"class":1095},"            current_app",[1053,12333,1762],{"class":1074},[1053,12335,12336],{"class":1765},"control",[1053,12338,1762],{"class":1074},[1053,12340,12341],{"class":1771},"shutdown",[1053,12343,1821],{"class":1074},[1053,12345,12346,12348],{"class":1055,"line":4325},[1053,12347,5072],{"class":1140},[1053,12349,1075],{"class":1074},[1053,12351,12352],{"class":1055,"line":4348},[1053,12353,12354],{"class":1140},"            pass\n",[1053,12356,12357],{"class":1055,"line":4353},[1053,12358,1269],{"emptyLinePlaceholder":1268},[1053,12360,12361],{"class":1055,"line":4359},[1053,12362,12363],{"class":1059},"# Middleware to track active requests\n",[1053,12365,12366,12368,12370,12372,12374,12376,12378,12380],{"class":1055,"line":4380},[1053,12367,2093],{"class":1140},[1053,12369,5215],{"class":1095},[1053,12371,1762],{"class":1074},[1053,12373,5220],{"class":1095},[1053,12375,1762],{"class":1074},[1053,12377,5225],{"class":1095},[1053,12379,2104],{"class":1140},[1053,12381,5230],{"class":1095},[1053,12383,12384],{"class":1055,"line":4385},[1053,12385,1269],{"emptyLinePlaceholder":1268},[1053,12387,12388,12391,12393,12395],{"class":1055,"line":4404},[1053,12389,12390],{"class":1095},"shutdown_handler ",[1053,12392,1756],{"class":1074},[1053,12394,11571],{"class":1771},[1053,12396,1821],{"class":1074},[1053,12398,12399],{"class":1055,"line":4410},[1053,12400,1269],{"emptyLinePlaceholder":1268},[1053,12402,12403,12405,12408,12410,12412],{"class":1055,"line":4420},[1053,12404,1067],{"class":1066},[1053,12406,12407],{"class":1070}," GracefulShutdownMiddleware",[1053,12409,1109],{"class":1074},[1053,12411,5745],{"class":2128},[1053,12413,1123],{"class":1074},[1053,12415,12416,12418,12421],{"class":1055,"line":4433},[1053,12417,1082],{"class":1081},[1053,12419,12420],{"class":1085},"Middleware to track active requests for graceful shutdown",[1053,12422,1089],{"class":1081},[1053,12424,12425],{"class":1055,"line":4477},[1053,12426,1096],{"class":1095},[1053,12428,12429,12431,12433,12435,12437,12439,12441],{"class":1055,"line":4518},[1053,12430,1102],{"class":1066},[1053,12432,5825],{"class":3423},[1053,12434,1109],{"class":1074},[1053,12436,1113],{"class":1112},[1053,12438,1116],{"class":1074},[1053,12440,2427],{"class":1119},[1053,12442,1123],{"class":1074},[1053,12444,12445,12447,12450,12452,12454,12456,12459],{"class":1055,"line":4538},[1053,12446,4249],{"class":1140},[1053,12448,12449],{"class":1095}," shutdown_handler",[1053,12451,1762],{"class":1074},[1053,12453,11607],{"class":1765},[1053,12455,1762],{"class":1074},[1053,12457,12458],{"class":1771},"is_set",[1053,12460,4864],{"class":1074},[1053,12462,12463],{"class":1055,"line":4553},[1053,12464,12465],{"class":1059},"            # Service is shutting down, reject new requests\n",[1053,12467,12468,12470,12472,12474,12476,12478],{"class":1055,"line":4572},[1053,12469,12318],{"class":1140},[1053,12471,5215],{"class":1095},[1053,12473,1762],{"class":1074},[1053,12475,9039],{"class":1095},[1053,12477,2104],{"class":1140},[1053,12479,12480],{"class":1095}," HttpResponse\n",[1053,12482,12483,12485,12488,12490,12492,12495,12497,12499,12501,12503,12506],{"class":1055,"line":4595},[1053,12484,5049],{"class":1140},[1053,12486,12487],{"class":1771}," HttpResponse",[1053,12489,1109],{"class":1074},[1053,12491,1975],{"class":1419},[1053,12493,12494],{"class":1423},"Service shutting down",[1053,12496,1975],{"class":1419},[1053,12498,1116],{"class":1074},[1053,12500,4238],{"class":1792},[1053,12502,1756],{"class":1074},[1053,12504,12505],{"class":2203},"503",[1053,12507,1800],{"class":1074},[1053,12509,12510],{"class":1055,"line":4600},[1053,12511,4107],{"class":1095},[1053,12513,12514,12517,12519,12522],{"class":1055,"line":4605},[1053,12515,12516],{"class":1095},"        shutdown_handler",[1053,12518,1762],{"class":1074},[1053,12520,12521],{"class":1771},"request_started",[1053,12523,1821],{"class":1074},[1053,12525,12526],{"class":1055,"line":4610},[1053,12527,4107],{"class":1095},[1053,12529,12530,12532],{"class":1055,"line":4615},[1053,12531,4807],{"class":1140},[1053,12533,1075],{"class":1074},[1053,12535,12536,12539,12541,12543,12545,12547,12549,12551],{"class":1055,"line":4659},[1053,12537,12538],{"class":1095},"            response ",[1053,12540,1756],{"class":1074},[1053,12542,4932],{"class":1407},[1053,12544,1762],{"class":1074},[1053,12546,5786],{"class":1771},[1053,12548,1109],{"class":1074},[1053,12550,2448],{"class":1771},[1053,12552,1800],{"class":1074},[1053,12554,12555,12557],{"class":1055,"line":4678},[1053,12556,5049],{"class":1140},[1053,12558,4745],{"class":1095},[1053,12560,12561,12564],{"class":1055,"line":4697},[1053,12562,12563],{"class":1140},"        finally",[1053,12565,1075],{"class":1074},[1053,12567,12568,12571,12573,12576],{"class":1055,"line":4710},[1053,12569,12570],{"class":1095},"            shutdown_handler",[1053,12572,1762],{"class":1074},[1053,12574,12575],{"class":1771},"request_finished",[1053,12577,1821],{"class":1074},[1035,12579,12581],{"id":12580},"_3-resource-management","3. Resource Management",[1026,12583,12584],{},"Implement proper resource management:",[1043,12586,12588],{"className":1045,"code":12587,"language":1047,"meta":1048,"style":1048},"# resource_management.py\nfrom django.conf import settings\nimport threading\nimport time\nimport psutil\nimport logging\n\nlogger = logging.getLogger(__name__)\n\nclass ResourceMonitor:\n    \"\"\"Monitor and manage system resources\"\"\"\n    \n    def __init__(self):\n        self.monitoring = False\n        self.monitor_thread = None\n        self.thresholds = {\n            'cpu_percent': 80,\n            'memory_percent': 85,\n            'disk_percent': 90\n        }\n    \n    def start_monitoring(self):\n        \"\"\"Start resource monitoring\"\"\"\n        if not self.monitoring:\n            self.monitoring = True\n            self.monitor_thread = threading.Thread(target=self._monitor_loop)\n            self.monitor_thread.daemon = True\n            self.monitor_thread.start()\n            logger.info(\"Resource monitoring started\")\n    \n    def stop_monitoring(self):\n        \"\"\"Stop resource monitoring\"\"\"\n        self.monitoring = False\n        if self.monitor_thread:\n            self.monitor_thread.join()\n        logger.info(\"Resource monitoring stopped\")\n    \n    def _monitor_loop(self):\n        \"\"\"Main monitoring loop\"\"\"\n        while self.monitoring:\n            try:\n                self._check_resources()\n                time.sleep(30)  # Check every 30 seconds\n            except Exception as e:\n                logger.error(f\"Error in resource monitoring: {e}\")\n    \n    def _check_resources(self):\n        \"\"\"Check system resources\"\"\"\n        # CPU usage\n        cpu_percent = psutil.cpu_percent(interval=1)\n        if cpu_percent > self.thresholds['cpu_percent']:\n            logger.warning(f\"High CPU usage: {cpu_percent}%\")\n            self._handle_high_cpu()\n        \n        # Memory usage\n        memory = psutil.virtual_memory()\n        if memory.percent > self.thresholds['memory_percent']:\n            logger.warning(f\"High memory usage: {memory.percent}%\")\n            self._handle_high_memory()\n        \n        # Disk usage\n        disk = psutil.disk_usage('/')\n        disk_percent = (disk.used / disk.total) * 100\n        if disk_percent > self.thresholds['disk_percent']:\n            logger.warning(f\"High disk usage: {disk_percent}%\")\n            self._handle_high_disk()\n    \n    def _handle_high_cpu(self):\n        \"\"\"Handle high CPU usage\"\"\"\n        # Could implement CPU throttling or request limiting\n        pass\n    \n    def _handle_high_memory(self):\n        \"\"\"Handle high memory usage\"\"\"\n        # Clear caches to free memory\n        from django.core.cache import cache\n        cache.clear()\n        logger.info(\"Cleared cache due to high memory usage\")\n    \n    def _handle_high_disk(self):\n        \"\"\"Handle high disk usage\"\"\"\n        # Could implement log rotation or cleanup\n        pass\n\n# Connection pooling\nclass DatabaseConnectionManager:\n    \"\"\"Manage database connections efficiently\"\"\"\n    \n    def __init__(self):\n        self.max_connections = getattr(settings, 'DB_MAX_CONNECTIONS', 20)\n        self.connection_timeout = getattr(settings, 'DB_CONNECTION_TIMEOUT', 300)\n    \n    def configure_connection_pooling(self):\n        \"\"\"Configure database connection pooling\"\"\"\n        # This would typically be done in settings.py\n        database_config = {\n            'ENGINE': 'django.db.backends.postgresql',\n            'OPTIONS': {\n                'MAX_CONNS': self.max_connections,\n                'CONN_MAX_AGE': self.connection_timeout,\n            }\n        }\n        return database_config\n\n# Memory management\nclass MemoryManager:\n    \"\"\"Manage memory usage\"\"\"\n    \n    @staticmethod\n    def clear_query_cache():\n        \"\"\"Clear Django query cache\"\"\"\n        from django.db import reset_queries\n        reset_queries()\n    \n    @staticmethod\n    def clear_template_cache():\n        \"\"\"Clear template cache\"\"\"\n        from django.template.loader import get_template\n        get_template.cache_clear()\n    \n    @staticmethod\n    def force_garbage_collection():\n        \"\"\"Force garbage collection\"\"\"\n        import gc\n        collected = gc.collect()\n        logger.info(f\"Garbage collection freed {collected} objects\")\n        return collected\n\n# Resource limits\nclass ResourceLimiter:\n    \"\"\"Implement resource limits\"\"\"\n    \n    def __init__(self):\n        self.max_request_size = getattr(settings, 'MAX_REQUEST_SIZE', 10 * 1024 * 1024)  # 10MB\n        self.max_response_size = getattr(settings, 'MAX_RESPONSE_SIZE', 50 * 1024 * 1024)  # 50MB\n    \n    def check_request_size(self, request):\n        \"\"\"Check if request size is within limits\"\"\"\n        content_length = request.META.get('CONTENT_LENGTH')\n        if content_length and int(content_length) > self.max_request_size:\n            from django.http import HttpResponseBadRequest\n            return HttpResponseBadRequest(\"Request too large\")\n        return None\n    \n    def check_response_size(self, response):\n        \"\"\"Check if response size is within limits\"\"\"\n        if hasattr(response, 'content') and len(response.content) > self.max_response_size:\n            logger.warning(\"Response size exceeds limit\")\n            # Could truncate or compress response\n        return response\n\n# Initialize resource monitoring\nresource_monitor = ResourceMonitor()\nresource_monitor.start_monitoring()\n",[1050,12589,12590,12595,12609,12615,12621,12627,12633,12637,12655,12659,12668,12677,12681,12693,12706,12720,12733,12749,12765,12779,12783,12787,12800,12809,12823,12835,12868,12885,12900,12919,12923,12936,12945,12957,12969,12984,13003,13007,13020,13029,13041,13047,13059,13077,13089,13115,13119,13132,13141,13146,13170,13195,13221,13232,13236,13241,13256,13284,13313,13324,13328,13333,13356,13390,13415,13440,13451,13455,13468,13477,13482,13486,13490,13503,13512,13517,13535,13547,13566,13570,13583,13592,13597,13601,13605,13610,13619,13628,13632,13644,13676,13709,13713,13726,13735,13740,13749,13767,13780,13799,13818,13822,13826,13833,13837,13842,13851,13860,13864,13871,13880,13889,13904,13911,13915,13921,13930,13939,13960,13972,13976,13982,13991,14000,14007,14024,14051,14058,14062,14067,14076,14085,14089,14101,14145,14189,14193,14210,14219,14247,14276,14291,14309,14315,14319,14336,14345,14392,14411,14416,14422,14426,14431,14442],{"__ignoreMap":1048},[1053,12591,12592],{"class":1055,"line":1056},[1053,12593,12594],{"class":1059},"# resource_management.py\n",[1053,12596,12597,12599,12601,12603,12605,12607],{"class":1055,"line":1063},[1053,12598,2093],{"class":1140},[1053,12600,5215],{"class":1095},[1053,12602,1762],{"class":1074},[1053,12604,5241],{"class":1095},[1053,12606,2104],{"class":1140},[1053,12608,5246],{"class":1095},[1053,12610,12611,12613],{"class":1055,"line":1078},[1053,12612,2104],{"class":1140},[1053,12614,11515],{"class":1095},[1053,12616,12617,12619],{"class":1055,"line":1092},[1053,12618,2104],{"class":1140},[1053,12620,5208],{"class":1095},[1053,12622,12623,12625],{"class":1055,"line":1099},[1053,12624,2104],{"class":1140},[1053,12626,10788],{"class":1095},[1053,12628,12629,12631],{"class":1055,"line":1126},[1053,12630,2104],{"class":1140},[1053,12632,3351],{"class":1095},[1053,12634,12635],{"class":1055,"line":1137},[1053,12636,1269],{"emptyLinePlaceholder":1268},[1053,12638,12639,12641,12643,12645,12647,12649,12651,12653],{"class":1055,"line":1144},[1053,12640,3367],{"class":1095},[1053,12642,1756],{"class":1074},[1053,12644,3372],{"class":1095},[1053,12646,1762],{"class":1074},[1053,12648,3377],{"class":1771},[1053,12650,1109],{"class":1074},[1053,12652,3383],{"class":3382},[1053,12654,1800],{"class":1074},[1053,12656,12657],{"class":1055,"line":1149},[1053,12658,1269],{"emptyLinePlaceholder":1268},[1053,12660,12661,12663,12666],{"class":1055,"line":1168},[1053,12662,1067],{"class":1066},[1053,12664,12665],{"class":1070}," ResourceMonitor",[1053,12667,1075],{"class":1074},[1053,12669,12670,12672,12675],{"class":1055,"line":1178},[1053,12671,1082],{"class":1081},[1053,12673,12674],{"class":1085},"Monitor and manage system resources",[1053,12676,1089],{"class":1081},[1053,12678,12679],{"class":1055,"line":1183},[1053,12680,1096],{"class":1095},[1053,12682,12683,12685,12687,12689,12691],{"class":1055,"line":1188},[1053,12684,1102],{"class":1066},[1053,12686,3424],{"class":3423},[1053,12688,1109],{"class":1074},[1053,12690,1113],{"class":1112},[1053,12692,1123],{"class":1074},[1053,12694,12695,12697,12699,12702,12704],{"class":1055,"line":1212},[1053,12696,3459],{"class":1407},[1053,12698,1762],{"class":1074},[1053,12700,12701],{"class":1765},"monitoring",[1053,12703,1411],{"class":1074},[1053,12705,9418],{"class":2530},[1053,12707,12708,12710,12712,12715,12717],{"class":1055,"line":1222},[1053,12709,3459],{"class":1407},[1053,12711,1762],{"class":1074},[1053,12713,12714],{"class":1765},"monitor_thread",[1053,12716,1411],{"class":1074},[1053,12718,12719],{"class":2530}," None\n",[1053,12721,12722,12724,12726,12729,12731],{"class":1055,"line":1227},[1053,12723,3459],{"class":1407},[1053,12725,1762],{"class":1074},[1053,12727,12728],{"class":1765},"thresholds",[1053,12730,1411],{"class":1074},[1053,12732,1414],{"class":1074},[1053,12734,12735,12737,12740,12742,12744,12747],{"class":1055,"line":1232},[1053,12736,3070],{"class":1419},[1053,12738,12739],{"class":1423},"cpu_percent",[1053,12741,1427],{"class":1419},[1053,12743,1430],{"class":1074},[1053,12745,12746],{"class":2203}," 80",[1053,12748,1455],{"class":1074},[1053,12750,12751,12753,12756,12758,12760,12763],{"class":1055,"line":1250},[1053,12752,3070],{"class":1419},[1053,12754,12755],{"class":1423},"memory_percent",[1053,12757,1427],{"class":1419},[1053,12759,1430],{"class":1074},[1053,12761,12762],{"class":2203}," 85",[1053,12764,1455],{"class":1074},[1053,12766,12767,12769,12772,12774,12776],{"class":1055,"line":1260},[1053,12768,3070],{"class":1419},[1053,12770,12771],{"class":1423},"disk_percent",[1053,12773,1427],{"class":1419},[1053,12775,1430],{"class":1074},[1053,12777,12778],{"class":2203}," 90\n",[1053,12780,12781],{"class":1055,"line":1265},[1053,12782,4101],{"class":1074},[1053,12784,12785],{"class":1055,"line":1272},[1053,12786,1096],{"class":1095},[1053,12788,12789,12791,12794,12796,12798],{"class":1055,"line":1278},[1053,12790,1102],{"class":1066},[1053,12792,12793],{"class":1105}," start_monitoring",[1053,12795,1109],{"class":1074},[1053,12797,1113],{"class":1112},[1053,12799,1123],{"class":1074},[1053,12801,12802,12804,12807],{"class":1055,"line":1288},[1053,12803,1129],{"class":1081},[1053,12805,12806],{"class":1085},"Start resource monitoring",[1053,12808,1089],{"class":1081},[1053,12810,12811,12813,12815,12817,12819,12821],{"class":1055,"line":1298},[1053,12812,4249],{"class":1140},[1053,12814,4396],{"class":3099},[1053,12816,4932],{"class":1407},[1053,12818,1762],{"class":1074},[1053,12820,12701],{"class":1765},[1053,12822,1075],{"class":1074},[1053,12824,12825,12827,12829,12831,12833],{"class":1055,"line":1303},[1053,12826,6531],{"class":1407},[1053,12828,1762],{"class":1074},[1053,12830,12701],{"class":1765},[1053,12832,1411],{"class":1074},[1053,12834,9306],{"class":2530},[1053,12836,12837,12839,12841,12843,12845,12847,12849,12852,12854,12857,12859,12861,12863,12866],{"class":1055,"line":1320},[1053,12838,6531],{"class":1407},[1053,12840,1762],{"class":1074},[1053,12842,12714],{"class":1765},[1053,12844,1411],{"class":1074},[1053,12846,11612],{"class":1095},[1053,12848,1762],{"class":1074},[1053,12850,12851],{"class":1771},"Thread",[1053,12853,1109],{"class":1074},[1053,12855,12856],{"class":1792},"target",[1053,12858,1756],{"class":1074},[1053,12860,1113],{"class":1407},[1053,12862,1762],{"class":1074},[1053,12864,12865],{"class":1765},"_monitor_loop",[1053,12867,1800],{"class":1074},[1053,12869,12870,12872,12874,12876,12878,12881,12883],{"class":1055,"line":1325},[1053,12871,6531],{"class":1407},[1053,12873,1762],{"class":1074},[1053,12875,12714],{"class":1765},[1053,12877,1762],{"class":1074},[1053,12879,12880],{"class":1765},"daemon",[1053,12882,1411],{"class":1074},[1053,12884,9306],{"class":2530},[1053,12886,12887,12889,12891,12893,12895,12898],{"class":1055,"line":1330},[1053,12888,6531],{"class":1407},[1053,12890,1762],{"class":1074},[1053,12892,12714],{"class":1765},[1053,12894,1762],{"class":1074},[1053,12896,12897],{"class":1771},"start",[1053,12899,1821],{"class":1074},[1053,12901,12902,12904,12906,12908,12910,12912,12915,12917],{"class":1055,"line":1349},[1053,12903,5113],{"class":1095},[1053,12905,1762],{"class":1074},[1053,12907,5872],{"class":1771},[1053,12909,1109],{"class":1074},[1053,12911,1975],{"class":1419},[1053,12913,12914],{"class":1423},"Resource monitoring started",[1053,12916,1975],{"class":1419},[1053,12918,1800],{"class":1074},[1053,12920,12921],{"class":1055,"line":1354},[1053,12922,1096],{"class":1095},[1053,12924,12925,12927,12930,12932,12934],{"class":1055,"line":1359},[1053,12926,1102],{"class":1066},[1053,12928,12929],{"class":1105}," stop_monitoring",[1053,12931,1109],{"class":1074},[1053,12933,1113],{"class":1112},[1053,12935,1123],{"class":1074},[1053,12937,12938,12940,12943],{"class":1055,"line":1378},[1053,12939,1129],{"class":1081},[1053,12941,12942],{"class":1085},"Stop resource monitoring",[1053,12944,1089],{"class":1081},[1053,12946,12947,12949,12951,12953,12955],{"class":1055,"line":1828},[1053,12948,3459],{"class":1407},[1053,12950,1762],{"class":1074},[1053,12952,12701],{"class":1765},[1053,12954,1411],{"class":1074},[1053,12956,9418],{"class":2530},[1053,12958,12959,12961,12963,12965,12967],{"class":1055,"line":1834},[1053,12960,4249],{"class":1140},[1053,12962,4932],{"class":1407},[1053,12964,1762],{"class":1074},[1053,12966,12714],{"class":1765},[1053,12968,1075],{"class":1074},[1053,12970,12971,12973,12975,12977,12979,12982],{"class":1055,"line":1847},[1053,12972,6531],{"class":1407},[1053,12974,1762],{"class":1074},[1053,12976,12714],{"class":1765},[1053,12978,1762],{"class":1074},[1053,12980,12981],{"class":1771},"join",[1053,12983,1821],{"class":1074},[1053,12985,12986,12988,12990,12992,12994,12996,12999,13001],{"class":1055,"line":1853},[1053,12987,4119],{"class":1095},[1053,12989,1762],{"class":1074},[1053,12991,5872],{"class":1771},[1053,12993,1109],{"class":1074},[1053,12995,1975],{"class":1419},[1053,12997,12998],{"class":1423},"Resource monitoring stopped",[1053,13000,1975],{"class":1419},[1053,13002,1800],{"class":1074},[1053,13004,13005],{"class":1055,"line":1875},[1053,13006,1096],{"class":1095},[1053,13008,13009,13011,13014,13016,13018],{"class":1055,"line":1912},[1053,13010,1102],{"class":1066},[1053,13012,13013],{"class":1105}," _monitor_loop",[1053,13015,1109],{"class":1074},[1053,13017,1113],{"class":1112},[1053,13019,1123],{"class":1074},[1053,13021,13022,13024,13027],{"class":1055,"line":1917},[1053,13023,1129],{"class":1081},[1053,13025,13026],{"class":1085},"Main monitoring loop",[1053,13028,1089],{"class":1081},[1053,13030,13031,13033,13035,13037,13039],{"class":1055,"line":1927},[1053,13032,12028],{"class":1140},[1053,13034,4932],{"class":1407},[1053,13036,1762],{"class":1074},[1053,13038,12701],{"class":1765},[1053,13040,1075],{"class":1074},[1053,13042,13043,13045],{"class":1055,"line":1955},[1053,13044,9342],{"class":1140},[1053,13046,1075],{"class":1074},[1053,13048,13049,13052,13054,13057],{"class":1055,"line":1963},[1053,13050,13051],{"class":1407},"                self",[1053,13053,1762],{"class":1074},[1053,13055,13056],{"class":1771},"_check_resources",[1053,13058,1821],{"class":1074},[1053,13060,13061,13064,13066,13068,13070,13072,13074],{"class":1055,"line":2370},[1053,13062,13063],{"class":1095},"                time",[1053,13065,1762],{"class":1074},[1053,13067,12137],{"class":1771},[1053,13069,1109],{"class":1074},[1053,13071,11994],{"class":2203},[1053,13073,7561],{"class":1074},[1053,13075,13076],{"class":1059},"  # Check every 30 seconds\n",[1053,13078,13079,13081,13083,13085,13087],{"class":1055,"line":2390},[1053,13080,9428],{"class":1140},[1053,13082,5093],{"class":1969},[1053,13084,5096],{"class":1140},[1053,13086,5099],{"class":1095},[1053,13088,1075],{"class":1074},[1053,13090,13091,13094,13096,13098,13100,13102,13105,13107,13109,13111,13113],{"class":1055,"line":2396},[1053,13092,13093],{"class":1095},"                logger",[1053,13095,1762],{"class":1074},[1053,13097,3959],{"class":1771},[1053,13099,1109],{"class":1074},[1053,13101,1892],{"class":1066},[1053,13103,13104],{"class":1423},"\"Error in resource monitoring: ",[1053,13106,1899],{"class":1898},[1053,13108,6649],{"class":1771},[1053,13110,1904],{"class":1898},[1053,13112,1975],{"class":1423},[1053,13114,1800],{"class":1074},[1053,13116,13117],{"class":1055,"line":2401},[1053,13118,1096],{"class":1095},[1053,13120,13121,13123,13126,13128,13130],{"class":1055,"line":2407},[1053,13122,1102],{"class":1066},[1053,13124,13125],{"class":1105}," _check_resources",[1053,13127,1109],{"class":1074},[1053,13129,1113],{"class":1112},[1053,13131,1123],{"class":1074},[1053,13133,13134,13136,13139],{"class":1055,"line":2413},[1053,13135,1129],{"class":1081},[1053,13137,13138],{"class":1085},"Check system resources",[1053,13140,1089],{"class":1081},[1053,13142,13143],{"class":1055,"line":2432},[1053,13144,13145],{"class":1059},"        # CPU usage\n",[1053,13147,13148,13151,13153,13155,13157,13159,13161,13164,13166,13168],{"class":1055,"line":3280},[1053,13149,13150],{"class":1095},"        cpu_percent ",[1053,13152,1756],{"class":1074},[1053,13154,10802],{"class":1095},[1053,13156,1762],{"class":1074},[1053,13158,12739],{"class":1771},[1053,13160,1109],{"class":1074},[1053,13162,13163],{"class":1792},"interval",[1053,13165,1756],{"class":1074},[1053,13167,12142],{"class":2203},[1053,13169,1800],{"class":1074},[1053,13171,13172,13174,13177,13179,13181,13183,13185,13187,13189,13191,13193],{"class":1055,"line":3968},[1053,13173,4249],{"class":1140},[1053,13175,13176],{"class":1095}," cpu_percent ",[1053,13178,10633],{"class":3099},[1053,13180,4932],{"class":1407},[1053,13182,1762],{"class":1074},[1053,13184,12728],{"class":1765},[1053,13186,4960],{"class":1074},[1053,13188,1427],{"class":1419},[1053,13190,12739],{"class":1423},[1053,13192,1427],{"class":1419},[1053,13194,4970],{"class":1074},[1053,13196,13197,13199,13201,13203,13205,13207,13210,13212,13214,13216,13219],{"class":1055,"line":3988},[1053,13198,5113],{"class":1095},[1053,13200,1762],{"class":1074},[1053,13202,4622],{"class":1771},[1053,13204,1109],{"class":1074},[1053,13206,1892],{"class":1066},[1053,13208,13209],{"class":1423},"\"High CPU usage: ",[1053,13211,1899],{"class":1898},[1053,13213,12739],{"class":1771},[1053,13215,1904],{"class":1898},[1053,13217,13218],{"class":1423},"%\"",[1053,13220,1800],{"class":1074},[1053,13222,13223,13225,13227,13230],{"class":1055,"line":4007},[1053,13224,6531],{"class":1407},[1053,13226,1762],{"class":1074},[1053,13228,13229],{"class":1771},"_handle_high_cpu",[1053,13231,1821],{"class":1074},[1053,13233,13234],{"class":1055,"line":4026},[1053,13235,4107],{"class":1095},[1053,13237,13238],{"class":1055,"line":4043},[1053,13239,13240],{"class":1059},"        # Memory usage\n",[1053,13242,13243,13246,13248,13250,13252,13254],{"class":1055,"line":4065},[1053,13244,13245],{"class":1095},"        memory ",[1053,13247,1756],{"class":1074},[1053,13249,10802],{"class":1095},[1053,13251,1762],{"class":1074},[1053,13253,10807],{"class":1771},[1053,13255,1821],{"class":1074},[1053,13257,13258,13260,13262,13264,13266,13268,13270,13272,13274,13276,13278,13280,13282],{"class":1055,"line":4092},[1053,13259,4249],{"class":1140},[1053,13261,10832],{"class":1095},[1053,13263,1762],{"class":1074},[1053,13265,10837],{"class":1765},[1053,13267,12037],{"class":3099},[1053,13269,4932],{"class":1407},[1053,13271,1762],{"class":1074},[1053,13273,12728],{"class":1765},[1053,13275,4960],{"class":1074},[1053,13277,1427],{"class":1419},[1053,13279,12755],{"class":1423},[1053,13281,1427],{"class":1419},[1053,13283,4970],{"class":1074},[1053,13285,13286,13288,13290,13292,13294,13296,13299,13301,13303,13305,13307,13309,13311],{"class":1055,"line":4098},[1053,13287,5113],{"class":1095},[1053,13289,1762],{"class":1074},[1053,13291,4622],{"class":1771},[1053,13293,1109],{"class":1074},[1053,13295,1892],{"class":1066},[1053,13297,13298],{"class":1423},"\"High memory usage: ",[1053,13300,1899],{"class":1898},[1053,13302,9246],{"class":1771},[1053,13304,1762],{"class":1074},[1053,13306,10837],{"class":1765},[1053,13308,1904],{"class":1898},[1053,13310,13218],{"class":1423},[1053,13312,1800],{"class":1074},[1053,13314,13315,13317,13319,13322],{"class":1055,"line":4104},[1053,13316,6531],{"class":1407},[1053,13318,1762],{"class":1074},[1053,13320,13321],{"class":1771},"_handle_high_memory",[1053,13323,1821],{"class":1074},[1053,13325,13326],{"class":1055,"line":4110},[1053,13327,4107],{"class":1095},[1053,13329,13330],{"class":1055,"line":4116},[1053,13331,13332],{"class":1059},"        # Disk usage\n",[1053,13334,13335,13338,13340,13342,13344,13346,13348,13350,13352,13354],{"class":1055,"line":4161},[1053,13336,13337],{"class":1095},"        disk ",[1053,13339,1756],{"class":1074},[1053,13341,10802],{"class":1095},[1053,13343,1762],{"class":1074},[1053,13345,10571],{"class":1771},[1053,13347,1109],{"class":1074},[1053,13349,1427],{"class":1419},[1053,13351,10578],{"class":1423},[1053,13353,1427],{"class":1419},[1053,13355,1800],{"class":1074},[1053,13357,13358,13361,13363,13365,13368,13370,13373,13376,13379,13381,13384,13386,13388],{"class":1055,"line":4180},[1053,13359,13360],{"class":1095},"        disk_percent ",[1053,13362,1756],{"class":1074},[1053,13364,10592],{"class":1074},[1053,13366,13367],{"class":1095},"disk",[1053,13369,1762],{"class":1074},[1053,13371,13372],{"class":1765},"used",[1053,13374,13375],{"class":3099}," /",[1053,13377,13378],{"class":1095}," disk",[1053,13380,1762],{"class":1074},[1053,13382,13383],{"class":1765},"total",[1053,13385,7561],{"class":1074},[1053,13387,10330],{"class":3099},[1053,13389,10607],{"class":2203},[1053,13391,13392,13394,13397,13399,13401,13403,13405,13407,13409,13411,13413],{"class":1055,"line":4199},[1053,13393,4249],{"class":1140},[1053,13395,13396],{"class":1095}," disk_percent ",[1053,13398,10633],{"class":3099},[1053,13400,4932],{"class":1407},[1053,13402,1762],{"class":1074},[1053,13404,12728],{"class":1765},[1053,13406,4960],{"class":1074},[1053,13408,1427],{"class":1419},[1053,13410,12771],{"class":1423},[1053,13412,1427],{"class":1419},[1053,13414,4970],{"class":1074},[1053,13416,13417,13419,13421,13423,13425,13427,13430,13432,13434,13436,13438],{"class":1055,"line":4213},[1053,13418,5113],{"class":1095},[1053,13420,1762],{"class":1074},[1053,13422,4622],{"class":1771},[1053,13424,1109],{"class":1074},[1053,13426,1892],{"class":1066},[1053,13428,13429],{"class":1423},"\"High disk usage: ",[1053,13431,1899],{"class":1898},[1053,13433,12771],{"class":1771},[1053,13435,1904],{"class":1898},[1053,13437,13218],{"class":1423},[1053,13439,1800],{"class":1074},[1053,13441,13442,13444,13446,13449],{"class":1055,"line":4219},[1053,13443,6531],{"class":1407},[1053,13445,1762],{"class":1074},[1053,13447,13448],{"class":1771},"_handle_high_disk",[1053,13450,1821],{"class":1074},[1053,13452,13453],{"class":1055,"line":4224},[1053,13454,1096],{"class":1095},[1053,13456,13457,13459,13462,13464,13466],{"class":1055,"line":4230},[1053,13458,1102],{"class":1066},[1053,13460,13461],{"class":1105}," _handle_high_cpu",[1053,13463,1109],{"class":1074},[1053,13465,1113],{"class":1112},[1053,13467,1123],{"class":1074},[1053,13469,13470,13472,13475],{"class":1055,"line":4246},[1053,13471,1129],{"class":1081},[1053,13473,13474],{"class":1085},"Handle high CPU usage",[1053,13476,1089],{"class":1081},[1053,13478,13479],{"class":1055,"line":4269},[1053,13480,13481],{"class":1059},"        # Could implement CPU throttling or request limiting\n",[1053,13483,13484],{"class":1055,"line":4284},[1053,13485,1141],{"class":1140},[1053,13487,13488],{"class":1055,"line":4306},[1053,13489,1096],{"class":1095},[1053,13491,13492,13494,13497,13499,13501],{"class":1055,"line":4320},[1053,13493,1102],{"class":1066},[1053,13495,13496],{"class":1105}," _handle_high_memory",[1053,13498,1109],{"class":1074},[1053,13500,1113],{"class":1112},[1053,13502,1123],{"class":1074},[1053,13504,13505,13507,13510],{"class":1055,"line":4325},[1053,13506,1129],{"class":1081},[1053,13508,13509],{"class":1085},"Handle high memory usage",[1053,13511,1089],{"class":1081},[1053,13513,13514],{"class":1055,"line":4348},[1053,13515,13516],{"class":1059},"        # Clear caches to free memory\n",[1053,13518,13519,13521,13523,13525,13527,13529,13531,13533],{"class":1055,"line":4353},[1053,13520,8772],{"class":1140},[1053,13522,5215],{"class":1095},[1053,13524,1762],{"class":1074},[1053,13526,9071],{"class":1095},[1053,13528,1762],{"class":1074},[1053,13530,9076],{"class":1095},[1053,13532,2104],{"class":1140},[1053,13534,9081],{"class":1095},[1053,13536,13537,13540,13542,13545],{"class":1055,"line":4359},[1053,13538,13539],{"class":1095},"        cache",[1053,13541,1762],{"class":1074},[1053,13543,13544],{"class":1771},"clear",[1053,13546,1821],{"class":1074},[1053,13548,13549,13551,13553,13555,13557,13559,13562,13564],{"class":1055,"line":4380},[1053,13550,4119],{"class":1095},[1053,13552,1762],{"class":1074},[1053,13554,5872],{"class":1771},[1053,13556,1109],{"class":1074},[1053,13558,1975],{"class":1419},[1053,13560,13561],{"class":1423},"Cleared cache due to high memory usage",[1053,13563,1975],{"class":1419},[1053,13565,1800],{"class":1074},[1053,13567,13568],{"class":1055,"line":4385},[1053,13569,1096],{"class":1095},[1053,13571,13572,13574,13577,13579,13581],{"class":1055,"line":4404},[1053,13573,1102],{"class":1066},[1053,13575,13576],{"class":1105}," _handle_high_disk",[1053,13578,1109],{"class":1074},[1053,13580,1113],{"class":1112},[1053,13582,1123],{"class":1074},[1053,13584,13585,13587,13590],{"class":1055,"line":4410},[1053,13586,1129],{"class":1081},[1053,13588,13589],{"class":1085},"Handle high disk usage",[1053,13591,1089],{"class":1081},[1053,13593,13594],{"class":1055,"line":4420},[1053,13595,13596],{"class":1059},"        # Could implement log rotation or cleanup\n",[1053,13598,13599],{"class":1055,"line":4433},[1053,13600,1141],{"class":1140},[1053,13602,13603],{"class":1055,"line":4477},[1053,13604,1269],{"emptyLinePlaceholder":1268},[1053,13606,13607],{"class":1055,"line":4518},[1053,13608,13609],{"class":1059},"# Connection pooling\n",[1053,13611,13612,13614,13617],{"class":1055,"line":4538},[1053,13613,1067],{"class":1066},[1053,13615,13616],{"class":1070}," DatabaseConnectionManager",[1053,13618,1075],{"class":1074},[1053,13620,13621,13623,13626],{"class":1055,"line":4553},[1053,13622,1082],{"class":1081},[1053,13624,13625],{"class":1085},"Manage database connections efficiently",[1053,13627,1089],{"class":1081},[1053,13629,13630],{"class":1055,"line":4572},[1053,13631,1096],{"class":1095},[1053,13633,13634,13636,13638,13640,13642],{"class":1055,"line":4595},[1053,13635,1102],{"class":1066},[1053,13637,3424],{"class":3423},[1053,13639,1109],{"class":1074},[1053,13641,1113],{"class":1112},[1053,13643,1123],{"class":1074},[1053,13645,13646,13648,13650,13653,13655,13657,13659,13661,13663,13665,13668,13670,13672,13674],{"class":1055,"line":4600},[1053,13647,3459],{"class":1407},[1053,13649,1762],{"class":1074},[1053,13651,13652],{"class":1765},"max_connections",[1053,13654,1411],{"class":1074},[1053,13656,10135],{"class":3423},[1053,13658,1109],{"class":1074},[1053,13660,10140],{"class":1771},[1053,13662,1116],{"class":1074},[1053,13664,1447],{"class":1419},[1053,13666,13667],{"class":1423},"DB_MAX_CONNECTIONS",[1053,13669,1427],{"class":1419},[1053,13671,1116],{"class":1074},[1053,13673,8680],{"class":2203},[1053,13675,1800],{"class":1074},[1053,13677,13678,13680,13682,13685,13687,13689,13691,13693,13695,13697,13700,13702,13704,13707],{"class":1055,"line":4605},[1053,13679,3459],{"class":1407},[1053,13681,1762],{"class":1074},[1053,13683,13684],{"class":1765},"connection_timeout",[1053,13686,1411],{"class":1074},[1053,13688,10135],{"class":3423},[1053,13690,1109],{"class":1074},[1053,13692,10140],{"class":1771},[1053,13694,1116],{"class":1074},[1053,13696,1447],{"class":1419},[1053,13698,13699],{"class":1423},"DB_CONNECTION_TIMEOUT",[1053,13701,1427],{"class":1419},[1053,13703,1116],{"class":1074},[1053,13705,13706],{"class":2203}," 300",[1053,13708,1800],{"class":1074},[1053,13710,13711],{"class":1055,"line":4610},[1053,13712,1096],{"class":1095},[1053,13714,13715,13717,13720,13722,13724],{"class":1055,"line":4615},[1053,13716,1102],{"class":1066},[1053,13718,13719],{"class":1105}," configure_connection_pooling",[1053,13721,1109],{"class":1074},[1053,13723,1113],{"class":1112},[1053,13725,1123],{"class":1074},[1053,13727,13728,13730,13733],{"class":1055,"line":4659},[1053,13729,1129],{"class":1081},[1053,13731,13732],{"class":1085},"Configure database connection pooling",[1053,13734,1089],{"class":1081},[1053,13736,13737],{"class":1055,"line":4678},[1053,13738,13739],{"class":1059},"        # This would typically be done in settings.py\n",[1053,13741,13742,13745,13747],{"class":1055,"line":4697},[1053,13743,13744],{"class":1095},"        database_config ",[1053,13746,1756],{"class":1074},[1053,13748,1414],{"class":1074},[1053,13750,13751,13753,13755,13757,13759,13761,13763,13765],{"class":1055,"line":4710},[1053,13752,3070],{"class":1419},[1053,13754,1440],{"class":1423},[1053,13756,1427],{"class":1419},[1053,13758,1430],{"class":1074},[1053,13760,1447],{"class":1419},[1053,13762,1450],{"class":1423},[1053,13764,1427],{"class":1419},[1053,13766,1455],{"class":1074},[1053,13768,13769,13771,13774,13776,13778],{"class":1055,"line":4715},[1053,13770,3070],{"class":1419},[1053,13772,13773],{"class":1423},"OPTIONS",[1053,13775,1427],{"class":1419},[1053,13777,1430],{"class":1074},[1053,13779,1414],{"class":1074},[1053,13781,13782,13784,13787,13789,13791,13793,13795,13797],{"class":1055,"line":4720},[1053,13783,2228],{"class":1419},[1053,13785,13786],{"class":1423},"MAX_CONNS",[1053,13788,1427],{"class":1419},[1053,13790,1430],{"class":1074},[1053,13792,4932],{"class":1407},[1053,13794,1762],{"class":1074},[1053,13796,13652],{"class":1765},[1053,13798,1455],{"class":1074},[1053,13800,13801,13803,13806,13808,13810,13812,13814,13816],{"class":1055,"line":4735},[1053,13802,2228],{"class":1419},[1053,13804,13805],{"class":1423},"CONN_MAX_AGE",[1053,13807,1427],{"class":1419},[1053,13809,1430],{"class":1074},[1053,13811,4932],{"class":1407},[1053,13813,1762],{"class":1074},[1053,13815,13684],{"class":1765},[1053,13817,1455],{"class":1074},[1053,13819,13820],{"class":1055,"line":4740},[1053,13821,4095],{"class":1074},[1053,13823,13824],{"class":1055,"line":4748},[1053,13825,4101],{"class":1074},[1053,13827,13828,13830],{"class":1055,"line":4753},[1053,13829,1930],{"class":1140},[1053,13831,13832],{"class":1095}," database_config\n",[1053,13834,13835],{"class":1055,"line":4759},[1053,13836,1269],{"emptyLinePlaceholder":1268},[1053,13838,13839],{"class":1055,"line":4772},[1053,13840,13841],{"class":1059},"# Memory management\n",[1053,13843,13844,13846,13849],{"class":1055,"line":4777},[1053,13845,1067],{"class":1066},[1053,13847,13848],{"class":1070}," MemoryManager",[1053,13850,1075],{"class":1074},[1053,13852,13853,13855,13858],{"class":1055,"line":4794},[1053,13854,1082],{"class":1081},[1053,13856,13857],{"class":1085},"Manage memory usage",[1053,13859,1089],{"class":1081},[1053,13861,13862],{"class":1055,"line":4804},[1053,13863,1096],{"class":1095},[1053,13865,13866,13868],{"class":1055,"line":4812},[1053,13867,2140],{"class":1074},[1053,13869,13870],{"class":1969},"staticmethod\n",[1053,13872,13873,13875,13878],{"class":1055,"line":4818},[1053,13874,1102],{"class":1066},[1053,13876,13877],{"class":1105}," clear_query_cache",[1053,13879,4864],{"class":1074},[1053,13881,13882,13884,13887],{"class":1055,"line":4867},[1053,13883,1129],{"class":1081},[1053,13885,13886],{"class":1085},"Clear Django query cache",[1053,13888,1089],{"class":1081},[1053,13890,13891,13893,13895,13897,13899,13901],{"class":1055,"line":4877},[1053,13892,8772],{"class":1140},[1053,13894,5215],{"class":1095},[1053,13896,1762],{"class":1074},[1053,13898,9055],{"class":1095},[1053,13900,2104],{"class":1140},[1053,13902,13903],{"class":1095}," reset_queries\n",[1053,13905,13906,13909],{"class":1055,"line":4890},[1053,13907,13908],{"class":1771},"        reset_queries",[1053,13910,1821],{"class":1074},[1053,13912,13913],{"class":1055,"line":4906},[1053,13914,1096],{"class":1095},[1053,13916,13917,13919],{"class":1055,"line":4912},[1053,13918,2140],{"class":1074},[1053,13920,13870],{"class":1969},[1053,13922,13923,13925,13928],{"class":1055,"line":4918},[1053,13924,1102],{"class":1066},[1053,13926,13927],{"class":1105}," clear_template_cache",[1053,13929,4864],{"class":1074},[1053,13931,13932,13934,13937],{"class":1055,"line":4924},[1053,13933,1129],{"class":1081},[1053,13935,13936],{"class":1085},"Clear template cache",[1053,13938,1089],{"class":1081},[1053,13940,13941,13943,13945,13947,13950,13952,13955,13957],{"class":1055,"line":4950},[1053,13942,8772],{"class":1140},[1053,13944,5215],{"class":1095},[1053,13946,1762],{"class":1074},[1053,13948,13949],{"class":1095},"template",[1053,13951,1762],{"class":1074},[1053,13953,13954],{"class":1095},"loader ",[1053,13956,2104],{"class":1140},[1053,13958,13959],{"class":1095}," get_template\n",[1053,13961,13962,13965,13967,13970],{"class":1055,"line":4973},[1053,13963,13964],{"class":1095},"        get_template",[1053,13966,1762],{"class":1074},[1053,13968,13969],{"class":1771},"cache_clear",[1053,13971,1821],{"class":1074},[1053,13973,13974],{"class":1055,"line":4982},[1053,13975,1096],{"class":1095},[1053,13977,13978,13980],{"class":1055,"line":4994},[1053,13979,2140],{"class":1074},[1053,13981,13870],{"class":1969},[1053,13983,13984,13986,13989],{"class":1055,"line":5011},[1053,13985,1102],{"class":1066},[1053,13987,13988],{"class":1105}," force_garbage_collection",[1053,13990,4864],{"class":1074},[1053,13992,13993,13995,13998],{"class":1055,"line":5036},[1053,13994,1129],{"class":1081},[1053,13996,13997],{"class":1085},"Force garbage collection",[1053,13999,1089],{"class":1081},[1053,14001,14002,14004],{"class":1055,"line":5041},[1053,14003,8531],{"class":1140},[1053,14005,14006],{"class":1095}," gc\n",[1053,14008,14009,14012,14014,14017,14019,14022],{"class":1055,"line":5046},[1053,14010,14011],{"class":1095},"        collected ",[1053,14013,1756],{"class":1074},[1053,14015,14016],{"class":1095}," gc",[1053,14018,1762],{"class":1074},[1053,14020,14021],{"class":1771},"collect",[1053,14023,1821],{"class":1074},[1053,14025,14026,14028,14030,14032,14034,14036,14039,14041,14044,14046,14049],{"class":1055,"line":5064},[1053,14027,4119],{"class":1095},[1053,14029,1762],{"class":1074},[1053,14031,5872],{"class":1771},[1053,14033,1109],{"class":1074},[1053,14035,1892],{"class":1066},[1053,14037,14038],{"class":1423},"\"Garbage collection freed ",[1053,14040,1899],{"class":1898},[1053,14042,14043],{"class":1771},"collected",[1053,14045,1904],{"class":1898},[1053,14047,14048],{"class":1423}," objects\"",[1053,14050,1800],{"class":1074},[1053,14052,14053,14055],{"class":1055,"line":5069},[1053,14054,1930],{"class":1140},[1053,14056,14057],{"class":1095}," collected\n",[1053,14059,14060],{"class":1055,"line":5079},[1053,14061,1269],{"emptyLinePlaceholder":1268},[1053,14063,14064],{"class":1055,"line":5088},[1053,14065,14066],{"class":1059},"# Resource limits\n",[1053,14068,14069,14071,14074],{"class":1055,"line":5104},[1053,14070,1067],{"class":1066},[1053,14072,14073],{"class":1070}," ResourceLimiter",[1053,14075,1075],{"class":1074},[1053,14077,14078,14080,14083],{"class":1055,"line":5110},[1053,14079,1082],{"class":1081},[1053,14081,14082],{"class":1085},"Implement resource limits",[1053,14084,1089],{"class":1081},[1053,14086,14087],{"class":1055,"line":5132},[1053,14088,1096],{"class":1095},[1053,14090,14091,14093,14095,14097,14099],{"class":1055,"line":5141},[1053,14092,1102],{"class":1066},[1053,14094,3424],{"class":3423},[1053,14096,1109],{"class":1074},[1053,14098,1113],{"class":1112},[1053,14100,1123],{"class":1074},[1053,14102,14103,14105,14107,14110,14112,14114,14116,14118,14120,14122,14125,14127,14129,14131,14133,14136,14138,14140,14142],{"class":1055,"line":5154},[1053,14104,3459],{"class":1407},[1053,14106,1762],{"class":1074},[1053,14108,14109],{"class":1765},"max_request_size",[1053,14111,1411],{"class":1074},[1053,14113,10135],{"class":3423},[1053,14115,1109],{"class":1074},[1053,14117,10140],{"class":1771},[1053,14119,1116],{"class":1074},[1053,14121,1447],{"class":1419},[1053,14123,14124],{"class":1423},"MAX_REQUEST_SIZE",[1053,14126,1427],{"class":1419},[1053,14128,1116],{"class":1074},[1053,14130,10636],{"class":2203},[1053,14132,10330],{"class":3099},[1053,14134,14135],{"class":2203}," 1024",[1053,14137,10330],{"class":3099},[1053,14139,14135],{"class":2203},[1053,14141,7561],{"class":1074},[1053,14143,14144],{"class":1059},"  # 10MB\n",[1053,14146,14147,14149,14151,14154,14156,14158,14160,14162,14164,14166,14169,14171,14173,14176,14178,14180,14182,14184,14186],{"class":1055,"line":5169},[1053,14148,3459],{"class":1407},[1053,14150,1762],{"class":1074},[1053,14152,14153],{"class":1765},"max_response_size",[1053,14155,1411],{"class":1074},[1053,14157,10135],{"class":3423},[1053,14159,1109],{"class":1074},[1053,14161,10140],{"class":1771},[1053,14163,1116],{"class":1074},[1053,14165,1447],{"class":1419},[1053,14167,14168],{"class":1423},"MAX_RESPONSE_SIZE",[1053,14170,1427],{"class":1419},[1053,14172,1116],{"class":1074},[1053,14174,14175],{"class":2203}," 50",[1053,14177,10330],{"class":3099},[1053,14179,14135],{"class":2203},[1053,14181,10330],{"class":3099},[1053,14183,14135],{"class":2203},[1053,14185,7561],{"class":1074},[1053,14187,14188],{"class":1059},"  # 50MB\n",[1053,14190,14191],{"class":1055,"line":8528},[1053,14192,1096],{"class":1095},[1053,14194,14195,14197,14200,14202,14204,14206,14208],{"class":1055,"line":8536},[1053,14196,1102],{"class":1066},[1053,14198,14199],{"class":1105}," check_request_size",[1053,14201,1109],{"class":1074},[1053,14203,1113],{"class":1112},[1053,14205,1116],{"class":1074},[1053,14207,2427],{"class":1119},[1053,14209,1123],{"class":1074},[1053,14211,14212,14214,14217],{"class":1055,"line":8551},[1053,14213,1129],{"class":1081},[1053,14215,14216],{"class":1085},"Check if request size is within limits",[1053,14218,1089],{"class":1081},[1053,14220,14221,14224,14226,14228,14230,14232,14234,14236,14238,14240,14243,14245],{"class":1055,"line":8556},[1053,14222,14223],{"class":1095},"        content_length ",[1053,14225,1756],{"class":1074},[1053,14227,2427],{"class":1095},[1053,14229,1762],{"class":1074},[1053,14231,5931],{"class":4060},[1053,14233,1762],{"class":1074},[1053,14235,1787],{"class":1771},[1053,14237,1109],{"class":1074},[1053,14239,1427],{"class":1419},[1053,14241,14242],{"class":1423},"CONTENT_LENGTH",[1053,14244,1427],{"class":1419},[1053,14246,1800],{"class":1074},[1053,14248,14249,14251,14254,14257,14259,14261,14264,14266,14268,14270,14272,14274],{"class":1055,"line":8588},[1053,14250,4249],{"class":1140},[1053,14252,14253],{"class":1095}," content_length ",[1053,14255,14256],{"class":3099},"and",[1053,14258,8951],{"class":1969},[1053,14260,1109],{"class":1074},[1053,14262,14263],{"class":1771},"content_length",[1053,14265,7561],{"class":1074},[1053,14267,12037],{"class":3099},[1053,14269,4932],{"class":1407},[1053,14271,1762],{"class":1074},[1053,14273,14109],{"class":1765},[1053,14275,1075],{"class":1074},[1053,14277,14278,14280,14282,14284,14286,14288],{"class":1055,"line":8593},[1053,14279,12318],{"class":1140},[1053,14281,5215],{"class":1095},[1053,14283,1762],{"class":1074},[1053,14285,9039],{"class":1095},[1053,14287,2104],{"class":1140},[1053,14289,14290],{"class":1095}," HttpResponseBadRequest\n",[1053,14292,14293,14295,14298,14300,14302,14305,14307],{"class":1055,"line":8609},[1053,14294,5049],{"class":1140},[1053,14296,14297],{"class":1771}," HttpResponseBadRequest",[1053,14299,1109],{"class":1074},[1053,14301,1975],{"class":1419},[1053,14303,14304],{"class":1423},"Request too large",[1053,14306,1975],{"class":1419},[1053,14308,1800],{"class":1074},[1053,14310,14311,14313],{"class":1055,"line":8625},[1053,14312,1930],{"class":1140},[1053,14314,12719],{"class":2530},[1053,14316,14317],{"class":1055,"line":8630},[1053,14318,1096],{"class":1095},[1053,14320,14321,14323,14326,14328,14330,14332,14334],{"class":1055,"line":8636},[1053,14322,1102],{"class":1066},[1053,14324,14325],{"class":1105}," check_response_size",[1053,14327,1109],{"class":1074},[1053,14329,1113],{"class":1112},[1053,14331,1116],{"class":1074},[1053,14333,4453],{"class":1119},[1053,14335,1123],{"class":1074},[1053,14337,14338,14340,14343],{"class":1055,"line":8658},[1053,14339,1129],{"class":1081},[1053,14341,14342],{"class":1085},"Check if response size is within limits",[1053,14344,1089],{"class":1081},[1053,14346,14347,14349,14351,14353,14355,14357,14359,14362,14364,14366,14369,14372,14374,14376,14378,14380,14382,14384,14386,14388,14390],{"class":1055,"line":8685},[1053,14348,4249],{"class":1140},[1053,14350,12273],{"class":3423},[1053,14352,1109],{"class":1074},[1053,14354,4642],{"class":1771},[1053,14356,1116],{"class":1074},[1053,14358,1447],{"class":1419},[1053,14360,14361],{"class":1423},"content",[1053,14363,1427],{"class":1419},[1053,14365,7561],{"class":1074},[1053,14367,14368],{"class":3099}," and",[1053,14370,14371],{"class":3423}," len",[1053,14373,1109],{"class":1074},[1053,14375,4642],{"class":1771},[1053,14377,1762],{"class":1074},[1053,14379,14361],{"class":1765},[1053,14381,7561],{"class":1074},[1053,14383,12037],{"class":3099},[1053,14385,4932],{"class":1407},[1053,14387,1762],{"class":1074},[1053,14389,14153],{"class":1765},[1053,14391,1075],{"class":1074},[1053,14393,14394,14396,14398,14400,14402,14404,14407,14409],{"class":1055,"line":8690},[1053,14395,5113],{"class":1095},[1053,14397,1762],{"class":1074},[1053,14399,4622],{"class":1771},[1053,14401,1109],{"class":1074},[1053,14403,1975],{"class":1419},[1053,14405,14406],{"class":1423},"Response size exceeds limit",[1053,14408,1975],{"class":1419},[1053,14410,1800],{"class":1074},[1053,14412,14413],{"class":1055,"line":8696},[1053,14414,14415],{"class":1059},"            # Could truncate or compress response\n",[1053,14417,14418,14420],{"class":1055,"line":8710},[1053,14419,1930],{"class":1140},[1053,14421,4745],{"class":1095},[1053,14423,14424],{"class":1055,"line":8720},[1053,14425,1269],{"emptyLinePlaceholder":1268},[1053,14427,14428],{"class":1055,"line":8725},[1053,14429,14430],{"class":1059},"# Initialize resource monitoring\n",[1053,14432,14433,14436,14438,14440],{"class":1055,"line":8739},[1053,14434,14435],{"class":1095},"resource_monitor ",[1053,14437,1756],{"class":1074},[1053,14439,12665],{"class":1771},[1053,14441,1821],{"class":1074},[1053,14443,14444,14447,14449,14452],{"class":1055,"line":8749},[1053,14445,14446],{"class":1095},"resource_monitor",[1053,14448,1762],{"class":1074},[1053,14450,14451],{"class":1771},"start_monitoring",[1053,14453,1821],{"class":1074},[1030,14455,14457],{"id":14456},"monitoring-and-observability","Monitoring and Observability",[1035,14459,14461],{"id":14460},"_1-metrics-collection","1. Metrics Collection",[1043,14463,14465],{"className":1045,"code":14464,"language":1047,"meta":1048,"style":1048},"# metrics.py\nfrom prometheus_client import Counter, Histogram, Gauge, Info\nimport time\nimport functools\n\n# Application metrics\nREQUEST_COUNT = Counter(\n    'http_requests_total',\n    'Total HTTP requests',\n    ['method', 'endpoint', 'status']\n)\n\nREQUEST_DURATION = Histogram(\n    'http_request_duration_seconds',\n    'HTTP request duration',\n    ['method', 'endpoint']\n)\n\nACTIVE_CONNECTIONS = Gauge(\n    'active_connections',\n    'Number of active connections'\n)\n\nSERVICE_INFO = Info(\n    'service_info',\n    'Service information'\n)\n\n# Business metrics\nUSER_REGISTRATIONS = Counter(\n    'user_registrations_total',\n    'Total user registrations'\n)\n\nUSER_LOGINS = Counter(\n    'user_logins_total',\n    'Total user logins',\n    ['status']\n)\n\nACTIVE_USERS = Gauge(\n    'active_users',\n    'Number of active users'\n)\n\nclass MetricsCollector:\n    \"\"\"Collect application metrics\"\"\"\n    \n    @staticmethod\n    def record_request(method, endpoint, status_code, duration):\n        \"\"\"Record HTTP request metrics\"\"\"\n        REQUEST_COUNT.labels(\n            method=method,\n            endpoint=endpoint,\n            status=status_code\n        ).inc()\n        \n        REQUEST_DURATION.labels(\n            method=method,\n            endpoint=endpoint\n        ).observe(duration)\n    \n    @staticmethod\n    def record_user_registration():\n        \"\"\"Record user registration\"\"\"\n        USER_REGISTRATIONS.inc()\n    \n    @staticmethod\n    def record_user_login(success=True):\n        \"\"\"Record user login attempt\"\"\"\n        status = 'success' if success else 'failure'\n        USER_LOGINS.labels(status=status).inc()\n    \n    @staticmethod\n    def update_active_users(count):\n        \"\"\"Update active users count\"\"\"\n        ACTIVE_USERS.set(count)\n    \n    @staticmethod\n    def update_service_info():\n        \"\"\"Update service information\"\"\"\n        SERVICE_INFO.info({\n            'version': settings.SERVICE_VERSION,\n            'environment': settings.SERVICE_ENVIRONMENT,\n            'service': settings.SERVICE_NAME\n        })\n\n# Metrics middleware\nclass MetricsMiddleware:\n    \"\"\"Middleware to collect request metrics\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        start_time = time.time()\n        \n        response = self.get_response(request)\n        \n        duration = time.time() - start_time\n        \n        MetricsCollector.record_request(\n            method=request.method,\n            endpoint=request.path,\n            status_code=response.status_code,\n            duration=duration\n        )\n        \n        return response\n\n# Metrics decorator\ndef track_execution_time(metric_name):\n    \"\"\"Decorator to track function execution time\"\"\"\n    def decorator(func):\n        execution_time = Histogram(\n            f'{metric_name}_duration_seconds',\n            f'Execution time for {func.__name__}'\n        )\n        \n        @functools.wraps(func)\n        def wrapper(*args, **kwargs):\n            start_time = time.time()\n            try:\n                result = func(*args, **kwargs)\n                return result\n            finally:\n                duration = time.time() - start_time\n                execution_time.observe(duration)\n        \n        return wrapper\n    return decorator\n\n# Usage example\n@track_execution_time('user_creation')\ndef create_user(user_data):\n    \"\"\"Create user with execution time tracking\"\"\"\n    user = User.objects.create_user(**user_data)\n    MetricsCollector.record_user_registration()\n    return user\n",[1050,14466,14467,14472,14499,14505,14512,14516,14521,14532,14543,14554,14585,14589,14593,14604,14615,14626,14646,14650,14654,14665,14676,14685,14689,14693,14705,14716,14725,14729,14733,14738,14749,14760,14769,14773,14777,14788,14799,14810,14822,14826,14830,14841,14852,14861,14865,14869,14878,14887,14891,14897,14924,14933,14945,14955,14966,14975,14985,14989,15000,15010,15019,15033,15037,15043,15052,15061,15072,15076,15082,15100,15109,15136,15159,15163,15169,15183,15192,15207,15211,15217,15226,15235,15246,15264,15282,15299,15303,15307,15312,15321,15330,15334,15350,15362,15366,15382,15396,15400,15418,15422,15440,15444,15456,15470,15484,15498,15508,15512,15516,15522,15526,15531,15545,15554,15568,15579,15597,15616,15620,15624,15643,15666,15681,15687,15710,15716,15723,15742,15757,15761,15768,15775,15779,15784,15803,15815,15824,15848,15860],{"__ignoreMap":1048},[1053,14468,14469],{"class":1055,"line":1056},[1053,14470,14471],{"class":1059},"# metrics.py\n",[1053,14473,14474,14476,14479,14481,14484,14486,14489,14491,14494,14496],{"class":1055,"line":1063},[1053,14475,2093],{"class":1140},[1053,14477,14478],{"class":1095}," prometheus_client ",[1053,14480,2104],{"class":1140},[1053,14482,14483],{"class":1095}," Counter",[1053,14485,1116],{"class":1074},[1053,14487,14488],{"class":1095}," Histogram",[1053,14490,1116],{"class":1074},[1053,14492,14493],{"class":1095}," Gauge",[1053,14495,1116],{"class":1074},[1053,14497,14498],{"class":1095}," Info\n",[1053,14500,14501,14503],{"class":1055,"line":1078},[1053,14502,2104],{"class":1140},[1053,14504,5208],{"class":1095},[1053,14506,14507,14509],{"class":1055,"line":1092},[1053,14508,2104],{"class":1140},[1053,14510,14511],{"class":1095}," functools\n",[1053,14513,14514],{"class":1055,"line":1099},[1053,14515,1269],{"emptyLinePlaceholder":1268},[1053,14517,14518],{"class":1055,"line":1126},[1053,14519,14520],{"class":1059},"# Application metrics\n",[1053,14522,14523,14526,14528,14530],{"class":1055,"line":1137},[1053,14524,14525],{"class":1407},"REQUEST_COUNT",[1053,14527,1411],{"class":1074},[1053,14529,14483],{"class":1771},[1053,14531,2146],{"class":1074},[1053,14533,14534,14536,14539,14541],{"class":1055,"line":1144},[1053,14535,1420],{"class":1419},[1053,14537,14538],{"class":1423},"http_requests_total",[1053,14540,1427],{"class":1419},[1053,14542,1455],{"class":1074},[1053,14544,14545,14547,14550,14552],{"class":1055,"line":1149},[1053,14546,1420],{"class":1419},[1053,14548,14549],{"class":1423},"Total HTTP requests",[1053,14551,1427],{"class":1419},[1053,14553,1455],{"class":1074},[1053,14555,14556,14559,14561,14563,14565,14567,14569,14572,14574,14576,14578,14581,14583],{"class":1055,"line":1168},[1053,14557,14558],{"class":1074},"    [",[1053,14560,1427],{"class":1419},[1053,14562,5899],{"class":1423},[1053,14564,1427],{"class":1419},[1053,14566,1116],{"class":1074},[1053,14568,1447],{"class":1419},[1053,14570,14571],{"class":1423},"endpoint",[1053,14573,1427],{"class":1419},[1053,14575,1116],{"class":1074},[1053,14577,1447],{"class":1419},[1053,14579,14580],{"class":1423},"status",[1053,14582,1427],{"class":1419},[1053,14584,6274],{"class":1074},[1053,14586,14587],{"class":1055,"line":1178},[1053,14588,1800],{"class":1074},[1053,14590,14591],{"class":1055,"line":1183},[1053,14592,1269],{"emptyLinePlaceholder":1268},[1053,14594,14595,14598,14600,14602],{"class":1055,"line":1188},[1053,14596,14597],{"class":1407},"REQUEST_DURATION",[1053,14599,1411],{"class":1074},[1053,14601,14488],{"class":1771},[1053,14603,2146],{"class":1074},[1053,14605,14606,14608,14611,14613],{"class":1055,"line":1212},[1053,14607,1420],{"class":1419},[1053,14609,14610],{"class":1423},"http_request_duration_seconds",[1053,14612,1427],{"class":1419},[1053,14614,1455],{"class":1074},[1053,14616,14617,14619,14622,14624],{"class":1055,"line":1222},[1053,14618,1420],{"class":1419},[1053,14620,14621],{"class":1423},"HTTP request duration",[1053,14623,1427],{"class":1419},[1053,14625,1455],{"class":1074},[1053,14627,14628,14630,14632,14634,14636,14638,14640,14642,14644],{"class":1055,"line":1227},[1053,14629,14558],{"class":1074},[1053,14631,1427],{"class":1419},[1053,14633,5899],{"class":1423},[1053,14635,1427],{"class":1419},[1053,14637,1116],{"class":1074},[1053,14639,1447],{"class":1419},[1053,14641,14571],{"class":1423},[1053,14643,1427],{"class":1419},[1053,14645,6274],{"class":1074},[1053,14647,14648],{"class":1055,"line":1232},[1053,14649,1800],{"class":1074},[1053,14651,14652],{"class":1055,"line":1250},[1053,14653,1269],{"emptyLinePlaceholder":1268},[1053,14655,14656,14659,14661,14663],{"class":1055,"line":1260},[1053,14657,14658],{"class":1407},"ACTIVE_CONNECTIONS",[1053,14660,1411],{"class":1074},[1053,14662,14493],{"class":1771},[1053,14664,2146],{"class":1074},[1053,14666,14667,14669,14672,14674],{"class":1055,"line":1265},[1053,14668,1420],{"class":1419},[1053,14670,14671],{"class":1423},"active_connections",[1053,14673,1427],{"class":1419},[1053,14675,1455],{"class":1074},[1053,14677,14678,14680,14683],{"class":1055,"line":1272},[1053,14679,1420],{"class":1419},[1053,14681,14682],{"class":1423},"Number of active connections",[1053,14684,2387],{"class":1419},[1053,14686,14687],{"class":1055,"line":1278},[1053,14688,1800],{"class":1074},[1053,14690,14691],{"class":1055,"line":1288},[1053,14692,1269],{"emptyLinePlaceholder":1268},[1053,14694,14695,14698,14700,14703],{"class":1055,"line":1298},[1053,14696,14697],{"class":1407},"SERVICE_INFO",[1053,14699,1411],{"class":1074},[1053,14701,14702],{"class":1771}," Info",[1053,14704,2146],{"class":1074},[1053,14706,14707,14709,14712,14714],{"class":1055,"line":1303},[1053,14708,1420],{"class":1419},[1053,14710,14711],{"class":1423},"service_info",[1053,14713,1427],{"class":1419},[1053,14715,1455],{"class":1074},[1053,14717,14718,14720,14723],{"class":1055,"line":1320},[1053,14719,1420],{"class":1419},[1053,14721,14722],{"class":1423},"Service information",[1053,14724,2387],{"class":1419},[1053,14726,14727],{"class":1055,"line":1325},[1053,14728,1800],{"class":1074},[1053,14730,14731],{"class":1055,"line":1330},[1053,14732,1269],{"emptyLinePlaceholder":1268},[1053,14734,14735],{"class":1055,"line":1349},[1053,14736,14737],{"class":1059},"# Business metrics\n",[1053,14739,14740,14743,14745,14747],{"class":1055,"line":1354},[1053,14741,14742],{"class":1407},"USER_REGISTRATIONS",[1053,14744,1411],{"class":1074},[1053,14746,14483],{"class":1771},[1053,14748,2146],{"class":1074},[1053,14750,14751,14753,14756,14758],{"class":1055,"line":1359},[1053,14752,1420],{"class":1419},[1053,14754,14755],{"class":1423},"user_registrations_total",[1053,14757,1427],{"class":1419},[1053,14759,1455],{"class":1074},[1053,14761,14762,14764,14767],{"class":1055,"line":1378},[1053,14763,1420],{"class":1419},[1053,14765,14766],{"class":1423},"Total user registrations",[1053,14768,2387],{"class":1419},[1053,14770,14771],{"class":1055,"line":1828},[1053,14772,1800],{"class":1074},[1053,14774,14775],{"class":1055,"line":1834},[1053,14776,1269],{"emptyLinePlaceholder":1268},[1053,14778,14779,14782,14784,14786],{"class":1055,"line":1847},[1053,14780,14781],{"class":1407},"USER_LOGINS",[1053,14783,1411],{"class":1074},[1053,14785,14483],{"class":1771},[1053,14787,2146],{"class":1074},[1053,14789,14790,14792,14795,14797],{"class":1055,"line":1853},[1053,14791,1420],{"class":1419},[1053,14793,14794],{"class":1423},"user_logins_total",[1053,14796,1427],{"class":1419},[1053,14798,1455],{"class":1074},[1053,14800,14801,14803,14806,14808],{"class":1055,"line":1875},[1053,14802,1420],{"class":1419},[1053,14804,14805],{"class":1423},"Total user logins",[1053,14807,1427],{"class":1419},[1053,14809,1455],{"class":1074},[1053,14811,14812,14814,14816,14818,14820],{"class":1055,"line":1912},[1053,14813,14558],{"class":1074},[1053,14815,1427],{"class":1419},[1053,14817,14580],{"class":1423},[1053,14819,1427],{"class":1419},[1053,14821,6274],{"class":1074},[1053,14823,14824],{"class":1055,"line":1917},[1053,14825,1800],{"class":1074},[1053,14827,14828],{"class":1055,"line":1927},[1053,14829,1269],{"emptyLinePlaceholder":1268},[1053,14831,14832,14835,14837,14839],{"class":1055,"line":1955},[1053,14833,14834],{"class":1407},"ACTIVE_USERS",[1053,14836,1411],{"class":1074},[1053,14838,14493],{"class":1771},[1053,14840,2146],{"class":1074},[1053,14842,14843,14845,14848,14850],{"class":1055,"line":1963},[1053,14844,1420],{"class":1419},[1053,14846,14847],{"class":1423},"active_users",[1053,14849,1427],{"class":1419},[1053,14851,1455],{"class":1074},[1053,14853,14854,14856,14859],{"class":1055,"line":2370},[1053,14855,1420],{"class":1419},[1053,14857,14858],{"class":1423},"Number of active users",[1053,14860,2387],{"class":1419},[1053,14862,14863],{"class":1055,"line":2390},[1053,14864,1800],{"class":1074},[1053,14866,14867],{"class":1055,"line":2396},[1053,14868,1269],{"emptyLinePlaceholder":1268},[1053,14870,14871,14873,14876],{"class":1055,"line":2401},[1053,14872,1067],{"class":1066},[1053,14874,14875],{"class":1070}," MetricsCollector",[1053,14877,1075],{"class":1074},[1053,14879,14880,14882,14885],{"class":1055,"line":2407},[1053,14881,1082],{"class":1081},[1053,14883,14884],{"class":1085},"Collect application metrics",[1053,14886,1089],{"class":1081},[1053,14888,14889],{"class":1055,"line":2413},[1053,14890,1096],{"class":1095},[1053,14892,14893,14895],{"class":1055,"line":2432},[1053,14894,2140],{"class":1074},[1053,14896,13870],{"class":1969},[1053,14898,14899,14901,14904,14906,14908,14910,14913,14915,14917,14919,14922],{"class":1055,"line":3280},[1053,14900,1102],{"class":1066},[1053,14902,14903],{"class":1105}," record_request",[1053,14905,1109],{"class":1074},[1053,14907,5899],{"class":1119},[1053,14909,1116],{"class":1074},[1053,14911,14912],{"class":1119}," endpoint",[1053,14914,1116],{"class":1074},[1053,14916,3779],{"class":1119},[1053,14918,1116],{"class":1074},[1053,14920,14921],{"class":1119}," duration",[1053,14923,1123],{"class":1074},[1053,14925,14926,14928,14931],{"class":1055,"line":3968},[1053,14927,1129],{"class":1081},[1053,14929,14930],{"class":1085},"Record HTTP request metrics",[1053,14932,1089],{"class":1081},[1053,14934,14935,14938,14940,14943],{"class":1055,"line":3988},[1053,14936,14937],{"class":1407},"        REQUEST_COUNT",[1053,14939,1762],{"class":1074},[1053,14941,14942],{"class":1771},"labels",[1053,14944,2146],{"class":1074},[1053,14946,14947,14949,14951,14953],{"class":1055,"line":4007},[1053,14948,5890],{"class":1792},[1053,14950,1756],{"class":1074},[1053,14952,5899],{"class":1771},[1053,14954,1455],{"class":1074},[1053,14956,14957,14960,14962,14964],{"class":1055,"line":4026},[1053,14958,14959],{"class":1792},"            endpoint",[1053,14961,1756],{"class":1074},[1053,14963,14571],{"class":1771},[1053,14965,1455],{"class":1074},[1053,14967,14968,14970,14972],{"class":1055,"line":4043},[1053,14969,7968],{"class":1792},[1053,14971,1756],{"class":1074},[1053,14973,14974],{"class":1771},"status_code\n",[1053,14976,14977,14980,14983],{"class":1055,"line":4065},[1053,14978,14979],{"class":1074},"        ).",[1053,14981,14982],{"class":1771},"inc",[1053,14984,1821],{"class":1074},[1053,14986,14987],{"class":1055,"line":4092},[1053,14988,4107],{"class":1095},[1053,14990,14991,14994,14996,14998],{"class":1055,"line":4098},[1053,14992,14993],{"class":1407},"        REQUEST_DURATION",[1053,14995,1762],{"class":1074},[1053,14997,14942],{"class":1771},[1053,14999,2146],{"class":1074},[1053,15001,15002,15004,15006,15008],{"class":1055,"line":4104},[1053,15003,5890],{"class":1792},[1053,15005,1756],{"class":1074},[1053,15007,5899],{"class":1771},[1053,15009,1455],{"class":1074},[1053,15011,15012,15014,15016],{"class":1055,"line":4110},[1053,15013,14959],{"class":1792},[1053,15015,1756],{"class":1074},[1053,15017,15018],{"class":1771},"endpoint\n",[1053,15020,15021,15023,15026,15028,15031],{"class":1055,"line":4116},[1053,15022,14979],{"class":1074},[1053,15024,15025],{"class":1771},"observe",[1053,15027,1109],{"class":1074},[1053,15029,15030],{"class":1771},"duration",[1053,15032,1800],{"class":1074},[1053,15034,15035],{"class":1055,"line":4161},[1053,15036,1096],{"class":1095},[1053,15038,15039,15041],{"class":1055,"line":4180},[1053,15040,2140],{"class":1074},[1053,15042,13870],{"class":1969},[1053,15044,15045,15047,15050],{"class":1055,"line":4199},[1053,15046,1102],{"class":1066},[1053,15048,15049],{"class":1105}," record_user_registration",[1053,15051,4864],{"class":1074},[1053,15053,15054,15056,15059],{"class":1055,"line":4213},[1053,15055,1129],{"class":1081},[1053,15057,15058],{"class":1085},"Record user registration",[1053,15060,1089],{"class":1081},[1053,15062,15063,15066,15068,15070],{"class":1055,"line":4219},[1053,15064,15065],{"class":1407},"        USER_REGISTRATIONS",[1053,15067,1762],{"class":1074},[1053,15069,14982],{"class":1771},[1053,15071,1821],{"class":1074},[1053,15073,15074],{"class":1055,"line":4224},[1053,15075,1096],{"class":1095},[1053,15077,15078,15080],{"class":1055,"line":4230},[1053,15079,2140],{"class":1074},[1053,15081,13870],{"class":1969},[1053,15083,15084,15086,15089,15091,15094,15096,15098],{"class":1055,"line":4246},[1053,15085,1102],{"class":1066},[1053,15087,15088],{"class":1105}," record_user_login",[1053,15090,1109],{"class":1074},[1053,15092,15093],{"class":1119},"success",[1053,15095,1756],{"class":3099},[1053,15097,2805],{"class":2530},[1053,15099,1123],{"class":1074},[1053,15101,15102,15104,15107],{"class":1055,"line":4269},[1053,15103,1129],{"class":1081},[1053,15105,15106],{"class":1085},"Record user login attempt",[1053,15108,1089],{"class":1081},[1053,15110,15111,15114,15116,15118,15120,15122,15124,15127,15129,15131,15134],{"class":1055,"line":4284},[1053,15112,15113],{"class":1095},"        status ",[1053,15115,1756],{"class":1074},[1053,15117,1447],{"class":1419},[1053,15119,15093],{"class":1423},[1053,15121,1427],{"class":1419},[1053,15123,4450],{"class":1140},[1053,15125,15126],{"class":1095}," success ",[1053,15128,11287],{"class":1140},[1053,15130,1447],{"class":1419},[1053,15132,15133],{"class":1423},"failure",[1053,15135,2387],{"class":1419},[1053,15137,15138,15141,15143,15145,15147,15149,15151,15153,15155,15157],{"class":1055,"line":4306},[1053,15139,15140],{"class":1407},"        USER_LOGINS",[1053,15142,1762],{"class":1074},[1053,15144,14942],{"class":1771},[1053,15146,1109],{"class":1074},[1053,15148,14580],{"class":1792},[1053,15150,1756],{"class":1074},[1053,15152,14580],{"class":1771},[1053,15154,1784],{"class":1074},[1053,15156,14982],{"class":1771},[1053,15158,1821],{"class":1074},[1053,15160,15161],{"class":1055,"line":4320},[1053,15162,1096],{"class":1095},[1053,15164,15165,15167],{"class":1055,"line":4325},[1053,15166,2140],{"class":1074},[1053,15168,13870],{"class":1969},[1053,15170,15171,15173,15176,15178,15181],{"class":1055,"line":4348},[1053,15172,1102],{"class":1066},[1053,15174,15175],{"class":1105}," update_active_users",[1053,15177,1109],{"class":1074},[1053,15179,15180],{"class":1119},"count",[1053,15182,1123],{"class":1074},[1053,15184,15185,15187,15190],{"class":1055,"line":4353},[1053,15186,1129],{"class":1081},[1053,15188,15189],{"class":1085},"Update active users count",[1053,15191,1089],{"class":1081},[1053,15193,15194,15197,15199,15201,15203,15205],{"class":1055,"line":4359},[1053,15195,15196],{"class":1407},"        ACTIVE_USERS",[1053,15198,1762],{"class":1074},[1053,15200,9883],{"class":1771},[1053,15202,1109],{"class":1074},[1053,15204,15180],{"class":1771},[1053,15206,1800],{"class":1074},[1053,15208,15209],{"class":1055,"line":4380},[1053,15210,1096],{"class":1095},[1053,15212,15213,15215],{"class":1055,"line":4385},[1053,15214,2140],{"class":1074},[1053,15216,13870],{"class":1969},[1053,15218,15219,15221,15224],{"class":1055,"line":4404},[1053,15220,1102],{"class":1066},[1053,15222,15223],{"class":1105}," update_service_info",[1053,15225,4864],{"class":1074},[1053,15227,15228,15230,15233],{"class":1055,"line":4410},[1053,15229,1129],{"class":1081},[1053,15231,15232],{"class":1085},"Update service information",[1053,15234,1089],{"class":1081},[1053,15236,15237,15240,15242,15244],{"class":1055,"line":4420},[1053,15238,15239],{"class":1407},"        SERVICE_INFO",[1053,15241,1762],{"class":1074},[1053,15243,5872],{"class":1771},[1053,15245,11304],{"class":1074},[1053,15247,15248,15250,15252,15254,15256,15258,15260,15262],{"class":1055,"line":4433},[1053,15249,3070],{"class":1419},[1053,15251,3014],{"class":1423},[1053,15253,1427],{"class":1419},[1053,15255,1430],{"class":1074},[1053,15257,4055],{"class":1771},[1053,15259,1762],{"class":1074},[1053,15261,2930],{"class":4060},[1053,15263,1455],{"class":1074},[1053,15265,15266,15268,15270,15272,15274,15276,15278,15280],{"class":1055,"line":4477},[1053,15267,3070],{"class":1419},[1053,15269,5429],{"class":1423},[1053,15271,1427],{"class":1419},[1053,15273,1430],{"class":1074},[1053,15275,4055],{"class":1771},[1053,15277,1762],{"class":1074},[1053,15279,2962],{"class":4060},[1053,15281,1455],{"class":1074},[1053,15283,15284,15286,15288,15290,15292,15294,15296],{"class":1055,"line":4518},[1053,15285,3070],{"class":1419},[1053,15287,4048],{"class":1423},[1053,15289,1427],{"class":1419},[1053,15291,1430],{"class":1074},[1053,15293,4055],{"class":1771},[1053,15295,1762],{"class":1074},[1053,15297,15298],{"class":4060},"SERVICE_NAME\n",[1053,15300,15301],{"class":1055,"line":4538},[1053,15302,4216],{"class":1074},[1053,15304,15305],{"class":1055,"line":4553},[1053,15306,1269],{"emptyLinePlaceholder":1268},[1053,15308,15309],{"class":1055,"line":4572},[1053,15310,15311],{"class":1059},"# Metrics middleware\n",[1053,15313,15314,15316,15319],{"class":1055,"line":4595},[1053,15315,1067],{"class":1066},[1053,15317,15318],{"class":1070}," MetricsMiddleware",[1053,15320,1075],{"class":1074},[1053,15322,15323,15325,15328],{"class":1055,"line":4600},[1053,15324,1082],{"class":1081},[1053,15326,15327],{"class":1085},"Middleware to collect request metrics",[1053,15329,1089],{"class":1081},[1053,15331,15332],{"class":1055,"line":4605},[1053,15333,1096],{"class":1095},[1053,15335,15336,15338,15340,15342,15344,15346,15348],{"class":1055,"line":4610},[1053,15337,1102],{"class":1066},[1053,15339,3424],{"class":3423},[1053,15341,1109],{"class":1074},[1053,15343,1113],{"class":1112},[1053,15345,1116],{"class":1074},[1053,15347,5775],{"class":1119},[1053,15349,1123],{"class":1074},[1053,15351,15352,15354,15356,15358,15360],{"class":1055,"line":4615},[1053,15353,3459],{"class":1407},[1053,15355,1762],{"class":1074},[1053,15357,5786],{"class":1765},[1053,15359,1411],{"class":1074},[1053,15361,5791],{"class":1095},[1053,15363,15364],{"class":1055,"line":4659},[1053,15365,1096],{"class":1095},[1053,15367,15368,15370,15372,15374,15376,15378,15380],{"class":1055,"line":4678},[1053,15369,1102],{"class":1066},[1053,15371,5825],{"class":3423},[1053,15373,1109],{"class":1074},[1053,15375,1113],{"class":1112},[1053,15377,1116],{"class":1074},[1053,15379,2427],{"class":1119},[1053,15381,1123],{"class":1074},[1053,15383,15384,15386,15388,15390,15392,15394],{"class":1055,"line":4697},[1053,15385,5840],{"class":1095},[1053,15387,1756],{"class":1074},[1053,15389,5378],{"class":1095},[1053,15391,1762],{"class":1074},[1053,15393,5383],{"class":1771},[1053,15395,1821],{"class":1074},[1053,15397,15398],{"class":1055,"line":4710},[1053,15399,4107],{"class":1095},[1053,15401,15402,15404,15406,15408,15410,15412,15414,15416],{"class":1055,"line":4715},[1053,15403,6007],{"class":1095},[1053,15405,1756],{"class":1074},[1053,15407,4932],{"class":1407},[1053,15409,1762],{"class":1074},[1053,15411,5786],{"class":1771},[1053,15413,1109],{"class":1074},[1053,15415,2448],{"class":1771},[1053,15417,1800],{"class":1074},[1053,15419,15420],{"class":1055,"line":4720},[1053,15421,4107],{"class":1095},[1053,15423,15424,15426,15428,15430,15432,15434,15436,15438],{"class":1055,"line":4735},[1053,15425,6035],{"class":1095},[1053,15427,1756],{"class":1074},[1053,15429,5378],{"class":1095},[1053,15431,1762],{"class":1074},[1053,15433,5383],{"class":1771},[1053,15435,6046],{"class":1074},[1053,15437,6049],{"class":3099},[1053,15439,6052],{"class":1095},[1053,15441,15442],{"class":1055,"line":4740},[1053,15443,4107],{"class":1095},[1053,15445,15446,15449,15451,15454],{"class":1055,"line":4748},[1053,15447,15448],{"class":1095},"        MetricsCollector",[1053,15450,1762],{"class":1074},[1053,15452,15453],{"class":1771},"record_request",[1053,15455,2146],{"class":1074},[1053,15457,15458,15460,15462,15464,15466,15468],{"class":1055,"line":4753},[1053,15459,5890],{"class":1792},[1053,15461,1756],{"class":1074},[1053,15463,2448],{"class":1771},[1053,15465,1762],{"class":1074},[1053,15467,5899],{"class":1765},[1053,15469,1455],{"class":1074},[1053,15471,15472,15474,15476,15478,15480,15482],{"class":1055,"line":4759},[1053,15473,14959],{"class":1792},[1053,15475,1756],{"class":1074},[1053,15477,2448],{"class":1771},[1053,15479,1762],{"class":1074},[1053,15481,5915],{"class":1765},[1053,15483,1455],{"class":1074},[1053,15485,15486,15488,15490,15492,15494,15496],{"class":1055,"line":4772},[1053,15487,6108],{"class":1792},[1053,15489,1756],{"class":1074},[1053,15491,4642],{"class":1771},[1053,15493,1762],{"class":1074},[1053,15495,3841],{"class":1765},[1053,15497,1455],{"class":1074},[1053,15499,15500,15503,15505],{"class":1055,"line":4777},[1053,15501,15502],{"class":1792},"            duration",[1053,15504,1756],{"class":1074},[1053,15506,15507],{"class":1771},"duration\n",[1053,15509,15510],{"class":1055,"line":4794},[1053,15511,3854],{"class":1074},[1053,15513,15514],{"class":1055,"line":4804},[1053,15515,4107],{"class":1095},[1053,15517,15518,15520],{"class":1055,"line":4812},[1053,15519,1930],{"class":1140},[1053,15521,4745],{"class":1095},[1053,15523,15524],{"class":1055,"line":4818},[1053,15525,1269],{"emptyLinePlaceholder":1268},[1053,15527,15528],{"class":1055,"line":4867},[1053,15529,15530],{"class":1059},"# Metrics decorator\n",[1053,15532,15533,15535,15538,15540,15543],{"class":1055,"line":4877},[1053,15534,1733],{"class":1066},[1053,15536,15537],{"class":1105}," track_execution_time",[1053,15539,1109],{"class":1074},[1053,15541,15542],{"class":1119},"metric_name",[1053,15544,1123],{"class":1074},[1053,15546,15547,15549,15552],{"class":1055,"line":4890},[1053,15548,1082],{"class":1081},[1053,15550,15551],{"class":1085},"Decorator to track function execution time",[1053,15553,1089],{"class":1081},[1053,15555,15556,15558,15561,15563,15566],{"class":1055,"line":4906},[1053,15557,1102],{"class":1066},[1053,15559,15560],{"class":1105}," decorator",[1053,15562,1109],{"class":1074},[1053,15564,15565],{"class":1119},"func",[1053,15567,1123],{"class":1074},[1053,15569,15570,15573,15575,15577],{"class":1055,"line":4912},[1053,15571,15572],{"class":1095},"        execution_time ",[1053,15574,1756],{"class":1074},[1053,15576,14488],{"class":1771},[1053,15578,2146],{"class":1074},[1053,15580,15581,15584,15586,15588,15590,15592,15595],{"class":1055,"line":4918},[1053,15582,15583],{"class":1066},"            f",[1053,15585,1427],{"class":1423},[1053,15587,1899],{"class":1898},[1053,15589,15542],{"class":1771},[1053,15591,1904],{"class":1898},[1053,15593,15594],{"class":1423},"_duration_seconds'",[1053,15596,1455],{"class":1074},[1053,15598,15599,15601,15604,15606,15608,15610,15612,15614],{"class":1055,"line":4924},[1053,15600,15583],{"class":1066},[1053,15602,15603],{"class":1423},"'Execution time for ",[1053,15605,1899],{"class":1898},[1053,15607,15565],{"class":1771},[1053,15609,1762],{"class":1074},[1053,15611,3383],{"class":3382},[1053,15613,1904],{"class":1898},[1053,15615,2387],{"class":1423},[1053,15617,15618],{"class":1055,"line":4950},[1053,15619,3854],{"class":1074},[1053,15621,15622],{"class":1055,"line":4973},[1053,15623,4107],{"class":1095},[1053,15625,15626,15629,15632,15634,15637,15639,15641],{"class":1055,"line":4982},[1053,15627,15628],{"class":1074},"        @",[1053,15630,15631],{"class":1105},"functools",[1053,15633,1762],{"class":1074},[1053,15635,15636],{"class":1105},"wraps",[1053,15638,1109],{"class":1074},[1053,15640,15565],{"class":1771},[1053,15642,1800],{"class":1074},[1053,15644,15645,15648,15651,15653,15655,15658,15660,15662,15664],{"class":1055,"line":4994},[1053,15646,15647],{"class":1066},"        def",[1053,15649,15650],{"class":1105}," wrapper",[1053,15652,1109],{"class":1074},[1053,15654,6131],{"class":3099},[1053,15656,15657],{"class":1119},"args",[1053,15659,1116],{"class":1074},[1053,15661,5342],{"class":3099},[1053,15663,5345],{"class":1119},[1053,15665,1123],{"class":1074},[1053,15667,15668,15671,15673,15675,15677,15679],{"class":1055,"line":5011},[1053,15669,15670],{"class":1095},"            start_time ",[1053,15672,1756],{"class":1074},[1053,15674,5378],{"class":1095},[1053,15676,1762],{"class":1074},[1053,15678,5383],{"class":1771},[1053,15680,1821],{"class":1074},[1053,15682,15683,15685],{"class":1055,"line":5036},[1053,15684,9342],{"class":1140},[1053,15686,1075],{"class":1074},[1053,15688,15689,15691,15693,15696,15698,15700,15702,15704,15706,15708],{"class":1055,"line":5041},[1053,15690,9349],{"class":1095},[1053,15692,1756],{"class":1074},[1053,15694,15695],{"class":1771}," func",[1053,15697,1109],{"class":1074},[1053,15699,6131],{"class":3099},[1053,15701,15657],{"class":1771},[1053,15703,1116],{"class":1074},[1053,15705,5342],{"class":3099},[1053,15707,5345],{"class":1771},[1053,15709,1800],{"class":1074},[1053,15711,15712,15714],{"class":1055,"line":5046},[1053,15713,9963],{"class":1140},[1053,15715,9374],{"class":1095},[1053,15717,15718,15721],{"class":1055,"line":5064},[1053,15719,15720],{"class":1140},"            finally",[1053,15722,1075],{"class":1074},[1053,15724,15725,15728,15730,15732,15734,15736,15738,15740],{"class":1055,"line":5069},[1053,15726,15727],{"class":1095},"                duration ",[1053,15729,1756],{"class":1074},[1053,15731,5378],{"class":1095},[1053,15733,1762],{"class":1074},[1053,15735,5383],{"class":1771},[1053,15737,6046],{"class":1074},[1053,15739,6049],{"class":3099},[1053,15741,6052],{"class":1095},[1053,15743,15744,15747,15749,15751,15753,15755],{"class":1055,"line":5079},[1053,15745,15746],{"class":1095},"                execution_time",[1053,15748,1762],{"class":1074},[1053,15750,15025],{"class":1771},[1053,15752,1109],{"class":1074},[1053,15754,15030],{"class":1771},[1053,15756,1800],{"class":1074},[1053,15758,15759],{"class":1055,"line":5088},[1053,15760,4107],{"class":1095},[1053,15762,15763,15765],{"class":1055,"line":5104},[1053,15764,1930],{"class":1140},[1053,15766,15767],{"class":1095}," wrapper\n",[1053,15769,15770,15772],{"class":1055,"line":5110},[1053,15771,1805],{"class":1140},[1053,15773,15774],{"class":1095}," decorator\n",[1053,15776,15777],{"class":1055,"line":5132},[1053,15778,1269],{"emptyLinePlaceholder":1268},[1053,15780,15781],{"class":1055,"line":5141},[1053,15782,15783],{"class":1059},"# Usage example\n",[1053,15785,15786,15789,15792,15794,15796,15799,15801],{"class":1055,"line":5154},[1053,15787,15788],{"class":1074},"@",[1053,15790,15791],{"class":1105},"track_execution_time",[1053,15793,1109],{"class":1074},[1053,15795,1427],{"class":1419},[1053,15797,15798],{"class":1423},"user_creation",[1053,15800,1427],{"class":1419},[1053,15802,1800],{"class":1074},[1053,15804,15805,15807,15809,15811,15813],{"class":1055,"line":5169},[1053,15806,1733],{"class":1066},[1053,15808,1106],{"class":1105},[1053,15810,1109],{"class":1074},[1053,15812,6444],{"class":1119},[1053,15814,1123],{"class":1074},[1053,15816,15817,15819,15822],{"class":1055,"line":8528},[1053,15818,1082],{"class":1081},[1053,15820,15821],{"class":1085},"Create user with execution time tracking",[1053,15823,1089],{"class":1081},[1053,15825,15826,15828,15830,15832,15834,15836,15838,15840,15842,15844,15846],{"class":1055,"line":8536},[1053,15827,1753],{"class":1095},[1053,15829,1756],{"class":1074},[1053,15831,1759],{"class":1095},[1053,15833,1762],{"class":1074},[1053,15835,1766],{"class":1765},[1053,15837,1762],{"class":1074},[1053,15839,6513],{"class":1771},[1053,15841,1109],{"class":1074},[1053,15843,6518],{"class":3099},[1053,15845,6444],{"class":1771},[1053,15847,1800],{"class":1074},[1053,15849,15850,15853,15855,15858],{"class":1055,"line":8551},[1053,15851,15852],{"class":1095},"    MetricsCollector",[1053,15854,1762],{"class":1074},[1053,15856,15857],{"class":1771},"record_user_registration",[1053,15859,1821],{"class":1074},[1053,15861,15862,15864],{"class":1055,"line":8556},[1053,15863,1805],{"class":1140},[1053,15865,6595],{"class":1095},[1030,15867,15869],{"id":15868},"summary","Summary",[1026,15871,15872],{},"Following these best practices ensures robust, scalable, and maintainable Django microservices:",[1026,15874,15875],{},[15876,15877,15878],"strong",{},"Design Principles:",[15880,15881,15882,15886,15889],"ul",{},[15883,15884,15885],"li",{},"Single responsibility per service",[15883,15887,15888],{},"Database per service",[15883,15890,15891],{},"API-first design approach",[1026,15893,15894],{},[15876,15895,15896],{},"Development Practices:",[15880,15898,15899,15902,15905,15908],{},[15883,15900,15901],{},"Environment-based configuration",[15883,15903,15904],{},"Consistent error handling",[15883,15906,15907],{},"Structured logging",[15883,15909,15910],{},"Comprehensive testing",[1026,15912,15913],{},[15876,15914,15915],{},"Deployment Practices:",[15880,15917,15918,15921,15924,15927],{},[15883,15919,15920],{},"Health checks and monitoring",[15883,15922,15923],{},"Graceful shutdown handling",[15883,15925,15926],{},"Resource management",[15883,15928,15929],{},"Metrics collection",[1026,15931,15932],{},[15876,15933,15934],{},"Key Takeaways:",[15880,15936,15937,15940,15943,15946,15949,15952],{},[15883,15938,15939],{},"Plan service boundaries carefully",[15883,15941,15942],{},"Implement proper error handling and logging",[15883,15944,15945],{},"Use comprehensive testing strategies",[15883,15947,15948],{},"Monitor service health and performance",[15883,15950,15951],{},"Follow security best practices",[15883,15953,15954],{},"Maintain clear documentation",[1026,15956,15957],{},"These practices form the foundation for successful microservices architecture with Django. In the final section, we'll explore transforming monolithic applications into microservices.",[15959,15960,15961],"style",{},"html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--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 .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 .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .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 .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 .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .s6DHA, html code.shiki .s6DHA{--shiki-light:#6182B8;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}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}",{"title":1048,"searchDepth":1056,"depth":1063,"links":15963},[15964,15969,15975,15980,15983],{"id":1032,"depth":1063,"text":1033,"children":15965},[15966,15967,15968],{"id":1037,"depth":1078,"text":1038},{"id":1383,"depth":1078,"text":1384},{"id":1985,"depth":1078,"text":1986},{"id":2453,"depth":1063,"text":2454,"children":15970},[15971,15972,15973,15974],{"id":2457,"depth":1078,"text":2458},{"id":3285,"depth":1078,"text":3286},{"id":5174,"depth":1078,"text":5175},{"id":6708,"depth":1078,"text":6709},{"id":9010,"depth":1063,"text":9011,"children":15976},[15977,15978,15979],{"id":9014,"depth":1078,"text":9015},{"id":11480,"depth":1078,"text":11481},{"id":12580,"depth":1078,"text":12581},{"id":14456,"depth":1063,"text":14457,"children":15981},[15982],{"id":14460,"depth":1078,"text":14461},{"id":15868,"depth":1063,"text":15869},"md",null,{},{"title":921,"description":1028},"OdeJ6qtGr8zl8jn57XAisCfGkKqZSA2zvJ_uGiblLoI",[15990,15992],{"title":917,"path":918,"stem":919,"description":15991,"children":-1},"Performance optimization in microservices requires a multi-layered approach to caching, from application-level caching to distributed caching strategies. This chapter covers comprehensive caching techniques, performance monitoring, and optimization strategies for Django microservices.",{"title":925,"path":926,"stem":927,"description":15993,"children":-1},"Migrating from a monolithic Django application to microservices is a complex but rewarding journey. This section provides a comprehensive guide for planning, executing, and managing this transformation while maintaining system stability and business continuity.",1772474965324]