[{"data":1,"prerenderedAt":6429},["ShallowReactive",2],{"navigation":3,"/external-packages-and-ecosystem":1016,"/external-packages-and-ecosystem-surround":6424},[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":863,"body":1018,"description":6418,"extension":6419,"links":6420,"meta":6421,"navigation":1465,"path":864,"seo":6422,"stem":865,"__hash__":6423},"docs/25.external-packages-and-ecosystem/01.index.md",{"type":1019,"value":1020,"toc":6373},"minimark",[1021,1025,1029,1034,1039,1042,1048,1064,1069,1083,1088,1102,1107,1121,1126,1140,1145,1159,1164,1178,1182,1193,1198,1209,1214,1227,1231,1235,1238,1243,1292,1297,1314,1319,1336,1341,1358,1363,1374,1378,1381,1401,1405,1409,1412,1656,1882,2281,2285,2288,2479,2618,3033,3037,3040,3363,3417,3419,3422,3537,3667,3669,3672,3802,3882,3886,3890,3990,3994,4138,4232,4296,4300,4307,4391,4454,4496,4500,4582,4586,4589,4710,4714,4850,4854,5067,5071,5366,5370,5374,5744,5748,5756,5759,5763,5766,5877,5881,5936,5940,6049,6053,6134,6138,6268,6272,6276,6303,6307,6321,6325,6339,6343,6369],[1022,1023,863],"h1",{"id":1024},"external-packages-and-ecosystem",[1026,1027,1028],"p",{},"Django's vibrant ecosystem includes thousands of third-party packages that extend its functionality. This guide helps you navigate the ecosystem, select quality packages, and integrate them effectively into your projects.",[1030,1031,1033],"h2",{"id":1032},"the-django-ecosystem","The Django Ecosystem",[1035,1036,1038],"h3",{"id":1037},"package-categories","Package Categories",[1026,1040,1041],{},"Django packages typically fall into these categories:",[1026,1043,1044],{},[1045,1046,1047],"strong",{},"API Development",[1049,1050,1051,1055,1058,1061],"ul",{},[1052,1053,1054],"li",{},"Django REST Framework (DRF)",[1052,1056,1057],{},"Django Ninja",[1052,1059,1060],{},"Tastypie",[1052,1062,1063],{},"GraphQL integrations",[1026,1065,1066],{},[1045,1067,1068],{},"Authentication & Authorization",[1049,1070,1071,1074,1077,1080],{},[1052,1072,1073],{},"django-allauth",[1052,1075,1076],{},"django-oauth-toolkit",[1052,1078,1079],{},"django-guardian",[1052,1081,1082],{},"django-rules",[1026,1084,1085],{},[1045,1086,1087],{},"Content Management",[1049,1089,1090,1093,1096,1099],{},[1052,1091,1092],{},"Wagtail CMS",[1052,1094,1095],{},"Django CMS",[1052,1097,1098],{},"Mezzanine",[1052,1100,1101],{},"Feincms",[1026,1103,1104],{},[1045,1105,1106],{},"Admin Enhancements",[1049,1108,1109,1112,1115,1118],{},[1052,1110,1111],{},"django-grappelli",[1052,1113,1114],{},"django-jet",[1052,1116,1117],{},"django-admin-interface",[1052,1119,1120],{},"django-import-export",[1026,1122,1123],{},[1045,1124,1125],{},"Forms & UI",[1049,1127,1128,1131,1134,1137],{},[1052,1129,1130],{},"django-crispy-forms",[1052,1132,1133],{},"django-widget-tweaks",[1052,1135,1136],{},"django-formtools",[1052,1138,1139],{},"django-autocomplete-light",[1026,1141,1142],{},[1045,1143,1144],{},"Database & Models",[1049,1146,1147,1150,1153,1156],{},[1052,1148,1149],{},"django-extensions",[1052,1151,1152],{},"django-model-utils",[1052,1154,1155],{},"django-polymorphic",[1052,1157,1158],{},"django-mptt (Modified Preorder Tree Traversal)",[1026,1160,1161],{},[1045,1162,1163],{},"Task Queues & Background Jobs",[1049,1165,1166,1169,1172,1175],{},[1052,1167,1168],{},"Celery",[1052,1170,1171],{},"Django-Q",[1052,1173,1174],{},"Django-RQ",[1052,1176,1177],{},"Huey",[1026,1179,1180],{},[1045,1181,292],{},[1049,1183,1184,1187,1190],{},[1052,1185,1186],{},"django-haystack",[1052,1188,1189],{},"django-elasticsearch-dsl",[1052,1191,1192],{},"Whoosh integration",[1026,1194,1195],{},[1045,1196,1197],{},"Storage & Files",[1049,1199,1200,1203,1206],{},[1052,1201,1202],{},"django-storages",[1052,1204,1205],{},"django-cleanup",[1052,1207,1208],{},"Pillow (image processing)",[1026,1210,1211],{},[1045,1212,1213],{},"Monitoring & Debugging",[1049,1215,1216,1219,1222,1225],{},[1052,1217,1218],{},"django-debug-toolbar",[1052,1220,1221],{},"django-silk",[1052,1223,1224],{},"Sentry SDK",[1052,1226,1149],{},[1030,1228,1230],{"id":1229},"evaluating-packages","Evaluating Packages",[1035,1232,1234],{"id":1233},"quality-indicators","Quality Indicators",[1026,1236,1237],{},"When selecting a package, consider:",[1026,1239,1240],{},[1045,1241,1242],{},"1. Maintenance Status",[1244,1245,1250],"pre",{"className":1246,"code":1247,"language":1248,"meta":1249,"style":1249},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Check these indicators:\n# - Last commit date (\u003C 6 months is good)\n# - Open issues vs. closed issues ratio\n# - Response time to issues\n# - Regular releases\n# - Django version compatibility\n","python","",[1251,1252,1253,1262,1268,1274,1280,1286],"code",{"__ignoreMap":1249},[1254,1255,1258],"span",{"class":1256,"line":1257},"line",1,[1254,1259,1261],{"class":1260},"s9Tkl","# Check these indicators:\n",[1254,1263,1265],{"class":1256,"line":1264},2,[1254,1266,1267],{"class":1260},"# - Last commit date (\u003C 6 months is good)\n",[1254,1269,1271],{"class":1256,"line":1270},3,[1254,1272,1273],{"class":1260},"# - Open issues vs. closed issues ratio\n",[1254,1275,1277],{"class":1256,"line":1276},4,[1254,1278,1279],{"class":1260},"# - Response time to issues\n",[1254,1281,1283],{"class":1256,"line":1282},5,[1254,1284,1285],{"class":1260},"# - Regular releases\n",[1254,1287,1289],{"class":1256,"line":1288},6,[1254,1290,1291],{"class":1260},"# - Django version compatibility\n",[1026,1293,1294],{},[1045,1295,1296],{},"2. Documentation Quality",[1049,1298,1299,1302,1305,1308,1311],{},[1052,1300,1301],{},"Comprehensive README",[1052,1303,1304],{},"Full documentation site",[1052,1306,1307],{},"Code examples",[1052,1309,1310],{},"Migration guides",[1052,1312,1313],{},"API reference",[1026,1315,1316],{},[1045,1317,1318],{},"3. Community Support",[1049,1320,1321,1324,1327,1330,1333],{},[1052,1322,1323],{},"GitHub stars and forks",[1052,1325,1326],{},"PyPI download statistics",[1052,1328,1329],{},"Active discussions",[1052,1331,1332],{},"Stack Overflow questions",[1052,1334,1335],{},"Community recommendations",[1026,1337,1338],{},[1045,1339,1340],{},"4. Code Quality",[1049,1342,1343,1346,1349,1352,1355],{},[1052,1344,1345],{},"Test coverage",[1052,1347,1348],{},"CI/CD setup",[1052,1350,1351],{},"Code style consistency",[1052,1353,1354],{},"Type hints",[1052,1356,1357],{},"Security practices",[1026,1359,1360],{},[1045,1361,1362],{},"5. License Compatibility",[1049,1364,1365,1368,1371],{},[1052,1366,1367],{},"MIT, BSD, Apache 2.0 (permissive)",[1052,1369,1370],{},"GPL considerations",[1052,1372,1373],{},"Commercial use restrictions",[1035,1375,1377],{"id":1376},"red-flags","Red Flags",[1026,1379,1380],{},"Avoid packages with:",[1049,1382,1383,1386,1389,1392,1395,1398],{},[1052,1384,1385],{},"No updates in 2+ years",[1052,1387,1388],{},"Incompatible with current Django versions",[1052,1390,1391],{},"No tests or documentation",[1052,1393,1394],{},"Many unresolved critical issues",[1052,1396,1397],{},"Abandoned by maintainers",[1052,1399,1400],{},"Security vulnerabilities",[1030,1402,1404],{"id":1403},"popular-package-deep-dives","Popular Package Deep Dives",[1035,1406,1408],{"id":1407},"django-rest-framework","Django REST Framework",[1026,1410,1411],{},"The de facto standard for building APIs:",[1244,1413,1415],{"className":1246,"code":1414,"language":1248,"meta":1249,"style":1249},"# settings.py\nINSTALLED_APPS = [\n    # ...\n    'rest_framework',\n]\n\nREST_FRAMEWORK = {\n    'DEFAULT_AUTHENTICATION_CLASSES': [\n        'rest_framework.authentication.SessionAuthentication',\n        'rest_framework.authentication.TokenAuthentication',\n    ],\n    'DEFAULT_PERMISSION_CLASSES': [\n        'rest_framework.permissions.IsAuthenticated',\n    ],\n    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',\n    'PAGE_SIZE': 100,\n    'DEFAULT_FILTER_BACKENDS': [\n        'django_filters.rest_framework.DjangoFilterBackend',\n        'rest_framework.filters.SearchFilter',\n        'rest_framework.filters.OrderingFilter',\n    ],\n}\n",[1251,1416,1417,1422,1435,1440,1456,1461,1467,1478,1493,1506,1518,1524,1538,1550,1555,1577,1595,1609,1621,1633,1645,1650],{"__ignoreMap":1249},[1254,1418,1419],{"class":1256,"line":1257},[1254,1420,1421],{"class":1260},"# settings.py\n",[1254,1423,1424,1428,1432],{"class":1256,"line":1264},[1254,1425,1427],{"class":1426},"se3Ec","INSTALLED_APPS",[1254,1429,1431],{"class":1430},"soVBu"," =",[1254,1433,1434],{"class":1430}," [\n",[1254,1436,1437],{"class":1256,"line":1270},[1254,1438,1439],{"class":1260},"    # ...\n",[1254,1441,1442,1446,1450,1453],{"class":1256,"line":1276},[1254,1443,1445],{"class":1444},"sbYkP","    '",[1254,1447,1449],{"class":1448},"sTbE_","rest_framework",[1254,1451,1452],{"class":1444},"'",[1254,1454,1455],{"class":1430},",\n",[1254,1457,1458],{"class":1256,"line":1282},[1254,1459,1460],{"class":1430},"]\n",[1254,1462,1463],{"class":1256,"line":1288},[1254,1464,1466],{"emptyLinePlaceholder":1465},true,"\n",[1254,1468,1470,1473,1475],{"class":1256,"line":1469},7,[1254,1471,1472],{"class":1426},"REST_FRAMEWORK",[1254,1474,1431],{"class":1430},[1254,1476,1477],{"class":1430}," {\n",[1254,1479,1481,1483,1486,1488,1491],{"class":1256,"line":1480},8,[1254,1482,1445],{"class":1444},[1254,1484,1485],{"class":1448},"DEFAULT_AUTHENTICATION_CLASSES",[1254,1487,1452],{"class":1444},[1254,1489,1490],{"class":1430},":",[1254,1492,1434],{"class":1430},[1254,1494,1496,1499,1502,1504],{"class":1256,"line":1495},9,[1254,1497,1498],{"class":1444},"        '",[1254,1500,1501],{"class":1448},"rest_framework.authentication.SessionAuthentication",[1254,1503,1452],{"class":1444},[1254,1505,1455],{"class":1430},[1254,1507,1509,1511,1514,1516],{"class":1256,"line":1508},10,[1254,1510,1498],{"class":1444},[1254,1512,1513],{"class":1448},"rest_framework.authentication.TokenAuthentication",[1254,1515,1452],{"class":1444},[1254,1517,1455],{"class":1430},[1254,1519,1521],{"class":1256,"line":1520},11,[1254,1522,1523],{"class":1430},"    ],\n",[1254,1525,1527,1529,1532,1534,1536],{"class":1256,"line":1526},12,[1254,1528,1445],{"class":1444},[1254,1530,1531],{"class":1448},"DEFAULT_PERMISSION_CLASSES",[1254,1533,1452],{"class":1444},[1254,1535,1490],{"class":1430},[1254,1537,1434],{"class":1430},[1254,1539,1541,1543,1546,1548],{"class":1256,"line":1540},13,[1254,1542,1498],{"class":1444},[1254,1544,1545],{"class":1448},"rest_framework.permissions.IsAuthenticated",[1254,1547,1452],{"class":1444},[1254,1549,1455],{"class":1430},[1254,1551,1553],{"class":1256,"line":1552},14,[1254,1554,1523],{"class":1430},[1254,1556,1558,1560,1563,1565,1567,1570,1573,1575],{"class":1256,"line":1557},15,[1254,1559,1445],{"class":1444},[1254,1561,1562],{"class":1448},"DEFAULT_PAGINATION_CLASS",[1254,1564,1452],{"class":1444},[1254,1566,1490],{"class":1430},[1254,1568,1569],{"class":1444}," '",[1254,1571,1572],{"class":1448},"rest_framework.pagination.PageNumberPagination",[1254,1574,1452],{"class":1444},[1254,1576,1455],{"class":1430},[1254,1578,1580,1582,1585,1587,1589,1593],{"class":1256,"line":1579},16,[1254,1581,1445],{"class":1444},[1254,1583,1584],{"class":1448},"PAGE_SIZE",[1254,1586,1452],{"class":1444},[1254,1588,1490],{"class":1430},[1254,1590,1592],{"class":1591},"s7CZa"," 100",[1254,1594,1455],{"class":1430},[1254,1596,1598,1600,1603,1605,1607],{"class":1256,"line":1597},17,[1254,1599,1445],{"class":1444},[1254,1601,1602],{"class":1448},"DEFAULT_FILTER_BACKENDS",[1254,1604,1452],{"class":1444},[1254,1606,1490],{"class":1430},[1254,1608,1434],{"class":1430},[1254,1610,1612,1614,1617,1619],{"class":1256,"line":1611},18,[1254,1613,1498],{"class":1444},[1254,1615,1616],{"class":1448},"django_filters.rest_framework.DjangoFilterBackend",[1254,1618,1452],{"class":1444},[1254,1620,1455],{"class":1430},[1254,1622,1624,1626,1629,1631],{"class":1256,"line":1623},19,[1254,1625,1498],{"class":1444},[1254,1627,1628],{"class":1448},"rest_framework.filters.SearchFilter",[1254,1630,1452],{"class":1444},[1254,1632,1455],{"class":1430},[1254,1634,1636,1638,1641,1643],{"class":1256,"line":1635},20,[1254,1637,1498],{"class":1444},[1254,1639,1640],{"class":1448},"rest_framework.filters.OrderingFilter",[1254,1642,1452],{"class":1444},[1254,1644,1455],{"class":1430},[1254,1646,1648],{"class":1256,"line":1647},21,[1254,1649,1523],{"class":1430},[1254,1651,1653],{"class":1256,"line":1652},22,[1254,1654,1655],{"class":1430},"}\n",[1244,1657,1659],{"className":1246,"code":1658,"language":1248,"meta":1249,"style":1249},"# api/serializers.py\nfrom rest_framework import serializers\nfrom myapp.models import Article\n\nclass ArticleSerializer(serializers.ModelSerializer):\n    author_name = serializers.CharField(source='author.get_full_name', read_only=True)\n    \n    class Meta:\n        model = Article\n        fields = ['id', 'title', 'content', 'author', 'author_name', 'created_at']\n        read_only_fields = ['created_at']\n",[1251,1660,1661,1666,1682,1700,1704,1729,1776,1781,1792,1801,1865],{"__ignoreMap":1249},[1254,1662,1663],{"class":1256,"line":1257},[1254,1664,1665],{"class":1260},"# api/serializers.py\n",[1254,1667,1668,1672,1676,1679],{"class":1256,"line":1264},[1254,1669,1671],{"class":1670},"siDh9","from",[1254,1673,1675],{"class":1674},"sftqT"," rest_framework ",[1254,1677,1678],{"class":1670},"import",[1254,1680,1681],{"class":1674}," serializers\n",[1254,1683,1684,1686,1689,1692,1695,1697],{"class":1256,"line":1270},[1254,1685,1671],{"class":1670},[1254,1687,1688],{"class":1674}," myapp",[1254,1690,1691],{"class":1430},".",[1254,1693,1694],{"class":1674},"models ",[1254,1696,1678],{"class":1670},[1254,1698,1699],{"class":1674}," Article\n",[1254,1701,1702],{"class":1256,"line":1276},[1254,1703,1466],{"emptyLinePlaceholder":1465},[1254,1705,1706,1710,1714,1717,1721,1723,1726],{"class":1256,"line":1282},[1254,1707,1709],{"class":1708},"s5Kfy","class",[1254,1711,1713],{"class":1712},"sD-vU"," ArticleSerializer",[1254,1715,1716],{"class":1430},"(",[1254,1718,1720],{"class":1719},"sYn-s","serializers",[1254,1722,1691],{"class":1430},[1254,1724,1725],{"class":1719},"ModelSerializer",[1254,1727,1728],{"class":1430},"):\n",[1254,1730,1731,1734,1737,1740,1742,1746,1748,1752,1754,1756,1759,1761,1764,1767,1769,1773],{"class":1256,"line":1288},[1254,1732,1733],{"class":1674},"    author_name ",[1254,1735,1736],{"class":1430},"=",[1254,1738,1739],{"class":1674}," serializers",[1254,1741,1691],{"class":1430},[1254,1743,1745],{"class":1744},"siWMO","CharField",[1254,1747,1716],{"class":1430},[1254,1749,1751],{"class":1750},"sqOPj","source",[1254,1753,1736],{"class":1430},[1254,1755,1452],{"class":1444},[1254,1757,1758],{"class":1448},"author.get_full_name",[1254,1760,1452],{"class":1444},[1254,1762,1763],{"class":1430},",",[1254,1765,1766],{"class":1750}," read_only",[1254,1768,1736],{"class":1430},[1254,1770,1772],{"class":1771},"s8XtY","True",[1254,1774,1775],{"class":1430},")\n",[1254,1777,1778],{"class":1256,"line":1469},[1254,1779,1780],{"class":1674},"    \n",[1254,1782,1783,1786,1789],{"class":1256,"line":1480},[1254,1784,1785],{"class":1708},"    class",[1254,1787,1788],{"class":1712}," Meta",[1254,1790,1791],{"class":1430},":\n",[1254,1793,1794,1797,1799],{"class":1256,"line":1495},[1254,1795,1796],{"class":1674},"        model ",[1254,1798,1736],{"class":1430},[1254,1800,1699],{"class":1674},[1254,1802,1803,1806,1808,1811,1813,1816,1818,1820,1822,1825,1827,1829,1831,1834,1836,1838,1840,1843,1845,1847,1849,1852,1854,1856,1858,1861,1863],{"class":1256,"line":1508},[1254,1804,1805],{"class":1674},"        fields ",[1254,1807,1736],{"class":1430},[1254,1809,1810],{"class":1430}," [",[1254,1812,1452],{"class":1444},[1254,1814,1815],{"class":1448},"id",[1254,1817,1452],{"class":1444},[1254,1819,1763],{"class":1430},[1254,1821,1569],{"class":1444},[1254,1823,1824],{"class":1448},"title",[1254,1826,1452],{"class":1444},[1254,1828,1763],{"class":1430},[1254,1830,1569],{"class":1444},[1254,1832,1833],{"class":1448},"content",[1254,1835,1452],{"class":1444},[1254,1837,1763],{"class":1430},[1254,1839,1569],{"class":1444},[1254,1841,1842],{"class":1448},"author",[1254,1844,1452],{"class":1444},[1254,1846,1763],{"class":1430},[1254,1848,1569],{"class":1444},[1254,1850,1851],{"class":1448},"author_name",[1254,1853,1452],{"class":1444},[1254,1855,1763],{"class":1430},[1254,1857,1569],{"class":1444},[1254,1859,1860],{"class":1448},"created_at",[1254,1862,1452],{"class":1444},[1254,1864,1460],{"class":1430},[1254,1866,1867,1870,1872,1874,1876,1878,1880],{"class":1256,"line":1520},[1254,1868,1869],{"class":1674},"        read_only_fields ",[1254,1871,1736],{"class":1430},[1254,1873,1810],{"class":1430},[1254,1875,1452],{"class":1444},[1254,1877,1860],{"class":1448},[1254,1879,1452],{"class":1444},[1254,1881,1460],{"class":1430},[1244,1883,1885],{"className":1246,"code":1884,"language":1248,"meta":1249,"style":1249},"# api/views.py\nfrom rest_framework import viewsets, filters\nfrom rest_framework.decorators import action\nfrom rest_framework.response import Response\nfrom django_filters.rest_framework import DjangoFilterBackend\n\nclass ArticleViewSet(viewsets.ModelViewSet):\n    queryset = Article.objects.select_related('author')\n    serializer_class = ArticleSerializer\n    filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]\n    filterset_fields = ['author', 'status']\n    search_fields = ['title', 'content']\n    ordering_fields = ['created_at', 'title']\n    \n    @action(detail=True, methods=['post'])\n    def publish(self, request, pk=None):\n        article = self.get_object()\n        article.status = 'published'\n        article.save()\n        return Response({'status': 'article published'})\n",[1251,1886,1887,1892,1908,1925,1941,1958,1962,1981,2012,2022,2055,2081,2106,2131,2135,2171,2204,2222,2241,2252],{"__ignoreMap":1249},[1254,1888,1889],{"class":1256,"line":1257},[1254,1890,1891],{"class":1260},"# api/views.py\n",[1254,1893,1894,1896,1898,1900,1903,1905],{"class":1256,"line":1264},[1254,1895,1671],{"class":1670},[1254,1897,1675],{"class":1674},[1254,1899,1678],{"class":1670},[1254,1901,1902],{"class":1674}," viewsets",[1254,1904,1763],{"class":1430},[1254,1906,1907],{"class":1674}," filters\n",[1254,1909,1910,1912,1915,1917,1920,1922],{"class":1256,"line":1270},[1254,1911,1671],{"class":1670},[1254,1913,1914],{"class":1674}," rest_framework",[1254,1916,1691],{"class":1430},[1254,1918,1919],{"class":1674},"decorators ",[1254,1921,1678],{"class":1670},[1254,1923,1924],{"class":1674}," action\n",[1254,1926,1927,1929,1931,1933,1936,1938],{"class":1256,"line":1276},[1254,1928,1671],{"class":1670},[1254,1930,1914],{"class":1674},[1254,1932,1691],{"class":1430},[1254,1934,1935],{"class":1674},"response ",[1254,1937,1678],{"class":1670},[1254,1939,1940],{"class":1674}," Response\n",[1254,1942,1943,1945,1948,1950,1953,1955],{"class":1256,"line":1282},[1254,1944,1671],{"class":1670},[1254,1946,1947],{"class":1674}," django_filters",[1254,1949,1691],{"class":1430},[1254,1951,1952],{"class":1674},"rest_framework ",[1254,1954,1678],{"class":1670},[1254,1956,1957],{"class":1674}," DjangoFilterBackend\n",[1254,1959,1960],{"class":1256,"line":1288},[1254,1961,1466],{"emptyLinePlaceholder":1465},[1254,1963,1964,1966,1969,1971,1974,1976,1979],{"class":1256,"line":1469},[1254,1965,1709],{"class":1708},[1254,1967,1968],{"class":1712}," ArticleViewSet",[1254,1970,1716],{"class":1430},[1254,1972,1973],{"class":1719},"viewsets",[1254,1975,1691],{"class":1430},[1254,1977,1978],{"class":1719},"ModelViewSet",[1254,1980,1728],{"class":1430},[1254,1982,1983,1986,1988,1991,1993,1997,1999,2002,2004,2006,2008,2010],{"class":1256,"line":1480},[1254,1984,1985],{"class":1674},"    queryset ",[1254,1987,1736],{"class":1430},[1254,1989,1990],{"class":1674}," Article",[1254,1992,1691],{"class":1430},[1254,1994,1996],{"class":1995},"sBPpx","objects",[1254,1998,1691],{"class":1430},[1254,2000,2001],{"class":1744},"select_related",[1254,2003,1716],{"class":1430},[1254,2005,1452],{"class":1444},[1254,2007,1842],{"class":1448},[1254,2009,1452],{"class":1444},[1254,2011,1775],{"class":1430},[1254,2013,2014,2017,2019],{"class":1256,"line":1495},[1254,2015,2016],{"class":1674},"    serializer_class ",[1254,2018,1736],{"class":1430},[1254,2020,2021],{"class":1674}," ArticleSerializer\n",[1254,2023,2024,2027,2029,2031,2034,2036,2039,2041,2044,2046,2048,2050,2053],{"class":1256,"line":1508},[1254,2025,2026],{"class":1674},"    filter_backends ",[1254,2028,1736],{"class":1430},[1254,2030,1810],{"class":1430},[1254,2032,2033],{"class":1674},"DjangoFilterBackend",[1254,2035,1763],{"class":1430},[1254,2037,2038],{"class":1674}," filters",[1254,2040,1691],{"class":1430},[1254,2042,2043],{"class":1995},"SearchFilter",[1254,2045,1763],{"class":1430},[1254,2047,2038],{"class":1674},[1254,2049,1691],{"class":1430},[1254,2051,2052],{"class":1995},"OrderingFilter",[1254,2054,1460],{"class":1430},[1254,2056,2057,2060,2062,2064,2066,2068,2070,2072,2074,2077,2079],{"class":1256,"line":1520},[1254,2058,2059],{"class":1674},"    filterset_fields ",[1254,2061,1736],{"class":1430},[1254,2063,1810],{"class":1430},[1254,2065,1452],{"class":1444},[1254,2067,1842],{"class":1448},[1254,2069,1452],{"class":1444},[1254,2071,1763],{"class":1430},[1254,2073,1569],{"class":1444},[1254,2075,2076],{"class":1448},"status",[1254,2078,1452],{"class":1444},[1254,2080,1460],{"class":1430},[1254,2082,2083,2086,2088,2090,2092,2094,2096,2098,2100,2102,2104],{"class":1256,"line":1526},[1254,2084,2085],{"class":1674},"    search_fields ",[1254,2087,1736],{"class":1430},[1254,2089,1810],{"class":1430},[1254,2091,1452],{"class":1444},[1254,2093,1824],{"class":1448},[1254,2095,1452],{"class":1444},[1254,2097,1763],{"class":1430},[1254,2099,1569],{"class":1444},[1254,2101,1833],{"class":1448},[1254,2103,1452],{"class":1444},[1254,2105,1460],{"class":1430},[1254,2107,2108,2111,2113,2115,2117,2119,2121,2123,2125,2127,2129],{"class":1256,"line":1540},[1254,2109,2110],{"class":1674},"    ordering_fields ",[1254,2112,1736],{"class":1430},[1254,2114,1810],{"class":1430},[1254,2116,1452],{"class":1444},[1254,2118,1860],{"class":1448},[1254,2120,1452],{"class":1444},[1254,2122,1763],{"class":1430},[1254,2124,1569],{"class":1444},[1254,2126,1824],{"class":1448},[1254,2128,1452],{"class":1444},[1254,2130,1460],{"class":1430},[1254,2132,2133],{"class":1256,"line":1552},[1254,2134,1780],{"class":1674},[1254,2136,2137,2140,2144,2146,2149,2151,2153,2155,2158,2161,2163,2166,2168],{"class":1256,"line":1557},[1254,2138,2139],{"class":1430},"    @",[1254,2141,2143],{"class":2142},"sljsM","action",[1254,2145,1716],{"class":1430},[1254,2147,2148],{"class":1750},"detail",[1254,2150,1736],{"class":1430},[1254,2152,1772],{"class":1771},[1254,2154,1763],{"class":1430},[1254,2156,2157],{"class":1750}," methods",[1254,2159,2160],{"class":1430},"=[",[1254,2162,1452],{"class":1444},[1254,2164,2165],{"class":1448},"post",[1254,2167,1452],{"class":1444},[1254,2169,2170],{"class":1430},"])\n",[1254,2172,2173,2176,2179,2181,2185,2187,2191,2193,2196,2199,2202],{"class":1256,"line":1579},[1254,2174,2175],{"class":1708},"    def",[1254,2177,2178],{"class":2142}," publish",[1254,2180,1716],{"class":1430},[1254,2182,2184],{"class":2183},"sRjD_","self",[1254,2186,1763],{"class":1430},[1254,2188,2190],{"class":2189},"sCyAa"," request",[1254,2192,1763],{"class":1430},[1254,2194,2195],{"class":2189}," pk",[1254,2197,1736],{"class":2198},"sVsLi",[1254,2200,2201],{"class":1771},"None",[1254,2203,1728],{"class":1430},[1254,2205,2206,2209,2211,2214,2216,2219],{"class":1256,"line":1597},[1254,2207,2208],{"class":1674},"        article ",[1254,2210,1736],{"class":1430},[1254,2212,2213],{"class":1426}," self",[1254,2215,1691],{"class":1430},[1254,2217,2218],{"class":1744},"get_object",[1254,2220,2221],{"class":1430},"()\n",[1254,2223,2224,2227,2229,2231,2233,2235,2238],{"class":1256,"line":1611},[1254,2225,2226],{"class":1674},"        article",[1254,2228,1691],{"class":1430},[1254,2230,2076],{"class":1995},[1254,2232,1431],{"class":1430},[1254,2234,1569],{"class":1444},[1254,2236,2237],{"class":1448},"published",[1254,2239,2240],{"class":1444},"'\n",[1254,2242,2243,2245,2247,2250],{"class":1256,"line":1623},[1254,2244,2226],{"class":1674},[1254,2246,1691],{"class":1430},[1254,2248,2249],{"class":1744},"save",[1254,2251,2221],{"class":1430},[1254,2253,2254,2257,2260,2263,2265,2267,2269,2271,2273,2276,2278],{"class":1256,"line":1635},[1254,2255,2256],{"class":1670},"        return",[1254,2258,2259],{"class":1744}," Response",[1254,2261,2262],{"class":1430},"({",[1254,2264,1452],{"class":1444},[1254,2266,2076],{"class":1448},[1254,2268,1452],{"class":1444},[1254,2270,1490],{"class":1430},[1254,2272,1569],{"class":1444},[1254,2274,2275],{"class":1448},"article published",[1254,2277,1452],{"class":1444},[1254,2279,2280],{"class":1430},"})\n",[1035,2282,2284],{"id":2283},"celery-for-background-tasks","Celery for Background Tasks",[1026,2286,2287],{},"Distributed task queue for async processing:",[1244,2289,2291],{"className":1246,"code":2290,"language":1248,"meta":1249,"style":1249},"# settings.py\nCELERY_BROKER_URL = 'redis://localhost:6379/0'\nCELERY_RESULT_BACKEND = 'redis://localhost:6379/0'\nCELERY_ACCEPT_CONTENT = ['json']\nCELERY_TASK_SERIALIZER = 'json'\nCELERY_RESULT_SERIALIZER = 'json'\nCELERY_TIMEZONE = 'UTC'\n\n# Celery Beat schedule for periodic tasks\nCELERY_BEAT_SCHEDULE = {\n    'send-daily-digest': {\n        'task': 'myapp.tasks.send_daily_digest',\n        'schedule': crontab(hour=8, minute=0),\n    },\n}\n",[1251,2292,2293,2297,2311,2324,2342,2355,2368,2382,2386,2391,2400,2413,2433,2470,2475],{"__ignoreMap":1249},[1254,2294,2295],{"class":1256,"line":1257},[1254,2296,1421],{"class":1260},[1254,2298,2299,2302,2304,2306,2309],{"class":1256,"line":1264},[1254,2300,2301],{"class":1426},"CELERY_BROKER_URL",[1254,2303,1431],{"class":1430},[1254,2305,1569],{"class":1444},[1254,2307,2308],{"class":1448},"redis://localhost:6379/0",[1254,2310,2240],{"class":1444},[1254,2312,2313,2316,2318,2320,2322],{"class":1256,"line":1270},[1254,2314,2315],{"class":1426},"CELERY_RESULT_BACKEND",[1254,2317,1431],{"class":1430},[1254,2319,1569],{"class":1444},[1254,2321,2308],{"class":1448},[1254,2323,2240],{"class":1444},[1254,2325,2326,2329,2331,2333,2335,2338,2340],{"class":1256,"line":1276},[1254,2327,2328],{"class":1426},"CELERY_ACCEPT_CONTENT",[1254,2330,1431],{"class":1430},[1254,2332,1810],{"class":1430},[1254,2334,1452],{"class":1444},[1254,2336,2337],{"class":1448},"json",[1254,2339,1452],{"class":1444},[1254,2341,1460],{"class":1430},[1254,2343,2344,2347,2349,2351,2353],{"class":1256,"line":1282},[1254,2345,2346],{"class":1426},"CELERY_TASK_SERIALIZER",[1254,2348,1431],{"class":1430},[1254,2350,1569],{"class":1444},[1254,2352,2337],{"class":1448},[1254,2354,2240],{"class":1444},[1254,2356,2357,2360,2362,2364,2366],{"class":1256,"line":1288},[1254,2358,2359],{"class":1426},"CELERY_RESULT_SERIALIZER",[1254,2361,1431],{"class":1430},[1254,2363,1569],{"class":1444},[1254,2365,2337],{"class":1448},[1254,2367,2240],{"class":1444},[1254,2369,2370,2373,2375,2377,2380],{"class":1256,"line":1469},[1254,2371,2372],{"class":1426},"CELERY_TIMEZONE",[1254,2374,1431],{"class":1430},[1254,2376,1569],{"class":1444},[1254,2378,2379],{"class":1448},"UTC",[1254,2381,2240],{"class":1444},[1254,2383,2384],{"class":1256,"line":1480},[1254,2385,1466],{"emptyLinePlaceholder":1465},[1254,2387,2388],{"class":1256,"line":1495},[1254,2389,2390],{"class":1260},"# Celery Beat schedule for periodic tasks\n",[1254,2392,2393,2396,2398],{"class":1256,"line":1508},[1254,2394,2395],{"class":1426},"CELERY_BEAT_SCHEDULE",[1254,2397,1431],{"class":1430},[1254,2399,1477],{"class":1430},[1254,2401,2402,2404,2407,2409,2411],{"class":1256,"line":1520},[1254,2403,1445],{"class":1444},[1254,2405,2406],{"class":1448},"send-daily-digest",[1254,2408,1452],{"class":1444},[1254,2410,1490],{"class":1430},[1254,2412,1477],{"class":1430},[1254,2414,2415,2417,2420,2422,2424,2426,2429,2431],{"class":1256,"line":1526},[1254,2416,1498],{"class":1444},[1254,2418,2419],{"class":1448},"task",[1254,2421,1452],{"class":1444},[1254,2423,1490],{"class":1430},[1254,2425,1569],{"class":1444},[1254,2427,2428],{"class":1448},"myapp.tasks.send_daily_digest",[1254,2430,1452],{"class":1444},[1254,2432,1455],{"class":1430},[1254,2434,2435,2437,2440,2442,2444,2447,2449,2452,2454,2457,2459,2462,2464,2467],{"class":1256,"line":1540},[1254,2436,1498],{"class":1444},[1254,2438,2439],{"class":1448},"schedule",[1254,2441,1452],{"class":1444},[1254,2443,1490],{"class":1430},[1254,2445,2446],{"class":1744}," crontab",[1254,2448,1716],{"class":1430},[1254,2450,2451],{"class":1750},"hour",[1254,2453,1736],{"class":1430},[1254,2455,2456],{"class":1591},"8",[1254,2458,1763],{"class":1430},[1254,2460,2461],{"class":1750}," minute",[1254,2463,1736],{"class":1430},[1254,2465,2466],{"class":1591},"0",[1254,2468,2469],{"class":1430},"),\n",[1254,2471,2472],{"class":1256,"line":1552},[1254,2473,2474],{"class":1430},"    },\n",[1254,2476,2477],{"class":1256,"line":1557},[1254,2478,1655],{"class":1430},[1244,2480,2482],{"className":1246,"code":2481,"language":1248,"meta":1249,"style":1249},"# myproject/celery.py\nimport os\nfrom celery import Celery\n\nos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')\n\napp = Celery('myproject')\napp.config_from_object('django.conf:settings', namespace='CELERY')\napp.autodiscover_tasks()\n",[1251,2483,2484,2489,2496,2508,2512,2547,2551,2572,2607],{"__ignoreMap":1249},[1254,2485,2486],{"class":1256,"line":1257},[1254,2487,2488],{"class":1260},"# myproject/celery.py\n",[1254,2490,2491,2493],{"class":1256,"line":1264},[1254,2492,1678],{"class":1670},[1254,2494,2495],{"class":1674}," os\n",[1254,2497,2498,2500,2503,2505],{"class":1256,"line":1270},[1254,2499,1671],{"class":1670},[1254,2501,2502],{"class":1674}," celery ",[1254,2504,1678],{"class":1670},[1254,2506,2507],{"class":1674}," Celery\n",[1254,2509,2510],{"class":1256,"line":1276},[1254,2511,1466],{"emptyLinePlaceholder":1465},[1254,2513,2514,2517,2519,2522,2524,2527,2529,2531,2534,2536,2538,2540,2543,2545],{"class":1256,"line":1282},[1254,2515,2516],{"class":1674},"os",[1254,2518,1691],{"class":1430},[1254,2520,2521],{"class":1995},"environ",[1254,2523,1691],{"class":1430},[1254,2525,2526],{"class":1744},"setdefault",[1254,2528,1716],{"class":1430},[1254,2530,1452],{"class":1444},[1254,2532,2533],{"class":1448},"DJANGO_SETTINGS_MODULE",[1254,2535,1452],{"class":1444},[1254,2537,1763],{"class":1430},[1254,2539,1569],{"class":1444},[1254,2541,2542],{"class":1448},"myproject.settings",[1254,2544,1452],{"class":1444},[1254,2546,1775],{"class":1430},[1254,2548,2549],{"class":1256,"line":1288},[1254,2550,1466],{"emptyLinePlaceholder":1465},[1254,2552,2553,2556,2558,2561,2563,2565,2568,2570],{"class":1256,"line":1469},[1254,2554,2555],{"class":1674},"app ",[1254,2557,1736],{"class":1430},[1254,2559,2560],{"class":1744}," Celery",[1254,2562,1716],{"class":1430},[1254,2564,1452],{"class":1444},[1254,2566,2567],{"class":1448},"myproject",[1254,2569,1452],{"class":1444},[1254,2571,1775],{"class":1430},[1254,2573,2574,2577,2579,2582,2584,2586,2589,2591,2593,2596,2598,2600,2603,2605],{"class":1256,"line":1480},[1254,2575,2576],{"class":1674},"app",[1254,2578,1691],{"class":1430},[1254,2580,2581],{"class":1744},"config_from_object",[1254,2583,1716],{"class":1430},[1254,2585,1452],{"class":1444},[1254,2587,2588],{"class":1448},"django.conf:settings",[1254,2590,1452],{"class":1444},[1254,2592,1763],{"class":1430},[1254,2594,2595],{"class":1750}," namespace",[1254,2597,1736],{"class":1430},[1254,2599,1452],{"class":1444},[1254,2601,2602],{"class":1448},"CELERY",[1254,2604,1452],{"class":1444},[1254,2606,1775],{"class":1430},[1254,2608,2609,2611,2613,2616],{"class":1256,"line":1495},[1254,2610,2576],{"class":1674},[1254,2612,1691],{"class":1430},[1254,2614,2615],{"class":1744},"autodiscover_tasks",[1254,2617,2221],{"class":1430},[1244,2619,2621],{"className":1246,"code":2620,"language":1248,"meta":1249,"style":1249},"# myapp/tasks.py\nfrom celery import shared_task\nfrom django.core.mail import send_mail\nfrom django.contrib.auth import get_user_model\n\nUser = get_user_model()\n\n@shared_task(bind=True, max_retries=3)\ndef send_welcome_email(self, user_id):\n    try:\n        user = User.objects.get(id=user_id)\n        send_mail(\n            'Welcome!',\n            f'Hello {user.first_name}, welcome to our platform!',\n            'noreply@example.com',\n            [user.email],\n            fail_silently=False,\n        )\n    except Exception as exc:\n        raise self.retry(exc=exc, countdown=60)\n\n@shared_task\ndef process_large_dataset(file_path):\n    # Long-running task\n    import pandas as pd\n    df = pd.read_csv(file_path)\n    # Process data...\n    return {'rows_processed': len(df)}\n",[1251,2622,2623,2628,2639,2661,2682,2686,2698,2702,2731,2750,2757,2787,2795,2807,2835,2846,2861,2873,2878,2895,2928,2932,2939,2954,2960,2975,2997,3003],{"__ignoreMap":1249},[1254,2624,2625],{"class":1256,"line":1257},[1254,2626,2627],{"class":1260},"# myapp/tasks.py\n",[1254,2629,2630,2632,2634,2636],{"class":1256,"line":1264},[1254,2631,1671],{"class":1670},[1254,2633,2502],{"class":1674},[1254,2635,1678],{"class":1670},[1254,2637,2638],{"class":1674}," shared_task\n",[1254,2640,2641,2643,2646,2648,2651,2653,2656,2658],{"class":1256,"line":1270},[1254,2642,1671],{"class":1670},[1254,2644,2645],{"class":1674}," django",[1254,2647,1691],{"class":1430},[1254,2649,2650],{"class":1674},"core",[1254,2652,1691],{"class":1430},[1254,2654,2655],{"class":1674},"mail ",[1254,2657,1678],{"class":1670},[1254,2659,2660],{"class":1674}," send_mail\n",[1254,2662,2663,2665,2667,2669,2672,2674,2677,2679],{"class":1256,"line":1276},[1254,2664,1671],{"class":1670},[1254,2666,2645],{"class":1674},[1254,2668,1691],{"class":1430},[1254,2670,2671],{"class":1674},"contrib",[1254,2673,1691],{"class":1430},[1254,2675,2676],{"class":1674},"auth ",[1254,2678,1678],{"class":1670},[1254,2680,2681],{"class":1674}," get_user_model\n",[1254,2683,2684],{"class":1256,"line":1282},[1254,2685,1466],{"emptyLinePlaceholder":1465},[1254,2687,2688,2691,2693,2696],{"class":1256,"line":1288},[1254,2689,2690],{"class":1674},"User ",[1254,2692,1736],{"class":1430},[1254,2694,2695],{"class":1744}," get_user_model",[1254,2697,2221],{"class":1430},[1254,2699,2700],{"class":1256,"line":1469},[1254,2701,1466],{"emptyLinePlaceholder":1465},[1254,2703,2704,2707,2710,2712,2715,2717,2719,2721,2724,2726,2729],{"class":1256,"line":1480},[1254,2705,2706],{"class":1430},"@",[1254,2708,2709],{"class":2142},"shared_task",[1254,2711,1716],{"class":1430},[1254,2713,2714],{"class":1750},"bind",[1254,2716,1736],{"class":1430},[1254,2718,1772],{"class":1771},[1254,2720,1763],{"class":1430},[1254,2722,2723],{"class":1750}," max_retries",[1254,2725,1736],{"class":1430},[1254,2727,2728],{"class":1591},"3",[1254,2730,1775],{"class":1430},[1254,2732,2733,2736,2739,2741,2743,2745,2748],{"class":1256,"line":1495},[1254,2734,2735],{"class":1708},"def",[1254,2737,2738],{"class":2142}," send_welcome_email",[1254,2740,1716],{"class":1430},[1254,2742,2184],{"class":2183},[1254,2744,1763],{"class":1430},[1254,2746,2747],{"class":2189}," user_id",[1254,2749,1728],{"class":1430},[1254,2751,2752,2755],{"class":1256,"line":1508},[1254,2753,2754],{"class":1670},"    try",[1254,2756,1791],{"class":1430},[1254,2758,2759,2762,2764,2767,2769,2771,2773,2776,2778,2780,2782,2785],{"class":1256,"line":1520},[1254,2760,2761],{"class":1674},"        user ",[1254,2763,1736],{"class":1430},[1254,2765,2766],{"class":1674}," User",[1254,2768,1691],{"class":1430},[1254,2770,1996],{"class":1995},[1254,2772,1691],{"class":1430},[1254,2774,2775],{"class":1744},"get",[1254,2777,1716],{"class":1430},[1254,2779,1815],{"class":1750},[1254,2781,1736],{"class":1430},[1254,2783,2784],{"class":1744},"user_id",[1254,2786,1775],{"class":1430},[1254,2788,2789,2792],{"class":1256,"line":1526},[1254,2790,2791],{"class":1744},"        send_mail",[1254,2793,2794],{"class":1430},"(\n",[1254,2796,2797,2800,2803,2805],{"class":1256,"line":1540},[1254,2798,2799],{"class":1444},"            '",[1254,2801,2802],{"class":1448},"Welcome!",[1254,2804,1452],{"class":1444},[1254,2806,1455],{"class":1430},[1254,2808,2809,2812,2815,2819,2822,2824,2827,2830,2833],{"class":1256,"line":1552},[1254,2810,2811],{"class":1708},"            f",[1254,2813,2814],{"class":1448},"'Hello ",[1254,2816,2818],{"class":2817},"s3h35","{",[1254,2820,2821],{"class":1744},"user",[1254,2823,1691],{"class":1430},[1254,2825,2826],{"class":1995},"first_name",[1254,2828,2829],{"class":2817},"}",[1254,2831,2832],{"class":1448},", welcome to our platform!'",[1254,2834,1455],{"class":1430},[1254,2836,2837,2839,2842,2844],{"class":1256,"line":1557},[1254,2838,2799],{"class":1444},[1254,2840,2841],{"class":1448},"noreply@example.com",[1254,2843,1452],{"class":1444},[1254,2845,1455],{"class":1430},[1254,2847,2848,2851,2853,2855,2858],{"class":1256,"line":1579},[1254,2849,2850],{"class":1430},"            [",[1254,2852,2821],{"class":1744},[1254,2854,1691],{"class":1430},[1254,2856,2857],{"class":1995},"email",[1254,2859,2860],{"class":1430},"],\n",[1254,2862,2863,2866,2868,2871],{"class":1256,"line":1597},[1254,2864,2865],{"class":1750},"            fail_silently",[1254,2867,1736],{"class":1430},[1254,2869,2870],{"class":1771},"False",[1254,2872,1455],{"class":1430},[1254,2874,2875],{"class":1256,"line":1611},[1254,2876,2877],{"class":1430},"        )\n",[1254,2879,2880,2883,2887,2890,2893],{"class":1256,"line":1623},[1254,2881,2882],{"class":1670},"    except",[1254,2884,2886],{"class":2885},"sa2tF"," Exception",[1254,2888,2889],{"class":1670}," as",[1254,2891,2892],{"class":1674}," exc",[1254,2894,1791],{"class":1430},[1254,2896,2897,2900,2902,2904,2907,2909,2912,2914,2916,2918,2921,2923,2926],{"class":1256,"line":1635},[1254,2898,2899],{"class":1670},"        raise",[1254,2901,2213],{"class":1426},[1254,2903,1691],{"class":1430},[1254,2905,2906],{"class":1744},"retry",[1254,2908,1716],{"class":1430},[1254,2910,2911],{"class":1750},"exc",[1254,2913,1736],{"class":1430},[1254,2915,2911],{"class":1744},[1254,2917,1763],{"class":1430},[1254,2919,2920],{"class":1750}," countdown",[1254,2922,1736],{"class":1430},[1254,2924,2925],{"class":1591},"60",[1254,2927,1775],{"class":1430},[1254,2929,2930],{"class":1256,"line":1647},[1254,2931,1466],{"emptyLinePlaceholder":1465},[1254,2933,2934,2936],{"class":1256,"line":1652},[1254,2935,2706],{"class":1430},[1254,2937,2938],{"class":2142},"shared_task\n",[1254,2940,2942,2944,2947,2949,2952],{"class":1256,"line":2941},23,[1254,2943,2735],{"class":1708},[1254,2945,2946],{"class":2142}," process_large_dataset",[1254,2948,1716],{"class":1430},[1254,2950,2951],{"class":2189},"file_path",[1254,2953,1728],{"class":1430},[1254,2955,2957],{"class":1256,"line":2956},24,[1254,2958,2959],{"class":1260},"    # Long-running task\n",[1254,2961,2963,2966,2969,2972],{"class":1256,"line":2962},25,[1254,2964,2965],{"class":1670},"    import",[1254,2967,2968],{"class":1674}," pandas ",[1254,2970,2971],{"class":1670},"as",[1254,2973,2974],{"class":1674}," pd\n",[1254,2976,2978,2981,2983,2986,2988,2991,2993,2995],{"class":1256,"line":2977},26,[1254,2979,2980],{"class":1674},"    df ",[1254,2982,1736],{"class":1430},[1254,2984,2985],{"class":1674}," pd",[1254,2987,1691],{"class":1430},[1254,2989,2990],{"class":1744},"read_csv",[1254,2992,1716],{"class":1430},[1254,2994,2951],{"class":1744},[1254,2996,1775],{"class":1430},[1254,2998,3000],{"class":1256,"line":2999},27,[1254,3001,3002],{"class":1260},"    # Process data...\n",[1254,3004,3006,3009,3012,3014,3017,3019,3021,3025,3027,3030],{"class":1256,"line":3005},28,[1254,3007,3008],{"class":1670},"    return",[1254,3010,3011],{"class":1430}," {",[1254,3013,1452],{"class":1444},[1254,3015,3016],{"class":1448},"rows_processed",[1254,3018,1452],{"class":1444},[1254,3020,1490],{"class":1430},[1254,3022,3024],{"class":3023},"sJdAF"," len",[1254,3026,1716],{"class":1430},[1254,3028,3029],{"class":1744},"df",[1254,3031,3032],{"class":1430},")}\n",[1035,3034,3036],{"id":3035},"django-allauth-for-authentication","django-allauth for Authentication",[1026,3038,3039],{},"Comprehensive authentication solution:",[1244,3041,3043],{"className":1246,"code":3042,"language":1248,"meta":1249,"style":1249},"# settings.py\nINSTALLED_APPS = [\n    # ...\n    'django.contrib.sites',\n    'allauth',\n    'allauth.account',\n    'allauth.socialaccount',\n    'allauth.socialaccount.providers.google',\n    'allauth.socialaccount.providers.github',\n]\n\nSITE_ID = 1\n\nAUTHENTICATION_BACKENDS = [\n    'django.contrib.auth.backends.ModelBackend',\n    'allauth.account.auth_backends.AuthenticationBackend',\n]\n\nACCOUNT_EMAIL_REQUIRED = True\nACCOUNT_USERNAME_REQUIRED = False\nACCOUNT_AUTHENTICATION_METHOD = 'email'\nACCOUNT_EMAIL_VERIFICATION = 'mandatory'\nSOCIALACCOUNT_AUTO_SIGNUP = True\n\nSOCIALACCOUNT_PROVIDERS = {\n    'google': {\n        'SCOPE': [\n            'profile',\n            'email',\n        ],\n        'AUTH_PARAMS': {\n            'access_type': 'online',\n        }\n    }\n}\n",[1251,3044,3045,3049,3057,3061,3072,3083,3094,3105,3116,3127,3131,3135,3145,3149,3158,3169,3180,3184,3188,3198,3208,3221,3235,3244,3248,3257,3270,3283,3294,3305,3311,3325,3346,3352,3358],{"__ignoreMap":1249},[1254,3046,3047],{"class":1256,"line":1257},[1254,3048,1421],{"class":1260},[1254,3050,3051,3053,3055],{"class":1256,"line":1264},[1254,3052,1427],{"class":1426},[1254,3054,1431],{"class":1430},[1254,3056,1434],{"class":1430},[1254,3058,3059],{"class":1256,"line":1270},[1254,3060,1439],{"class":1260},[1254,3062,3063,3065,3068,3070],{"class":1256,"line":1276},[1254,3064,1445],{"class":1444},[1254,3066,3067],{"class":1448},"django.contrib.sites",[1254,3069,1452],{"class":1444},[1254,3071,1455],{"class":1430},[1254,3073,3074,3076,3079,3081],{"class":1256,"line":1282},[1254,3075,1445],{"class":1444},[1254,3077,3078],{"class":1448},"allauth",[1254,3080,1452],{"class":1444},[1254,3082,1455],{"class":1430},[1254,3084,3085,3087,3090,3092],{"class":1256,"line":1288},[1254,3086,1445],{"class":1444},[1254,3088,3089],{"class":1448},"allauth.account",[1254,3091,1452],{"class":1444},[1254,3093,1455],{"class":1430},[1254,3095,3096,3098,3101,3103],{"class":1256,"line":1469},[1254,3097,1445],{"class":1444},[1254,3099,3100],{"class":1448},"allauth.socialaccount",[1254,3102,1452],{"class":1444},[1254,3104,1455],{"class":1430},[1254,3106,3107,3109,3112,3114],{"class":1256,"line":1480},[1254,3108,1445],{"class":1444},[1254,3110,3111],{"class":1448},"allauth.socialaccount.providers.google",[1254,3113,1452],{"class":1444},[1254,3115,1455],{"class":1430},[1254,3117,3118,3120,3123,3125],{"class":1256,"line":1495},[1254,3119,1445],{"class":1444},[1254,3121,3122],{"class":1448},"allauth.socialaccount.providers.github",[1254,3124,1452],{"class":1444},[1254,3126,1455],{"class":1430},[1254,3128,3129],{"class":1256,"line":1508},[1254,3130,1460],{"class":1430},[1254,3132,3133],{"class":1256,"line":1520},[1254,3134,1466],{"emptyLinePlaceholder":1465},[1254,3136,3137,3140,3142],{"class":1256,"line":1526},[1254,3138,3139],{"class":1426},"SITE_ID",[1254,3141,1431],{"class":1430},[1254,3143,3144],{"class":1591}," 1\n",[1254,3146,3147],{"class":1256,"line":1540},[1254,3148,1466],{"emptyLinePlaceholder":1465},[1254,3150,3151,3154,3156],{"class":1256,"line":1552},[1254,3152,3153],{"class":1426},"AUTHENTICATION_BACKENDS",[1254,3155,1431],{"class":1430},[1254,3157,1434],{"class":1430},[1254,3159,3160,3162,3165,3167],{"class":1256,"line":1557},[1254,3161,1445],{"class":1444},[1254,3163,3164],{"class":1448},"django.contrib.auth.backends.ModelBackend",[1254,3166,1452],{"class":1444},[1254,3168,1455],{"class":1430},[1254,3170,3171,3173,3176,3178],{"class":1256,"line":1579},[1254,3172,1445],{"class":1444},[1254,3174,3175],{"class":1448},"allauth.account.auth_backends.AuthenticationBackend",[1254,3177,1452],{"class":1444},[1254,3179,1455],{"class":1430},[1254,3181,3182],{"class":1256,"line":1597},[1254,3183,1460],{"class":1430},[1254,3185,3186],{"class":1256,"line":1611},[1254,3187,1466],{"emptyLinePlaceholder":1465},[1254,3189,3190,3193,3195],{"class":1256,"line":1623},[1254,3191,3192],{"class":1426},"ACCOUNT_EMAIL_REQUIRED",[1254,3194,1431],{"class":1430},[1254,3196,3197],{"class":1771}," True\n",[1254,3199,3200,3203,3205],{"class":1256,"line":1635},[1254,3201,3202],{"class":1426},"ACCOUNT_USERNAME_REQUIRED",[1254,3204,1431],{"class":1430},[1254,3206,3207],{"class":1771}," False\n",[1254,3209,3210,3213,3215,3217,3219],{"class":1256,"line":1647},[1254,3211,3212],{"class":1426},"ACCOUNT_AUTHENTICATION_METHOD",[1254,3214,1431],{"class":1430},[1254,3216,1569],{"class":1444},[1254,3218,2857],{"class":1448},[1254,3220,2240],{"class":1444},[1254,3222,3223,3226,3228,3230,3233],{"class":1256,"line":1652},[1254,3224,3225],{"class":1426},"ACCOUNT_EMAIL_VERIFICATION",[1254,3227,1431],{"class":1430},[1254,3229,1569],{"class":1444},[1254,3231,3232],{"class":1448},"mandatory",[1254,3234,2240],{"class":1444},[1254,3236,3237,3240,3242],{"class":1256,"line":2941},[1254,3238,3239],{"class":1426},"SOCIALACCOUNT_AUTO_SIGNUP",[1254,3241,1431],{"class":1430},[1254,3243,3197],{"class":1771},[1254,3245,3246],{"class":1256,"line":2956},[1254,3247,1466],{"emptyLinePlaceholder":1465},[1254,3249,3250,3253,3255],{"class":1256,"line":2962},[1254,3251,3252],{"class":1426},"SOCIALACCOUNT_PROVIDERS",[1254,3254,1431],{"class":1430},[1254,3256,1477],{"class":1430},[1254,3258,3259,3261,3264,3266,3268],{"class":1256,"line":2977},[1254,3260,1445],{"class":1444},[1254,3262,3263],{"class":1448},"google",[1254,3265,1452],{"class":1444},[1254,3267,1490],{"class":1430},[1254,3269,1477],{"class":1430},[1254,3271,3272,3274,3277,3279,3281],{"class":1256,"line":2999},[1254,3273,1498],{"class":1444},[1254,3275,3276],{"class":1448},"SCOPE",[1254,3278,1452],{"class":1444},[1254,3280,1490],{"class":1430},[1254,3282,1434],{"class":1430},[1254,3284,3285,3287,3290,3292],{"class":1256,"line":3005},[1254,3286,2799],{"class":1444},[1254,3288,3289],{"class":1448},"profile",[1254,3291,1452],{"class":1444},[1254,3293,1455],{"class":1430},[1254,3295,3297,3299,3301,3303],{"class":1256,"line":3296},29,[1254,3298,2799],{"class":1444},[1254,3300,2857],{"class":1448},[1254,3302,1452],{"class":1444},[1254,3304,1455],{"class":1430},[1254,3306,3308],{"class":1256,"line":3307},30,[1254,3309,3310],{"class":1430},"        ],\n",[1254,3312,3314,3316,3319,3321,3323],{"class":1256,"line":3313},31,[1254,3315,1498],{"class":1444},[1254,3317,3318],{"class":1448},"AUTH_PARAMS",[1254,3320,1452],{"class":1444},[1254,3322,1490],{"class":1430},[1254,3324,1477],{"class":1430},[1254,3326,3328,3330,3333,3335,3337,3339,3342,3344],{"class":1256,"line":3327},32,[1254,3329,2799],{"class":1444},[1254,3331,3332],{"class":1448},"access_type",[1254,3334,1452],{"class":1444},[1254,3336,1490],{"class":1430},[1254,3338,1569],{"class":1444},[1254,3340,3341],{"class":1448},"online",[1254,3343,1452],{"class":1444},[1254,3345,1455],{"class":1430},[1254,3347,3349],{"class":1256,"line":3348},33,[1254,3350,3351],{"class":1430},"        }\n",[1254,3353,3355],{"class":1256,"line":3354},34,[1254,3356,3357],{"class":1430},"    }\n",[1254,3359,3361],{"class":1256,"line":3360},35,[1254,3362,1655],{"class":1430},[1244,3364,3366],{"className":1246,"code":3365,"language":1248,"meta":1249,"style":1249},"# urls.py\nurlpatterns = [\n    path('accounts/', include('allauth.urls')),\n]\n",[1251,3367,3368,3373,3382,3413],{"__ignoreMap":1249},[1254,3369,3370],{"class":1256,"line":1257},[1254,3371,3372],{"class":1260},"# urls.py\n",[1254,3374,3375,3378,3380],{"class":1256,"line":1264},[1254,3376,3377],{"class":1674},"urlpatterns ",[1254,3379,1736],{"class":1430},[1254,3381,1434],{"class":1430},[1254,3383,3384,3387,3389,3391,3394,3396,3398,3401,3403,3405,3408,3410],{"class":1256,"line":1270},[1254,3385,3386],{"class":1744},"    path",[1254,3388,1716],{"class":1430},[1254,3390,1452],{"class":1444},[1254,3392,3393],{"class":1448},"accounts/",[1254,3395,1452],{"class":1444},[1254,3397,1763],{"class":1430},[1254,3399,3400],{"class":1744}," include",[1254,3402,1716],{"class":1430},[1254,3404,1452],{"class":1444},[1254,3406,3407],{"class":1448},"allauth.urls",[1254,3409,1452],{"class":1444},[1254,3411,3412],{"class":1430},")),\n",[1254,3414,3415],{"class":1256,"line":1276},[1254,3416,1460],{"class":1430},[1035,3418,1149],{"id":1149},[1026,3420,3421],{},"Developer productivity tools:",[1244,3423,3427],{"className":3424,"code":3425,"language":3426,"meta":1249,"style":1249},"language-bash shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Install\npip install django-extensions\n\n# Useful commands:\npython manage.py shell_plus  # Enhanced shell with auto-imports\npython manage.py show_urls   # List all URLs\npython manage.py graph_models -a -o models.png  # Generate model diagram\npython manage.py runserver_plus  # Enhanced dev server with Werkzeug debugger\npython manage.py clean_pyc   # Remove .pyc files\npython manage.py reset_db    # Reset database\n","bash",[1251,3428,3429,3434,3445,3449,3454,3467,3479,3501,3513,3525],{"__ignoreMap":1249},[1254,3430,3431],{"class":1256,"line":1257},[1254,3432,3433],{"class":1260},"# Install\n",[1254,3435,3436,3439,3442],{"class":1256,"line":1264},[1254,3437,3438],{"class":1719},"pip",[1254,3440,3441],{"class":1448}," install",[1254,3443,3444],{"class":1448}," django-extensions\n",[1254,3446,3447],{"class":1256,"line":1270},[1254,3448,1466],{"emptyLinePlaceholder":1465},[1254,3450,3451],{"class":1256,"line":1276},[1254,3452,3453],{"class":1260},"# Useful commands:\n",[1254,3455,3456,3458,3461,3464],{"class":1256,"line":1282},[1254,3457,1248],{"class":1719},[1254,3459,3460],{"class":1448}," manage.py",[1254,3462,3463],{"class":1448}," shell_plus",[1254,3465,3466],{"class":1260},"  # Enhanced shell with auto-imports\n",[1254,3468,3469,3471,3473,3476],{"class":1256,"line":1288},[1254,3470,1248],{"class":1719},[1254,3472,3460],{"class":1448},[1254,3474,3475],{"class":1448}," show_urls",[1254,3477,3478],{"class":1260},"   # List all URLs\n",[1254,3480,3481,3483,3485,3488,3492,3495,3498],{"class":1256,"line":1469},[1254,3482,1248],{"class":1719},[1254,3484,3460],{"class":1448},[1254,3486,3487],{"class":1448}," graph_models",[1254,3489,3491],{"class":3490},"sz9Cv"," -a",[1254,3493,3494],{"class":3490}," -o",[1254,3496,3497],{"class":1448}," models.png",[1254,3499,3500],{"class":1260},"  # Generate model diagram\n",[1254,3502,3503,3505,3507,3510],{"class":1256,"line":1480},[1254,3504,1248],{"class":1719},[1254,3506,3460],{"class":1448},[1254,3508,3509],{"class":1448}," runserver_plus",[1254,3511,3512],{"class":1260},"  # Enhanced dev server with Werkzeug debugger\n",[1254,3514,3515,3517,3519,3522],{"class":1256,"line":1495},[1254,3516,1248],{"class":1719},[1254,3518,3460],{"class":1448},[1254,3520,3521],{"class":1448}," clean_pyc",[1254,3523,3524],{"class":1260},"   # Remove .pyc files\n",[1254,3526,3527,3529,3531,3534],{"class":1256,"line":1508},[1254,3528,1248],{"class":1719},[1254,3530,3460],{"class":1448},[1254,3532,3533],{"class":1448}," reset_db",[1254,3535,3536],{"class":1260},"    # Reset database\n",[1244,3538,3540],{"className":1246,"code":3539,"language":1248,"meta":1249,"style":1249},"# settings.py\nINSTALLED_APPS = [\n    # ...\n    'django_extensions',\n]\n\n# Use TimeStampedModel base class\nfrom django_extensions.db.models import TimeStampedModel\n\nclass Article(TimeStampedModel):\n    # Automatically adds created and modified fields\n    title = models.CharField(max_length=200)\n    content = models.TextField()\n",[1251,3541,3542,3546,3554,3558,3569,3573,3577,3582,3603,3607,3620,3625,3651],{"__ignoreMap":1249},[1254,3543,3544],{"class":1256,"line":1257},[1254,3545,1421],{"class":1260},[1254,3547,3548,3550,3552],{"class":1256,"line":1264},[1254,3549,1427],{"class":1426},[1254,3551,1431],{"class":1430},[1254,3553,1434],{"class":1430},[1254,3555,3556],{"class":1256,"line":1270},[1254,3557,1439],{"class":1260},[1254,3559,3560,3562,3565,3567],{"class":1256,"line":1276},[1254,3561,1445],{"class":1444},[1254,3563,3564],{"class":1448},"django_extensions",[1254,3566,1452],{"class":1444},[1254,3568,1455],{"class":1430},[1254,3570,3571],{"class":1256,"line":1282},[1254,3572,1460],{"class":1430},[1254,3574,3575],{"class":1256,"line":1288},[1254,3576,1466],{"emptyLinePlaceholder":1465},[1254,3578,3579],{"class":1256,"line":1469},[1254,3580,3581],{"class":1260},"# Use TimeStampedModel base class\n",[1254,3583,3584,3586,3589,3591,3594,3596,3598,3600],{"class":1256,"line":1480},[1254,3585,1671],{"class":1670},[1254,3587,3588],{"class":1674}," django_extensions",[1254,3590,1691],{"class":1430},[1254,3592,3593],{"class":1674},"db",[1254,3595,1691],{"class":1430},[1254,3597,1694],{"class":1674},[1254,3599,1678],{"class":1670},[1254,3601,3602],{"class":1674}," TimeStampedModel\n",[1254,3604,3605],{"class":1256,"line":1495},[1254,3606,1466],{"emptyLinePlaceholder":1465},[1254,3608,3609,3611,3613,3615,3618],{"class":1256,"line":1508},[1254,3610,1709],{"class":1708},[1254,3612,1990],{"class":1712},[1254,3614,1716],{"class":1430},[1254,3616,3617],{"class":1719},"TimeStampedModel",[1254,3619,1728],{"class":1430},[1254,3621,3622],{"class":1256,"line":1520},[1254,3623,3624],{"class":1260},"    # Automatically adds created and modified fields\n",[1254,3626,3627,3630,3632,3635,3637,3639,3641,3644,3646,3649],{"class":1256,"line":1526},[1254,3628,3629],{"class":1674},"    title ",[1254,3631,1736],{"class":1430},[1254,3633,3634],{"class":1674}," models",[1254,3636,1691],{"class":1430},[1254,3638,1745],{"class":1744},[1254,3640,1716],{"class":1430},[1254,3642,3643],{"class":1750},"max_length",[1254,3645,1736],{"class":1430},[1254,3647,3648],{"class":1591},"200",[1254,3650,1775],{"class":1430},[1254,3652,3653,3656,3658,3660,3662,3665],{"class":1256,"line":1540},[1254,3654,3655],{"class":1674},"    content ",[1254,3657,1736],{"class":1430},[1254,3659,3634],{"class":1674},[1254,3661,1691],{"class":1430},[1254,3663,3664],{"class":1744},"TextField",[1254,3666,2221],{"class":1430},[1035,3668,1218],{"id":1218},[1026,3670,3671],{},"Essential debugging tool:",[1244,3673,3675],{"className":1246,"code":3674,"language":1248,"meta":1249,"style":1249},"# settings.py (development only)\nif DEBUG:\n    INSTALLED_APPS += ['debug_toolbar']\n    MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware']\n    INTERNAL_IPS = ['127.0.0.1']\n\nDEBUG_TOOLBAR_CONFIG = {\n    'SHOW_TOOLBAR_CALLBACK': lambda request: DEBUG,\n    'SHOW_TEMPLATE_CONTEXT': True,\n}\n",[1251,3676,3677,3682,3692,3711,3729,3747,3751,3760,3782,3798],{"__ignoreMap":1249},[1254,3678,3679],{"class":1256,"line":1257},[1254,3680,3681],{"class":1260},"# settings.py (development only)\n",[1254,3683,3684,3687,3690],{"class":1256,"line":1264},[1254,3685,3686],{"class":1670},"if",[1254,3688,3689],{"class":1426}," DEBUG",[1254,3691,1791],{"class":1430},[1254,3693,3694,3697,3700,3702,3704,3707,3709],{"class":1256,"line":1270},[1254,3695,3696],{"class":1426},"    INSTALLED_APPS",[1254,3698,3699],{"class":1430}," +=",[1254,3701,1810],{"class":1430},[1254,3703,1452],{"class":1444},[1254,3705,3706],{"class":1448},"debug_toolbar",[1254,3708,1452],{"class":1444},[1254,3710,1460],{"class":1430},[1254,3712,3713,3716,3718,3720,3722,3725,3727],{"class":1256,"line":1276},[1254,3714,3715],{"class":1426},"    MIDDLEWARE",[1254,3717,3699],{"class":1430},[1254,3719,1810],{"class":1430},[1254,3721,1452],{"class":1444},[1254,3723,3724],{"class":1448},"debug_toolbar.middleware.DebugToolbarMiddleware",[1254,3726,1452],{"class":1444},[1254,3728,1460],{"class":1430},[1254,3730,3731,3734,3736,3738,3740,3743,3745],{"class":1256,"line":1282},[1254,3732,3733],{"class":1426},"    INTERNAL_IPS",[1254,3735,1431],{"class":1430},[1254,3737,1810],{"class":1430},[1254,3739,1452],{"class":1444},[1254,3741,3742],{"class":1448},"127.0.0.1",[1254,3744,1452],{"class":1444},[1254,3746,1460],{"class":1430},[1254,3748,3749],{"class":1256,"line":1288},[1254,3750,1466],{"emptyLinePlaceholder":1465},[1254,3752,3753,3756,3758],{"class":1256,"line":1469},[1254,3754,3755],{"class":1426},"DEBUG_TOOLBAR_CONFIG",[1254,3757,1431],{"class":1430},[1254,3759,1477],{"class":1430},[1254,3761,3762,3764,3767,3769,3771,3774,3776,3778,3780],{"class":1256,"line":1480},[1254,3763,1445],{"class":1444},[1254,3765,3766],{"class":1448},"SHOW_TOOLBAR_CALLBACK",[1254,3768,1452],{"class":1444},[1254,3770,1490],{"class":1430},[1254,3772,3773],{"class":1708}," lambda",[1254,3775,2190],{"class":2189},[1254,3777,1490],{"class":1430},[1254,3779,3689],{"class":1426},[1254,3781,1455],{"class":1430},[1254,3783,3784,3786,3789,3791,3793,3796],{"class":1256,"line":1495},[1254,3785,1445],{"class":1444},[1254,3787,3788],{"class":1448},"SHOW_TEMPLATE_CONTEXT",[1254,3790,1452],{"class":1444},[1254,3792,1490],{"class":1430},[1254,3794,3795],{"class":1771}," True",[1254,3797,1455],{"class":1430},[1254,3799,3800],{"class":1256,"line":1508},[1254,3801,1655],{"class":1430},[1244,3803,3805],{"className":1246,"code":3804,"language":1248,"meta":1249,"style":1249},"# urls.py\nif settings.DEBUG:\n    import debug_toolbar\n    urlpatterns = [\n        path('__debug__/', include(debug_toolbar.urls)),\n    ] + urlpatterns\n",[1251,3806,3807,3811,3826,3833,3842,3871],{"__ignoreMap":1249},[1254,3808,3809],{"class":1256,"line":1257},[1254,3810,3372],{"class":1260},[1254,3812,3813,3815,3818,3820,3824],{"class":1256,"line":1264},[1254,3814,3686],{"class":1670},[1254,3816,3817],{"class":1674}," settings",[1254,3819,1691],{"class":1430},[1254,3821,3823],{"class":3822},"sFGJz","DEBUG",[1254,3825,1791],{"class":1430},[1254,3827,3828,3830],{"class":1256,"line":1270},[1254,3829,2965],{"class":1670},[1254,3831,3832],{"class":1674}," debug_toolbar\n",[1254,3834,3835,3838,3840],{"class":1256,"line":1276},[1254,3836,3837],{"class":1674},"    urlpatterns ",[1254,3839,1736],{"class":1430},[1254,3841,1434],{"class":1430},[1254,3843,3844,3847,3849,3851,3854,3856,3858,3860,3862,3864,3866,3869],{"class":1256,"line":1282},[1254,3845,3846],{"class":1744},"        path",[1254,3848,1716],{"class":1430},[1254,3850,1452],{"class":1444},[1254,3852,3853],{"class":1448},"__debug__/",[1254,3855,1452],{"class":1444},[1254,3857,1763],{"class":1430},[1254,3859,3400],{"class":1744},[1254,3861,1716],{"class":1430},[1254,3863,3706],{"class":1744},[1254,3865,1691],{"class":1430},[1254,3867,3868],{"class":1995},"urls",[1254,3870,3412],{"class":1430},[1254,3872,3873,3876,3879],{"class":1256,"line":1288},[1254,3874,3875],{"class":1430},"    ]",[1254,3877,3878],{"class":2198}," +",[1254,3880,3881],{"class":1674}," urlpatterns\n",[1030,3883,3885],{"id":3884},"integration-patterns","Integration Patterns",[1035,3887,3889],{"id":3888},"package-installation-workflow","Package Installation Workflow",[1244,3891,3893],{"className":3424,"code":3892,"language":3426,"meta":1249,"style":1249},"# 1. Research and evaluate\npip search django-package-name\n\n# 2. Check compatibility\npip show django-package-name\n\n# 3. Install in development\npip install django-package-name\n\n# 4. Test thoroughly\npython manage.py test\n\n# 5. Update requirements\npip freeze > requirements.txt\n# Or better, use requirements.in with pip-tools\n",[1251,3894,3895,3900,3910,3914,3919,3928,3932,3937,3945,3949,3954,3963,3967,3972,3985],{"__ignoreMap":1249},[1254,3896,3897],{"class":1256,"line":1257},[1254,3898,3899],{"class":1260},"# 1. Research and evaluate\n",[1254,3901,3902,3904,3907],{"class":1256,"line":1264},[1254,3903,3438],{"class":1719},[1254,3905,3906],{"class":1448}," search",[1254,3908,3909],{"class":1448}," django-package-name\n",[1254,3911,3912],{"class":1256,"line":1270},[1254,3913,1466],{"emptyLinePlaceholder":1465},[1254,3915,3916],{"class":1256,"line":1276},[1254,3917,3918],{"class":1260},"# 2. Check compatibility\n",[1254,3920,3921,3923,3926],{"class":1256,"line":1282},[1254,3922,3438],{"class":1719},[1254,3924,3925],{"class":1448}," show",[1254,3927,3909],{"class":1448},[1254,3929,3930],{"class":1256,"line":1288},[1254,3931,1466],{"emptyLinePlaceholder":1465},[1254,3933,3934],{"class":1256,"line":1469},[1254,3935,3936],{"class":1260},"# 3. Install in development\n",[1254,3938,3939,3941,3943],{"class":1256,"line":1480},[1254,3940,3438],{"class":1719},[1254,3942,3441],{"class":1448},[1254,3944,3909],{"class":1448},[1254,3946,3947],{"class":1256,"line":1495},[1254,3948,1466],{"emptyLinePlaceholder":1465},[1254,3950,3951],{"class":1256,"line":1508},[1254,3952,3953],{"class":1260},"# 4. Test thoroughly\n",[1254,3955,3956,3958,3960],{"class":1256,"line":1520},[1254,3957,1248],{"class":1719},[1254,3959,3460],{"class":1448},[1254,3961,3962],{"class":1448}," test\n",[1254,3964,3965],{"class":1256,"line":1526},[1254,3966,1466],{"emptyLinePlaceholder":1465},[1254,3968,3969],{"class":1256,"line":1540},[1254,3970,3971],{"class":1260},"# 5. Update requirements\n",[1254,3973,3974,3976,3979,3982],{"class":1256,"line":1552},[1254,3975,3438],{"class":1719},[1254,3977,3978],{"class":1448}," freeze",[1254,3980,3981],{"class":2198}," >",[1254,3983,3984],{"class":1448}," requirements.txt\n",[1254,3986,3987],{"class":1256,"line":1557},[1254,3988,3989],{"class":1260},"# Or better, use requirements.in with pip-tools\n",[1035,3991,3993],{"id":3992},"configuration-management","Configuration Management",[1244,3995,3997],{"className":1246,"code":3996,"language":1248,"meta":1249,"style":1249},"# settings/base.py - Shared settings\nINSTALLED_APPS = [\n    'django.contrib.admin',\n    # ... core apps\n]\n\nTHIRD_PARTY_APPS = [\n    'rest_framework',\n    'django_filters',\n    'corsheaders',\n]\n\nLOCAL_APPS = [\n    'myapp',\n    'accounts',\n]\n\nINSTALLED_APPS += THIRD_PARTY_APPS + LOCAL_APPS\n",[1251,3998,3999,4004,4012,4023,4028,4032,4036,4045,4055,4066,4077,4081,4085,4094,4105,4116,4120,4124],{"__ignoreMap":1249},[1254,4000,4001],{"class":1256,"line":1257},[1254,4002,4003],{"class":1260},"# settings/base.py - Shared settings\n",[1254,4005,4006,4008,4010],{"class":1256,"line":1264},[1254,4007,1427],{"class":1426},[1254,4009,1431],{"class":1430},[1254,4011,1434],{"class":1430},[1254,4013,4014,4016,4019,4021],{"class":1256,"line":1270},[1254,4015,1445],{"class":1444},[1254,4017,4018],{"class":1448},"django.contrib.admin",[1254,4020,1452],{"class":1444},[1254,4022,1455],{"class":1430},[1254,4024,4025],{"class":1256,"line":1276},[1254,4026,4027],{"class":1260},"    # ... core apps\n",[1254,4029,4030],{"class":1256,"line":1282},[1254,4031,1460],{"class":1430},[1254,4033,4034],{"class":1256,"line":1288},[1254,4035,1466],{"emptyLinePlaceholder":1465},[1254,4037,4038,4041,4043],{"class":1256,"line":1469},[1254,4039,4040],{"class":1426},"THIRD_PARTY_APPS",[1254,4042,1431],{"class":1430},[1254,4044,1434],{"class":1430},[1254,4046,4047,4049,4051,4053],{"class":1256,"line":1480},[1254,4048,1445],{"class":1444},[1254,4050,1449],{"class":1448},[1254,4052,1452],{"class":1444},[1254,4054,1455],{"class":1430},[1254,4056,4057,4059,4062,4064],{"class":1256,"line":1495},[1254,4058,1445],{"class":1444},[1254,4060,4061],{"class":1448},"django_filters",[1254,4063,1452],{"class":1444},[1254,4065,1455],{"class":1430},[1254,4067,4068,4070,4073,4075],{"class":1256,"line":1508},[1254,4069,1445],{"class":1444},[1254,4071,4072],{"class":1448},"corsheaders",[1254,4074,1452],{"class":1444},[1254,4076,1455],{"class":1430},[1254,4078,4079],{"class":1256,"line":1520},[1254,4080,1460],{"class":1430},[1254,4082,4083],{"class":1256,"line":1526},[1254,4084,1466],{"emptyLinePlaceholder":1465},[1254,4086,4087,4090,4092],{"class":1256,"line":1540},[1254,4088,4089],{"class":1426},"LOCAL_APPS",[1254,4091,1431],{"class":1430},[1254,4093,1434],{"class":1430},[1254,4095,4096,4098,4101,4103],{"class":1256,"line":1552},[1254,4097,1445],{"class":1444},[1254,4099,4100],{"class":1448},"myapp",[1254,4102,1452],{"class":1444},[1254,4104,1455],{"class":1430},[1254,4106,4107,4109,4112,4114],{"class":1256,"line":1557},[1254,4108,1445],{"class":1444},[1254,4110,4111],{"class":1448},"accounts",[1254,4113,1452],{"class":1444},[1254,4115,1455],{"class":1430},[1254,4117,4118],{"class":1256,"line":1579},[1254,4119,1460],{"class":1430},[1254,4121,4122],{"class":1256,"line":1597},[1254,4123,1466],{"emptyLinePlaceholder":1465},[1254,4125,4126,4128,4130,4133,4135],{"class":1256,"line":1611},[1254,4127,1427],{"class":1426},[1254,4129,3699],{"class":1430},[1254,4131,4132],{"class":1426}," THIRD_PARTY_APPS",[1254,4134,3878],{"class":2198},[1254,4136,4137],{"class":1426}," LOCAL_APPS\n",[1244,4139,4141],{"className":1246,"code":4140,"language":1248,"meta":1249,"style":1249},"# settings/development.py\nfrom .base import *\n\nDEBUG = True\n\nINSTALLED_APPS += [\n    'debug_toolbar',\n    'django_extensions',\n]\n\nMIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware']\n",[1251,4142,4143,4148,4163,4167,4175,4179,4187,4197,4207,4211,4215],{"__ignoreMap":1249},[1254,4144,4145],{"class":1256,"line":1257},[1254,4146,4147],{"class":1260},"# settings/development.py\n",[1254,4149,4150,4152,4155,4158,4160],{"class":1256,"line":1264},[1254,4151,1671],{"class":1670},[1254,4153,4154],{"class":1430}," .",[1254,4156,4157],{"class":1674},"base ",[1254,4159,1678],{"class":1670},[1254,4161,4162],{"class":2198}," *\n",[1254,4164,4165],{"class":1256,"line":1270},[1254,4166,1466],{"emptyLinePlaceholder":1465},[1254,4168,4169,4171,4173],{"class":1256,"line":1276},[1254,4170,3823],{"class":1426},[1254,4172,1431],{"class":1430},[1254,4174,3197],{"class":1771},[1254,4176,4177],{"class":1256,"line":1282},[1254,4178,1466],{"emptyLinePlaceholder":1465},[1254,4180,4181,4183,4185],{"class":1256,"line":1288},[1254,4182,1427],{"class":1426},[1254,4184,3699],{"class":1430},[1254,4186,1434],{"class":1430},[1254,4188,4189,4191,4193,4195],{"class":1256,"line":1469},[1254,4190,1445],{"class":1444},[1254,4192,3706],{"class":1448},[1254,4194,1452],{"class":1444},[1254,4196,1455],{"class":1430},[1254,4198,4199,4201,4203,4205],{"class":1256,"line":1480},[1254,4200,1445],{"class":1444},[1254,4202,3564],{"class":1448},[1254,4204,1452],{"class":1444},[1254,4206,1455],{"class":1430},[1254,4208,4209],{"class":1256,"line":1495},[1254,4210,1460],{"class":1430},[1254,4212,4213],{"class":1256,"line":1508},[1254,4214,1466],{"emptyLinePlaceholder":1465},[1254,4216,4217,4220,4222,4224,4226,4228,4230],{"class":1256,"line":1520},[1254,4218,4219],{"class":1426},"MIDDLEWARE",[1254,4221,3699],{"class":1430},[1254,4223,1810],{"class":1430},[1254,4225,1452],{"class":1444},[1254,4227,3724],{"class":1448},[1254,4229,1452],{"class":1444},[1254,4231,1460],{"class":1430},[1244,4233,4235],{"className":1246,"code":4234,"language":1248,"meta":1249,"style":1249},"# settings/production.py\nfrom .base import *\n\nDEBUG = False\n\nINSTALLED_APPS += [\n    'storages',  # S3 storage\n]\n",[1251,4236,4237,4242,4254,4258,4266,4270,4278,4292],{"__ignoreMap":1249},[1254,4238,4239],{"class":1256,"line":1257},[1254,4240,4241],{"class":1260},"# settings/production.py\n",[1254,4243,4244,4246,4248,4250,4252],{"class":1256,"line":1264},[1254,4245,1671],{"class":1670},[1254,4247,4154],{"class":1430},[1254,4249,4157],{"class":1674},[1254,4251,1678],{"class":1670},[1254,4253,4162],{"class":2198},[1254,4255,4256],{"class":1256,"line":1270},[1254,4257,1466],{"emptyLinePlaceholder":1465},[1254,4259,4260,4262,4264],{"class":1256,"line":1276},[1254,4261,3823],{"class":1426},[1254,4263,1431],{"class":1430},[1254,4265,3207],{"class":1771},[1254,4267,4268],{"class":1256,"line":1282},[1254,4269,1466],{"emptyLinePlaceholder":1465},[1254,4271,4272,4274,4276],{"class":1256,"line":1288},[1254,4273,1427],{"class":1426},[1254,4275,3699],{"class":1430},[1254,4277,1434],{"class":1430},[1254,4279,4280,4282,4285,4287,4289],{"class":1256,"line":1469},[1254,4281,1445],{"class":1444},[1254,4283,4284],{"class":1448},"storages",[1254,4286,1452],{"class":1444},[1254,4288,1763],{"class":1430},[1254,4290,4291],{"class":1260},"  # S3 storage\n",[1254,4293,4294],{"class":1256,"line":1480},[1254,4295,1460],{"class":1430},[1035,4297,4299],{"id":4298},"dependency-management","Dependency Management",[1026,4301,4302,4303,4306],{},"Use ",[1251,4304,4305],{},"requirements.txt"," with comments:",[1244,4308,4312],{"className":4309,"code":4310,"language":4311,"meta":1249,"style":1249},"language-txt shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# requirements/base.txt\nDjango==4.2.7\npsycopg2-binary==2.9.9\n\n# API\ndjangorestframework==3.14.0\ndjango-filter==23.3\ndjango-cors-headers==4.3.0\n\n# Background tasks\ncelery==5.3.4\nredis==5.0.1\n\n# Storage\ndjango-storages==1.14.2\nboto3==1.29.7\n","txt",[1251,4313,4314,4319,4324,4329,4333,4338,4343,4348,4353,4357,4362,4367,4372,4376,4381,4386],{"__ignoreMap":1249},[1254,4315,4316],{"class":1256,"line":1257},[1254,4317,4318],{},"# requirements/base.txt\n",[1254,4320,4321],{"class":1256,"line":1264},[1254,4322,4323],{},"Django==4.2.7\n",[1254,4325,4326],{"class":1256,"line":1270},[1254,4327,4328],{},"psycopg2-binary==2.9.9\n",[1254,4330,4331],{"class":1256,"line":1276},[1254,4332,1466],{"emptyLinePlaceholder":1465},[1254,4334,4335],{"class":1256,"line":1282},[1254,4336,4337],{},"# API\n",[1254,4339,4340],{"class":1256,"line":1288},[1254,4341,4342],{},"djangorestframework==3.14.0\n",[1254,4344,4345],{"class":1256,"line":1469},[1254,4346,4347],{},"django-filter==23.3\n",[1254,4349,4350],{"class":1256,"line":1480},[1254,4351,4352],{},"django-cors-headers==4.3.0\n",[1254,4354,4355],{"class":1256,"line":1495},[1254,4356,1466],{"emptyLinePlaceholder":1465},[1254,4358,4359],{"class":1256,"line":1508},[1254,4360,4361],{},"# Background tasks\n",[1254,4363,4364],{"class":1256,"line":1520},[1254,4365,4366],{},"celery==5.3.4\n",[1254,4368,4369],{"class":1256,"line":1526},[1254,4370,4371],{},"redis==5.0.1\n",[1254,4373,4374],{"class":1256,"line":1540},[1254,4375,1466],{"emptyLinePlaceholder":1465},[1254,4377,4378],{"class":1256,"line":1552},[1254,4379,4380],{},"# Storage\n",[1254,4382,4383],{"class":1256,"line":1557},[1254,4384,4385],{},"django-storages==1.14.2\n",[1254,4387,4388],{"class":1256,"line":1579},[1254,4389,4390],{},"boto3==1.29.7\n",[1244,4392,4394],{"className":4309,"code":4393,"language":4311,"meta":1249,"style":1249},"# requirements/development.txt\n-r base.txt\n\n# Development tools\ndjango-debug-toolbar==4.2.0\ndjango-extensions==3.2.3\nipython==8.17.2\n\n# Testing\npytest-django==4.7.0\nfactory-boy==3.3.0\nfaker==20.0.3\n",[1251,4395,4396,4401,4406,4410,4415,4420,4425,4430,4434,4439,4444,4449],{"__ignoreMap":1249},[1254,4397,4398],{"class":1256,"line":1257},[1254,4399,4400],{},"# requirements/development.txt\n",[1254,4402,4403],{"class":1256,"line":1264},[1254,4404,4405],{},"-r base.txt\n",[1254,4407,4408],{"class":1256,"line":1270},[1254,4409,1466],{"emptyLinePlaceholder":1465},[1254,4411,4412],{"class":1256,"line":1276},[1254,4413,4414],{},"# Development tools\n",[1254,4416,4417],{"class":1256,"line":1282},[1254,4418,4419],{},"django-debug-toolbar==4.2.0\n",[1254,4421,4422],{"class":1256,"line":1288},[1254,4423,4424],{},"django-extensions==3.2.3\n",[1254,4426,4427],{"class":1256,"line":1469},[1254,4428,4429],{},"ipython==8.17.2\n",[1254,4431,4432],{"class":1256,"line":1480},[1254,4433,1466],{"emptyLinePlaceholder":1465},[1254,4435,4436],{"class":1256,"line":1495},[1254,4437,4438],{},"# Testing\n",[1254,4440,4441],{"class":1256,"line":1508},[1254,4442,4443],{},"pytest-django==4.7.0\n",[1254,4445,4446],{"class":1256,"line":1520},[1254,4447,4448],{},"factory-boy==3.3.0\n",[1254,4450,4451],{"class":1256,"line":1526},[1254,4452,4453],{},"faker==20.0.3\n",[1244,4455,4457],{"className":4309,"code":4456,"language":4311,"meta":1249,"style":1249},"# requirements/production.txt\n-r base.txt\n\n# Monitoring\nsentry-sdk==1.38.0\n\n# Performance\ngunicorn==21.2.0\n",[1251,4458,4459,4464,4468,4472,4477,4482,4486,4491],{"__ignoreMap":1249},[1254,4460,4461],{"class":1256,"line":1257},[1254,4462,4463],{},"# requirements/production.txt\n",[1254,4465,4466],{"class":1256,"line":1264},[1254,4467,4405],{},[1254,4469,4470],{"class":1256,"line":1270},[1254,4471,1466],{"emptyLinePlaceholder":1465},[1254,4473,4474],{"class":1256,"line":1276},[1254,4475,4476],{},"# Monitoring\n",[1254,4478,4479],{"class":1256,"line":1282},[1254,4480,4481],{},"sentry-sdk==1.38.0\n",[1254,4483,4484],{"class":1256,"line":1288},[1254,4485,1466],{"emptyLinePlaceholder":1465},[1254,4487,4488],{"class":1256,"line":1469},[1254,4489,4490],{},"# Performance\n",[1254,4492,4493],{"class":1256,"line":1480},[1254,4494,4495],{},"gunicorn==21.2.0\n",[1035,4497,4499],{"id":4498},"version-pinning-strategy","Version Pinning Strategy",[1244,4501,4503],{"className":1246,"code":4502,"language":1248,"meta":1249,"style":1249},"# Use pip-tools for reproducible builds\n# requirements.in\nDjango>=4.2,\u003C5.0\ndjangorestframework>=3.14\ncelery[redis]>=5.3\n\n# Generate locked requirements\n# pip-compile requirements.in\n# Creates requirements.txt with exact versions\n",[1251,4504,4505,4510,4515,4534,4544,4563,4567,4572,4577],{"__ignoreMap":1249},[1254,4506,4507],{"class":1256,"line":1257},[1254,4508,4509],{"class":1260},"# Use pip-tools for reproducible builds\n",[1254,4511,4512],{"class":1256,"line":1264},[1254,4513,4514],{"class":1260},"# requirements.in\n",[1254,4516,4517,4520,4523,4526,4528,4531],{"class":1256,"line":1270},[1254,4518,4519],{"class":1674},"Django",[1254,4521,4522],{"class":2198},">=",[1254,4524,4525],{"class":1591},"4.2",[1254,4527,1763],{"class":1430},[1254,4529,4530],{"class":2198},"\u003C",[1254,4532,4533],{"class":1591},"5.0\n",[1254,4535,4536,4539,4541],{"class":1256,"line":1276},[1254,4537,4538],{"class":1674},"djangorestframework",[1254,4540,4522],{"class":2198},[1254,4542,4543],{"class":1591},"3.14\n",[1254,4545,4546,4549,4552,4555,4558,4560],{"class":1256,"line":1282},[1254,4547,4548],{"class":1674},"celery",[1254,4550,4551],{"class":1430},"[",[1254,4553,4554],{"class":1674},"redis",[1254,4556,4557],{"class":1430},"]",[1254,4559,4522],{"class":2198},[1254,4561,4562],{"class":1591},"5.3\n",[1254,4564,4565],{"class":1256,"line":1288},[1254,4566,1466],{"emptyLinePlaceholder":1465},[1254,4568,4569],{"class":1256,"line":1469},[1254,4570,4571],{"class":1260},"# Generate locked requirements\n",[1254,4573,4574],{"class":1256,"line":1480},[1254,4575,4576],{"class":1260},"# pip-compile requirements.in\n",[1254,4578,4579],{"class":1256,"line":1495},[1254,4580,4581],{"class":1260},"# Creates requirements.txt with exact versions\n",[1030,4583,4585],{"id":4584},"common-integration-challenges","Common Integration Challenges",[1035,4587,533],{"id":4588},"middleware-ordering",[1244,4590,4592],{"className":1246,"code":4591,"language":1248,"meta":1249,"style":1249},"MIDDLEWARE = [\n    'django.middleware.security.SecurityMiddleware',\n    'corsheaders.middleware.CorsMiddleware',  # CORS before CommonMiddleware\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'django.middleware.common.CommonMiddleware',\n    'django.middleware.csrf.CsrfViewMiddleware',\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'django.contrib.messages.middleware.MessageMiddleware',\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\n    'debug_toolbar.middleware.DebugToolbarMiddleware',  # Debug toolbar last\n]\n",[1251,4593,4594,4602,4613,4627,4638,4649,4660,4671,4682,4693,4706],{"__ignoreMap":1249},[1254,4595,4596,4598,4600],{"class":1256,"line":1257},[1254,4597,4219],{"class":1426},[1254,4599,1431],{"class":1430},[1254,4601,1434],{"class":1430},[1254,4603,4604,4606,4609,4611],{"class":1256,"line":1264},[1254,4605,1445],{"class":1444},[1254,4607,4608],{"class":1448},"django.middleware.security.SecurityMiddleware",[1254,4610,1452],{"class":1444},[1254,4612,1455],{"class":1430},[1254,4614,4615,4617,4620,4622,4624],{"class":1256,"line":1270},[1254,4616,1445],{"class":1444},[1254,4618,4619],{"class":1448},"corsheaders.middleware.CorsMiddleware",[1254,4621,1452],{"class":1444},[1254,4623,1763],{"class":1430},[1254,4625,4626],{"class":1260},"  # CORS before CommonMiddleware\n",[1254,4628,4629,4631,4634,4636],{"class":1256,"line":1276},[1254,4630,1445],{"class":1444},[1254,4632,4633],{"class":1448},"django.contrib.sessions.middleware.SessionMiddleware",[1254,4635,1452],{"class":1444},[1254,4637,1455],{"class":1430},[1254,4639,4640,4642,4645,4647],{"class":1256,"line":1282},[1254,4641,1445],{"class":1444},[1254,4643,4644],{"class":1448},"django.middleware.common.CommonMiddleware",[1254,4646,1452],{"class":1444},[1254,4648,1455],{"class":1430},[1254,4650,4651,4653,4656,4658],{"class":1256,"line":1288},[1254,4652,1445],{"class":1444},[1254,4654,4655],{"class":1448},"django.middleware.csrf.CsrfViewMiddleware",[1254,4657,1452],{"class":1444},[1254,4659,1455],{"class":1430},[1254,4661,4662,4664,4667,4669],{"class":1256,"line":1469},[1254,4663,1445],{"class":1444},[1254,4665,4666],{"class":1448},"django.contrib.auth.middleware.AuthenticationMiddleware",[1254,4668,1452],{"class":1444},[1254,4670,1455],{"class":1430},[1254,4672,4673,4675,4678,4680],{"class":1256,"line":1480},[1254,4674,1445],{"class":1444},[1254,4676,4677],{"class":1448},"django.contrib.messages.middleware.MessageMiddleware",[1254,4679,1452],{"class":1444},[1254,4681,1455],{"class":1430},[1254,4683,4684,4686,4689,4691],{"class":1256,"line":1495},[1254,4685,1445],{"class":1444},[1254,4687,4688],{"class":1448},"django.middleware.clickjacking.XFrameOptionsMiddleware",[1254,4690,1452],{"class":1444},[1254,4692,1455],{"class":1430},[1254,4694,4695,4697,4699,4701,4703],{"class":1256,"line":1508},[1254,4696,1445],{"class":1444},[1254,4698,3724],{"class":1448},[1254,4700,1452],{"class":1444},[1254,4702,1763],{"class":1430},[1254,4704,4705],{"class":1260},"  # Debug toolbar last\n",[1254,4707,4708],{"class":1256,"line":1520},[1254,4709,1460],{"class":1430},[1035,4711,4713],{"id":4712},"url-configuration-conflicts","URL Configuration Conflicts",[1244,4715,4717],{"className":1246,"code":4716,"language":1248,"meta":1249,"style":1249},"# urls.py - Order matters!\nurlpatterns = [\n    path('admin/', admin.site.urls),\n    path('api/', include('api.urls')),  # Specific paths first\n    path('accounts/', include('allauth.urls')),\n    path('', include('pages.urls')),  # Catch-all last\n]\n",[1251,4718,4719,4724,4732,4761,4793,4819,4846],{"__ignoreMap":1249},[1254,4720,4721],{"class":1256,"line":1257},[1254,4722,4723],{"class":1260},"# urls.py - Order matters!\n",[1254,4725,4726,4728,4730],{"class":1256,"line":1264},[1254,4727,3377],{"class":1674},[1254,4729,1736],{"class":1430},[1254,4731,1434],{"class":1430},[1254,4733,4734,4736,4738,4740,4743,4745,4747,4750,4752,4755,4757,4759],{"class":1256,"line":1270},[1254,4735,3386],{"class":1744},[1254,4737,1716],{"class":1430},[1254,4739,1452],{"class":1444},[1254,4741,4742],{"class":1448},"admin/",[1254,4744,1452],{"class":1444},[1254,4746,1763],{"class":1430},[1254,4748,4749],{"class":1744}," admin",[1254,4751,1691],{"class":1430},[1254,4753,4754],{"class":1995},"site",[1254,4756,1691],{"class":1430},[1254,4758,3868],{"class":1995},[1254,4760,2469],{"class":1430},[1254,4762,4763,4765,4767,4769,4772,4774,4776,4778,4780,4782,4785,4787,4790],{"class":1256,"line":1276},[1254,4764,3386],{"class":1744},[1254,4766,1716],{"class":1430},[1254,4768,1452],{"class":1444},[1254,4770,4771],{"class":1448},"api/",[1254,4773,1452],{"class":1444},[1254,4775,1763],{"class":1430},[1254,4777,3400],{"class":1744},[1254,4779,1716],{"class":1430},[1254,4781,1452],{"class":1444},[1254,4783,4784],{"class":1448},"api.urls",[1254,4786,1452],{"class":1444},[1254,4788,4789],{"class":1430},")),",[1254,4791,4792],{"class":1260},"  # Specific paths first\n",[1254,4794,4795,4797,4799,4801,4803,4805,4807,4809,4811,4813,4815,4817],{"class":1256,"line":1282},[1254,4796,3386],{"class":1744},[1254,4798,1716],{"class":1430},[1254,4800,1452],{"class":1444},[1254,4802,3393],{"class":1448},[1254,4804,1452],{"class":1444},[1254,4806,1763],{"class":1430},[1254,4808,3400],{"class":1744},[1254,4810,1716],{"class":1430},[1254,4812,1452],{"class":1444},[1254,4814,3407],{"class":1448},[1254,4816,1452],{"class":1444},[1254,4818,3412],{"class":1430},[1254,4820,4821,4823,4825,4828,4830,4832,4834,4836,4839,4841,4843],{"class":1256,"line":1288},[1254,4822,3386],{"class":1744},[1254,4824,1716],{"class":1430},[1254,4826,4827],{"class":1444},"''",[1254,4829,1763],{"class":1430},[1254,4831,3400],{"class":1744},[1254,4833,1716],{"class":1430},[1254,4835,1452],{"class":1444},[1254,4837,4838],{"class":1448},"pages.urls",[1254,4840,1452],{"class":1444},[1254,4842,4789],{"class":1430},[1254,4844,4845],{"class":1260},"  # Catch-all last\n",[1254,4847,4848],{"class":1256,"line":1469},[1254,4849,1460],{"class":1430},[1035,4851,4853],{"id":4852},"static-files-with-django-storages","Static Files with django-storages",[1244,4855,4857],{"className":1246,"code":4856,"language":1248,"meta":1249,"style":1249},"# settings/production.py\nINSTALLED_APPS += ['storages']\n\n# S3 Configuration\nAWS_ACCESS_KEY_ID = env('AWS_ACCESS_KEY_ID')\nAWS_SECRET_ACCESS_KEY = env('AWS_SECRET_ACCESS_KEY')\nAWS_STORAGE_BUCKET_NAME = env('AWS_STORAGE_BUCKET_NAME')\nAWS_S3_REGION_NAME = 'us-east-1'\nAWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'\n\n# Static files\nSTATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'\nSTATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/static/'\n\n# Media files\nDEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'\nMEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'\n",[1251,4858,4859,4863,4879,4883,4888,4908,4927,4946,4960,4981,4985,4990,5004,5025,5029,5034,5047],{"__ignoreMap":1249},[1254,4860,4861],{"class":1256,"line":1257},[1254,4862,4241],{"class":1260},[1254,4864,4865,4867,4869,4871,4873,4875,4877],{"class":1256,"line":1264},[1254,4866,1427],{"class":1426},[1254,4868,3699],{"class":1430},[1254,4870,1810],{"class":1430},[1254,4872,1452],{"class":1444},[1254,4874,4284],{"class":1448},[1254,4876,1452],{"class":1444},[1254,4878,1460],{"class":1430},[1254,4880,4881],{"class":1256,"line":1270},[1254,4882,1466],{"emptyLinePlaceholder":1465},[1254,4884,4885],{"class":1256,"line":1276},[1254,4886,4887],{"class":1260},"# S3 Configuration\n",[1254,4889,4890,4893,4895,4898,4900,4902,4904,4906],{"class":1256,"line":1282},[1254,4891,4892],{"class":1426},"AWS_ACCESS_KEY_ID",[1254,4894,1431],{"class":1430},[1254,4896,4897],{"class":1744}," env",[1254,4899,1716],{"class":1430},[1254,4901,1452],{"class":1444},[1254,4903,4892],{"class":1448},[1254,4905,1452],{"class":1444},[1254,4907,1775],{"class":1430},[1254,4909,4910,4913,4915,4917,4919,4921,4923,4925],{"class":1256,"line":1288},[1254,4911,4912],{"class":1426},"AWS_SECRET_ACCESS_KEY",[1254,4914,1431],{"class":1430},[1254,4916,4897],{"class":1744},[1254,4918,1716],{"class":1430},[1254,4920,1452],{"class":1444},[1254,4922,4912],{"class":1448},[1254,4924,1452],{"class":1444},[1254,4926,1775],{"class":1430},[1254,4928,4929,4932,4934,4936,4938,4940,4942,4944],{"class":1256,"line":1469},[1254,4930,4931],{"class":1426},"AWS_STORAGE_BUCKET_NAME",[1254,4933,1431],{"class":1430},[1254,4935,4897],{"class":1744},[1254,4937,1716],{"class":1430},[1254,4939,1452],{"class":1444},[1254,4941,4931],{"class":1448},[1254,4943,1452],{"class":1444},[1254,4945,1775],{"class":1430},[1254,4947,4948,4951,4953,4955,4958],{"class":1256,"line":1480},[1254,4949,4950],{"class":1426},"AWS_S3_REGION_NAME",[1254,4952,1431],{"class":1430},[1254,4954,1569],{"class":1444},[1254,4956,4957],{"class":1448},"us-east-1",[1254,4959,2240],{"class":1444},[1254,4961,4962,4965,4967,4970,4972,4974,4976,4978],{"class":1256,"line":1495},[1254,4963,4964],{"class":1426},"AWS_S3_CUSTOM_DOMAIN",[1254,4966,1431],{"class":1430},[1254,4968,4969],{"class":1708}," f",[1254,4971,1452],{"class":1448},[1254,4973,2818],{"class":2817},[1254,4975,4931],{"class":1426},[1254,4977,2829],{"class":2817},[1254,4979,4980],{"class":1448},".s3.amazonaws.com'\n",[1254,4982,4983],{"class":1256,"line":1508},[1254,4984,1466],{"emptyLinePlaceholder":1465},[1254,4986,4987],{"class":1256,"line":1520},[1254,4988,4989],{"class":1260},"# Static files\n",[1254,4991,4992,4995,4997,4999,5002],{"class":1256,"line":1526},[1254,4993,4994],{"class":1426},"STATICFILES_STORAGE",[1254,4996,1431],{"class":1430},[1254,4998,1569],{"class":1444},[1254,5000,5001],{"class":1448},"storages.backends.s3boto3.S3Boto3Storage",[1254,5003,2240],{"class":1444},[1254,5005,5006,5009,5011,5013,5016,5018,5020,5022],{"class":1256,"line":1540},[1254,5007,5008],{"class":1426},"STATIC_URL",[1254,5010,1431],{"class":1430},[1254,5012,4969],{"class":1708},[1254,5014,5015],{"class":1448},"'https://",[1254,5017,2818],{"class":2817},[1254,5019,4964],{"class":1426},[1254,5021,2829],{"class":2817},[1254,5023,5024],{"class":1448},"/static/'\n",[1254,5026,5027],{"class":1256,"line":1552},[1254,5028,1466],{"emptyLinePlaceholder":1465},[1254,5030,5031],{"class":1256,"line":1557},[1254,5032,5033],{"class":1260},"# Media files\n",[1254,5035,5036,5039,5041,5043,5045],{"class":1256,"line":1579},[1254,5037,5038],{"class":1426},"DEFAULT_FILE_STORAGE",[1254,5040,1431],{"class":1430},[1254,5042,1569],{"class":1444},[1254,5044,5001],{"class":1448},[1254,5046,2240],{"class":1444},[1254,5048,5049,5052,5054,5056,5058,5060,5062,5064],{"class":1256,"line":1597},[1254,5050,5051],{"class":1426},"MEDIA_URL",[1254,5053,1431],{"class":1430},[1254,5055,4969],{"class":1708},[1254,5057,5015],{"class":1448},[1254,5059,2818],{"class":2817},[1254,5061,4964],{"class":1426},[1254,5063,2829],{"class":2817},[1254,5065,5066],{"class":1448},"/media/'\n",[1035,5068,5070],{"id":5069},"database-router-for-multiple-databases","Database Router for Multiple Databases",[1244,5072,5074],{"className":1246,"code":5073,"language":1248,"meta":1249,"style":1249},"# routers.py\nclass AuthRouter:\n    \"\"\"Route auth models to separate database\"\"\"\n    \n    route_app_labels = {'auth', 'contenttypes', 'sessions'}\n    \n    def db_for_read(self, model, **hints):\n        if model._meta.app_label in self.route_app_labels:\n            return 'auth_db'\n        return None\n    \n    def db_for_write(self, model, **hints):\n        if model._meta.app_label in self.route_app_labels:\n            return 'auth_db'\n        return None\n\n# settings.py\nDATABASES = {\n    'default': {...},\n    'auth_db': {...},\n}\n\nDATABASE_ROUTERS = ['myproject.routers.AuthRouter']\n",[1251,5075,5076,5081,5090,5103,5107,5143,5147,5173,5202,5214,5221,5225,5248,5272,5282,5288,5292,5296,5305,5324,5340,5344,5348],{"__ignoreMap":1249},[1254,5077,5078],{"class":1256,"line":1257},[1254,5079,5080],{"class":1260},"# routers.py\n",[1254,5082,5083,5085,5088],{"class":1256,"line":1264},[1254,5084,1709],{"class":1708},[1254,5086,5087],{"class":1712}," AuthRouter",[1254,5089,1791],{"class":1430},[1254,5091,5092,5096,5100],{"class":1256,"line":1270},[1254,5093,5095],{"class":5094},"sm7ve","    \"\"\"",[1254,5097,5099],{"class":5098},"sVyVU","Route auth models to separate database",[1254,5101,5102],{"class":5094},"\"\"\"\n",[1254,5104,5105],{"class":1256,"line":1276},[1254,5106,1780],{"class":1674},[1254,5108,5109,5112,5114,5116,5118,5121,5123,5125,5127,5130,5132,5134,5136,5139,5141],{"class":1256,"line":1282},[1254,5110,5111],{"class":1674},"    route_app_labels ",[1254,5113,1736],{"class":1430},[1254,5115,3011],{"class":1430},[1254,5117,1452],{"class":1444},[1254,5119,5120],{"class":1448},"auth",[1254,5122,1452],{"class":1444},[1254,5124,1763],{"class":1430},[1254,5126,1569],{"class":1444},[1254,5128,5129],{"class":1448},"contenttypes",[1254,5131,1452],{"class":1444},[1254,5133,1763],{"class":1430},[1254,5135,1569],{"class":1444},[1254,5137,5138],{"class":1448},"sessions",[1254,5140,1452],{"class":1444},[1254,5142,1655],{"class":1430},[1254,5144,5145],{"class":1256,"line":1288},[1254,5146,1780],{"class":1674},[1254,5148,5149,5151,5154,5156,5158,5160,5163,5165,5168,5171],{"class":1256,"line":1469},[1254,5150,2175],{"class":1708},[1254,5152,5153],{"class":2142}," db_for_read",[1254,5155,1716],{"class":1430},[1254,5157,2184],{"class":2183},[1254,5159,1763],{"class":1430},[1254,5161,5162],{"class":2189}," model",[1254,5164,1763],{"class":1430},[1254,5166,5167],{"class":2198}," **",[1254,5169,5170],{"class":2189},"hints",[1254,5172,1728],{"class":1430},[1254,5174,5175,5178,5180,5182,5185,5187,5190,5193,5195,5197,5200],{"class":1256,"line":1480},[1254,5176,5177],{"class":1670},"        if",[1254,5179,5162],{"class":1674},[1254,5181,1691],{"class":1430},[1254,5183,5184],{"class":1995},"_meta",[1254,5186,1691],{"class":1430},[1254,5188,5189],{"class":1995},"app_label",[1254,5191,5192],{"class":2198}," in",[1254,5194,2213],{"class":1426},[1254,5196,1691],{"class":1430},[1254,5198,5199],{"class":1995},"route_app_labels",[1254,5201,1791],{"class":1430},[1254,5203,5204,5207,5209,5212],{"class":1256,"line":1495},[1254,5205,5206],{"class":1670},"            return",[1254,5208,1569],{"class":1444},[1254,5210,5211],{"class":1448},"auth_db",[1254,5213,2240],{"class":1444},[1254,5215,5216,5218],{"class":1256,"line":1508},[1254,5217,2256],{"class":1670},[1254,5219,5220],{"class":1771}," None\n",[1254,5222,5223],{"class":1256,"line":1520},[1254,5224,1780],{"class":1674},[1254,5226,5227,5229,5232,5234,5236,5238,5240,5242,5244,5246],{"class":1256,"line":1526},[1254,5228,2175],{"class":1708},[1254,5230,5231],{"class":2142}," db_for_write",[1254,5233,1716],{"class":1430},[1254,5235,2184],{"class":2183},[1254,5237,1763],{"class":1430},[1254,5239,5162],{"class":2189},[1254,5241,1763],{"class":1430},[1254,5243,5167],{"class":2198},[1254,5245,5170],{"class":2189},[1254,5247,1728],{"class":1430},[1254,5249,5250,5252,5254,5256,5258,5260,5262,5264,5266,5268,5270],{"class":1256,"line":1540},[1254,5251,5177],{"class":1670},[1254,5253,5162],{"class":1674},[1254,5255,1691],{"class":1430},[1254,5257,5184],{"class":1995},[1254,5259,1691],{"class":1430},[1254,5261,5189],{"class":1995},[1254,5263,5192],{"class":2198},[1254,5265,2213],{"class":1426},[1254,5267,1691],{"class":1430},[1254,5269,5199],{"class":1995},[1254,5271,1791],{"class":1430},[1254,5273,5274,5276,5278,5280],{"class":1256,"line":1552},[1254,5275,5206],{"class":1670},[1254,5277,1569],{"class":1444},[1254,5279,5211],{"class":1448},[1254,5281,2240],{"class":1444},[1254,5283,5284,5286],{"class":1256,"line":1557},[1254,5285,2256],{"class":1670},[1254,5287,5220],{"class":1771},[1254,5289,5290],{"class":1256,"line":1579},[1254,5291,1466],{"emptyLinePlaceholder":1465},[1254,5293,5294],{"class":1256,"line":1597},[1254,5295,1421],{"class":1260},[1254,5297,5298,5301,5303],{"class":1256,"line":1611},[1254,5299,5300],{"class":1426},"DATABASES",[1254,5302,1431],{"class":1430},[1254,5304,1477],{"class":1430},[1254,5306,5307,5309,5312,5314,5316,5318,5321],{"class":1256,"line":1623},[1254,5308,1445],{"class":1444},[1254,5310,5311],{"class":1448},"default",[1254,5313,1452],{"class":1444},[1254,5315,1490],{"class":1430},[1254,5317,3011],{"class":1430},[1254,5319,5320],{"class":1426},"...",[1254,5322,5323],{"class":1430},"},\n",[1254,5325,5326,5328,5330,5332,5334,5336,5338],{"class":1256,"line":1635},[1254,5327,1445],{"class":1444},[1254,5329,5211],{"class":1448},[1254,5331,1452],{"class":1444},[1254,5333,1490],{"class":1430},[1254,5335,3011],{"class":1430},[1254,5337,5320],{"class":1426},[1254,5339,5323],{"class":1430},[1254,5341,5342],{"class":1256,"line":1647},[1254,5343,1655],{"class":1430},[1254,5345,5346],{"class":1256,"line":1652},[1254,5347,1466],{"emptyLinePlaceholder":1465},[1254,5349,5350,5353,5355,5357,5359,5362,5364],{"class":1256,"line":2941},[1254,5351,5352],{"class":1426},"DATABASE_ROUTERS",[1254,5354,1431],{"class":1430},[1254,5356,1810],{"class":1430},[1254,5358,1452],{"class":1444},[1254,5360,5361],{"class":1448},"myproject.routers.AuthRouter",[1254,5363,1452],{"class":1444},[1254,5365,1460],{"class":1430},[1030,5367,5369],{"id":5368},"package-development","Package Development",[1035,5371,5373],{"id":5372},"creating-reusable-apps","Creating Reusable Apps",[1244,5375,5377],{"className":1246,"code":5376,"language":1248,"meta":1249,"style":1249},"# setup.py for your package\nfrom setuptools import setup, find_packages\n\nsetup(\n    name='django-mypackage',\n    version='0.1.0',\n    packages=find_packages(),\n    include_package_data=True,\n    license='MIT',\n    description='A Django package for...',\n    long_description=open('README.md').read(),\n    long_description_content_type='text/markdown',\n    url='https://github.com/yourusername/django-mypackage',\n    author='Your Name',\n    author_email='your.email@example.com',\n    classifiers=[\n        'Environment :: Web Environment',\n        'Framework :: Django',\n        'Framework :: Django :: 4.2',\n        'Intended Audience :: Developers',\n        'License :: OSI Approved :: MIT License',\n        'Operating System :: OS Independent',\n        'Programming Language :: Python',\n        'Programming Language :: Python :: 3.10',\n        'Programming Language :: Python :: 3.11',\n    ],\n    install_requires=[\n        'Django>=4.2',\n    ],\n    python_requires='>=3.10',\n)\n",[1251,5378,5379,5384,5401,5405,5412,5428,5444,5457,5468,5484,5500,5527,5543,5559,5575,5591,5599,5610,5621,5632,5643,5654,5665,5676,5687,5698,5702,5709,5720,5724,5740],{"__ignoreMap":1249},[1254,5380,5381],{"class":1256,"line":1257},[1254,5382,5383],{"class":1260},"# setup.py for your package\n",[1254,5385,5386,5388,5391,5393,5396,5398],{"class":1256,"line":1264},[1254,5387,1671],{"class":1670},[1254,5389,5390],{"class":1674}," setuptools ",[1254,5392,1678],{"class":1670},[1254,5394,5395],{"class":1674}," setup",[1254,5397,1763],{"class":1430},[1254,5399,5400],{"class":1674}," find_packages\n",[1254,5402,5403],{"class":1256,"line":1270},[1254,5404,1466],{"emptyLinePlaceholder":1465},[1254,5406,5407,5410],{"class":1256,"line":1276},[1254,5408,5409],{"class":1744},"setup",[1254,5411,2794],{"class":1430},[1254,5413,5414,5417,5419,5421,5424,5426],{"class":1256,"line":1282},[1254,5415,5416],{"class":1750},"    name",[1254,5418,1736],{"class":1430},[1254,5420,1452],{"class":1444},[1254,5422,5423],{"class":1448},"django-mypackage",[1254,5425,1452],{"class":1444},[1254,5427,1455],{"class":1430},[1254,5429,5430,5433,5435,5437,5440,5442],{"class":1256,"line":1288},[1254,5431,5432],{"class":1750},"    version",[1254,5434,1736],{"class":1430},[1254,5436,1452],{"class":1444},[1254,5438,5439],{"class":1448},"0.1.0",[1254,5441,1452],{"class":1444},[1254,5443,1455],{"class":1430},[1254,5445,5446,5449,5451,5454],{"class":1256,"line":1469},[1254,5447,5448],{"class":1750},"    packages",[1254,5450,1736],{"class":1430},[1254,5452,5453],{"class":1744},"find_packages",[1254,5455,5456],{"class":1430},"(),\n",[1254,5458,5459,5462,5464,5466],{"class":1256,"line":1480},[1254,5460,5461],{"class":1750},"    include_package_data",[1254,5463,1736],{"class":1430},[1254,5465,1772],{"class":1771},[1254,5467,1455],{"class":1430},[1254,5469,5470,5473,5475,5477,5480,5482],{"class":1256,"line":1495},[1254,5471,5472],{"class":1750},"    license",[1254,5474,1736],{"class":1430},[1254,5476,1452],{"class":1444},[1254,5478,5479],{"class":1448},"MIT",[1254,5481,1452],{"class":1444},[1254,5483,1455],{"class":1430},[1254,5485,5486,5489,5491,5493,5496,5498],{"class":1256,"line":1508},[1254,5487,5488],{"class":1750},"    description",[1254,5490,1736],{"class":1430},[1254,5492,1452],{"class":1444},[1254,5494,5495],{"class":1448},"A Django package for...",[1254,5497,1452],{"class":1444},[1254,5499,1455],{"class":1430},[1254,5501,5502,5505,5507,5510,5512,5514,5517,5519,5522,5525],{"class":1256,"line":1520},[1254,5503,5504],{"class":1750},"    long_description",[1254,5506,1736],{"class":1430},[1254,5508,5509],{"class":3023},"open",[1254,5511,1716],{"class":1430},[1254,5513,1452],{"class":1444},[1254,5515,5516],{"class":1448},"README.md",[1254,5518,1452],{"class":1444},[1254,5520,5521],{"class":1430},").",[1254,5523,5524],{"class":1744},"read",[1254,5526,5456],{"class":1430},[1254,5528,5529,5532,5534,5536,5539,5541],{"class":1256,"line":1526},[1254,5530,5531],{"class":1750},"    long_description_content_type",[1254,5533,1736],{"class":1430},[1254,5535,1452],{"class":1444},[1254,5537,5538],{"class":1448},"text/markdown",[1254,5540,1452],{"class":1444},[1254,5542,1455],{"class":1430},[1254,5544,5545,5548,5550,5552,5555,5557],{"class":1256,"line":1540},[1254,5546,5547],{"class":1750},"    url",[1254,5549,1736],{"class":1430},[1254,5551,1452],{"class":1444},[1254,5553,5554],{"class":1448},"https://github.com/yourusername/django-mypackage",[1254,5556,1452],{"class":1444},[1254,5558,1455],{"class":1430},[1254,5560,5561,5564,5566,5568,5571,5573],{"class":1256,"line":1552},[1254,5562,5563],{"class":1750},"    author",[1254,5565,1736],{"class":1430},[1254,5567,1452],{"class":1444},[1254,5569,5570],{"class":1448},"Your Name",[1254,5572,1452],{"class":1444},[1254,5574,1455],{"class":1430},[1254,5576,5577,5580,5582,5584,5587,5589],{"class":1256,"line":1557},[1254,5578,5579],{"class":1750},"    author_email",[1254,5581,1736],{"class":1430},[1254,5583,1452],{"class":1444},[1254,5585,5586],{"class":1448},"your.email@example.com",[1254,5588,1452],{"class":1444},[1254,5590,1455],{"class":1430},[1254,5592,5593,5596],{"class":1256,"line":1579},[1254,5594,5595],{"class":1750},"    classifiers",[1254,5597,5598],{"class":1430},"=[\n",[1254,5600,5601,5603,5606,5608],{"class":1256,"line":1597},[1254,5602,1498],{"class":1444},[1254,5604,5605],{"class":1448},"Environment :: Web Environment",[1254,5607,1452],{"class":1444},[1254,5609,1455],{"class":1430},[1254,5611,5612,5614,5617,5619],{"class":1256,"line":1611},[1254,5613,1498],{"class":1444},[1254,5615,5616],{"class":1448},"Framework :: Django",[1254,5618,1452],{"class":1444},[1254,5620,1455],{"class":1430},[1254,5622,5623,5625,5628,5630],{"class":1256,"line":1623},[1254,5624,1498],{"class":1444},[1254,5626,5627],{"class":1448},"Framework :: Django :: 4.2",[1254,5629,1452],{"class":1444},[1254,5631,1455],{"class":1430},[1254,5633,5634,5636,5639,5641],{"class":1256,"line":1635},[1254,5635,1498],{"class":1444},[1254,5637,5638],{"class":1448},"Intended Audience :: Developers",[1254,5640,1452],{"class":1444},[1254,5642,1455],{"class":1430},[1254,5644,5645,5647,5650,5652],{"class":1256,"line":1647},[1254,5646,1498],{"class":1444},[1254,5648,5649],{"class":1448},"License :: OSI Approved :: MIT License",[1254,5651,1452],{"class":1444},[1254,5653,1455],{"class":1430},[1254,5655,5656,5658,5661,5663],{"class":1256,"line":1652},[1254,5657,1498],{"class":1444},[1254,5659,5660],{"class":1448},"Operating System :: OS Independent",[1254,5662,1452],{"class":1444},[1254,5664,1455],{"class":1430},[1254,5666,5667,5669,5672,5674],{"class":1256,"line":2941},[1254,5668,1498],{"class":1444},[1254,5670,5671],{"class":1448},"Programming Language :: Python",[1254,5673,1452],{"class":1444},[1254,5675,1455],{"class":1430},[1254,5677,5678,5680,5683,5685],{"class":1256,"line":2956},[1254,5679,1498],{"class":1444},[1254,5681,5682],{"class":1448},"Programming Language :: Python :: 3.10",[1254,5684,1452],{"class":1444},[1254,5686,1455],{"class":1430},[1254,5688,5689,5691,5694,5696],{"class":1256,"line":2962},[1254,5690,1498],{"class":1444},[1254,5692,5693],{"class":1448},"Programming Language :: Python :: 3.11",[1254,5695,1452],{"class":1444},[1254,5697,1455],{"class":1430},[1254,5699,5700],{"class":1256,"line":2977},[1254,5701,1523],{"class":1430},[1254,5703,5704,5707],{"class":1256,"line":2999},[1254,5705,5706],{"class":1750},"    install_requires",[1254,5708,5598],{"class":1430},[1254,5710,5711,5713,5716,5718],{"class":1256,"line":3005},[1254,5712,1498],{"class":1444},[1254,5714,5715],{"class":1448},"Django>=4.2",[1254,5717,1452],{"class":1444},[1254,5719,1455],{"class":1430},[1254,5721,5722],{"class":1256,"line":3296},[1254,5723,1523],{"class":1430},[1254,5725,5726,5729,5731,5733,5736,5738],{"class":1256,"line":3307},[1254,5727,5728],{"class":1750},"    python_requires",[1254,5730,1736],{"class":1430},[1254,5732,1452],{"class":1444},[1254,5734,5735],{"class":1448},">=3.10",[1254,5737,1452],{"class":1444},[1254,5739,1455],{"class":1430},[1254,5741,5742],{"class":1256,"line":3313},[1254,5743,1775],{"class":1430},[1035,5745,5747],{"id":5746},"package-structure","Package Structure",[1244,5749,5754],{"className":5750,"code":5752,"language":5753},[5751],"language-text","django-mypackage/\n├── mypackage/\n│   ├── __init__.py\n│   ├── models.py\n│   ├── views.py\n│   ├── urls.py\n│   ├── admin.py\n│   ├── templates/\n│   │   └── mypackage/\n│   │       └── base.html\n│   ├── static/\n│   │   └── mypackage/\n│   │       └── style.css\n│   └── migrations/\n├── tests/\n│   ├── __init__.py\n│   ├── test_models.py\n│   └── test_views.py\n├── docs/\n├── README.md\n├── LICENSE\n├── setup.py\n├── MANIFEST.in\n└── tox.ini\n","text",[1251,5755,5752],{"__ignoreMap":1249},[1030,5757,921],{"id":5758},"best-practices",[1035,5760,5762],{"id":5761},"_1-minimize-dependencies","1. Minimize Dependencies",[1026,5764,5765],{},"Only add packages that provide significant value:",[1244,5767,5769],{"className":1246,"code":5768,"language":1248,"meta":1249,"style":1249},"# Bad - too many dependencies\nINSTALLED_APPS = [\n    'package1',  # Only used once\n    'package2',  # Could write yourself\n    'package3',  # Unmaintained\n]\n\n# Good - essential packages only\nINSTALLED_APPS = [\n    'rest_framework',  # Core API functionality\n    'celery',  # Complex async handling\n]\n",[1251,5770,5771,5776,5784,5798,5812,5826,5830,5834,5839,5847,5860,5873],{"__ignoreMap":1249},[1254,5772,5773],{"class":1256,"line":1257},[1254,5774,5775],{"class":1260},"# Bad - too many dependencies\n",[1254,5777,5778,5780,5782],{"class":1256,"line":1264},[1254,5779,1427],{"class":1426},[1254,5781,1431],{"class":1430},[1254,5783,1434],{"class":1430},[1254,5785,5786,5788,5791,5793,5795],{"class":1256,"line":1270},[1254,5787,1445],{"class":1444},[1254,5789,5790],{"class":1448},"package1",[1254,5792,1452],{"class":1444},[1254,5794,1763],{"class":1430},[1254,5796,5797],{"class":1260},"  # Only used once\n",[1254,5799,5800,5802,5805,5807,5809],{"class":1256,"line":1276},[1254,5801,1445],{"class":1444},[1254,5803,5804],{"class":1448},"package2",[1254,5806,1452],{"class":1444},[1254,5808,1763],{"class":1430},[1254,5810,5811],{"class":1260},"  # Could write yourself\n",[1254,5813,5814,5816,5819,5821,5823],{"class":1256,"line":1282},[1254,5815,1445],{"class":1444},[1254,5817,5818],{"class":1448},"package3",[1254,5820,1452],{"class":1444},[1254,5822,1763],{"class":1430},[1254,5824,5825],{"class":1260},"  # Unmaintained\n",[1254,5827,5828],{"class":1256,"line":1288},[1254,5829,1460],{"class":1430},[1254,5831,5832],{"class":1256,"line":1469},[1254,5833,1466],{"emptyLinePlaceholder":1465},[1254,5835,5836],{"class":1256,"line":1480},[1254,5837,5838],{"class":1260},"# Good - essential packages only\n",[1254,5840,5841,5843,5845],{"class":1256,"line":1495},[1254,5842,1427],{"class":1426},[1254,5844,1431],{"class":1430},[1254,5846,1434],{"class":1430},[1254,5848,5849,5851,5853,5855,5857],{"class":1256,"line":1508},[1254,5850,1445],{"class":1444},[1254,5852,1449],{"class":1448},[1254,5854,1452],{"class":1444},[1254,5856,1763],{"class":1430},[1254,5858,5859],{"class":1260},"  # Core API functionality\n",[1254,5861,5862,5864,5866,5868,5870],{"class":1256,"line":1520},[1254,5863,1445],{"class":1444},[1254,5865,4548],{"class":1448},[1254,5867,1452],{"class":1444},[1254,5869,1763],{"class":1430},[1254,5871,5872],{"class":1260},"  # Complex async handling\n",[1254,5874,5875],{"class":1256,"line":1526},[1254,5876,1460],{"class":1430},[1035,5878,5880],{"id":5879},"_2-keep-packages-updated","2. Keep Packages Updated",[1244,5882,5884],{"className":3424,"code":5883,"language":3426,"meta":1249,"style":1249},"# Check for outdated packages\npip list --outdated\n\n# Use pip-review for interactive updates\npip install pip-review\npip-review --interactive\n\n# Or use dependabot/renovate for automated PRs\n",[1251,5885,5886,5891,5901,5905,5910,5919,5927,5931],{"__ignoreMap":1249},[1254,5887,5888],{"class":1256,"line":1257},[1254,5889,5890],{"class":1260},"# Check for outdated packages\n",[1254,5892,5893,5895,5898],{"class":1256,"line":1264},[1254,5894,3438],{"class":1719},[1254,5896,5897],{"class":1448}," list",[1254,5899,5900],{"class":3490}," --outdated\n",[1254,5902,5903],{"class":1256,"line":1270},[1254,5904,1466],{"emptyLinePlaceholder":1465},[1254,5906,5907],{"class":1256,"line":1276},[1254,5908,5909],{"class":1260},"# Use pip-review for interactive updates\n",[1254,5911,5912,5914,5916],{"class":1256,"line":1282},[1254,5913,3438],{"class":1719},[1254,5915,3441],{"class":1448},[1254,5917,5918],{"class":1448}," pip-review\n",[1254,5920,5921,5924],{"class":1256,"line":1288},[1254,5922,5923],{"class":1719},"pip-review",[1254,5925,5926],{"class":3490}," --interactive\n",[1254,5928,5929],{"class":1256,"line":1469},[1254,5930,1466],{"emptyLinePlaceholder":1465},[1254,5932,5933],{"class":1256,"line":1480},[1254,5934,5935],{"class":1260},"# Or use dependabot/renovate for automated PRs\n",[1035,5937,5939],{"id":5938},"_3-test-package-upgrades","3. Test Package Upgrades",[1244,5941,5943],{"className":1246,"code":5942,"language":1248,"meta":1249,"style":1249},"# tests/test_package_compatibility.py\nimport pytest\nfrom django.test import TestCase\n\nclass PackageCompatibilityTest(TestCase):\n    def test_rest_framework_version(self):\n        import rest_framework\n        # Ensure we're on a compatible version\n        assert rest_framework.VERSION >= (3, 14, 0)\n",[1251,5944,5945,5950,5957,5973,5977,5991,6004,6012,6017],{"__ignoreMap":1249},[1254,5946,5947],{"class":1256,"line":1257},[1254,5948,5949],{"class":1260},"# tests/test_package_compatibility.py\n",[1254,5951,5952,5954],{"class":1256,"line":1264},[1254,5953,1678],{"class":1670},[1254,5955,5956],{"class":1674}," pytest\n",[1254,5958,5959,5961,5963,5965,5968,5970],{"class":1256,"line":1270},[1254,5960,1671],{"class":1670},[1254,5962,2645],{"class":1674},[1254,5964,1691],{"class":1430},[1254,5966,5967],{"class":1674},"test ",[1254,5969,1678],{"class":1670},[1254,5971,5972],{"class":1674}," TestCase\n",[1254,5974,5975],{"class":1256,"line":1276},[1254,5976,1466],{"emptyLinePlaceholder":1465},[1254,5978,5979,5981,5984,5986,5989],{"class":1256,"line":1282},[1254,5980,1709],{"class":1708},[1254,5982,5983],{"class":1712}," PackageCompatibilityTest",[1254,5985,1716],{"class":1430},[1254,5987,5988],{"class":1719},"TestCase",[1254,5990,1728],{"class":1430},[1254,5992,5993,5995,5998,6000,6002],{"class":1256,"line":1288},[1254,5994,2175],{"class":1708},[1254,5996,5997],{"class":2142}," test_rest_framework_version",[1254,5999,1716],{"class":1430},[1254,6001,2184],{"class":2183},[1254,6003,1728],{"class":1430},[1254,6005,6006,6009],{"class":1256,"line":1469},[1254,6007,6008],{"class":1670},"        import",[1254,6010,6011],{"class":1674}," rest_framework\n",[1254,6013,6014],{"class":1256,"line":1480},[1254,6015,6016],{"class":1260},"        # Ensure we're on a compatible version\n",[1254,6018,6019,6022,6024,6026,6029,6032,6035,6037,6039,6042,6044,6047],{"class":1256,"line":1495},[1254,6020,6021],{"class":1670},"        assert",[1254,6023,1914],{"class":1674},[1254,6025,1691],{"class":1430},[1254,6027,6028],{"class":3822},"VERSION",[1254,6030,6031],{"class":2198}," >=",[1254,6033,6034],{"class":1430}," (",[1254,6036,2728],{"class":1591},[1254,6038,1763],{"class":1430},[1254,6040,6041],{"class":1591}," 14",[1254,6043,1763],{"class":1430},[1254,6045,6046],{"class":1591}," 0",[1254,6048,1775],{"class":1430},[1035,6050,6052],{"id":6051},"_4-document-package-usage","4. Document Package Usage",[1244,6054,6056],{"className":1246,"code":6055,"language":1248,"meta":1249,"style":1249},"# docs/packages.md\n\"\"\"\n# Third-Party Packages\n\n## Django REST Framework\n- Version: 3.14.0\n- Purpose: API development\n- Configuration: settings/base.py\n- Documentation: https://www.django-rest-framework.org/\n\n## Celery\n- Version: 5.3.4\n- Purpose: Background task processing\n- Configuration: myproject/celery.py\n- Documentation: https://docs.celeryproject.org/\n\"\"\"\n",[1251,6057,6058,6063,6067,6072,6076,6081,6086,6091,6096,6101,6105,6110,6115,6120,6125,6130],{"__ignoreMap":1249},[1254,6059,6060],{"class":1256,"line":1257},[1254,6061,6062],{"class":1260},"# docs/packages.md\n",[1254,6064,6065],{"class":1256,"line":1264},[1254,6066,5102],{"class":5094},[1254,6068,6069],{"class":1256,"line":1270},[1254,6070,6071],{"class":5098},"# Third-Party Packages\n",[1254,6073,6074],{"class":1256,"line":1276},[1254,6075,1466],{"emptyLinePlaceholder":1465},[1254,6077,6078],{"class":1256,"line":1282},[1254,6079,6080],{"class":5098},"## Django REST Framework\n",[1254,6082,6083],{"class":1256,"line":1288},[1254,6084,6085],{"class":5098},"- Version: 3.14.0\n",[1254,6087,6088],{"class":1256,"line":1469},[1254,6089,6090],{"class":5098},"- Purpose: API development\n",[1254,6092,6093],{"class":1256,"line":1480},[1254,6094,6095],{"class":5098},"- Configuration: settings/base.py\n",[1254,6097,6098],{"class":1256,"line":1495},[1254,6099,6100],{"class":5098},"- Documentation: https://www.django-rest-framework.org/\n",[1254,6102,6103],{"class":1256,"line":1508},[1254,6104,1466],{"emptyLinePlaceholder":1465},[1254,6106,6107],{"class":1256,"line":1520},[1254,6108,6109],{"class":5098},"## Celery\n",[1254,6111,6112],{"class":1256,"line":1526},[1254,6113,6114],{"class":5098},"- Version: 5.3.4\n",[1254,6116,6117],{"class":1256,"line":1540},[1254,6118,6119],{"class":5098},"- Purpose: Background task processing\n",[1254,6121,6122],{"class":1256,"line":1552},[1254,6123,6124],{"class":5098},"- Configuration: myproject/celery.py\n",[1254,6126,6127],{"class":1256,"line":1557},[1254,6128,6129],{"class":5098},"- Documentation: https://docs.celeryproject.org/\n",[1254,6131,6132],{"class":1256,"line":1579},[1254,6133,5102],{"class":5094},[1035,6135,6137],{"id":6136},"_5-isolate-package-configuration","5. Isolate Package Configuration",[1244,6139,6141],{"className":1246,"code":6140,"language":1248,"meta":1249,"style":1249},"# config/rest_framework.py\nREST_FRAMEWORK = {\n    'DEFAULT_AUTHENTICATION_CLASSES': [...],\n    'DEFAULT_PERMISSION_CLASSES': [...],\n}\n\n# config/celery.py\nCELERY_BROKER_URL = 'redis://localhost:6379/0'\nCELERY_RESULT_BACKEND = 'redis://localhost:6379/0'\n\n# settings.py\nfrom .config.rest_framework import REST_FRAMEWORK\nfrom .config.celery import *\n",[1251,6142,6143,6148,6156,6172,6188,6192,6196,6201,6213,6225,6229,6233,6251],{"__ignoreMap":1249},[1254,6144,6145],{"class":1256,"line":1257},[1254,6146,6147],{"class":1260},"# config/rest_framework.py\n",[1254,6149,6150,6152,6154],{"class":1256,"line":1264},[1254,6151,1472],{"class":1426},[1254,6153,1431],{"class":1430},[1254,6155,1477],{"class":1430},[1254,6157,6158,6160,6162,6164,6166,6168,6170],{"class":1256,"line":1270},[1254,6159,1445],{"class":1444},[1254,6161,1485],{"class":1448},[1254,6163,1452],{"class":1444},[1254,6165,1490],{"class":1430},[1254,6167,1810],{"class":1430},[1254,6169,5320],{"class":1426},[1254,6171,2860],{"class":1430},[1254,6173,6174,6176,6178,6180,6182,6184,6186],{"class":1256,"line":1276},[1254,6175,1445],{"class":1444},[1254,6177,1531],{"class":1448},[1254,6179,1452],{"class":1444},[1254,6181,1490],{"class":1430},[1254,6183,1810],{"class":1430},[1254,6185,5320],{"class":1426},[1254,6187,2860],{"class":1430},[1254,6189,6190],{"class":1256,"line":1282},[1254,6191,1655],{"class":1430},[1254,6193,6194],{"class":1256,"line":1288},[1254,6195,1466],{"emptyLinePlaceholder":1465},[1254,6197,6198],{"class":1256,"line":1469},[1254,6199,6200],{"class":1260},"# config/celery.py\n",[1254,6202,6203,6205,6207,6209,6211],{"class":1256,"line":1480},[1254,6204,2301],{"class":1426},[1254,6206,1431],{"class":1430},[1254,6208,1569],{"class":1444},[1254,6210,2308],{"class":1448},[1254,6212,2240],{"class":1444},[1254,6214,6215,6217,6219,6221,6223],{"class":1256,"line":1495},[1254,6216,2315],{"class":1426},[1254,6218,1431],{"class":1430},[1254,6220,1569],{"class":1444},[1254,6222,2308],{"class":1448},[1254,6224,2240],{"class":1444},[1254,6226,6227],{"class":1256,"line":1508},[1254,6228,1466],{"emptyLinePlaceholder":1465},[1254,6230,6231],{"class":1256,"line":1520},[1254,6232,1421],{"class":1260},[1254,6234,6235,6237,6239,6242,6244,6246,6248],{"class":1256,"line":1526},[1254,6236,1671],{"class":1670},[1254,6238,4154],{"class":1430},[1254,6240,6241],{"class":1674},"config",[1254,6243,1691],{"class":1430},[1254,6245,1952],{"class":1674},[1254,6247,1678],{"class":1670},[1254,6249,6250],{"class":1426}," REST_FRAMEWORK\n",[1254,6252,6253,6255,6257,6259,6261,6264,6266],{"class":1256,"line":1540},[1254,6254,1671],{"class":1670},[1254,6256,4154],{"class":1430},[1254,6258,6241],{"class":1674},[1254,6260,1691],{"class":1430},[1254,6262,6263],{"class":1674},"celery ",[1254,6265,1678],{"class":1670},[1254,6267,4162],{"class":2198},[1030,6269,6271],{"id":6270},"resources","Resources",[1035,6273,6275],{"id":6274},"package-discovery","Package Discovery",[1049,6277,6278,6288,6296],{},[1052,6279,6280,6287],{},[6281,6282,6286],"a",{"href":6283,"rel":6284},"https://djangopackages.org/",[6285],"nofollow","Django Packages"," - Comprehensive package directory",[1052,6289,6290,6295],{},[6281,6291,6294],{"href":6292,"rel":6293},"https://github.com/wsvincent/awesome-django",[6285],"Awesome Django"," - Curated list",[1052,6297,6298],{},[6281,6299,6302],{"href":6300,"rel":6301},"https://pypi.org/search/?c=Framework+%3A%3A+Django",[6285],"PyPI Django Trove Classifiers",[1035,6304,6306],{"id":6305},"community","Community",[1049,6308,6309,6312,6315,6318],{},[1052,6310,6311],{},"Django Forum",[1052,6313,6314],{},"Django Discord",[1052,6316,6317],{},"r/django subreddit",[1052,6319,6320],{},"Django Developers mailing list",[1035,6322,6324],{"id":6323},"learning","Learning",[1049,6326,6327,6330,6333,6336],{},[1052,6328,6329],{},"Two Scoops of Django",[1052,6331,6332],{},"Django for Professionals",[1052,6334,6335],{},"Real Python Django tutorials",[1052,6337,6338],{},"TestDriven.io courses",[1030,6340,6342],{"id":6341},"next-steps","Next Steps",[1049,6344,6345,6351,6357,6363],{},[1052,6346,6347,6348,6350],{},"Review ",[6281,6349,869],{"href":870}," to understand Django's core",[1052,6352,6353,6354,6356],{},"Explore ",[6281,6355,775],{"href":776}," for package performance impact",[1052,6358,6359,6360,6362],{},"Check ",[6281,6361,541],{"href":542}," for package security considerations",[1052,6364,6365,6366,6368],{},"See ",[6281,6367,737],{"href":738}," for production package configuration",[6370,6371,6372],"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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .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 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 .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 .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 .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sz9Cv, html code.shiki .sz9Cv{--shiki-light:#91B859;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}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}",{"title":1249,"searchDepth":1257,"depth":1264,"links":6374},[6375,6378,6382,6389,6395,6401,6405,6412,6417],{"id":1032,"depth":1264,"text":1033,"children":6376},[6377],{"id":1037,"depth":1270,"text":1038},{"id":1229,"depth":1264,"text":1230,"children":6379},[6380,6381],{"id":1233,"depth":1270,"text":1234},{"id":1376,"depth":1270,"text":1377},{"id":1403,"depth":1264,"text":1404,"children":6383},[6384,6385,6386,6387,6388],{"id":1407,"depth":1270,"text":1408},{"id":2283,"depth":1270,"text":2284},{"id":3035,"depth":1270,"text":3036},{"id":1149,"depth":1270,"text":1149},{"id":1218,"depth":1270,"text":1218},{"id":3884,"depth":1264,"text":3885,"children":6390},[6391,6392,6393,6394],{"id":3888,"depth":1270,"text":3889},{"id":3992,"depth":1270,"text":3993},{"id":4298,"depth":1270,"text":4299},{"id":4498,"depth":1270,"text":4499},{"id":4584,"depth":1264,"text":4585,"children":6396},[6397,6398,6399,6400],{"id":4588,"depth":1270,"text":533},{"id":4712,"depth":1270,"text":4713},{"id":4852,"depth":1270,"text":4853},{"id":5069,"depth":1270,"text":5070},{"id":5368,"depth":1264,"text":5369,"children":6402},[6403,6404],{"id":5372,"depth":1270,"text":5373},{"id":5746,"depth":1270,"text":5747},{"id":5758,"depth":1264,"text":921,"children":6406},[6407,6408,6409,6410,6411],{"id":5761,"depth":1270,"text":5762},{"id":5879,"depth":1270,"text":5880},{"id":5938,"depth":1270,"text":5939},{"id":6051,"depth":1270,"text":6052},{"id":6136,"depth":1270,"text":6137},{"id":6270,"depth":1264,"text":6271,"children":6413},[6414,6415,6416],{"id":6274,"depth":1270,"text":6275},{"id":6305,"depth":1270,"text":6306},{"id":6323,"depth":1270,"text":6324},{"id":6341,"depth":1264,"text":6342},"Explore the rich Django ecosystem, popular third-party packages, and best practices for selecting and integrating external tools into your Django projects.","md",null,{},{"title":863,"description":6418},"w5AjqiaZY7vSBpe0XxcfwI53zdMk1Mnm8NA7ux9davU",[6425,6427],{"title":857,"path":858,"stem":859,"description":6426,"children":-1},"This comprehensive guide addresses the most common questions, issues, and problems Django developers encounter. From setup and configuration to deployment and performance, find solutions to typical Django challenges.",{"title":869,"path":870,"stem":871,"description":6428,"children":-1},"Understand Django's internal architecture, learn how to contribute to the Django project, and become part of the Django community.",1772474961405]