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