[{"data":1,"prerenderedAt":7224},["ShallowReactive",2],{"navigation":3,"/working-with-files/using-cloud-storage-providers":1016,"/working-with-files/using-cloud-storage-providers-surround":7219},[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":481,"body":1018,"description":1028,"extension":7214,"links":7215,"meta":7216,"navigation":1098,"path":482,"seo":7217,"stem":483,"__hash__":7218},"docs/11.working-with-files/05.using-cloud-storage-providers.md",{"type":1019,"value":1020,"toc":7173},"minimark",[1021,1025,1029,1034,1039,1065,1069,1679,1683,2122,2126,2377,2381,2384,2398,2401,2703,2707,3150,3154,3157,3171,3174,3409,3413,3587,3591,3595,4098,4102,4708,4712,4716,4863,4867,5237,5241,5907,5911,5915,6282,6286,6569,6573,6577,7086,7089,7093,7109,7112,7126,7130,7144,7148,7162,7166,7169],[1022,1023,481],"h1",{"id":1024},"using-cloud-storage-providers",[1026,1027,1028],"p",{},"Cloud storage providers offer scalable, reliable, and cost-effective solutions for handling files in production Django applications. This chapter covers integration with major cloud storage services and best practices for cloud-based file management.",[1030,1031,1033],"h2",{"id":1032},"aws-s3-integration","AWS S3 Integration",[1035,1036,1038],"h3",{"id":1037},"installation-and-setup","Installation and Setup",[1040,1041,1046],"pre",{"className":1042,"code":1043,"language":1044,"meta":1045,"style":1045},"language-bash shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","pip install django-storages[boto3]\n","bash","",[1047,1048,1049],"code",{"__ignoreMap":1045},[1050,1051,1054,1058,1062],"span",{"class":1052,"line":1053},"line",1,[1050,1055,1057],{"class":1056},"sYn-s","pip",[1050,1059,1061],{"class":1060},"sTbE_"," install",[1050,1063,1064],{"class":1060}," django-storages[boto3]\n",[1035,1066,1068],{"id":1067},"configuration","Configuration",[1040,1070,1074],{"className":1071,"code":1072,"language":1073,"meta":1045,"style":1045},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# settings.py\nimport os\n\n# AWS S3 Configuration\nAWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')\nAWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')\nAWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')\nAWS_S3_REGION_NAME = os.environ.get('AWS_S3_REGION_NAME', 'us-east-1')\n\n# S3 Storage Settings\nAWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'\nAWS_S3_OBJECT_PARAMETERS = {\n    'CacheControl': 'max-age=86400',\n}\nAWS_DEFAULT_ACL = 'public-read'\nAWS_S3_FILE_OVERWRITE = False\nAWS_QUERYSTRING_AUTH = False\n\n# Storage backends\nSTORAGES = {\n    \"default\": {\n        \"BACKEND\": \"storages.backends.s3boto3.S3Boto3Storage\",\n        \"OPTIONS\": {\n            \"bucket_name\": AWS_STORAGE_BUCKET_NAME,\n            \"region_name\": AWS_S3_REGION_NAME,\n            \"access_key\": AWS_ACCESS_KEY_ID,\n            \"secret_key\": AWS_SECRET_ACCESS_KEY,\n            \"custom_domain\": AWS_S3_CUSTOM_DOMAIN,\n            \"object_parameters\": AWS_S3_OBJECT_PARAMETERS,\n            \"default_acl\": AWS_DEFAULT_ACL,\n            \"querystring_auth\": AWS_QUERYSTRING_AUTH,\n        },\n    },\n    \"staticfiles\": {\n        \"BACKEND\": \"storages.backends.s3boto3.S3StaticStorage\",\n        \"OPTIONS\": {\n            \"bucket_name\": AWS_STORAGE_BUCKET_NAME,\n            \"location\": \"static\",\n        },\n    },\n}\n","python",[1047,1075,1076,1082,1093,1100,1106,1147,1175,1203,1242,1247,1253,1279,1290,1314,1320,1336,1348,1358,1363,1369,1379,1395,1418,1432,1450,1467,1484,1501,1518,1535,1552,1569,1575,1581,1595,1615,1628,1643,1664,1669,1674],{"__ignoreMap":1045},[1050,1077,1078],{"class":1052,"line":1053},[1050,1079,1081],{"class":1080},"s9Tkl","# settings.py\n",[1050,1083,1085,1089],{"class":1052,"line":1084},2,[1050,1086,1088],{"class":1087},"siDh9","import",[1050,1090,1092],{"class":1091},"sftqT"," os\n",[1050,1094,1096],{"class":1052,"line":1095},3,[1050,1097,1099],{"emptyLinePlaceholder":1098},true,"\n",[1050,1101,1103],{"class":1052,"line":1102},4,[1050,1104,1105],{"class":1080},"# AWS S3 Configuration\n",[1050,1107,1109,1113,1117,1120,1123,1127,1129,1133,1136,1140,1142,1144],{"class":1052,"line":1108},5,[1050,1110,1112],{"class":1111},"se3Ec","AWS_ACCESS_KEY_ID",[1050,1114,1116],{"class":1115},"soVBu"," =",[1050,1118,1119],{"class":1091}," os",[1050,1121,1122],{"class":1115},".",[1050,1124,1126],{"class":1125},"sBPpx","environ",[1050,1128,1122],{"class":1115},[1050,1130,1132],{"class":1131},"siWMO","get",[1050,1134,1135],{"class":1115},"(",[1050,1137,1139],{"class":1138},"sbYkP","'",[1050,1141,1112],{"class":1060},[1050,1143,1139],{"class":1138},[1050,1145,1146],{"class":1115},")\n",[1050,1148,1150,1153,1155,1157,1159,1161,1163,1165,1167,1169,1171,1173],{"class":1052,"line":1149},6,[1050,1151,1152],{"class":1111},"AWS_SECRET_ACCESS_KEY",[1050,1154,1116],{"class":1115},[1050,1156,1119],{"class":1091},[1050,1158,1122],{"class":1115},[1050,1160,1126],{"class":1125},[1050,1162,1122],{"class":1115},[1050,1164,1132],{"class":1131},[1050,1166,1135],{"class":1115},[1050,1168,1139],{"class":1138},[1050,1170,1152],{"class":1060},[1050,1172,1139],{"class":1138},[1050,1174,1146],{"class":1115},[1050,1176,1178,1181,1183,1185,1187,1189,1191,1193,1195,1197,1199,1201],{"class":1052,"line":1177},7,[1050,1179,1180],{"class":1111},"AWS_STORAGE_BUCKET_NAME",[1050,1182,1116],{"class":1115},[1050,1184,1119],{"class":1091},[1050,1186,1122],{"class":1115},[1050,1188,1126],{"class":1125},[1050,1190,1122],{"class":1115},[1050,1192,1132],{"class":1131},[1050,1194,1135],{"class":1115},[1050,1196,1139],{"class":1138},[1050,1198,1180],{"class":1060},[1050,1200,1139],{"class":1138},[1050,1202,1146],{"class":1115},[1050,1204,1206,1209,1211,1213,1215,1217,1219,1221,1223,1225,1227,1229,1232,1235,1238,1240],{"class":1052,"line":1205},8,[1050,1207,1208],{"class":1111},"AWS_S3_REGION_NAME",[1050,1210,1116],{"class":1115},[1050,1212,1119],{"class":1091},[1050,1214,1122],{"class":1115},[1050,1216,1126],{"class":1125},[1050,1218,1122],{"class":1115},[1050,1220,1132],{"class":1131},[1050,1222,1135],{"class":1115},[1050,1224,1139],{"class":1138},[1050,1226,1208],{"class":1060},[1050,1228,1139],{"class":1138},[1050,1230,1231],{"class":1115},",",[1050,1233,1234],{"class":1138}," '",[1050,1236,1237],{"class":1060},"us-east-1",[1050,1239,1139],{"class":1138},[1050,1241,1146],{"class":1115},[1050,1243,1245],{"class":1052,"line":1244},9,[1050,1246,1099],{"emptyLinePlaceholder":1098},[1050,1248,1250],{"class":1052,"line":1249},10,[1050,1251,1252],{"class":1080},"# S3 Storage Settings\n",[1050,1254,1256,1259,1261,1265,1267,1271,1273,1276],{"class":1052,"line":1255},11,[1050,1257,1258],{"class":1111},"AWS_S3_CUSTOM_DOMAIN",[1050,1260,1116],{"class":1115},[1050,1262,1264],{"class":1263},"s5Kfy"," f",[1050,1266,1139],{"class":1060},[1050,1268,1270],{"class":1269},"s3h35","{",[1050,1272,1180],{"class":1111},[1050,1274,1275],{"class":1269},"}",[1050,1277,1278],{"class":1060},".s3.amazonaws.com'\n",[1050,1280,1282,1285,1287],{"class":1052,"line":1281},12,[1050,1283,1284],{"class":1111},"AWS_S3_OBJECT_PARAMETERS",[1050,1286,1116],{"class":1115},[1050,1288,1289],{"class":1115}," {\n",[1050,1291,1293,1296,1299,1301,1304,1306,1309,1311],{"class":1052,"line":1292},13,[1050,1294,1295],{"class":1138},"    '",[1050,1297,1298],{"class":1060},"CacheControl",[1050,1300,1139],{"class":1138},[1050,1302,1303],{"class":1115},":",[1050,1305,1234],{"class":1138},[1050,1307,1308],{"class":1060},"max-age=86400",[1050,1310,1139],{"class":1138},[1050,1312,1313],{"class":1115},",\n",[1050,1315,1317],{"class":1052,"line":1316},14,[1050,1318,1319],{"class":1115},"}\n",[1050,1321,1323,1326,1328,1330,1333],{"class":1052,"line":1322},15,[1050,1324,1325],{"class":1111},"AWS_DEFAULT_ACL",[1050,1327,1116],{"class":1115},[1050,1329,1234],{"class":1138},[1050,1331,1332],{"class":1060},"public-read",[1050,1334,1335],{"class":1138},"'\n",[1050,1337,1339,1342,1344],{"class":1052,"line":1338},16,[1050,1340,1341],{"class":1111},"AWS_S3_FILE_OVERWRITE",[1050,1343,1116],{"class":1115},[1050,1345,1347],{"class":1346},"s8XtY"," False\n",[1050,1349,1351,1354,1356],{"class":1052,"line":1350},17,[1050,1352,1353],{"class":1111},"AWS_QUERYSTRING_AUTH",[1050,1355,1116],{"class":1115},[1050,1357,1347],{"class":1346},[1050,1359,1361],{"class":1052,"line":1360},18,[1050,1362,1099],{"emptyLinePlaceholder":1098},[1050,1364,1366],{"class":1052,"line":1365},19,[1050,1367,1368],{"class":1080},"# Storage backends\n",[1050,1370,1372,1375,1377],{"class":1052,"line":1371},20,[1050,1373,1374],{"class":1111},"STORAGES",[1050,1376,1116],{"class":1115},[1050,1378,1289],{"class":1115},[1050,1380,1382,1385,1388,1391,1393],{"class":1052,"line":1381},21,[1050,1383,1384],{"class":1138},"    \"",[1050,1386,1387],{"class":1060},"default",[1050,1389,1390],{"class":1138},"\"",[1050,1392,1303],{"class":1115},[1050,1394,1289],{"class":1115},[1050,1396,1398,1401,1404,1406,1408,1411,1414,1416],{"class":1052,"line":1397},22,[1050,1399,1400],{"class":1138},"        \"",[1050,1402,1403],{"class":1060},"BACKEND",[1050,1405,1390],{"class":1138},[1050,1407,1303],{"class":1115},[1050,1409,1410],{"class":1138}," \"",[1050,1412,1413],{"class":1060},"storages.backends.s3boto3.S3Boto3Storage",[1050,1415,1390],{"class":1138},[1050,1417,1313],{"class":1115},[1050,1419,1421,1423,1426,1428,1430],{"class":1052,"line":1420},23,[1050,1422,1400],{"class":1138},[1050,1424,1425],{"class":1060},"OPTIONS",[1050,1427,1390],{"class":1138},[1050,1429,1303],{"class":1115},[1050,1431,1289],{"class":1115},[1050,1433,1435,1438,1441,1443,1445,1448],{"class":1052,"line":1434},24,[1050,1436,1437],{"class":1138},"            \"",[1050,1439,1440],{"class":1060},"bucket_name",[1050,1442,1390],{"class":1138},[1050,1444,1303],{"class":1115},[1050,1446,1447],{"class":1111}," AWS_STORAGE_BUCKET_NAME",[1050,1449,1313],{"class":1115},[1050,1451,1453,1455,1458,1460,1462,1465],{"class":1052,"line":1452},25,[1050,1454,1437],{"class":1138},[1050,1456,1457],{"class":1060},"region_name",[1050,1459,1390],{"class":1138},[1050,1461,1303],{"class":1115},[1050,1463,1464],{"class":1111}," AWS_S3_REGION_NAME",[1050,1466,1313],{"class":1115},[1050,1468,1470,1472,1475,1477,1479,1482],{"class":1052,"line":1469},26,[1050,1471,1437],{"class":1138},[1050,1473,1474],{"class":1060},"access_key",[1050,1476,1390],{"class":1138},[1050,1478,1303],{"class":1115},[1050,1480,1481],{"class":1111}," AWS_ACCESS_KEY_ID",[1050,1483,1313],{"class":1115},[1050,1485,1487,1489,1492,1494,1496,1499],{"class":1052,"line":1486},27,[1050,1488,1437],{"class":1138},[1050,1490,1491],{"class":1060},"secret_key",[1050,1493,1390],{"class":1138},[1050,1495,1303],{"class":1115},[1050,1497,1498],{"class":1111}," AWS_SECRET_ACCESS_KEY",[1050,1500,1313],{"class":1115},[1050,1502,1504,1506,1509,1511,1513,1516],{"class":1052,"line":1503},28,[1050,1505,1437],{"class":1138},[1050,1507,1508],{"class":1060},"custom_domain",[1050,1510,1390],{"class":1138},[1050,1512,1303],{"class":1115},[1050,1514,1515],{"class":1111}," AWS_S3_CUSTOM_DOMAIN",[1050,1517,1313],{"class":1115},[1050,1519,1521,1523,1526,1528,1530,1533],{"class":1052,"line":1520},29,[1050,1522,1437],{"class":1138},[1050,1524,1525],{"class":1060},"object_parameters",[1050,1527,1390],{"class":1138},[1050,1529,1303],{"class":1115},[1050,1531,1532],{"class":1111}," AWS_S3_OBJECT_PARAMETERS",[1050,1534,1313],{"class":1115},[1050,1536,1538,1540,1543,1545,1547,1550],{"class":1052,"line":1537},30,[1050,1539,1437],{"class":1138},[1050,1541,1542],{"class":1060},"default_acl",[1050,1544,1390],{"class":1138},[1050,1546,1303],{"class":1115},[1050,1548,1549],{"class":1111}," AWS_DEFAULT_ACL",[1050,1551,1313],{"class":1115},[1050,1553,1555,1557,1560,1562,1564,1567],{"class":1052,"line":1554},31,[1050,1556,1437],{"class":1138},[1050,1558,1559],{"class":1060},"querystring_auth",[1050,1561,1390],{"class":1138},[1050,1563,1303],{"class":1115},[1050,1565,1566],{"class":1111}," AWS_QUERYSTRING_AUTH",[1050,1568,1313],{"class":1115},[1050,1570,1572],{"class":1052,"line":1571},32,[1050,1573,1574],{"class":1115},"        },\n",[1050,1576,1578],{"class":1052,"line":1577},33,[1050,1579,1580],{"class":1115},"    },\n",[1050,1582,1584,1586,1589,1591,1593],{"class":1052,"line":1583},34,[1050,1585,1384],{"class":1138},[1050,1587,1588],{"class":1060},"staticfiles",[1050,1590,1390],{"class":1138},[1050,1592,1303],{"class":1115},[1050,1594,1289],{"class":1115},[1050,1596,1598,1600,1602,1604,1606,1608,1611,1613],{"class":1052,"line":1597},35,[1050,1599,1400],{"class":1138},[1050,1601,1403],{"class":1060},[1050,1603,1390],{"class":1138},[1050,1605,1303],{"class":1115},[1050,1607,1410],{"class":1138},[1050,1609,1610],{"class":1060},"storages.backends.s3boto3.S3StaticStorage",[1050,1612,1390],{"class":1138},[1050,1614,1313],{"class":1115},[1050,1616,1618,1620,1622,1624,1626],{"class":1052,"line":1617},36,[1050,1619,1400],{"class":1138},[1050,1621,1425],{"class":1060},[1050,1623,1390],{"class":1138},[1050,1625,1303],{"class":1115},[1050,1627,1289],{"class":1115},[1050,1629,1631,1633,1635,1637,1639,1641],{"class":1052,"line":1630},37,[1050,1632,1437],{"class":1138},[1050,1634,1440],{"class":1060},[1050,1636,1390],{"class":1138},[1050,1638,1303],{"class":1115},[1050,1640,1447],{"class":1111},[1050,1642,1313],{"class":1115},[1050,1644,1646,1648,1651,1653,1655,1657,1660,1662],{"class":1052,"line":1645},38,[1050,1647,1437],{"class":1138},[1050,1649,1650],{"class":1060},"location",[1050,1652,1390],{"class":1138},[1050,1654,1303],{"class":1115},[1050,1656,1410],{"class":1138},[1050,1658,1659],{"class":1060},"static",[1050,1661,1390],{"class":1138},[1050,1663,1313],{"class":1115},[1050,1665,1667],{"class":1052,"line":1666},39,[1050,1668,1574],{"class":1115},[1050,1670,1672],{"class":1052,"line":1671},40,[1050,1673,1580],{"class":1115},[1050,1675,1677],{"class":1052,"line":1676},41,[1050,1678,1319],{"class":1115},[1035,1680,1682],{"id":1681},"custom-s3-storage-classes","Custom S3 Storage Classes",[1040,1684,1686],{"className":1071,"code":1685,"language":1073,"meta":1045,"style":1045},"# storage.py\nfrom storages.backends.s3boto3 import S3Boto3Storage\n\nclass MediaStorage(S3Boto3Storage):\n    \"\"\"Custom S3 storage for media files\"\"\"\n    bucket_name = 'my-media-bucket'\n    location = 'media'\n    default_acl = 'public-read'\n    file_overwrite = False\n\nclass PrivateMediaStorage(S3Boto3Storage):\n    \"\"\"Private S3 storage for sensitive files\"\"\"\n    bucket_name = 'my-private-bucket'\n    location = 'private'\n    default_acl = 'private'\n    file_overwrite = False\n    custom_domain = False\n    querystring_auth = True\n    querystring_expire = 3600  # 1 hour\n\nclass StaticStorage(S3Boto3Storage):\n    \"\"\"S3 storage for static files\"\"\"\n    bucket_name = 'my-static-bucket'\n    location = 'static'\n    default_acl = 'public-read'\n    \n# Using in models\nclass Document(models.Model):\n    title = models.CharField(max_length=200)\n    public_file = models.FileField(\n        upload_to='documents/',\n        storage=MediaStorage()\n    )\n    private_file = models.FileField(\n        upload_to='private/',\n        storage=PrivateMediaStorage()\n    )\n",[1047,1687,1688,1693,1716,1720,1737,1750,1765,1779,1792,1801,1805,1818,1827,1840,1853,1865,1873,1882,1892,1906,1910,1923,1932,1945,1957,1969,1974,1979,1998,2026,2043,2059,2072,2077,2092,2107,2118],{"__ignoreMap":1045},[1050,1689,1690],{"class":1052,"line":1053},[1050,1691,1692],{"class":1080},"# storage.py\n",[1050,1694,1695,1698,1701,1703,1706,1708,1711,1713],{"class":1052,"line":1084},[1050,1696,1697],{"class":1087},"from",[1050,1699,1700],{"class":1091}," storages",[1050,1702,1122],{"class":1115},[1050,1704,1705],{"class":1091},"backends",[1050,1707,1122],{"class":1115},[1050,1709,1710],{"class":1091},"s3boto3 ",[1050,1712,1088],{"class":1087},[1050,1714,1715],{"class":1091}," S3Boto3Storage\n",[1050,1717,1718],{"class":1052,"line":1095},[1050,1719,1099],{"emptyLinePlaceholder":1098},[1050,1721,1722,1725,1729,1731,1734],{"class":1052,"line":1102},[1050,1723,1724],{"class":1263},"class",[1050,1726,1728],{"class":1727},"sD-vU"," MediaStorage",[1050,1730,1135],{"class":1115},[1050,1732,1733],{"class":1056},"S3Boto3Storage",[1050,1735,1736],{"class":1115},"):\n",[1050,1738,1739,1743,1747],{"class":1052,"line":1108},[1050,1740,1742],{"class":1741},"sm7ve","    \"\"\"",[1050,1744,1746],{"class":1745},"sVyVU","Custom S3 storage for media files",[1050,1748,1749],{"class":1741},"\"\"\"\n",[1050,1751,1752,1755,1758,1760,1763],{"class":1052,"line":1149},[1050,1753,1754],{"class":1091},"    bucket_name ",[1050,1756,1757],{"class":1115},"=",[1050,1759,1234],{"class":1138},[1050,1761,1762],{"class":1060},"my-media-bucket",[1050,1764,1335],{"class":1138},[1050,1766,1767,1770,1772,1774,1777],{"class":1052,"line":1177},[1050,1768,1769],{"class":1091},"    location ",[1050,1771,1757],{"class":1115},[1050,1773,1234],{"class":1138},[1050,1775,1776],{"class":1060},"media",[1050,1778,1335],{"class":1138},[1050,1780,1781,1784,1786,1788,1790],{"class":1052,"line":1205},[1050,1782,1783],{"class":1091},"    default_acl ",[1050,1785,1757],{"class":1115},[1050,1787,1234],{"class":1138},[1050,1789,1332],{"class":1060},[1050,1791,1335],{"class":1138},[1050,1793,1794,1797,1799],{"class":1052,"line":1244},[1050,1795,1796],{"class":1091},"    file_overwrite ",[1050,1798,1757],{"class":1115},[1050,1800,1347],{"class":1346},[1050,1802,1803],{"class":1052,"line":1249},[1050,1804,1099],{"emptyLinePlaceholder":1098},[1050,1806,1807,1809,1812,1814,1816],{"class":1052,"line":1255},[1050,1808,1724],{"class":1263},[1050,1810,1811],{"class":1727}," PrivateMediaStorage",[1050,1813,1135],{"class":1115},[1050,1815,1733],{"class":1056},[1050,1817,1736],{"class":1115},[1050,1819,1820,1822,1825],{"class":1052,"line":1281},[1050,1821,1742],{"class":1741},[1050,1823,1824],{"class":1745},"Private S3 storage for sensitive files",[1050,1826,1749],{"class":1741},[1050,1828,1829,1831,1833,1835,1838],{"class":1052,"line":1292},[1050,1830,1754],{"class":1091},[1050,1832,1757],{"class":1115},[1050,1834,1234],{"class":1138},[1050,1836,1837],{"class":1060},"my-private-bucket",[1050,1839,1335],{"class":1138},[1050,1841,1842,1844,1846,1848,1851],{"class":1052,"line":1316},[1050,1843,1769],{"class":1091},[1050,1845,1757],{"class":1115},[1050,1847,1234],{"class":1138},[1050,1849,1850],{"class":1060},"private",[1050,1852,1335],{"class":1138},[1050,1854,1855,1857,1859,1861,1863],{"class":1052,"line":1322},[1050,1856,1783],{"class":1091},[1050,1858,1757],{"class":1115},[1050,1860,1234],{"class":1138},[1050,1862,1850],{"class":1060},[1050,1864,1335],{"class":1138},[1050,1866,1867,1869,1871],{"class":1052,"line":1338},[1050,1868,1796],{"class":1091},[1050,1870,1757],{"class":1115},[1050,1872,1347],{"class":1346},[1050,1874,1875,1878,1880],{"class":1052,"line":1350},[1050,1876,1877],{"class":1091},"    custom_domain ",[1050,1879,1757],{"class":1115},[1050,1881,1347],{"class":1346},[1050,1883,1884,1887,1889],{"class":1052,"line":1360},[1050,1885,1886],{"class":1091},"    querystring_auth ",[1050,1888,1757],{"class":1115},[1050,1890,1891],{"class":1346}," True\n",[1050,1893,1894,1897,1899,1903],{"class":1052,"line":1365},[1050,1895,1896],{"class":1091},"    querystring_expire ",[1050,1898,1757],{"class":1115},[1050,1900,1902],{"class":1901},"s7CZa"," 3600",[1050,1904,1905],{"class":1080},"  # 1 hour\n",[1050,1907,1908],{"class":1052,"line":1371},[1050,1909,1099],{"emptyLinePlaceholder":1098},[1050,1911,1912,1914,1917,1919,1921],{"class":1052,"line":1381},[1050,1913,1724],{"class":1263},[1050,1915,1916],{"class":1727}," StaticStorage",[1050,1918,1135],{"class":1115},[1050,1920,1733],{"class":1056},[1050,1922,1736],{"class":1115},[1050,1924,1925,1927,1930],{"class":1052,"line":1397},[1050,1926,1742],{"class":1741},[1050,1928,1929],{"class":1745},"S3 storage for static files",[1050,1931,1749],{"class":1741},[1050,1933,1934,1936,1938,1940,1943],{"class":1052,"line":1420},[1050,1935,1754],{"class":1091},[1050,1937,1757],{"class":1115},[1050,1939,1234],{"class":1138},[1050,1941,1942],{"class":1060},"my-static-bucket",[1050,1944,1335],{"class":1138},[1050,1946,1947,1949,1951,1953,1955],{"class":1052,"line":1434},[1050,1948,1769],{"class":1091},[1050,1950,1757],{"class":1115},[1050,1952,1234],{"class":1138},[1050,1954,1659],{"class":1060},[1050,1956,1335],{"class":1138},[1050,1958,1959,1961,1963,1965,1967],{"class":1052,"line":1452},[1050,1960,1783],{"class":1091},[1050,1962,1757],{"class":1115},[1050,1964,1234],{"class":1138},[1050,1966,1332],{"class":1060},[1050,1968,1335],{"class":1138},[1050,1970,1971],{"class":1052,"line":1469},[1050,1972,1973],{"class":1091},"    \n",[1050,1975,1976],{"class":1052,"line":1486},[1050,1977,1978],{"class":1080},"# Using in models\n",[1050,1980,1981,1983,1986,1988,1991,1993,1996],{"class":1052,"line":1503},[1050,1982,1724],{"class":1263},[1050,1984,1985],{"class":1727}," Document",[1050,1987,1135],{"class":1115},[1050,1989,1990],{"class":1056},"models",[1050,1992,1122],{"class":1115},[1050,1994,1995],{"class":1056},"Model",[1050,1997,1736],{"class":1115},[1050,1999,2000,2003,2005,2008,2010,2013,2015,2019,2021,2024],{"class":1052,"line":1520},[1050,2001,2002],{"class":1091},"    title ",[1050,2004,1757],{"class":1115},[1050,2006,2007],{"class":1091}," models",[1050,2009,1122],{"class":1115},[1050,2011,2012],{"class":1131},"CharField",[1050,2014,1135],{"class":1115},[1050,2016,2018],{"class":2017},"sqOPj","max_length",[1050,2020,1757],{"class":1115},[1050,2022,2023],{"class":1901},"200",[1050,2025,1146],{"class":1115},[1050,2027,2028,2031,2033,2035,2037,2040],{"class":1052,"line":1537},[1050,2029,2030],{"class":1091},"    public_file ",[1050,2032,1757],{"class":1115},[1050,2034,2007],{"class":1091},[1050,2036,1122],{"class":1115},[1050,2038,2039],{"class":1131},"FileField",[1050,2041,2042],{"class":1115},"(\n",[1050,2044,2045,2048,2050,2052,2055,2057],{"class":1052,"line":1554},[1050,2046,2047],{"class":2017},"        upload_to",[1050,2049,1757],{"class":1115},[1050,2051,1139],{"class":1138},[1050,2053,2054],{"class":1060},"documents/",[1050,2056,1139],{"class":1138},[1050,2058,1313],{"class":1115},[1050,2060,2061,2064,2066,2069],{"class":1052,"line":1571},[1050,2062,2063],{"class":2017},"        storage",[1050,2065,1757],{"class":1115},[1050,2067,2068],{"class":1131},"MediaStorage",[1050,2070,2071],{"class":1115},"()\n",[1050,2073,2074],{"class":1052,"line":1577},[1050,2075,2076],{"class":1115},"    )\n",[1050,2078,2079,2082,2084,2086,2088,2090],{"class":1052,"line":1583},[1050,2080,2081],{"class":1091},"    private_file ",[1050,2083,1757],{"class":1115},[1050,2085,2007],{"class":1091},[1050,2087,1122],{"class":1115},[1050,2089,2039],{"class":1131},[1050,2091,2042],{"class":1115},[1050,2093,2094,2096,2098,2100,2103,2105],{"class":1052,"line":1597},[1050,2095,2047],{"class":2017},[1050,2097,1757],{"class":1115},[1050,2099,1139],{"class":1138},[1050,2101,2102],{"class":1060},"private/",[1050,2104,1139],{"class":1138},[1050,2106,1313],{"class":1115},[1050,2108,2109,2111,2113,2116],{"class":1052,"line":1617},[1050,2110,2063],{"class":2017},[1050,2112,1757],{"class":1115},[1050,2114,2115],{"class":1131},"PrivateMediaStorage",[1050,2117,2071],{"class":1115},[1050,2119,2120],{"class":1052,"line":1630},[1050,2121,2076],{"class":1115},[1035,2123,2125],{"id":2124},"s3-advanced-configuration","S3 Advanced Configuration",[1040,2127,2129],{"className":1071,"code":2128,"language":1073,"meta":1045,"style":1045},"# settings.py\n\n# CloudFront CDN\nAWS_S3_CUSTOM_DOMAIN = 'cdn.example.com'\nAWS_S3_URL_PROTOCOL = 'https:'\n\n# Security settings\nAWS_S3_SECURE_URLS = True\nAWS_S3_USE_SSL = True\n\n# Performance settings\nAWS_S3_MAX_MEMORY_SIZE = 100 * 1024 * 1024  # 100MB\nAWS_S3_TRANSFER_CONFIG = {\n    'multipart_threshold': 1024 * 25,  # 25MB\n    'max_concurrency': 10,\n    'multipart_chunksize': 1024 * 25,\n    'use_threads': True\n}\n\n# Lifecycle management\nAWS_S3_OBJECT_PARAMETERS = {\n    'CacheControl': 'max-age=86400',\n    'StorageClass': 'STANDARD_IA',  # Infrequent Access\n}\n",[1047,2130,2131,2135,2139,2144,2157,2171,2175,2180,2189,2198,2202,2207,2231,2240,2263,2279,2298,2311,2315,2319,2324,2332,2350,2373],{"__ignoreMap":1045},[1050,2132,2133],{"class":1052,"line":1053},[1050,2134,1081],{"class":1080},[1050,2136,2137],{"class":1052,"line":1084},[1050,2138,1099],{"emptyLinePlaceholder":1098},[1050,2140,2141],{"class":1052,"line":1095},[1050,2142,2143],{"class":1080},"# CloudFront CDN\n",[1050,2145,2146,2148,2150,2152,2155],{"class":1052,"line":1102},[1050,2147,1258],{"class":1111},[1050,2149,1116],{"class":1115},[1050,2151,1234],{"class":1138},[1050,2153,2154],{"class":1060},"cdn.example.com",[1050,2156,1335],{"class":1138},[1050,2158,2159,2162,2164,2166,2169],{"class":1052,"line":1108},[1050,2160,2161],{"class":1111},"AWS_S3_URL_PROTOCOL",[1050,2163,1116],{"class":1115},[1050,2165,1234],{"class":1138},[1050,2167,2168],{"class":1060},"https:",[1050,2170,1335],{"class":1138},[1050,2172,2173],{"class":1052,"line":1149},[1050,2174,1099],{"emptyLinePlaceholder":1098},[1050,2176,2177],{"class":1052,"line":1177},[1050,2178,2179],{"class":1080},"# Security settings\n",[1050,2181,2182,2185,2187],{"class":1052,"line":1205},[1050,2183,2184],{"class":1111},"AWS_S3_SECURE_URLS",[1050,2186,1116],{"class":1115},[1050,2188,1891],{"class":1346},[1050,2190,2191,2194,2196],{"class":1052,"line":1244},[1050,2192,2193],{"class":1111},"AWS_S3_USE_SSL",[1050,2195,1116],{"class":1115},[1050,2197,1891],{"class":1346},[1050,2199,2200],{"class":1052,"line":1249},[1050,2201,1099],{"emptyLinePlaceholder":1098},[1050,2203,2204],{"class":1052,"line":1255},[1050,2205,2206],{"class":1080},"# Performance settings\n",[1050,2208,2209,2212,2214,2217,2221,2224,2226,2228],{"class":1052,"line":1281},[1050,2210,2211],{"class":1111},"AWS_S3_MAX_MEMORY_SIZE",[1050,2213,1116],{"class":1115},[1050,2215,2216],{"class":1901}," 100",[1050,2218,2220],{"class":2219},"sVsLi"," *",[1050,2222,2223],{"class":1901}," 1024",[1050,2225,2220],{"class":2219},[1050,2227,2223],{"class":1901},[1050,2229,2230],{"class":1080},"  # 100MB\n",[1050,2232,2233,2236,2238],{"class":1052,"line":1292},[1050,2234,2235],{"class":1111},"AWS_S3_TRANSFER_CONFIG",[1050,2237,1116],{"class":1115},[1050,2239,1289],{"class":1115},[1050,2241,2242,2244,2247,2249,2251,2253,2255,2258,2260],{"class":1052,"line":1316},[1050,2243,1295],{"class":1138},[1050,2245,2246],{"class":1060},"multipart_threshold",[1050,2248,1139],{"class":1138},[1050,2250,1303],{"class":1115},[1050,2252,2223],{"class":1901},[1050,2254,2220],{"class":2219},[1050,2256,2257],{"class":1901}," 25",[1050,2259,1231],{"class":1115},[1050,2261,2262],{"class":1080},"  # 25MB\n",[1050,2264,2265,2267,2270,2272,2274,2277],{"class":1052,"line":1322},[1050,2266,1295],{"class":1138},[1050,2268,2269],{"class":1060},"max_concurrency",[1050,2271,1139],{"class":1138},[1050,2273,1303],{"class":1115},[1050,2275,2276],{"class":1901}," 10",[1050,2278,1313],{"class":1115},[1050,2280,2281,2283,2286,2288,2290,2292,2294,2296],{"class":1052,"line":1338},[1050,2282,1295],{"class":1138},[1050,2284,2285],{"class":1060},"multipart_chunksize",[1050,2287,1139],{"class":1138},[1050,2289,1303],{"class":1115},[1050,2291,2223],{"class":1901},[1050,2293,2220],{"class":2219},[1050,2295,2257],{"class":1901},[1050,2297,1313],{"class":1115},[1050,2299,2300,2302,2305,2307,2309],{"class":1052,"line":1350},[1050,2301,1295],{"class":1138},[1050,2303,2304],{"class":1060},"use_threads",[1050,2306,1139],{"class":1138},[1050,2308,1303],{"class":1115},[1050,2310,1891],{"class":1346},[1050,2312,2313],{"class":1052,"line":1360},[1050,2314,1319],{"class":1115},[1050,2316,2317],{"class":1052,"line":1365},[1050,2318,1099],{"emptyLinePlaceholder":1098},[1050,2320,2321],{"class":1052,"line":1371},[1050,2322,2323],{"class":1080},"# Lifecycle management\n",[1050,2325,2326,2328,2330],{"class":1052,"line":1381},[1050,2327,1284],{"class":1111},[1050,2329,1116],{"class":1115},[1050,2331,1289],{"class":1115},[1050,2333,2334,2336,2338,2340,2342,2344,2346,2348],{"class":1052,"line":1397},[1050,2335,1295],{"class":1138},[1050,2337,1298],{"class":1060},[1050,2339,1139],{"class":1138},[1050,2341,1303],{"class":1115},[1050,2343,1234],{"class":1138},[1050,2345,1308],{"class":1060},[1050,2347,1139],{"class":1138},[1050,2349,1313],{"class":1115},[1050,2351,2352,2354,2357,2359,2361,2363,2366,2368,2370],{"class":1052,"line":1420},[1050,2353,1295],{"class":1138},[1050,2355,2356],{"class":1060},"StorageClass",[1050,2358,1139],{"class":1138},[1050,2360,1303],{"class":1115},[1050,2362,1234],{"class":1138},[1050,2364,2365],{"class":1060},"STANDARD_IA",[1050,2367,1139],{"class":1138},[1050,2369,1231],{"class":1115},[1050,2371,2372],{"class":1080},"  # Infrequent Access\n",[1050,2374,2375],{"class":1052,"line":1434},[1050,2376,1319],{"class":1115},[1030,2378,2380],{"id":2379},"google-cloud-storage","Google Cloud Storage",[1035,2382,1038],{"id":2383},"installation-and-setup-1",[1040,2385,2387],{"className":1042,"code":2386,"language":1044,"meta":1045,"style":1045},"pip install django-storages[google]\n",[1047,2388,2389],{"__ignoreMap":1045},[1050,2390,2391,2393,2395],{"class":1052,"line":1053},[1050,2392,1057],{"class":1056},[1050,2394,1061],{"class":1060},[1050,2396,2397],{"class":1060}," django-storages[google]\n",[1035,2399,1068],{"id":2400},"configuration-1",[1040,2402,2404],{"className":1071,"code":2403,"language":1073,"meta":1045,"style":1045},"# settings.py\nimport os\n\n# Google Cloud Storage\nGS_BUCKET_NAME = os.environ.get('GS_BUCKET_NAME')\nGS_PROJECT_ID = os.environ.get('GS_PROJECT_ID')\nGS_CREDENTIALS = os.environ.get('GOOGLE_APPLICATION_CREDENTIALS')\n\n# GCS Storage Settings\nGS_DEFAULT_ACL = 'publicRead'\nGS_FILE_OVERWRITE = False\nGS_MAX_MEMORY_SIZE = 100 * 1024 * 1024  # 100MB\n\nSTORAGES = {\n    \"default\": {\n        \"BACKEND\": \"storages.backends.gcloud.GoogleCloudStorage\",\n        \"OPTIONS\": {\n            \"bucket_name\": GS_BUCKET_NAME,\n            \"project_id\": GS_PROJECT_ID,\n            \"credentials\": GS_CREDENTIALS,\n            \"default_acl\": GS_DEFAULT_ACL,\n            \"file_overwrite\": GS_FILE_OVERWRITE,\n        },\n    },\n}\n",[1047,2405,2406,2410,2416,2420,2425,2452,2479,2507,2511,2516,2530,2539,2558,2562,2570,2582,2601,2613,2628,2644,2660,2675,2691,2695,2699],{"__ignoreMap":1045},[1050,2407,2408],{"class":1052,"line":1053},[1050,2409,1081],{"class":1080},[1050,2411,2412,2414],{"class":1052,"line":1084},[1050,2413,1088],{"class":1087},[1050,2415,1092],{"class":1091},[1050,2417,2418],{"class":1052,"line":1095},[1050,2419,1099],{"emptyLinePlaceholder":1098},[1050,2421,2422],{"class":1052,"line":1102},[1050,2423,2424],{"class":1080},"# Google Cloud Storage\n",[1050,2426,2427,2430,2432,2434,2436,2438,2440,2442,2444,2446,2448,2450],{"class":1052,"line":1108},[1050,2428,2429],{"class":1111},"GS_BUCKET_NAME",[1050,2431,1116],{"class":1115},[1050,2433,1119],{"class":1091},[1050,2435,1122],{"class":1115},[1050,2437,1126],{"class":1125},[1050,2439,1122],{"class":1115},[1050,2441,1132],{"class":1131},[1050,2443,1135],{"class":1115},[1050,2445,1139],{"class":1138},[1050,2447,2429],{"class":1060},[1050,2449,1139],{"class":1138},[1050,2451,1146],{"class":1115},[1050,2453,2454,2457,2459,2461,2463,2465,2467,2469,2471,2473,2475,2477],{"class":1052,"line":1149},[1050,2455,2456],{"class":1111},"GS_PROJECT_ID",[1050,2458,1116],{"class":1115},[1050,2460,1119],{"class":1091},[1050,2462,1122],{"class":1115},[1050,2464,1126],{"class":1125},[1050,2466,1122],{"class":1115},[1050,2468,1132],{"class":1131},[1050,2470,1135],{"class":1115},[1050,2472,1139],{"class":1138},[1050,2474,2456],{"class":1060},[1050,2476,1139],{"class":1138},[1050,2478,1146],{"class":1115},[1050,2480,2481,2484,2486,2488,2490,2492,2494,2496,2498,2500,2503,2505],{"class":1052,"line":1177},[1050,2482,2483],{"class":1111},"GS_CREDENTIALS",[1050,2485,1116],{"class":1115},[1050,2487,1119],{"class":1091},[1050,2489,1122],{"class":1115},[1050,2491,1126],{"class":1125},[1050,2493,1122],{"class":1115},[1050,2495,1132],{"class":1131},[1050,2497,1135],{"class":1115},[1050,2499,1139],{"class":1138},[1050,2501,2502],{"class":1060},"GOOGLE_APPLICATION_CREDENTIALS",[1050,2504,1139],{"class":1138},[1050,2506,1146],{"class":1115},[1050,2508,2509],{"class":1052,"line":1205},[1050,2510,1099],{"emptyLinePlaceholder":1098},[1050,2512,2513],{"class":1052,"line":1244},[1050,2514,2515],{"class":1080},"# GCS Storage Settings\n",[1050,2517,2518,2521,2523,2525,2528],{"class":1052,"line":1249},[1050,2519,2520],{"class":1111},"GS_DEFAULT_ACL",[1050,2522,1116],{"class":1115},[1050,2524,1234],{"class":1138},[1050,2526,2527],{"class":1060},"publicRead",[1050,2529,1335],{"class":1138},[1050,2531,2532,2535,2537],{"class":1052,"line":1255},[1050,2533,2534],{"class":1111},"GS_FILE_OVERWRITE",[1050,2536,1116],{"class":1115},[1050,2538,1347],{"class":1346},[1050,2540,2541,2544,2546,2548,2550,2552,2554,2556],{"class":1052,"line":1281},[1050,2542,2543],{"class":1111},"GS_MAX_MEMORY_SIZE",[1050,2545,1116],{"class":1115},[1050,2547,2216],{"class":1901},[1050,2549,2220],{"class":2219},[1050,2551,2223],{"class":1901},[1050,2553,2220],{"class":2219},[1050,2555,2223],{"class":1901},[1050,2557,2230],{"class":1080},[1050,2559,2560],{"class":1052,"line":1292},[1050,2561,1099],{"emptyLinePlaceholder":1098},[1050,2563,2564,2566,2568],{"class":1052,"line":1316},[1050,2565,1374],{"class":1111},[1050,2567,1116],{"class":1115},[1050,2569,1289],{"class":1115},[1050,2571,2572,2574,2576,2578,2580],{"class":1052,"line":1322},[1050,2573,1384],{"class":1138},[1050,2575,1387],{"class":1060},[1050,2577,1390],{"class":1138},[1050,2579,1303],{"class":1115},[1050,2581,1289],{"class":1115},[1050,2583,2584,2586,2588,2590,2592,2594,2597,2599],{"class":1052,"line":1338},[1050,2585,1400],{"class":1138},[1050,2587,1403],{"class":1060},[1050,2589,1390],{"class":1138},[1050,2591,1303],{"class":1115},[1050,2593,1410],{"class":1138},[1050,2595,2596],{"class":1060},"storages.backends.gcloud.GoogleCloudStorage",[1050,2598,1390],{"class":1138},[1050,2600,1313],{"class":1115},[1050,2602,2603,2605,2607,2609,2611],{"class":1052,"line":1350},[1050,2604,1400],{"class":1138},[1050,2606,1425],{"class":1060},[1050,2608,1390],{"class":1138},[1050,2610,1303],{"class":1115},[1050,2612,1289],{"class":1115},[1050,2614,2615,2617,2619,2621,2623,2626],{"class":1052,"line":1360},[1050,2616,1437],{"class":1138},[1050,2618,1440],{"class":1060},[1050,2620,1390],{"class":1138},[1050,2622,1303],{"class":1115},[1050,2624,2625],{"class":1111}," GS_BUCKET_NAME",[1050,2627,1313],{"class":1115},[1050,2629,2630,2632,2635,2637,2639,2642],{"class":1052,"line":1365},[1050,2631,1437],{"class":1138},[1050,2633,2634],{"class":1060},"project_id",[1050,2636,1390],{"class":1138},[1050,2638,1303],{"class":1115},[1050,2640,2641],{"class":1111}," GS_PROJECT_ID",[1050,2643,1313],{"class":1115},[1050,2645,2646,2648,2651,2653,2655,2658],{"class":1052,"line":1371},[1050,2647,1437],{"class":1138},[1050,2649,2650],{"class":1060},"credentials",[1050,2652,1390],{"class":1138},[1050,2654,1303],{"class":1115},[1050,2656,2657],{"class":1111}," GS_CREDENTIALS",[1050,2659,1313],{"class":1115},[1050,2661,2662,2664,2666,2668,2670,2673],{"class":1052,"line":1381},[1050,2663,1437],{"class":1138},[1050,2665,1542],{"class":1060},[1050,2667,1390],{"class":1138},[1050,2669,1303],{"class":1115},[1050,2671,2672],{"class":1111}," GS_DEFAULT_ACL",[1050,2674,1313],{"class":1115},[1050,2676,2677,2679,2682,2684,2686,2689],{"class":1052,"line":1397},[1050,2678,1437],{"class":1138},[1050,2680,2681],{"class":1060},"file_overwrite",[1050,2683,1390],{"class":1138},[1050,2685,1303],{"class":1115},[1050,2687,2688],{"class":1111}," GS_FILE_OVERWRITE",[1050,2690,1313],{"class":1115},[1050,2692,2693],{"class":1052,"line":1420},[1050,2694,1574],{"class":1115},[1050,2696,2697],{"class":1052,"line":1434},[1050,2698,1580],{"class":1115},[1050,2700,2701],{"class":1052,"line":1452},[1050,2702,1319],{"class":1115},[1035,2704,2706],{"id":2705},"custom-gcs-storage","Custom GCS Storage",[1040,2708,2710],{"className":1071,"code":2709,"language":1073,"meta":1045,"style":1045},"# storage.py\nfrom storages.backends.gcloud import GoogleCloudStorage\n\nclass CustomGoogleCloudStorage(GoogleCloudStorage):\n    \"\"\"Custom Google Cloud Storage\"\"\"\n    bucket_name = 'my-gcs-bucket'\n    location = 'media'\n    default_acl = 'publicRead'\n    \n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        # Custom initialization\n        self.custom_endpoint = None\n        \n    def url(self, name):\n        \"\"\"Custom URL generation\"\"\"\n        if self.custom_endpoint:\n            return f\"{self.custom_endpoint}/{name}\"\n        return super().url(name)\n\n# Service account authentication\nfrom google.oauth2 import service_account\n\nclass AuthenticatedGCSStorage(GoogleCloudStorage):\n    \"\"\"GCS with service account authentication\"\"\"\n    \n    def __init__(self, *args, **kwargs):\n        # Load service account credentials\n        credentials = service_account.Credentials.from_service_account_file(\n            '/path/to/service-account.json'\n        )\n        kwargs['credentials'] = credentials\n        super().__init__(*args, **kwargs)\n",[1047,2711,2712,2716,2736,2740,2754,2763,2776,2788,2800,2804,2837,2864,2869,2884,2889,2908,2918,2933,2965,2984,2988,2993,3010,3014,3027,3036,3040,3064,3069,3091,3101,3106,3128],{"__ignoreMap":1045},[1050,2713,2714],{"class":1052,"line":1053},[1050,2715,1692],{"class":1080},[1050,2717,2718,2720,2722,2724,2726,2728,2731,2733],{"class":1052,"line":1084},[1050,2719,1697],{"class":1087},[1050,2721,1700],{"class":1091},[1050,2723,1122],{"class":1115},[1050,2725,1705],{"class":1091},[1050,2727,1122],{"class":1115},[1050,2729,2730],{"class":1091},"gcloud ",[1050,2732,1088],{"class":1087},[1050,2734,2735],{"class":1091}," GoogleCloudStorage\n",[1050,2737,2738],{"class":1052,"line":1095},[1050,2739,1099],{"emptyLinePlaceholder":1098},[1050,2741,2742,2744,2747,2749,2752],{"class":1052,"line":1102},[1050,2743,1724],{"class":1263},[1050,2745,2746],{"class":1727}," CustomGoogleCloudStorage",[1050,2748,1135],{"class":1115},[1050,2750,2751],{"class":1056},"GoogleCloudStorage",[1050,2753,1736],{"class":1115},[1050,2755,2756,2758,2761],{"class":1052,"line":1108},[1050,2757,1742],{"class":1741},[1050,2759,2760],{"class":1745},"Custom Google Cloud Storage",[1050,2762,1749],{"class":1741},[1050,2764,2765,2767,2769,2771,2774],{"class":1052,"line":1149},[1050,2766,1754],{"class":1091},[1050,2768,1757],{"class":1115},[1050,2770,1234],{"class":1138},[1050,2772,2773],{"class":1060},"my-gcs-bucket",[1050,2775,1335],{"class":1138},[1050,2777,2778,2780,2782,2784,2786],{"class":1052,"line":1177},[1050,2779,1769],{"class":1091},[1050,2781,1757],{"class":1115},[1050,2783,1234],{"class":1138},[1050,2785,1776],{"class":1060},[1050,2787,1335],{"class":1138},[1050,2789,2790,2792,2794,2796,2798],{"class":1052,"line":1205},[1050,2791,1783],{"class":1091},[1050,2793,1757],{"class":1115},[1050,2795,1234],{"class":1138},[1050,2797,2527],{"class":1060},[1050,2799,1335],{"class":1138},[1050,2801,2802],{"class":1052,"line":1244},[1050,2803,1973],{"class":1091},[1050,2805,2806,2809,2813,2815,2819,2821,2823,2827,2829,2832,2835],{"class":1052,"line":1249},[1050,2807,2808],{"class":1263},"    def",[1050,2810,2812],{"class":2811},"sJdAF"," __init__",[1050,2814,1135],{"class":1115},[1050,2816,2818],{"class":2817},"sRjD_","self",[1050,2820,1231],{"class":1115},[1050,2822,2220],{"class":2219},[1050,2824,2826],{"class":2825},"sCyAa","args",[1050,2828,1231],{"class":1115},[1050,2830,2831],{"class":2219}," **",[1050,2833,2834],{"class":2825},"kwargs",[1050,2836,1736],{"class":1115},[1050,2838,2839,2843,2846,2849,2851,2854,2856,2858,2860,2862],{"class":1052,"line":1255},[1050,2840,2842],{"class":2841},"sa2tF","        super",[1050,2844,2845],{"class":1115},"().",[1050,2847,2848],{"class":2811},"__init__",[1050,2850,1135],{"class":1115},[1050,2852,2853],{"class":2219},"*",[1050,2855,2826],{"class":1131},[1050,2857,1231],{"class":1115},[1050,2859,2831],{"class":2219},[1050,2861,2834],{"class":1131},[1050,2863,1146],{"class":1115},[1050,2865,2866],{"class":1052,"line":1281},[1050,2867,2868],{"class":1080},"        # Custom initialization\n",[1050,2870,2871,2874,2876,2879,2881],{"class":1052,"line":1292},[1050,2872,2873],{"class":1111},"        self",[1050,2875,1122],{"class":1115},[1050,2877,2878],{"class":1125},"custom_endpoint",[1050,2880,1116],{"class":1115},[1050,2882,2883],{"class":1346}," None\n",[1050,2885,2886],{"class":1052,"line":1316},[1050,2887,2888],{"class":1091},"        \n",[1050,2890,2891,2893,2897,2899,2901,2903,2906],{"class":1052,"line":1322},[1050,2892,2808],{"class":1263},[1050,2894,2896],{"class":2895},"sljsM"," url",[1050,2898,1135],{"class":1115},[1050,2900,2818],{"class":2817},[1050,2902,1231],{"class":1115},[1050,2904,2905],{"class":2825}," name",[1050,2907,1736],{"class":1115},[1050,2909,2910,2913,2916],{"class":1052,"line":1338},[1050,2911,2912],{"class":1741},"        \"\"\"",[1050,2914,2915],{"class":1745},"Custom URL generation",[1050,2917,1749],{"class":1741},[1050,2919,2920,2923,2926,2928,2930],{"class":1052,"line":1350},[1050,2921,2922],{"class":1087},"        if",[1050,2924,2925],{"class":1111}," self",[1050,2927,1122],{"class":1115},[1050,2929,2878],{"class":1125},[1050,2931,2932],{"class":1115},":\n",[1050,2934,2935,2938,2940,2942,2944,2946,2948,2950,2952,2955,2957,2960,2962],{"class":1052,"line":1360},[1050,2936,2937],{"class":1087},"            return",[1050,2939,1264],{"class":1263},[1050,2941,1390],{"class":1060},[1050,2943,1270],{"class":1269},[1050,2945,2818],{"class":1111},[1050,2947,1122],{"class":1115},[1050,2949,2878],{"class":1125},[1050,2951,1275],{"class":1269},[1050,2953,2954],{"class":1060},"/",[1050,2956,1270],{"class":1269},[1050,2958,2959],{"class":1091},"name",[1050,2961,1275],{"class":1269},[1050,2963,2964],{"class":1060},"\"\n",[1050,2966,2967,2970,2973,2975,2978,2980,2982],{"class":1052,"line":1365},[1050,2968,2969],{"class":1087},"        return",[1050,2971,2972],{"class":2841}," super",[1050,2974,2845],{"class":1115},[1050,2976,2977],{"class":1131},"url",[1050,2979,1135],{"class":1115},[1050,2981,2959],{"class":1131},[1050,2983,1146],{"class":1115},[1050,2985,2986],{"class":1052,"line":1371},[1050,2987,1099],{"emptyLinePlaceholder":1098},[1050,2989,2990],{"class":1052,"line":1381},[1050,2991,2992],{"class":1080},"# Service account authentication\n",[1050,2994,2995,2997,3000,3002,3005,3007],{"class":1052,"line":1397},[1050,2996,1697],{"class":1087},[1050,2998,2999],{"class":1091}," google",[1050,3001,1122],{"class":1115},[1050,3003,3004],{"class":1091},"oauth2 ",[1050,3006,1088],{"class":1087},[1050,3008,3009],{"class":1091}," service_account\n",[1050,3011,3012],{"class":1052,"line":1420},[1050,3013,1099],{"emptyLinePlaceholder":1098},[1050,3015,3016,3018,3021,3023,3025],{"class":1052,"line":1434},[1050,3017,1724],{"class":1263},[1050,3019,3020],{"class":1727}," AuthenticatedGCSStorage",[1050,3022,1135],{"class":1115},[1050,3024,2751],{"class":1056},[1050,3026,1736],{"class":1115},[1050,3028,3029,3031,3034],{"class":1052,"line":1452},[1050,3030,1742],{"class":1741},[1050,3032,3033],{"class":1745},"GCS with service account authentication",[1050,3035,1749],{"class":1741},[1050,3037,3038],{"class":1052,"line":1469},[1050,3039,1973],{"class":1091},[1050,3041,3042,3044,3046,3048,3050,3052,3054,3056,3058,3060,3062],{"class":1052,"line":1486},[1050,3043,2808],{"class":1263},[1050,3045,2812],{"class":2811},[1050,3047,1135],{"class":1115},[1050,3049,2818],{"class":2817},[1050,3051,1231],{"class":1115},[1050,3053,2220],{"class":2219},[1050,3055,2826],{"class":2825},[1050,3057,1231],{"class":1115},[1050,3059,2831],{"class":2219},[1050,3061,2834],{"class":2825},[1050,3063,1736],{"class":1115},[1050,3065,3066],{"class":1052,"line":1503},[1050,3067,3068],{"class":1080},"        # Load service account credentials\n",[1050,3070,3071,3074,3076,3079,3081,3084,3086,3089],{"class":1052,"line":1520},[1050,3072,3073],{"class":1091},"        credentials ",[1050,3075,1757],{"class":1115},[1050,3077,3078],{"class":1091}," service_account",[1050,3080,1122],{"class":1115},[1050,3082,3083],{"class":1125},"Credentials",[1050,3085,1122],{"class":1115},[1050,3087,3088],{"class":1131},"from_service_account_file",[1050,3090,2042],{"class":1115},[1050,3092,3093,3096,3099],{"class":1052,"line":1537},[1050,3094,3095],{"class":1138},"            '",[1050,3097,3098],{"class":1060},"/path/to/service-account.json",[1050,3100,1335],{"class":1138},[1050,3102,3103],{"class":1052,"line":1554},[1050,3104,3105],{"class":1115},"        )\n",[1050,3107,3108,3111,3114,3116,3118,3120,3123,3125],{"class":1052,"line":1571},[1050,3109,3110],{"class":1091},"        kwargs",[1050,3112,3113],{"class":1115},"[",[1050,3115,1139],{"class":1138},[1050,3117,2650],{"class":1060},[1050,3119,1139],{"class":1138},[1050,3121,3122],{"class":1115},"]",[1050,3124,1116],{"class":1115},[1050,3126,3127],{"class":1091}," credentials\n",[1050,3129,3130,3132,3134,3136,3138,3140,3142,3144,3146,3148],{"class":1052,"line":1577},[1050,3131,2842],{"class":2841},[1050,3133,2845],{"class":1115},[1050,3135,2848],{"class":2811},[1050,3137,1135],{"class":1115},[1050,3139,2853],{"class":2219},[1050,3141,2826],{"class":1131},[1050,3143,1231],{"class":1115},[1050,3145,2831],{"class":2219},[1050,3147,2834],{"class":1131},[1050,3149,1146],{"class":1115},[1030,3151,3153],{"id":3152},"azure-blob-storage","Azure Blob Storage",[1035,3155,1038],{"id":3156},"installation-and-setup-2",[1040,3158,3160],{"className":1042,"code":3159,"language":1044,"meta":1045,"style":1045},"pip install django-storages[azure]\n",[1047,3161,3162],{"__ignoreMap":1045},[1050,3163,3164,3166,3168],{"class":1052,"line":1053},[1050,3165,1057],{"class":1056},[1050,3167,1061],{"class":1060},[1050,3169,3170],{"class":1060}," django-storages[azure]\n",[1035,3172,1068],{"id":3173},"configuration-2",[1040,3175,3177],{"className":1071,"code":3176,"language":1073,"meta":1045,"style":1045},"# settings.py\nimport os\n\n# Azure Blob Storage\nAZURE_ACCOUNT_NAME = os.environ.get('AZURE_ACCOUNT_NAME')\nAZURE_ACCOUNT_KEY = os.environ.get('AZURE_ACCOUNT_KEY')\nAZURE_CONTAINER = os.environ.get('AZURE_CONTAINER')\n\nSTORAGES = {\n    \"default\": {\n        \"BACKEND\": \"storages.backends.azure_storage.AzureStorage\",\n        \"OPTIONS\": {\n            \"account_name\": AZURE_ACCOUNT_NAME,\n            \"account_key\": AZURE_ACCOUNT_KEY,\n            \"azure_container\": AZURE_CONTAINER,\n            \"expiration_secs\": 3600,\n        },\n    },\n}\n",[1047,3178,3179,3183,3189,3193,3198,3225,3252,3279,3283,3291,3303,3322,3334,3350,3366,3382,3397,3401,3405],{"__ignoreMap":1045},[1050,3180,3181],{"class":1052,"line":1053},[1050,3182,1081],{"class":1080},[1050,3184,3185,3187],{"class":1052,"line":1084},[1050,3186,1088],{"class":1087},[1050,3188,1092],{"class":1091},[1050,3190,3191],{"class":1052,"line":1095},[1050,3192,1099],{"emptyLinePlaceholder":1098},[1050,3194,3195],{"class":1052,"line":1102},[1050,3196,3197],{"class":1080},"# Azure Blob Storage\n",[1050,3199,3200,3203,3205,3207,3209,3211,3213,3215,3217,3219,3221,3223],{"class":1052,"line":1108},[1050,3201,3202],{"class":1111},"AZURE_ACCOUNT_NAME",[1050,3204,1116],{"class":1115},[1050,3206,1119],{"class":1091},[1050,3208,1122],{"class":1115},[1050,3210,1126],{"class":1125},[1050,3212,1122],{"class":1115},[1050,3214,1132],{"class":1131},[1050,3216,1135],{"class":1115},[1050,3218,1139],{"class":1138},[1050,3220,3202],{"class":1060},[1050,3222,1139],{"class":1138},[1050,3224,1146],{"class":1115},[1050,3226,3227,3230,3232,3234,3236,3238,3240,3242,3244,3246,3248,3250],{"class":1052,"line":1149},[1050,3228,3229],{"class":1111},"AZURE_ACCOUNT_KEY",[1050,3231,1116],{"class":1115},[1050,3233,1119],{"class":1091},[1050,3235,1122],{"class":1115},[1050,3237,1126],{"class":1125},[1050,3239,1122],{"class":1115},[1050,3241,1132],{"class":1131},[1050,3243,1135],{"class":1115},[1050,3245,1139],{"class":1138},[1050,3247,3229],{"class":1060},[1050,3249,1139],{"class":1138},[1050,3251,1146],{"class":1115},[1050,3253,3254,3257,3259,3261,3263,3265,3267,3269,3271,3273,3275,3277],{"class":1052,"line":1177},[1050,3255,3256],{"class":1111},"AZURE_CONTAINER",[1050,3258,1116],{"class":1115},[1050,3260,1119],{"class":1091},[1050,3262,1122],{"class":1115},[1050,3264,1126],{"class":1125},[1050,3266,1122],{"class":1115},[1050,3268,1132],{"class":1131},[1050,3270,1135],{"class":1115},[1050,3272,1139],{"class":1138},[1050,3274,3256],{"class":1060},[1050,3276,1139],{"class":1138},[1050,3278,1146],{"class":1115},[1050,3280,3281],{"class":1052,"line":1205},[1050,3282,1099],{"emptyLinePlaceholder":1098},[1050,3284,3285,3287,3289],{"class":1052,"line":1244},[1050,3286,1374],{"class":1111},[1050,3288,1116],{"class":1115},[1050,3290,1289],{"class":1115},[1050,3292,3293,3295,3297,3299,3301],{"class":1052,"line":1249},[1050,3294,1384],{"class":1138},[1050,3296,1387],{"class":1060},[1050,3298,1390],{"class":1138},[1050,3300,1303],{"class":1115},[1050,3302,1289],{"class":1115},[1050,3304,3305,3307,3309,3311,3313,3315,3318,3320],{"class":1052,"line":1255},[1050,3306,1400],{"class":1138},[1050,3308,1403],{"class":1060},[1050,3310,1390],{"class":1138},[1050,3312,1303],{"class":1115},[1050,3314,1410],{"class":1138},[1050,3316,3317],{"class":1060},"storages.backends.azure_storage.AzureStorage",[1050,3319,1390],{"class":1138},[1050,3321,1313],{"class":1115},[1050,3323,3324,3326,3328,3330,3332],{"class":1052,"line":1281},[1050,3325,1400],{"class":1138},[1050,3327,1425],{"class":1060},[1050,3329,1390],{"class":1138},[1050,3331,1303],{"class":1115},[1050,3333,1289],{"class":1115},[1050,3335,3336,3338,3341,3343,3345,3348],{"class":1052,"line":1292},[1050,3337,1437],{"class":1138},[1050,3339,3340],{"class":1060},"account_name",[1050,3342,1390],{"class":1138},[1050,3344,1303],{"class":1115},[1050,3346,3347],{"class":1111}," AZURE_ACCOUNT_NAME",[1050,3349,1313],{"class":1115},[1050,3351,3352,3354,3357,3359,3361,3364],{"class":1052,"line":1316},[1050,3353,1437],{"class":1138},[1050,3355,3356],{"class":1060},"account_key",[1050,3358,1390],{"class":1138},[1050,3360,1303],{"class":1115},[1050,3362,3363],{"class":1111}," AZURE_ACCOUNT_KEY",[1050,3365,1313],{"class":1115},[1050,3367,3368,3370,3373,3375,3377,3380],{"class":1052,"line":1322},[1050,3369,1437],{"class":1138},[1050,3371,3372],{"class":1060},"azure_container",[1050,3374,1390],{"class":1138},[1050,3376,1303],{"class":1115},[1050,3378,3379],{"class":1111}," AZURE_CONTAINER",[1050,3381,1313],{"class":1115},[1050,3383,3384,3386,3389,3391,3393,3395],{"class":1052,"line":1338},[1050,3385,1437],{"class":1138},[1050,3387,3388],{"class":1060},"expiration_secs",[1050,3390,1390],{"class":1138},[1050,3392,1303],{"class":1115},[1050,3394,1902],{"class":1901},[1050,3396,1313],{"class":1115},[1050,3398,3399],{"class":1052,"line":1350},[1050,3400,1574],{"class":1115},[1050,3402,3403],{"class":1052,"line":1360},[1050,3404,1580],{"class":1115},[1050,3406,3407],{"class":1052,"line":1365},[1050,3408,1319],{"class":1115},[1035,3410,3412],{"id":3411},"custom-azure-storage","Custom Azure Storage",[1040,3414,3416],{"className":1071,"code":3415,"language":1073,"meta":1045,"style":1045},"# storage.py\nfrom storages.backends.azure_storage import AzureStorage\n\nclass CustomAzureStorage(AzureStorage):\n    \"\"\"Custom Azure Blob Storage\"\"\"\n    account_name = 'mystorageaccount'\n    azure_container = 'media'\n    expiration_secs = 3600\n    \n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        # Custom settings\n        self.overwrite_files = False\n        self.azure_ssl = True\n",[1047,3417,3418,3422,3442,3446,3460,3469,3483,3496,3506,3510,3534,3556,3561,3574],{"__ignoreMap":1045},[1050,3419,3420],{"class":1052,"line":1053},[1050,3421,1692],{"class":1080},[1050,3423,3424,3426,3428,3430,3432,3434,3437,3439],{"class":1052,"line":1084},[1050,3425,1697],{"class":1087},[1050,3427,1700],{"class":1091},[1050,3429,1122],{"class":1115},[1050,3431,1705],{"class":1091},[1050,3433,1122],{"class":1115},[1050,3435,3436],{"class":1091},"azure_storage ",[1050,3438,1088],{"class":1087},[1050,3440,3441],{"class":1091}," AzureStorage\n",[1050,3443,3444],{"class":1052,"line":1095},[1050,3445,1099],{"emptyLinePlaceholder":1098},[1050,3447,3448,3450,3453,3455,3458],{"class":1052,"line":1102},[1050,3449,1724],{"class":1263},[1050,3451,3452],{"class":1727}," CustomAzureStorage",[1050,3454,1135],{"class":1115},[1050,3456,3457],{"class":1056},"AzureStorage",[1050,3459,1736],{"class":1115},[1050,3461,3462,3464,3467],{"class":1052,"line":1108},[1050,3463,1742],{"class":1741},[1050,3465,3466],{"class":1745},"Custom Azure Blob Storage",[1050,3468,1749],{"class":1741},[1050,3470,3471,3474,3476,3478,3481],{"class":1052,"line":1149},[1050,3472,3473],{"class":1091},"    account_name ",[1050,3475,1757],{"class":1115},[1050,3477,1234],{"class":1138},[1050,3479,3480],{"class":1060},"mystorageaccount",[1050,3482,1335],{"class":1138},[1050,3484,3485,3488,3490,3492,3494],{"class":1052,"line":1177},[1050,3486,3487],{"class":1091},"    azure_container ",[1050,3489,1757],{"class":1115},[1050,3491,1234],{"class":1138},[1050,3493,1776],{"class":1060},[1050,3495,1335],{"class":1138},[1050,3497,3498,3501,3503],{"class":1052,"line":1205},[1050,3499,3500],{"class":1091},"    expiration_secs ",[1050,3502,1757],{"class":1115},[1050,3504,3505],{"class":1901}," 3600\n",[1050,3507,3508],{"class":1052,"line":1244},[1050,3509,1973],{"class":1091},[1050,3511,3512,3514,3516,3518,3520,3522,3524,3526,3528,3530,3532],{"class":1052,"line":1249},[1050,3513,2808],{"class":1263},[1050,3515,2812],{"class":2811},[1050,3517,1135],{"class":1115},[1050,3519,2818],{"class":2817},[1050,3521,1231],{"class":1115},[1050,3523,2220],{"class":2219},[1050,3525,2826],{"class":2825},[1050,3527,1231],{"class":1115},[1050,3529,2831],{"class":2219},[1050,3531,2834],{"class":2825},[1050,3533,1736],{"class":1115},[1050,3535,3536,3538,3540,3542,3544,3546,3548,3550,3552,3554],{"class":1052,"line":1255},[1050,3537,2842],{"class":2841},[1050,3539,2845],{"class":1115},[1050,3541,2848],{"class":2811},[1050,3543,1135],{"class":1115},[1050,3545,2853],{"class":2219},[1050,3547,2826],{"class":1131},[1050,3549,1231],{"class":1115},[1050,3551,2831],{"class":2219},[1050,3553,2834],{"class":1131},[1050,3555,1146],{"class":1115},[1050,3557,3558],{"class":1052,"line":1281},[1050,3559,3560],{"class":1080},"        # Custom settings\n",[1050,3562,3563,3565,3567,3570,3572],{"class":1052,"line":1292},[1050,3564,2873],{"class":1111},[1050,3566,1122],{"class":1115},[1050,3568,3569],{"class":1125},"overwrite_files",[1050,3571,1116],{"class":1115},[1050,3573,1347],{"class":1346},[1050,3575,3576,3578,3580,3583,3585],{"class":1052,"line":1316},[1050,3577,2873],{"class":1111},[1050,3579,1122],{"class":1115},[1050,3581,3582],{"class":1125},"azure_ssl",[1050,3584,1116],{"class":1115},[1050,3586,1891],{"class":1346},[1030,3588,3590],{"id":3589},"multi-cloud-storage-strategy","Multi-Cloud Storage Strategy",[1035,3592,3594],{"id":3593},"hybrid-storage-configuration","Hybrid Storage Configuration",[1040,3596,3598],{"className":1071,"code":3597,"language":1073,"meta":1045,"style":1045},"# storage.py\nfrom django.conf import settings\nfrom storages.backends.s3boto3 import S3Boto3Storage\nfrom storages.backends.gcloud import GoogleCloudStorage\n\nclass HybridStorage:\n    \"\"\"Route files to different cloud providers based on criteria\"\"\"\n    \n    def __init__(self):\n        self.s3_storage = S3Boto3Storage()\n        self.gcs_storage = GoogleCloudStorage()\n    \n    def get_storage(self, filename):\n        \"\"\"Choose storage based on file type or size\"\"\"\n        if filename.endswith(('.jpg', '.png', '.gif')):\n            # Images to S3 with CloudFront\n            return self.s3_storage\n        elif filename.endswith(('.mp4', '.avi', '.mov')):\n            # Videos to Google Cloud Storage\n            return self.gcs_storage\n        else:\n            # Default to S3\n            return self.s3_storage\n\n# Usage in models\nclass MediaFile(models.Model):\n    name = models.CharField(max_length=255)\n    file = models.FileField(upload_to='uploads/')\n    \n    def save(self, *args, **kwargs):\n        if self.file:\n            hybrid = HybridStorage()\n            storage = hybrid.get_storage(self.file.name)\n            self.file.storage = storage\n        super().save(*args, **kwargs)\n",[1047,3599,3600,3604,3621,3639,3657,3661,3670,3679,3683,3695,3711,3727,3731,3749,3758,3800,3805,3816,3856,3861,3872,3879,3884,3894,3898,3903,3920,3944,3974,3978,4003,4016,4027,4056,4075],{"__ignoreMap":1045},[1050,3601,3602],{"class":1052,"line":1053},[1050,3603,1692],{"class":1080},[1050,3605,3606,3608,3611,3613,3616,3618],{"class":1052,"line":1084},[1050,3607,1697],{"class":1087},[1050,3609,3610],{"class":1091}," django",[1050,3612,1122],{"class":1115},[1050,3614,3615],{"class":1091},"conf ",[1050,3617,1088],{"class":1087},[1050,3619,3620],{"class":1091}," settings\n",[1050,3622,3623,3625,3627,3629,3631,3633,3635,3637],{"class":1052,"line":1095},[1050,3624,1697],{"class":1087},[1050,3626,1700],{"class":1091},[1050,3628,1122],{"class":1115},[1050,3630,1705],{"class":1091},[1050,3632,1122],{"class":1115},[1050,3634,1710],{"class":1091},[1050,3636,1088],{"class":1087},[1050,3638,1715],{"class":1091},[1050,3640,3641,3643,3645,3647,3649,3651,3653,3655],{"class":1052,"line":1102},[1050,3642,1697],{"class":1087},[1050,3644,1700],{"class":1091},[1050,3646,1122],{"class":1115},[1050,3648,1705],{"class":1091},[1050,3650,1122],{"class":1115},[1050,3652,2730],{"class":1091},[1050,3654,1088],{"class":1087},[1050,3656,2735],{"class":1091},[1050,3658,3659],{"class":1052,"line":1108},[1050,3660,1099],{"emptyLinePlaceholder":1098},[1050,3662,3663,3665,3668],{"class":1052,"line":1149},[1050,3664,1724],{"class":1263},[1050,3666,3667],{"class":1727}," HybridStorage",[1050,3669,2932],{"class":1115},[1050,3671,3672,3674,3677],{"class":1052,"line":1177},[1050,3673,1742],{"class":1741},[1050,3675,3676],{"class":1745},"Route files to different cloud providers based on criteria",[1050,3678,1749],{"class":1741},[1050,3680,3681],{"class":1052,"line":1205},[1050,3682,1973],{"class":1091},[1050,3684,3685,3687,3689,3691,3693],{"class":1052,"line":1244},[1050,3686,2808],{"class":1263},[1050,3688,2812],{"class":2811},[1050,3690,1135],{"class":1115},[1050,3692,2818],{"class":2817},[1050,3694,1736],{"class":1115},[1050,3696,3697,3699,3701,3704,3706,3709],{"class":1052,"line":1249},[1050,3698,2873],{"class":1111},[1050,3700,1122],{"class":1115},[1050,3702,3703],{"class":1125},"s3_storage",[1050,3705,1116],{"class":1115},[1050,3707,3708],{"class":1131}," S3Boto3Storage",[1050,3710,2071],{"class":1115},[1050,3712,3713,3715,3717,3720,3722,3725],{"class":1052,"line":1255},[1050,3714,2873],{"class":1111},[1050,3716,1122],{"class":1115},[1050,3718,3719],{"class":1125},"gcs_storage",[1050,3721,1116],{"class":1115},[1050,3723,3724],{"class":1131}," GoogleCloudStorage",[1050,3726,2071],{"class":1115},[1050,3728,3729],{"class":1052,"line":1281},[1050,3730,1973],{"class":1091},[1050,3732,3733,3735,3738,3740,3742,3744,3747],{"class":1052,"line":1292},[1050,3734,2808],{"class":1263},[1050,3736,3737],{"class":2895}," get_storage",[1050,3739,1135],{"class":1115},[1050,3741,2818],{"class":2817},[1050,3743,1231],{"class":1115},[1050,3745,3746],{"class":2825}," filename",[1050,3748,1736],{"class":1115},[1050,3750,3751,3753,3756],{"class":1052,"line":1316},[1050,3752,2912],{"class":1741},[1050,3754,3755],{"class":1745},"Choose storage based on file type or size",[1050,3757,1749],{"class":1741},[1050,3759,3760,3762,3764,3766,3769,3772,3774,3777,3779,3781,3783,3786,3788,3790,3792,3795,3797],{"class":1052,"line":1322},[1050,3761,2922],{"class":1087},[1050,3763,3746],{"class":1091},[1050,3765,1122],{"class":1115},[1050,3767,3768],{"class":1131},"endswith",[1050,3770,3771],{"class":1115},"((",[1050,3773,1139],{"class":1138},[1050,3775,3776],{"class":1060},".jpg",[1050,3778,1139],{"class":1138},[1050,3780,1231],{"class":1115},[1050,3782,1234],{"class":1138},[1050,3784,3785],{"class":1060},".png",[1050,3787,1139],{"class":1138},[1050,3789,1231],{"class":1115},[1050,3791,1234],{"class":1138},[1050,3793,3794],{"class":1060},".gif",[1050,3796,1139],{"class":1138},[1050,3798,3799],{"class":1115},")):\n",[1050,3801,3802],{"class":1052,"line":1338},[1050,3803,3804],{"class":1080},"            # Images to S3 with CloudFront\n",[1050,3806,3807,3809,3811,3813],{"class":1052,"line":1350},[1050,3808,2937],{"class":1087},[1050,3810,2925],{"class":1111},[1050,3812,1122],{"class":1115},[1050,3814,3815],{"class":1125},"s3_storage\n",[1050,3817,3818,3821,3823,3825,3827,3829,3831,3834,3836,3838,3840,3843,3845,3847,3849,3852,3854],{"class":1052,"line":1360},[1050,3819,3820],{"class":1087},"        elif",[1050,3822,3746],{"class":1091},[1050,3824,1122],{"class":1115},[1050,3826,3768],{"class":1131},[1050,3828,3771],{"class":1115},[1050,3830,1139],{"class":1138},[1050,3832,3833],{"class":1060},".mp4",[1050,3835,1139],{"class":1138},[1050,3837,1231],{"class":1115},[1050,3839,1234],{"class":1138},[1050,3841,3842],{"class":1060},".avi",[1050,3844,1139],{"class":1138},[1050,3846,1231],{"class":1115},[1050,3848,1234],{"class":1138},[1050,3850,3851],{"class":1060},".mov",[1050,3853,1139],{"class":1138},[1050,3855,3799],{"class":1115},[1050,3857,3858],{"class":1052,"line":1365},[1050,3859,3860],{"class":1080},"            # Videos to Google Cloud Storage\n",[1050,3862,3863,3865,3867,3869],{"class":1052,"line":1371},[1050,3864,2937],{"class":1087},[1050,3866,2925],{"class":1111},[1050,3868,1122],{"class":1115},[1050,3870,3871],{"class":1125},"gcs_storage\n",[1050,3873,3874,3877],{"class":1052,"line":1381},[1050,3875,3876],{"class":1087},"        else",[1050,3878,2932],{"class":1115},[1050,3880,3881],{"class":1052,"line":1397},[1050,3882,3883],{"class":1080},"            # Default to S3\n",[1050,3885,3886,3888,3890,3892],{"class":1052,"line":1420},[1050,3887,2937],{"class":1087},[1050,3889,2925],{"class":1111},[1050,3891,1122],{"class":1115},[1050,3893,3815],{"class":1125},[1050,3895,3896],{"class":1052,"line":1434},[1050,3897,1099],{"emptyLinePlaceholder":1098},[1050,3899,3900],{"class":1052,"line":1452},[1050,3901,3902],{"class":1080},"# Usage in models\n",[1050,3904,3905,3907,3910,3912,3914,3916,3918],{"class":1052,"line":1469},[1050,3906,1724],{"class":1263},[1050,3908,3909],{"class":1727}," MediaFile",[1050,3911,1135],{"class":1115},[1050,3913,1990],{"class":1056},[1050,3915,1122],{"class":1115},[1050,3917,1995],{"class":1056},[1050,3919,1736],{"class":1115},[1050,3921,3922,3925,3927,3929,3931,3933,3935,3937,3939,3942],{"class":1052,"line":1486},[1050,3923,3924],{"class":1091},"    name ",[1050,3926,1757],{"class":1115},[1050,3928,2007],{"class":1091},[1050,3930,1122],{"class":1115},[1050,3932,2012],{"class":1131},[1050,3934,1135],{"class":1115},[1050,3936,2018],{"class":2017},[1050,3938,1757],{"class":1115},[1050,3940,3941],{"class":1901},"255",[1050,3943,1146],{"class":1115},[1050,3945,3946,3950,3952,3954,3956,3958,3960,3963,3965,3967,3970,3972],{"class":1052,"line":1503},[1050,3947,3949],{"class":3948},"sSC40","    file",[1050,3951,1116],{"class":1115},[1050,3953,2007],{"class":1091},[1050,3955,1122],{"class":1115},[1050,3957,2039],{"class":1131},[1050,3959,1135],{"class":1115},[1050,3961,3962],{"class":2017},"upload_to",[1050,3964,1757],{"class":1115},[1050,3966,1139],{"class":1138},[1050,3968,3969],{"class":1060},"uploads/",[1050,3971,1139],{"class":1138},[1050,3973,1146],{"class":1115},[1050,3975,3976],{"class":1052,"line":1520},[1050,3977,1973],{"class":1091},[1050,3979,3980,3982,3985,3987,3989,3991,3993,3995,3997,3999,4001],{"class":1052,"line":1537},[1050,3981,2808],{"class":1263},[1050,3983,3984],{"class":2895}," save",[1050,3986,1135],{"class":1115},[1050,3988,2818],{"class":2817},[1050,3990,1231],{"class":1115},[1050,3992,2220],{"class":2219},[1050,3994,2826],{"class":2825},[1050,3996,1231],{"class":1115},[1050,3998,2831],{"class":2219},[1050,4000,2834],{"class":2825},[1050,4002,1736],{"class":1115},[1050,4004,4005,4007,4009,4011,4014],{"class":1052,"line":1554},[1050,4006,2922],{"class":1087},[1050,4008,2925],{"class":1111},[1050,4010,1122],{"class":1115},[1050,4012,4013],{"class":1125},"file",[1050,4015,2932],{"class":1115},[1050,4017,4018,4021,4023,4025],{"class":1052,"line":1571},[1050,4019,4020],{"class":1091},"            hybrid ",[1050,4022,1757],{"class":1115},[1050,4024,3667],{"class":1131},[1050,4026,2071],{"class":1115},[1050,4028,4029,4032,4034,4037,4039,4042,4044,4046,4048,4050,4052,4054],{"class":1052,"line":1577},[1050,4030,4031],{"class":1091},"            storage ",[1050,4033,1757],{"class":1115},[1050,4035,4036],{"class":1091}," hybrid",[1050,4038,1122],{"class":1115},[1050,4040,4041],{"class":1131},"get_storage",[1050,4043,1135],{"class":1115},[1050,4045,2818],{"class":1111},[1050,4047,1122],{"class":1115},[1050,4049,4013],{"class":1125},[1050,4051,1122],{"class":1115},[1050,4053,2959],{"class":1125},[1050,4055,1146],{"class":1115},[1050,4057,4058,4061,4063,4065,4067,4070,4072],{"class":1052,"line":1583},[1050,4059,4060],{"class":1111},"            self",[1050,4062,1122],{"class":1115},[1050,4064,4013],{"class":1125},[1050,4066,1122],{"class":1115},[1050,4068,4069],{"class":1125},"storage",[1050,4071,1116],{"class":1115},[1050,4073,4074],{"class":1091}," storage\n",[1050,4076,4077,4079,4081,4084,4086,4088,4090,4092,4094,4096],{"class":1052,"line":1597},[1050,4078,2842],{"class":2841},[1050,4080,2845],{"class":1115},[1050,4082,4083],{"class":1131},"save",[1050,4085,1135],{"class":1115},[1050,4087,2853],{"class":2219},[1050,4089,2826],{"class":1131},[1050,4091,1231],{"class":1115},[1050,4093,2831],{"class":2219},[1050,4095,2834],{"class":1131},[1050,4097,1146],{"class":1115},[1035,4099,4101],{"id":4100},"failover-storage","Failover Storage",[1040,4103,4105],{"className":1071,"code":4104,"language":1073,"meta":1045,"style":1045},"# storage.py\nimport logging\nfrom django.core.files.storage import Storage\n\nlogger = logging.getLogger(__name__)\n\nclass FailoverStorage(Storage):\n    \"\"\"Storage with automatic failover between providers\"\"\"\n    \n    def __init__(self, primary_storage, backup_storage):\n        self.primary_storage = primary_storage\n        self.backup_storage = backup_storage\n    \n    def _save(self, name, content):\n        \"\"\"Try primary storage, fallback to backup\"\"\"\n        try:\n            return self.primary_storage._save(name, content)\n        except Exception as e:\n            logger.warning(f\"Primary storage failed: {e}\")\n            logger.info(\"Falling back to backup storage\")\n            return self.backup_storage._save(name, content)\n    \n    def _open(self, name, mode='rb'):\n        \"\"\"Try to open from either storage\"\"\"\n        try:\n            return self.primary_storage._open(name, mode)\n        except Exception:\n            return self.backup_storage._open(name, mode)\n    \n    def exists(self, name):\n        \"\"\"Check both storages\"\"\"\n        return (self.primary_storage.exists(name) or \n                self.backup_storage.exists(name))\n    \n    def delete(self, name):\n        \"\"\"Delete from both storages\"\"\"\n        try:\n            self.primary_storage.delete(name)\n        except Exception:\n            pass\n        \n        try:\n            self.backup_storage.delete(name)\n        except Exception:\n            pass\n",[1047,4106,4107,4111,4118,4144,4148,4171,4175,4189,4198,4202,4224,4238,4252,4256,4278,4287,4294,4319,4335,4364,4384,4408,4412,4443,4452,4458,4483,4491,4515,4519,4536,4545,4576,4596,4600,4617,4626,4632,4651,4659,4664,4668,4675,4694,4703],{"__ignoreMap":1045},[1050,4108,4109],{"class":1052,"line":1053},[1050,4110,1692],{"class":1080},[1050,4112,4113,4115],{"class":1052,"line":1084},[1050,4114,1088],{"class":1087},[1050,4116,4117],{"class":1091}," logging\n",[1050,4119,4120,4122,4124,4126,4129,4131,4134,4136,4139,4141],{"class":1052,"line":1095},[1050,4121,1697],{"class":1087},[1050,4123,3610],{"class":1091},[1050,4125,1122],{"class":1115},[1050,4127,4128],{"class":1091},"core",[1050,4130,1122],{"class":1115},[1050,4132,4133],{"class":1091},"files",[1050,4135,1122],{"class":1115},[1050,4137,4138],{"class":1091},"storage ",[1050,4140,1088],{"class":1087},[1050,4142,4143],{"class":1091}," Storage\n",[1050,4145,4146],{"class":1052,"line":1102},[1050,4147,1099],{"emptyLinePlaceholder":1098},[1050,4149,4150,4153,4155,4158,4160,4163,4165,4169],{"class":1052,"line":1108},[1050,4151,4152],{"class":1091},"logger ",[1050,4154,1757],{"class":1115},[1050,4156,4157],{"class":1091}," logging",[1050,4159,1122],{"class":1115},[1050,4161,4162],{"class":1131},"getLogger",[1050,4164,1135],{"class":1115},[1050,4166,4168],{"class":4167},"s131V","__name__",[1050,4170,1146],{"class":1115},[1050,4172,4173],{"class":1052,"line":1149},[1050,4174,1099],{"emptyLinePlaceholder":1098},[1050,4176,4177,4179,4182,4184,4187],{"class":1052,"line":1177},[1050,4178,1724],{"class":1263},[1050,4180,4181],{"class":1727}," FailoverStorage",[1050,4183,1135],{"class":1115},[1050,4185,4186],{"class":1056},"Storage",[1050,4188,1736],{"class":1115},[1050,4190,4191,4193,4196],{"class":1052,"line":1205},[1050,4192,1742],{"class":1741},[1050,4194,4195],{"class":1745},"Storage with automatic failover between providers",[1050,4197,1749],{"class":1741},[1050,4199,4200],{"class":1052,"line":1244},[1050,4201,1973],{"class":1091},[1050,4203,4204,4206,4208,4210,4212,4214,4217,4219,4222],{"class":1052,"line":1249},[1050,4205,2808],{"class":1263},[1050,4207,2812],{"class":2811},[1050,4209,1135],{"class":1115},[1050,4211,2818],{"class":2817},[1050,4213,1231],{"class":1115},[1050,4215,4216],{"class":2825}," primary_storage",[1050,4218,1231],{"class":1115},[1050,4220,4221],{"class":2825}," backup_storage",[1050,4223,1736],{"class":1115},[1050,4225,4226,4228,4230,4233,4235],{"class":1052,"line":1255},[1050,4227,2873],{"class":1111},[1050,4229,1122],{"class":1115},[1050,4231,4232],{"class":1125},"primary_storage",[1050,4234,1116],{"class":1115},[1050,4236,4237],{"class":1091}," primary_storage\n",[1050,4239,4240,4242,4244,4247,4249],{"class":1052,"line":1281},[1050,4241,2873],{"class":1111},[1050,4243,1122],{"class":1115},[1050,4245,4246],{"class":1125},"backup_storage",[1050,4248,1116],{"class":1115},[1050,4250,4251],{"class":1091}," backup_storage\n",[1050,4253,4254],{"class":1052,"line":1292},[1050,4255,1973],{"class":1091},[1050,4257,4258,4260,4263,4265,4267,4269,4271,4273,4276],{"class":1052,"line":1316},[1050,4259,2808],{"class":1263},[1050,4261,4262],{"class":2895}," _save",[1050,4264,1135],{"class":1115},[1050,4266,2818],{"class":2817},[1050,4268,1231],{"class":1115},[1050,4270,2905],{"class":2825},[1050,4272,1231],{"class":1115},[1050,4274,4275],{"class":2825}," content",[1050,4277,1736],{"class":1115},[1050,4279,4280,4282,4285],{"class":1052,"line":1322},[1050,4281,2912],{"class":1741},[1050,4283,4284],{"class":1745},"Try primary storage, fallback to backup",[1050,4286,1749],{"class":1741},[1050,4288,4289,4292],{"class":1052,"line":1338},[1050,4290,4291],{"class":1087},"        try",[1050,4293,2932],{"class":1115},[1050,4295,4296,4298,4300,4302,4304,4306,4309,4311,4313,4315,4317],{"class":1052,"line":1350},[1050,4297,2937],{"class":1087},[1050,4299,2925],{"class":1111},[1050,4301,1122],{"class":1115},[1050,4303,4232],{"class":1125},[1050,4305,1122],{"class":1115},[1050,4307,4308],{"class":1131},"_save",[1050,4310,1135],{"class":1115},[1050,4312,2959],{"class":1131},[1050,4314,1231],{"class":1115},[1050,4316,4275],{"class":1131},[1050,4318,1146],{"class":1115},[1050,4320,4321,4324,4327,4330,4333],{"class":1052,"line":1360},[1050,4322,4323],{"class":1087},"        except",[1050,4325,4326],{"class":2841}," Exception",[1050,4328,4329],{"class":1087}," as",[1050,4331,4332],{"class":1091}," e",[1050,4334,2932],{"class":1115},[1050,4336,4337,4340,4342,4345,4347,4350,4353,4355,4358,4360,4362],{"class":1052,"line":1365},[1050,4338,4339],{"class":1091},"            logger",[1050,4341,1122],{"class":1115},[1050,4343,4344],{"class":1131},"warning",[1050,4346,1135],{"class":1115},[1050,4348,4349],{"class":1263},"f",[1050,4351,4352],{"class":1060},"\"Primary storage failed: ",[1050,4354,1270],{"class":1269},[1050,4356,4357],{"class":1131},"e",[1050,4359,1275],{"class":1269},[1050,4361,1390],{"class":1060},[1050,4363,1146],{"class":1115},[1050,4365,4366,4368,4370,4373,4375,4377,4380,4382],{"class":1052,"line":1371},[1050,4367,4339],{"class":1091},[1050,4369,1122],{"class":1115},[1050,4371,4372],{"class":1131},"info",[1050,4374,1135],{"class":1115},[1050,4376,1390],{"class":1138},[1050,4378,4379],{"class":1060},"Falling back to backup storage",[1050,4381,1390],{"class":1138},[1050,4383,1146],{"class":1115},[1050,4385,4386,4388,4390,4392,4394,4396,4398,4400,4402,4404,4406],{"class":1052,"line":1381},[1050,4387,2937],{"class":1087},[1050,4389,2925],{"class":1111},[1050,4391,1122],{"class":1115},[1050,4393,4246],{"class":1125},[1050,4395,1122],{"class":1115},[1050,4397,4308],{"class":1131},[1050,4399,1135],{"class":1115},[1050,4401,2959],{"class":1131},[1050,4403,1231],{"class":1115},[1050,4405,4275],{"class":1131},[1050,4407,1146],{"class":1115},[1050,4409,4410],{"class":1052,"line":1397},[1050,4411,1973],{"class":1091},[1050,4413,4414,4416,4419,4421,4423,4425,4427,4429,4432,4434,4436,4439,4441],{"class":1052,"line":1420},[1050,4415,2808],{"class":1263},[1050,4417,4418],{"class":2895}," _open",[1050,4420,1135],{"class":1115},[1050,4422,2818],{"class":2817},[1050,4424,1231],{"class":1115},[1050,4426,2905],{"class":2825},[1050,4428,1231],{"class":1115},[1050,4430,4431],{"class":2825}," mode",[1050,4433,1757],{"class":2219},[1050,4435,1139],{"class":1138},[1050,4437,4438],{"class":1060},"rb",[1050,4440,1139],{"class":1138},[1050,4442,1736],{"class":1115},[1050,4444,4445,4447,4450],{"class":1052,"line":1434},[1050,4446,2912],{"class":1741},[1050,4448,4449],{"class":1745},"Try to open from either storage",[1050,4451,1749],{"class":1741},[1050,4453,4454,4456],{"class":1052,"line":1452},[1050,4455,4291],{"class":1087},[1050,4457,2932],{"class":1115},[1050,4459,4460,4462,4464,4466,4468,4470,4473,4475,4477,4479,4481],{"class":1052,"line":1469},[1050,4461,2937],{"class":1087},[1050,4463,2925],{"class":1111},[1050,4465,1122],{"class":1115},[1050,4467,4232],{"class":1125},[1050,4469,1122],{"class":1115},[1050,4471,4472],{"class":1131},"_open",[1050,4474,1135],{"class":1115},[1050,4476,2959],{"class":1131},[1050,4478,1231],{"class":1115},[1050,4480,4431],{"class":1131},[1050,4482,1146],{"class":1115},[1050,4484,4485,4487,4489],{"class":1052,"line":1486},[1050,4486,4323],{"class":1087},[1050,4488,4326],{"class":2841},[1050,4490,2932],{"class":1115},[1050,4492,4493,4495,4497,4499,4501,4503,4505,4507,4509,4511,4513],{"class":1052,"line":1503},[1050,4494,2937],{"class":1087},[1050,4496,2925],{"class":1111},[1050,4498,1122],{"class":1115},[1050,4500,4246],{"class":1125},[1050,4502,1122],{"class":1115},[1050,4504,4472],{"class":1131},[1050,4506,1135],{"class":1115},[1050,4508,2959],{"class":1131},[1050,4510,1231],{"class":1115},[1050,4512,4431],{"class":1131},[1050,4514,1146],{"class":1115},[1050,4516,4517],{"class":1052,"line":1520},[1050,4518,1973],{"class":1091},[1050,4520,4521,4523,4526,4528,4530,4532,4534],{"class":1052,"line":1537},[1050,4522,2808],{"class":1263},[1050,4524,4525],{"class":2895}," exists",[1050,4527,1135],{"class":1115},[1050,4529,2818],{"class":2817},[1050,4531,1231],{"class":1115},[1050,4533,2905],{"class":2825},[1050,4535,1736],{"class":1115},[1050,4537,4538,4540,4543],{"class":1052,"line":1554},[1050,4539,2912],{"class":1741},[1050,4541,4542],{"class":1745},"Check both storages",[1050,4544,1749],{"class":1741},[1050,4546,4547,4549,4552,4554,4556,4558,4560,4563,4565,4567,4570,4573],{"class":1052,"line":1571},[1050,4548,2969],{"class":1087},[1050,4550,4551],{"class":1115}," (",[1050,4553,2818],{"class":1111},[1050,4555,1122],{"class":1115},[1050,4557,4232],{"class":1125},[1050,4559,1122],{"class":1115},[1050,4561,4562],{"class":1131},"exists",[1050,4564,1135],{"class":1115},[1050,4566,2959],{"class":1131},[1050,4568,4569],{"class":1115},")",[1050,4571,4572],{"class":2219}," or",[1050,4574,4575],{"class":1091}," \n",[1050,4577,4578,4581,4583,4585,4587,4589,4591,4593],{"class":1052,"line":1577},[1050,4579,4580],{"class":1111},"                self",[1050,4582,1122],{"class":1115},[1050,4584,4246],{"class":1125},[1050,4586,1122],{"class":1115},[1050,4588,4562],{"class":1131},[1050,4590,1135],{"class":1115},[1050,4592,2959],{"class":1131},[1050,4594,4595],{"class":1115},"))\n",[1050,4597,4598],{"class":1052,"line":1583},[1050,4599,1973],{"class":1091},[1050,4601,4602,4604,4607,4609,4611,4613,4615],{"class":1052,"line":1597},[1050,4603,2808],{"class":1263},[1050,4605,4606],{"class":2895}," delete",[1050,4608,1135],{"class":1115},[1050,4610,2818],{"class":2817},[1050,4612,1231],{"class":1115},[1050,4614,2905],{"class":2825},[1050,4616,1736],{"class":1115},[1050,4618,4619,4621,4624],{"class":1052,"line":1617},[1050,4620,2912],{"class":1741},[1050,4622,4623],{"class":1745},"Delete from both storages",[1050,4625,1749],{"class":1741},[1050,4627,4628,4630],{"class":1052,"line":1630},[1050,4629,4291],{"class":1087},[1050,4631,2932],{"class":1115},[1050,4633,4634,4636,4638,4640,4642,4645,4647,4649],{"class":1052,"line":1645},[1050,4635,4060],{"class":1111},[1050,4637,1122],{"class":1115},[1050,4639,4232],{"class":1125},[1050,4641,1122],{"class":1115},[1050,4643,4644],{"class":1131},"delete",[1050,4646,1135],{"class":1115},[1050,4648,2959],{"class":1131},[1050,4650,1146],{"class":1115},[1050,4652,4653,4655,4657],{"class":1052,"line":1666},[1050,4654,4323],{"class":1087},[1050,4656,4326],{"class":2841},[1050,4658,2932],{"class":1115},[1050,4660,4661],{"class":1052,"line":1671},[1050,4662,4663],{"class":1087},"            pass\n",[1050,4665,4666],{"class":1052,"line":1676},[1050,4667,2888],{"class":1091},[1050,4669,4671,4673],{"class":1052,"line":4670},42,[1050,4672,4291],{"class":1087},[1050,4674,2932],{"class":1115},[1050,4676,4678,4680,4682,4684,4686,4688,4690,4692],{"class":1052,"line":4677},43,[1050,4679,4060],{"class":1111},[1050,4681,1122],{"class":1115},[1050,4683,4246],{"class":1125},[1050,4685,1122],{"class":1115},[1050,4687,4644],{"class":1131},[1050,4689,1135],{"class":1115},[1050,4691,2959],{"class":1131},[1050,4693,1146],{"class":1115},[1050,4695,4697,4699,4701],{"class":1052,"line":4696},44,[1050,4698,4323],{"class":1087},[1050,4700,4326],{"class":2841},[1050,4702,2932],{"class":1115},[1050,4704,4706],{"class":1052,"line":4705},45,[1050,4707,4663],{"class":1087},[1030,4709,4711],{"id":4710},"cloud-storage-optimization","Cloud Storage Optimization",[1035,4713,4715],{"id":4714},"caching-and-cdn-integration","Caching and CDN Integration",[1040,4717,4719],{"className":1071,"code":4718,"language":1073,"meta":1045,"style":1045},"# settings.py\n\n# CloudFront CDN for S3\nAWS_S3_CUSTOM_DOMAIN = 'cdn.example.com'\nAWS_CLOUDFRONT_DOMAIN = 'cdn.example.com'\n\n# Cache headers\nAWS_S3_OBJECT_PARAMETERS = {\n    'CacheControl': 'max-age=86400',\n    'Expires': 'Thu, 31 Dec 2099 20:00:00 GMT',\n}\n\n# Google Cloud CDN\nGS_CUSTOM_ENDPOINT = 'https://cdn.example.com'\n\n# Azure CDN\nAZURE_CUSTOM_DOMAIN = 'cdn.example.com'\n",[1047,4720,4721,4725,4729,4734,4746,4759,4763,4768,4776,4794,4814,4818,4822,4827,4841,4845,4850],{"__ignoreMap":1045},[1050,4722,4723],{"class":1052,"line":1053},[1050,4724,1081],{"class":1080},[1050,4726,4727],{"class":1052,"line":1084},[1050,4728,1099],{"emptyLinePlaceholder":1098},[1050,4730,4731],{"class":1052,"line":1095},[1050,4732,4733],{"class":1080},"# CloudFront CDN for S3\n",[1050,4735,4736,4738,4740,4742,4744],{"class":1052,"line":1102},[1050,4737,1258],{"class":1111},[1050,4739,1116],{"class":1115},[1050,4741,1234],{"class":1138},[1050,4743,2154],{"class":1060},[1050,4745,1335],{"class":1138},[1050,4747,4748,4751,4753,4755,4757],{"class":1052,"line":1108},[1050,4749,4750],{"class":1111},"AWS_CLOUDFRONT_DOMAIN",[1050,4752,1116],{"class":1115},[1050,4754,1234],{"class":1138},[1050,4756,2154],{"class":1060},[1050,4758,1335],{"class":1138},[1050,4760,4761],{"class":1052,"line":1149},[1050,4762,1099],{"emptyLinePlaceholder":1098},[1050,4764,4765],{"class":1052,"line":1177},[1050,4766,4767],{"class":1080},"# Cache headers\n",[1050,4769,4770,4772,4774],{"class":1052,"line":1205},[1050,4771,1284],{"class":1111},[1050,4773,1116],{"class":1115},[1050,4775,1289],{"class":1115},[1050,4777,4778,4780,4782,4784,4786,4788,4790,4792],{"class":1052,"line":1244},[1050,4779,1295],{"class":1138},[1050,4781,1298],{"class":1060},[1050,4783,1139],{"class":1138},[1050,4785,1303],{"class":1115},[1050,4787,1234],{"class":1138},[1050,4789,1308],{"class":1060},[1050,4791,1139],{"class":1138},[1050,4793,1313],{"class":1115},[1050,4795,4796,4798,4801,4803,4805,4807,4810,4812],{"class":1052,"line":1249},[1050,4797,1295],{"class":1138},[1050,4799,4800],{"class":1060},"Expires",[1050,4802,1139],{"class":1138},[1050,4804,1303],{"class":1115},[1050,4806,1234],{"class":1138},[1050,4808,4809],{"class":1060},"Thu, 31 Dec 2099 20:00:00 GMT",[1050,4811,1139],{"class":1138},[1050,4813,1313],{"class":1115},[1050,4815,4816],{"class":1052,"line":1255},[1050,4817,1319],{"class":1115},[1050,4819,4820],{"class":1052,"line":1281},[1050,4821,1099],{"emptyLinePlaceholder":1098},[1050,4823,4824],{"class":1052,"line":1292},[1050,4825,4826],{"class":1080},"# Google Cloud CDN\n",[1050,4828,4829,4832,4834,4836,4839],{"class":1052,"line":1316},[1050,4830,4831],{"class":1111},"GS_CUSTOM_ENDPOINT",[1050,4833,1116],{"class":1115},[1050,4835,1234],{"class":1138},[1050,4837,4838],{"class":1060},"https://cdn.example.com",[1050,4840,1335],{"class":1138},[1050,4842,4843],{"class":1052,"line":1322},[1050,4844,1099],{"emptyLinePlaceholder":1098},[1050,4846,4847],{"class":1052,"line":1338},[1050,4848,4849],{"class":1080},"# Azure CDN\n",[1050,4851,4852,4855,4857,4859,4861],{"class":1052,"line":1350},[1050,4853,4854],{"class":1111},"AZURE_CUSTOM_DOMAIN",[1050,4856,1116],{"class":1115},[1050,4858,1234],{"class":1138},[1050,4860,2154],{"class":1060},[1050,4862,1335],{"class":1138},[1035,4864,4866],{"id":4865},"compression-and-optimization","Compression and Optimization",[1040,4868,4870],{"className":1071,"code":4869,"language":1073,"meta":1045,"style":1045},"# storage.py\nimport gzip\nimport io\nfrom django.core.files.base import ContentFile\n\nclass CompressedStorage(S3Boto3Storage):\n    \"\"\"S3 storage with automatic compression\"\"\"\n    \n    def _save(self, name, content):\n        \"\"\"Compress files before saving\"\"\"\n        \n        # Compress text files\n        if name.endswith(('.css', '.js', '.html', '.txt', '.json')):\n            content.seek(0)\n            original_content = content.read()\n            \n            # Compress content\n            compressed_content = gzip.compress(original_content)\n            \n            # Create new content file\n            compressed_file = ContentFile(compressed_content)\n            \n            # Set content encoding\n            self.object_parameters = {\n                **self.object_parameters,\n                'ContentEncoding': 'gzip'\n            }\n            \n            return super()._save(name, compressed_file)\n        \n        return super()._save(name, content)\n",[1047,4871,4872,4876,4883,4890,4914,4918,4931,4940,4944,4964,4973,4977,4982,5039,5056,5072,5077,5082,5104,5108,5113,5130,5134,5139,5151,5164,5183,5188,5192,5213,5217],{"__ignoreMap":1045},[1050,4873,4874],{"class":1052,"line":1053},[1050,4875,1692],{"class":1080},[1050,4877,4878,4880],{"class":1052,"line":1084},[1050,4879,1088],{"class":1087},[1050,4881,4882],{"class":1091}," gzip\n",[1050,4884,4885,4887],{"class":1052,"line":1095},[1050,4886,1088],{"class":1087},[1050,4888,4889],{"class":1091}," io\n",[1050,4891,4892,4894,4896,4898,4900,4902,4904,4906,4909,4911],{"class":1052,"line":1102},[1050,4893,1697],{"class":1087},[1050,4895,3610],{"class":1091},[1050,4897,1122],{"class":1115},[1050,4899,4128],{"class":1091},[1050,4901,1122],{"class":1115},[1050,4903,4133],{"class":1091},[1050,4905,1122],{"class":1115},[1050,4907,4908],{"class":1091},"base ",[1050,4910,1088],{"class":1087},[1050,4912,4913],{"class":1091}," ContentFile\n",[1050,4915,4916],{"class":1052,"line":1108},[1050,4917,1099],{"emptyLinePlaceholder":1098},[1050,4919,4920,4922,4925,4927,4929],{"class":1052,"line":1149},[1050,4921,1724],{"class":1263},[1050,4923,4924],{"class":1727}," CompressedStorage",[1050,4926,1135],{"class":1115},[1050,4928,1733],{"class":1056},[1050,4930,1736],{"class":1115},[1050,4932,4933,4935,4938],{"class":1052,"line":1177},[1050,4934,1742],{"class":1741},[1050,4936,4937],{"class":1745},"S3 storage with automatic compression",[1050,4939,1749],{"class":1741},[1050,4941,4942],{"class":1052,"line":1205},[1050,4943,1973],{"class":1091},[1050,4945,4946,4948,4950,4952,4954,4956,4958,4960,4962],{"class":1052,"line":1244},[1050,4947,2808],{"class":1263},[1050,4949,4262],{"class":2895},[1050,4951,1135],{"class":1115},[1050,4953,2818],{"class":2817},[1050,4955,1231],{"class":1115},[1050,4957,2905],{"class":2825},[1050,4959,1231],{"class":1115},[1050,4961,4275],{"class":2825},[1050,4963,1736],{"class":1115},[1050,4965,4966,4968,4971],{"class":1052,"line":1249},[1050,4967,2912],{"class":1741},[1050,4969,4970],{"class":1745},"Compress files before saving",[1050,4972,1749],{"class":1741},[1050,4974,4975],{"class":1052,"line":1255},[1050,4976,2888],{"class":1091},[1050,4978,4979],{"class":1052,"line":1281},[1050,4980,4981],{"class":1080},"        # Compress text files\n",[1050,4983,4984,4986,4988,4990,4992,4994,4996,4999,5001,5003,5005,5008,5010,5012,5014,5017,5019,5021,5023,5026,5028,5030,5032,5035,5037],{"class":1052,"line":1292},[1050,4985,2922],{"class":1087},[1050,4987,2905],{"class":1091},[1050,4989,1122],{"class":1115},[1050,4991,3768],{"class":1131},[1050,4993,3771],{"class":1115},[1050,4995,1139],{"class":1138},[1050,4997,4998],{"class":1060},".css",[1050,5000,1139],{"class":1138},[1050,5002,1231],{"class":1115},[1050,5004,1234],{"class":1138},[1050,5006,5007],{"class":1060},".js",[1050,5009,1139],{"class":1138},[1050,5011,1231],{"class":1115},[1050,5013,1234],{"class":1138},[1050,5015,5016],{"class":1060},".html",[1050,5018,1139],{"class":1138},[1050,5020,1231],{"class":1115},[1050,5022,1234],{"class":1138},[1050,5024,5025],{"class":1060},".txt",[1050,5027,1139],{"class":1138},[1050,5029,1231],{"class":1115},[1050,5031,1234],{"class":1138},[1050,5033,5034],{"class":1060},".json",[1050,5036,1139],{"class":1138},[1050,5038,3799],{"class":1115},[1050,5040,5041,5044,5046,5049,5051,5054],{"class":1052,"line":1316},[1050,5042,5043],{"class":1091},"            content",[1050,5045,1122],{"class":1115},[1050,5047,5048],{"class":1131},"seek",[1050,5050,1135],{"class":1115},[1050,5052,5053],{"class":1901},"0",[1050,5055,1146],{"class":1115},[1050,5057,5058,5061,5063,5065,5067,5070],{"class":1052,"line":1322},[1050,5059,5060],{"class":1091},"            original_content ",[1050,5062,1757],{"class":1115},[1050,5064,4275],{"class":1091},[1050,5066,1122],{"class":1115},[1050,5068,5069],{"class":1131},"read",[1050,5071,2071],{"class":1115},[1050,5073,5074],{"class":1052,"line":1338},[1050,5075,5076],{"class":1091},"            \n",[1050,5078,5079],{"class":1052,"line":1350},[1050,5080,5081],{"class":1080},"            # Compress content\n",[1050,5083,5084,5087,5089,5092,5094,5097,5099,5102],{"class":1052,"line":1360},[1050,5085,5086],{"class":1091},"            compressed_content ",[1050,5088,1757],{"class":1115},[1050,5090,5091],{"class":1091}," gzip",[1050,5093,1122],{"class":1115},[1050,5095,5096],{"class":1131},"compress",[1050,5098,1135],{"class":1115},[1050,5100,5101],{"class":1131},"original_content",[1050,5103,1146],{"class":1115},[1050,5105,5106],{"class":1052,"line":1365},[1050,5107,5076],{"class":1091},[1050,5109,5110],{"class":1052,"line":1371},[1050,5111,5112],{"class":1080},"            # Create new content file\n",[1050,5114,5115,5118,5120,5123,5125,5128],{"class":1052,"line":1381},[1050,5116,5117],{"class":1091},"            compressed_file ",[1050,5119,1757],{"class":1115},[1050,5121,5122],{"class":1131}," ContentFile",[1050,5124,1135],{"class":1115},[1050,5126,5127],{"class":1131},"compressed_content",[1050,5129,1146],{"class":1115},[1050,5131,5132],{"class":1052,"line":1397},[1050,5133,5076],{"class":1091},[1050,5135,5136],{"class":1052,"line":1420},[1050,5137,5138],{"class":1080},"            # Set content encoding\n",[1050,5140,5141,5143,5145,5147,5149],{"class":1052,"line":1434},[1050,5142,4060],{"class":1111},[1050,5144,1122],{"class":1115},[1050,5146,1525],{"class":1125},[1050,5148,1116],{"class":1115},[1050,5150,1289],{"class":1115},[1050,5152,5153,5156,5158,5160,5162],{"class":1052,"line":1452},[1050,5154,5155],{"class":2219},"                **",[1050,5157,2818],{"class":1111},[1050,5159,1122],{"class":1115},[1050,5161,1525],{"class":1125},[1050,5163,1313],{"class":1115},[1050,5165,5166,5169,5172,5174,5176,5178,5181],{"class":1052,"line":1469},[1050,5167,5168],{"class":1138},"                '",[1050,5170,5171],{"class":1060},"ContentEncoding",[1050,5173,1139],{"class":1138},[1050,5175,1303],{"class":1115},[1050,5177,1234],{"class":1138},[1050,5179,5180],{"class":1060},"gzip",[1050,5182,1335],{"class":1138},[1050,5184,5185],{"class":1052,"line":1486},[1050,5186,5187],{"class":1115},"            }\n",[1050,5189,5190],{"class":1052,"line":1503},[1050,5191,5076],{"class":1091},[1050,5193,5194,5196,5198,5200,5202,5204,5206,5208,5211],{"class":1052,"line":1520},[1050,5195,2937],{"class":1087},[1050,5197,2972],{"class":2841},[1050,5199,2845],{"class":1115},[1050,5201,4308],{"class":1131},[1050,5203,1135],{"class":1115},[1050,5205,2959],{"class":1131},[1050,5207,1231],{"class":1115},[1050,5209,5210],{"class":1131}," compressed_file",[1050,5212,1146],{"class":1115},[1050,5214,5215],{"class":1052,"line":1537},[1050,5216,2888],{"class":1091},[1050,5218,5219,5221,5223,5225,5227,5229,5231,5233,5235],{"class":1052,"line":1554},[1050,5220,2969],{"class":1087},[1050,5222,2972],{"class":2841},[1050,5224,2845],{"class":1115},[1050,5226,4308],{"class":1131},[1050,5228,1135],{"class":1115},[1050,5230,2959],{"class":1131},[1050,5232,1231],{"class":1115},[1050,5234,4275],{"class":1131},[1050,5236,1146],{"class":1115},[1035,5238,5240],{"id":5239},"image-processing-pipeline","Image Processing Pipeline",[1040,5242,5244],{"className":1071,"code":5243,"language":1073,"meta":1045,"style":1045},"# storage.py\nfrom PIL import Image\nimport io\nfrom django.core.files.base import ContentFile\n\nclass ImageProcessingStorage(S3Boto3Storage):\n    \"\"\"S3 storage with automatic image processing\"\"\"\n    \n    def _save(self, name, content):\n        \"\"\"Process images before saving\"\"\"\n        \n        if self._is_image(name):\n            processed_content = self._process_image(content)\n            return super()._save(name, processed_content)\n        \n        return super()._save(name, content)\n    \n    def _is_image(self, name):\n        \"\"\"Check if file is an image\"\"\"\n        return name.lower().endswith(('.jpg', '.jpeg', '.png', '.gif', '.webp'))\n    \n    def _process_image(self, content):\n        \"\"\"Process and optimize image\"\"\"\n        content.seek(0)\n        \n        # Open image\n        image = Image.open(content)\n        \n        # Convert to RGB if necessary\n        if image.mode in ('RGBA', 'LA', 'P'):\n            image = image.convert('RGB')\n        \n        # Resize if too large\n        max_size = (1920, 1080)\n        if image.size[0] > max_size[0] or image.size[1] > max_size[1]:\n            image.thumbnail(max_size, Image.Resampling.LANCZOS)\n        \n        # Save optimized image\n        output = io.BytesIO()\n        image.save(output, format='JPEG', quality=85, optimize=True)\n        output.seek(0)\n        \n        return ContentFile(output.getvalue())\n",[1047,5245,5246,5250,5263,5269,5291,5295,5308,5317,5321,5341,5350,5354,5371,5392,5413,5417,5437,5441,5458,5467,5526,5530,5547,5556,5571,5575,5580,5601,5605,5610,5654,5679,5683,5688,5707,5762,5794,5798,5803,5820,5870,5885,5889],{"__ignoreMap":1045},[1050,5247,5248],{"class":1052,"line":1053},[1050,5249,1692],{"class":1080},[1050,5251,5252,5254,5257,5260],{"class":1052,"line":1084},[1050,5253,1697],{"class":1087},[1050,5255,5256],{"class":1111}," PIL",[1050,5258,5259],{"class":1087}," import",[1050,5261,5262],{"class":1091}," Image\n",[1050,5264,5265,5267],{"class":1052,"line":1095},[1050,5266,1088],{"class":1087},[1050,5268,4889],{"class":1091},[1050,5270,5271,5273,5275,5277,5279,5281,5283,5285,5287,5289],{"class":1052,"line":1102},[1050,5272,1697],{"class":1087},[1050,5274,3610],{"class":1091},[1050,5276,1122],{"class":1115},[1050,5278,4128],{"class":1091},[1050,5280,1122],{"class":1115},[1050,5282,4133],{"class":1091},[1050,5284,1122],{"class":1115},[1050,5286,4908],{"class":1091},[1050,5288,1088],{"class":1087},[1050,5290,4913],{"class":1091},[1050,5292,5293],{"class":1052,"line":1108},[1050,5294,1099],{"emptyLinePlaceholder":1098},[1050,5296,5297,5299,5302,5304,5306],{"class":1052,"line":1149},[1050,5298,1724],{"class":1263},[1050,5300,5301],{"class":1727}," ImageProcessingStorage",[1050,5303,1135],{"class":1115},[1050,5305,1733],{"class":1056},[1050,5307,1736],{"class":1115},[1050,5309,5310,5312,5315],{"class":1052,"line":1177},[1050,5311,1742],{"class":1741},[1050,5313,5314],{"class":1745},"S3 storage with automatic image processing",[1050,5316,1749],{"class":1741},[1050,5318,5319],{"class":1052,"line":1205},[1050,5320,1973],{"class":1091},[1050,5322,5323,5325,5327,5329,5331,5333,5335,5337,5339],{"class":1052,"line":1244},[1050,5324,2808],{"class":1263},[1050,5326,4262],{"class":2895},[1050,5328,1135],{"class":1115},[1050,5330,2818],{"class":2817},[1050,5332,1231],{"class":1115},[1050,5334,2905],{"class":2825},[1050,5336,1231],{"class":1115},[1050,5338,4275],{"class":2825},[1050,5340,1736],{"class":1115},[1050,5342,5343,5345,5348],{"class":1052,"line":1249},[1050,5344,2912],{"class":1741},[1050,5346,5347],{"class":1745},"Process images before saving",[1050,5349,1749],{"class":1741},[1050,5351,5352],{"class":1052,"line":1255},[1050,5353,2888],{"class":1091},[1050,5355,5356,5358,5360,5362,5365,5367,5369],{"class":1052,"line":1281},[1050,5357,2922],{"class":1087},[1050,5359,2925],{"class":1111},[1050,5361,1122],{"class":1115},[1050,5363,5364],{"class":1131},"_is_image",[1050,5366,1135],{"class":1115},[1050,5368,2959],{"class":1131},[1050,5370,1736],{"class":1115},[1050,5372,5373,5376,5378,5380,5382,5385,5387,5390],{"class":1052,"line":1292},[1050,5374,5375],{"class":1091},"            processed_content ",[1050,5377,1757],{"class":1115},[1050,5379,2925],{"class":1111},[1050,5381,1122],{"class":1115},[1050,5383,5384],{"class":1131},"_process_image",[1050,5386,1135],{"class":1115},[1050,5388,5389],{"class":1131},"content",[1050,5391,1146],{"class":1115},[1050,5393,5394,5396,5398,5400,5402,5404,5406,5408,5411],{"class":1052,"line":1316},[1050,5395,2937],{"class":1087},[1050,5397,2972],{"class":2841},[1050,5399,2845],{"class":1115},[1050,5401,4308],{"class":1131},[1050,5403,1135],{"class":1115},[1050,5405,2959],{"class":1131},[1050,5407,1231],{"class":1115},[1050,5409,5410],{"class":1131}," processed_content",[1050,5412,1146],{"class":1115},[1050,5414,5415],{"class":1052,"line":1322},[1050,5416,2888],{"class":1091},[1050,5418,5419,5421,5423,5425,5427,5429,5431,5433,5435],{"class":1052,"line":1338},[1050,5420,2969],{"class":1087},[1050,5422,2972],{"class":2841},[1050,5424,2845],{"class":1115},[1050,5426,4308],{"class":1131},[1050,5428,1135],{"class":1115},[1050,5430,2959],{"class":1131},[1050,5432,1231],{"class":1115},[1050,5434,4275],{"class":1131},[1050,5436,1146],{"class":1115},[1050,5438,5439],{"class":1052,"line":1350},[1050,5440,1973],{"class":1091},[1050,5442,5443,5445,5448,5450,5452,5454,5456],{"class":1052,"line":1360},[1050,5444,2808],{"class":1263},[1050,5446,5447],{"class":2895}," _is_image",[1050,5449,1135],{"class":1115},[1050,5451,2818],{"class":2817},[1050,5453,1231],{"class":1115},[1050,5455,2905],{"class":2825},[1050,5457,1736],{"class":1115},[1050,5459,5460,5462,5465],{"class":1052,"line":1365},[1050,5461,2912],{"class":1741},[1050,5463,5464],{"class":1745},"Check if file is an image",[1050,5466,1749],{"class":1741},[1050,5468,5469,5471,5473,5475,5478,5480,5482,5484,5486,5488,5490,5492,5494,5497,5499,5501,5503,5505,5507,5509,5511,5513,5515,5517,5519,5522,5524],{"class":1052,"line":1371},[1050,5470,2969],{"class":1087},[1050,5472,2905],{"class":1091},[1050,5474,1122],{"class":1115},[1050,5476,5477],{"class":1131},"lower",[1050,5479,2845],{"class":1115},[1050,5481,3768],{"class":1131},[1050,5483,3771],{"class":1115},[1050,5485,1139],{"class":1138},[1050,5487,3776],{"class":1060},[1050,5489,1139],{"class":1138},[1050,5491,1231],{"class":1115},[1050,5493,1234],{"class":1138},[1050,5495,5496],{"class":1060},".jpeg",[1050,5498,1139],{"class":1138},[1050,5500,1231],{"class":1115},[1050,5502,1234],{"class":1138},[1050,5504,3785],{"class":1060},[1050,5506,1139],{"class":1138},[1050,5508,1231],{"class":1115},[1050,5510,1234],{"class":1138},[1050,5512,3794],{"class":1060},[1050,5514,1139],{"class":1138},[1050,5516,1231],{"class":1115},[1050,5518,1234],{"class":1138},[1050,5520,5521],{"class":1060},".webp",[1050,5523,1139],{"class":1138},[1050,5525,4595],{"class":1115},[1050,5527,5528],{"class":1052,"line":1381},[1050,5529,1973],{"class":1091},[1050,5531,5532,5534,5537,5539,5541,5543,5545],{"class":1052,"line":1397},[1050,5533,2808],{"class":1263},[1050,5535,5536],{"class":2895}," _process_image",[1050,5538,1135],{"class":1115},[1050,5540,2818],{"class":2817},[1050,5542,1231],{"class":1115},[1050,5544,4275],{"class":2825},[1050,5546,1736],{"class":1115},[1050,5548,5549,5551,5554],{"class":1052,"line":1420},[1050,5550,2912],{"class":1741},[1050,5552,5553],{"class":1745},"Process and optimize image",[1050,5555,1749],{"class":1741},[1050,5557,5558,5561,5563,5565,5567,5569],{"class":1052,"line":1434},[1050,5559,5560],{"class":1091},"        content",[1050,5562,1122],{"class":1115},[1050,5564,5048],{"class":1131},[1050,5566,1135],{"class":1115},[1050,5568,5053],{"class":1901},[1050,5570,1146],{"class":1115},[1050,5572,5573],{"class":1052,"line":1452},[1050,5574,2888],{"class":1091},[1050,5576,5577],{"class":1052,"line":1469},[1050,5578,5579],{"class":1080},"        # Open image\n",[1050,5581,5582,5585,5587,5590,5592,5595,5597,5599],{"class":1052,"line":1486},[1050,5583,5584],{"class":1091},"        image ",[1050,5586,1757],{"class":1115},[1050,5588,5589],{"class":1091}," Image",[1050,5591,1122],{"class":1115},[1050,5593,5594],{"class":1131},"open",[1050,5596,1135],{"class":1115},[1050,5598,5389],{"class":1131},[1050,5600,1146],{"class":1115},[1050,5602,5603],{"class":1052,"line":1503},[1050,5604,2888],{"class":1091},[1050,5606,5607],{"class":1052,"line":1520},[1050,5608,5609],{"class":1080},"        # Convert to RGB if necessary\n",[1050,5611,5612,5614,5617,5619,5622,5625,5627,5629,5632,5634,5636,5638,5641,5643,5645,5647,5650,5652],{"class":1052,"line":1537},[1050,5613,2922],{"class":1087},[1050,5615,5616],{"class":1091}," image",[1050,5618,1122],{"class":1115},[1050,5620,5621],{"class":1125},"mode",[1050,5623,5624],{"class":2219}," in",[1050,5626,4551],{"class":1115},[1050,5628,1139],{"class":1138},[1050,5630,5631],{"class":1060},"RGBA",[1050,5633,1139],{"class":1138},[1050,5635,1231],{"class":1115},[1050,5637,1234],{"class":1138},[1050,5639,5640],{"class":1060},"LA",[1050,5642,1139],{"class":1138},[1050,5644,1231],{"class":1115},[1050,5646,1234],{"class":1138},[1050,5648,5649],{"class":1060},"P",[1050,5651,1139],{"class":1138},[1050,5653,1736],{"class":1115},[1050,5655,5656,5659,5661,5663,5665,5668,5670,5672,5675,5677],{"class":1052,"line":1554},[1050,5657,5658],{"class":1091},"            image ",[1050,5660,1757],{"class":1115},[1050,5662,5616],{"class":1091},[1050,5664,1122],{"class":1115},[1050,5666,5667],{"class":1131},"convert",[1050,5669,1135],{"class":1115},[1050,5671,1139],{"class":1138},[1050,5673,5674],{"class":1060},"RGB",[1050,5676,1139],{"class":1138},[1050,5678,1146],{"class":1115},[1050,5680,5681],{"class":1052,"line":1571},[1050,5682,2888],{"class":1091},[1050,5684,5685],{"class":1052,"line":1577},[1050,5686,5687],{"class":1080},"        # Resize if too large\n",[1050,5689,5690,5693,5695,5697,5700,5702,5705],{"class":1052,"line":1583},[1050,5691,5692],{"class":1091},"        max_size ",[1050,5694,1757],{"class":1115},[1050,5696,4551],{"class":1115},[1050,5698,5699],{"class":1901},"1920",[1050,5701,1231],{"class":1115},[1050,5703,5704],{"class":1901}," 1080",[1050,5706,1146],{"class":1115},[1050,5708,5709,5711,5713,5715,5718,5720,5722,5724,5727,5730,5732,5734,5736,5738,5740,5742,5744,5746,5749,5751,5753,5755,5757,5759],{"class":1052,"line":1597},[1050,5710,2922],{"class":1087},[1050,5712,5616],{"class":1091},[1050,5714,1122],{"class":1115},[1050,5716,5717],{"class":1125},"size",[1050,5719,3113],{"class":1115},[1050,5721,5053],{"class":1901},[1050,5723,3122],{"class":1115},[1050,5725,5726],{"class":2219}," >",[1050,5728,5729],{"class":1091}," max_size",[1050,5731,3113],{"class":1115},[1050,5733,5053],{"class":1901},[1050,5735,3122],{"class":1115},[1050,5737,4572],{"class":2219},[1050,5739,5616],{"class":1091},[1050,5741,1122],{"class":1115},[1050,5743,5717],{"class":1125},[1050,5745,3113],{"class":1115},[1050,5747,5748],{"class":1901},"1",[1050,5750,3122],{"class":1115},[1050,5752,5726],{"class":2219},[1050,5754,5729],{"class":1091},[1050,5756,3113],{"class":1115},[1050,5758,5748],{"class":1901},[1050,5760,5761],{"class":1115},"]:\n",[1050,5763,5764,5767,5769,5772,5774,5777,5779,5781,5783,5786,5788,5792],{"class":1052,"line":1617},[1050,5765,5766],{"class":1091},"            image",[1050,5768,1122],{"class":1115},[1050,5770,5771],{"class":1131},"thumbnail",[1050,5773,1135],{"class":1115},[1050,5775,5776],{"class":1131},"max_size",[1050,5778,1231],{"class":1115},[1050,5780,5589],{"class":1131},[1050,5782,1122],{"class":1115},[1050,5784,5785],{"class":1125},"Resampling",[1050,5787,1122],{"class":1115},[1050,5789,5791],{"class":5790},"sFGJz","LANCZOS",[1050,5793,1146],{"class":1115},[1050,5795,5796],{"class":1052,"line":1630},[1050,5797,2888],{"class":1091},[1050,5799,5800],{"class":1052,"line":1645},[1050,5801,5802],{"class":1080},"        # Save optimized image\n",[1050,5804,5805,5808,5810,5813,5815,5818],{"class":1052,"line":1666},[1050,5806,5807],{"class":1091},"        output ",[1050,5809,1757],{"class":1115},[1050,5811,5812],{"class":1091}," io",[1050,5814,1122],{"class":1115},[1050,5816,5817],{"class":1131},"BytesIO",[1050,5819,2071],{"class":1115},[1050,5821,5822,5825,5827,5829,5831,5834,5836,5839,5841,5843,5846,5848,5850,5853,5855,5858,5860,5863,5865,5868],{"class":1052,"line":1671},[1050,5823,5824],{"class":1091},"        image",[1050,5826,1122],{"class":1115},[1050,5828,4083],{"class":1131},[1050,5830,1135],{"class":1115},[1050,5832,5833],{"class":1131},"output",[1050,5835,1231],{"class":1115},[1050,5837,5838],{"class":2017}," format",[1050,5840,1757],{"class":1115},[1050,5842,1139],{"class":1138},[1050,5844,5845],{"class":1060},"JPEG",[1050,5847,1139],{"class":1138},[1050,5849,1231],{"class":1115},[1050,5851,5852],{"class":2017}," quality",[1050,5854,1757],{"class":1115},[1050,5856,5857],{"class":1901},"85",[1050,5859,1231],{"class":1115},[1050,5861,5862],{"class":2017}," optimize",[1050,5864,1757],{"class":1115},[1050,5866,5867],{"class":1346},"True",[1050,5869,1146],{"class":1115},[1050,5871,5872,5875,5877,5879,5881,5883],{"class":1052,"line":1676},[1050,5873,5874],{"class":1091},"        output",[1050,5876,1122],{"class":1115},[1050,5878,5048],{"class":1131},[1050,5880,1135],{"class":1115},[1050,5882,5053],{"class":1901},[1050,5884,1146],{"class":1115},[1050,5886,5887],{"class":1052,"line":4670},[1050,5888,2888],{"class":1091},[1050,5890,5891,5893,5895,5897,5899,5901,5904],{"class":1052,"line":4677},[1050,5892,2969],{"class":1087},[1050,5894,5122],{"class":1131},[1050,5896,1135],{"class":1115},[1050,5898,5833],{"class":1131},[1050,5900,1122],{"class":1115},[1050,5902,5903],{"class":1131},"getvalue",[1050,5905,5906],{"class":1115},"())\n",[1030,5908,5910],{"id":5909},"security-and-access-control","Security and Access Control",[1035,5912,5914],{"id":5913},"signed-urls-for-private-files","Signed URLs for Private Files",[1040,5916,5918],{"className":1071,"code":5917,"language":1073,"meta":1045,"style":1045},"# views.py\nfrom django.http import HttpResponseRedirect\nfrom django.contrib.auth.decorators import login_required\nfrom botocore.exceptions import ClientError\nimport boto3\n\n@login_required\ndef serve_private_file(request, file_id):\n    \"\"\"Serve private file with signed URL\"\"\"\n    \n    try:\n        # Get file record\n        file_obj = PrivateFile.objects.get(id=file_id, user=request.user)\n        \n        # Generate signed URL\n        s3_client = boto3.client('s3')\n        signed_url = s3_client.generate_presigned_url(\n            'get_object',\n            Params={\n                'Bucket': settings.AWS_PRIVATE_BUCKET_NAME,\n                'Key': file_obj.file.name\n            },\n            ExpiresIn=3600  # 1 hour\n        )\n        \n        return HttpResponseRedirect(signed_url)\n        \n    except (PrivateFile.DoesNotExist, ClientError):\n        return HttpResponseForbidden()\n",[1047,5919,5920,5925,5941,5967,5984,5991,5995,6003,6023,6032,6036,6043,6048,6093,6097,6102,6128,6145,6156,6164,6185,6208,6213,6225,6229,6233,6247,6251,6273],{"__ignoreMap":1045},[1050,5921,5922],{"class":1052,"line":1053},[1050,5923,5924],{"class":1080},"# views.py\n",[1050,5926,5927,5929,5931,5933,5936,5938],{"class":1052,"line":1084},[1050,5928,1697],{"class":1087},[1050,5930,3610],{"class":1091},[1050,5932,1122],{"class":1115},[1050,5934,5935],{"class":1091},"http ",[1050,5937,1088],{"class":1087},[1050,5939,5940],{"class":1091}," HttpResponseRedirect\n",[1050,5942,5943,5945,5947,5949,5952,5954,5957,5959,5962,5964],{"class":1052,"line":1095},[1050,5944,1697],{"class":1087},[1050,5946,3610],{"class":1091},[1050,5948,1122],{"class":1115},[1050,5950,5951],{"class":1091},"contrib",[1050,5953,1122],{"class":1115},[1050,5955,5956],{"class":1091},"auth",[1050,5958,1122],{"class":1115},[1050,5960,5961],{"class":1091},"decorators ",[1050,5963,1088],{"class":1087},[1050,5965,5966],{"class":1091}," login_required\n",[1050,5968,5969,5971,5974,5976,5979,5981],{"class":1052,"line":1102},[1050,5970,1697],{"class":1087},[1050,5972,5973],{"class":1091}," botocore",[1050,5975,1122],{"class":1115},[1050,5977,5978],{"class":1091},"exceptions ",[1050,5980,1088],{"class":1087},[1050,5982,5983],{"class":1091}," ClientError\n",[1050,5985,5986,5988],{"class":1052,"line":1108},[1050,5987,1088],{"class":1087},[1050,5989,5990],{"class":1091}," boto3\n",[1050,5992,5993],{"class":1052,"line":1149},[1050,5994,1099],{"emptyLinePlaceholder":1098},[1050,5996,5997,6000],{"class":1052,"line":1177},[1050,5998,5999],{"class":1115},"@",[1050,6001,6002],{"class":2895},"login_required\n",[1050,6004,6005,6008,6011,6013,6016,6018,6021],{"class":1052,"line":1205},[1050,6006,6007],{"class":1263},"def",[1050,6009,6010],{"class":2895}," serve_private_file",[1050,6012,1135],{"class":1115},[1050,6014,6015],{"class":2825},"request",[1050,6017,1231],{"class":1115},[1050,6019,6020],{"class":2825}," file_id",[1050,6022,1736],{"class":1115},[1050,6024,6025,6027,6030],{"class":1052,"line":1244},[1050,6026,1742],{"class":1741},[1050,6028,6029],{"class":1745},"Serve private file with signed URL",[1050,6031,1749],{"class":1741},[1050,6033,6034],{"class":1052,"line":1249},[1050,6035,1973],{"class":1091},[1050,6037,6038,6041],{"class":1052,"line":1255},[1050,6039,6040],{"class":1087},"    try",[1050,6042,2932],{"class":1115},[1050,6044,6045],{"class":1052,"line":1281},[1050,6046,6047],{"class":1080},"        # Get file record\n",[1050,6049,6050,6053,6055,6058,6060,6063,6065,6067,6069,6072,6074,6077,6079,6082,6084,6086,6088,6091],{"class":1052,"line":1292},[1050,6051,6052],{"class":1091},"        file_obj ",[1050,6054,1757],{"class":1115},[1050,6056,6057],{"class":1091}," PrivateFile",[1050,6059,1122],{"class":1115},[1050,6061,6062],{"class":1125},"objects",[1050,6064,1122],{"class":1115},[1050,6066,1132],{"class":1131},[1050,6068,1135],{"class":1115},[1050,6070,6071],{"class":2017},"id",[1050,6073,1757],{"class":1115},[1050,6075,6076],{"class":1131},"file_id",[1050,6078,1231],{"class":1115},[1050,6080,6081],{"class":2017}," user",[1050,6083,1757],{"class":1115},[1050,6085,6015],{"class":1131},[1050,6087,1122],{"class":1115},[1050,6089,6090],{"class":1125},"user",[1050,6092,1146],{"class":1115},[1050,6094,6095],{"class":1052,"line":1316},[1050,6096,2888],{"class":1091},[1050,6098,6099],{"class":1052,"line":1322},[1050,6100,6101],{"class":1080},"        # Generate signed URL\n",[1050,6103,6104,6107,6109,6112,6114,6117,6119,6121,6124,6126],{"class":1052,"line":1338},[1050,6105,6106],{"class":1091},"        s3_client ",[1050,6108,1757],{"class":1115},[1050,6110,6111],{"class":1091}," boto3",[1050,6113,1122],{"class":1115},[1050,6115,6116],{"class":1131},"client",[1050,6118,1135],{"class":1115},[1050,6120,1139],{"class":1138},[1050,6122,6123],{"class":1060},"s3",[1050,6125,1139],{"class":1138},[1050,6127,1146],{"class":1115},[1050,6129,6130,6133,6135,6138,6140,6143],{"class":1052,"line":1350},[1050,6131,6132],{"class":1091},"        signed_url ",[1050,6134,1757],{"class":1115},[1050,6136,6137],{"class":1091}," s3_client",[1050,6139,1122],{"class":1115},[1050,6141,6142],{"class":1131},"generate_presigned_url",[1050,6144,2042],{"class":1115},[1050,6146,6147,6149,6152,6154],{"class":1052,"line":1360},[1050,6148,3095],{"class":1138},[1050,6150,6151],{"class":1060},"get_object",[1050,6153,1139],{"class":1138},[1050,6155,1313],{"class":1115},[1050,6157,6158,6161],{"class":1052,"line":1365},[1050,6159,6160],{"class":2017},"            Params",[1050,6162,6163],{"class":1115},"={\n",[1050,6165,6166,6168,6171,6173,6175,6178,6180,6183],{"class":1052,"line":1371},[1050,6167,5168],{"class":1138},[1050,6169,6170],{"class":1060},"Bucket",[1050,6172,1139],{"class":1138},[1050,6174,1303],{"class":1115},[1050,6176,6177],{"class":1131}," settings",[1050,6179,1122],{"class":1115},[1050,6181,6182],{"class":5790},"AWS_PRIVATE_BUCKET_NAME",[1050,6184,1313],{"class":1115},[1050,6186,6187,6189,6192,6194,6196,6199,6201,6203,6205],{"class":1052,"line":1381},[1050,6188,5168],{"class":1138},[1050,6190,6191],{"class":1060},"Key",[1050,6193,1139],{"class":1138},[1050,6195,1303],{"class":1115},[1050,6197,6198],{"class":1131}," file_obj",[1050,6200,1122],{"class":1115},[1050,6202,4013],{"class":1125},[1050,6204,1122],{"class":1115},[1050,6206,6207],{"class":1125},"name\n",[1050,6209,6210],{"class":1052,"line":1397},[1050,6211,6212],{"class":1115},"            },\n",[1050,6214,6215,6218,6220,6223],{"class":1052,"line":1420},[1050,6216,6217],{"class":2017},"            ExpiresIn",[1050,6219,1757],{"class":1115},[1050,6221,6222],{"class":1901},"3600",[1050,6224,1905],{"class":1080},[1050,6226,6227],{"class":1052,"line":1434},[1050,6228,3105],{"class":1115},[1050,6230,6231],{"class":1052,"line":1452},[1050,6232,2888],{"class":1091},[1050,6234,6235,6237,6240,6242,6245],{"class":1052,"line":1469},[1050,6236,2969],{"class":1087},[1050,6238,6239],{"class":1131}," HttpResponseRedirect",[1050,6241,1135],{"class":1115},[1050,6243,6244],{"class":1131},"signed_url",[1050,6246,1146],{"class":1115},[1050,6248,6249],{"class":1052,"line":1486},[1050,6250,2888],{"class":1091},[1050,6252,6253,6256,6258,6261,6263,6266,6268,6271],{"class":1052,"line":1503},[1050,6254,6255],{"class":1087},"    except",[1050,6257,4551],{"class":1115},[1050,6259,6260],{"class":1091},"PrivateFile",[1050,6262,1122],{"class":1115},[1050,6264,6265],{"class":1125},"DoesNotExist",[1050,6267,1231],{"class":1115},[1050,6269,6270],{"class":1091}," ClientError",[1050,6272,1736],{"class":1115},[1050,6274,6275,6277,6280],{"class":1052,"line":1520},[1050,6276,2969],{"class":1087},[1050,6278,6279],{"class":1131}," HttpResponseForbidden",[1050,6281,2071],{"class":1115},[1035,6283,6285],{"id":6284},"access-control-with-iam-policies","Access Control with IAM Policies",[1040,6287,6291],{"className":6288,"code":6289,"language":6290,"meta":1045,"style":1045},"language-json shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"s3:GetObject\",\n        \"s3:PutObject\",\n        \"s3:DeleteObject\"\n      ],\n      \"Resource\": \"arn:aws:s3:::my-bucket/uploads/*\"\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"s3:ListBucket\"\n      ],\n      \"Resource\": \"arn:aws:s3:::my-bucket\",\n      \"Condition\": {\n        \"StringLike\": {\n          \"s3:prefix\": \"uploads/*\"\n        }\n      }\n    }\n  ]\n}\n","json",[1047,6292,6293,6298,6321,6335,6340,6361,6374,6385,6396,6405,6410,6428,6432,6436,6454,6466,6475,6479,6498,6511,6525,6545,6550,6555,6560,6565],{"__ignoreMap":1045},[1050,6294,6295],{"class":1052,"line":1053},[1050,6296,6297],{"class":1115},"{\n",[1050,6299,6300,6304,6308,6310,6312,6314,6317,6319],{"class":1052,"line":1084},[1050,6301,6303],{"class":6302},"s4Jsk","  \"",[1050,6305,6307],{"class":6306},"sLorS","Version",[1050,6309,1390],{"class":6302},[1050,6311,1303],{"class":1115},[1050,6313,1410],{"class":1138},[1050,6315,6316],{"class":1060},"2012-10-17",[1050,6318,1390],{"class":1138},[1050,6320,1313],{"class":1115},[1050,6322,6323,6325,6328,6330,6332],{"class":1052,"line":1095},[1050,6324,6303],{"class":6302},[1050,6326,6327],{"class":6306},"Statement",[1050,6329,1390],{"class":6302},[1050,6331,1303],{"class":1115},[1050,6333,6334],{"class":1115}," [\n",[1050,6336,6337],{"class":1052,"line":1102},[1050,6338,6339],{"class":1115},"    {\n",[1050,6341,6342,6345,6348,6350,6352,6354,6357,6359],{"class":1052,"line":1108},[1050,6343,6344],{"class":6302},"      \"",[1050,6346,6347],{"class":2841},"Effect",[1050,6349,1390],{"class":6302},[1050,6351,1303],{"class":1115},[1050,6353,1410],{"class":1138},[1050,6355,6356],{"class":1060},"Allow",[1050,6358,1390],{"class":1138},[1050,6360,1313],{"class":1115},[1050,6362,6363,6365,6368,6370,6372],{"class":1052,"line":1149},[1050,6364,6344],{"class":6302},[1050,6366,6367],{"class":2841},"Action",[1050,6369,1390],{"class":6302},[1050,6371,1303],{"class":1115},[1050,6373,6334],{"class":1115},[1050,6375,6376,6378,6381,6383],{"class":1052,"line":1177},[1050,6377,1400],{"class":1138},[1050,6379,6380],{"class":1060},"s3:GetObject",[1050,6382,1390],{"class":1138},[1050,6384,1313],{"class":1115},[1050,6386,6387,6389,6392,6394],{"class":1052,"line":1205},[1050,6388,1400],{"class":1138},[1050,6390,6391],{"class":1060},"s3:PutObject",[1050,6393,1390],{"class":1138},[1050,6395,1313],{"class":1115},[1050,6397,6398,6400,6403],{"class":1052,"line":1244},[1050,6399,1400],{"class":1138},[1050,6401,6402],{"class":1060},"s3:DeleteObject",[1050,6404,2964],{"class":1138},[1050,6406,6407],{"class":1052,"line":1249},[1050,6408,6409],{"class":1115},"      ],\n",[1050,6411,6412,6414,6417,6419,6421,6423,6426],{"class":1052,"line":1255},[1050,6413,6344],{"class":6302},[1050,6415,6416],{"class":2841},"Resource",[1050,6418,1390],{"class":6302},[1050,6420,1303],{"class":1115},[1050,6422,1410],{"class":1138},[1050,6424,6425],{"class":1060},"arn:aws:s3:::my-bucket/uploads/*",[1050,6427,2964],{"class":1138},[1050,6429,6430],{"class":1052,"line":1281},[1050,6431,1580],{"class":1115},[1050,6433,6434],{"class":1052,"line":1292},[1050,6435,6339],{"class":1115},[1050,6437,6438,6440,6442,6444,6446,6448,6450,6452],{"class":1052,"line":1316},[1050,6439,6344],{"class":6302},[1050,6441,6347],{"class":2841},[1050,6443,1390],{"class":6302},[1050,6445,1303],{"class":1115},[1050,6447,1410],{"class":1138},[1050,6449,6356],{"class":1060},[1050,6451,1390],{"class":1138},[1050,6453,1313],{"class":1115},[1050,6455,6456,6458,6460,6462,6464],{"class":1052,"line":1322},[1050,6457,6344],{"class":6302},[1050,6459,6367],{"class":2841},[1050,6461,1390],{"class":6302},[1050,6463,1303],{"class":1115},[1050,6465,6334],{"class":1115},[1050,6467,6468,6470,6473],{"class":1052,"line":1338},[1050,6469,1400],{"class":1138},[1050,6471,6472],{"class":1060},"s3:ListBucket",[1050,6474,2964],{"class":1138},[1050,6476,6477],{"class":1052,"line":1350},[1050,6478,6409],{"class":1115},[1050,6480,6481,6483,6485,6487,6489,6491,6494,6496],{"class":1052,"line":1360},[1050,6482,6344],{"class":6302},[1050,6484,6416],{"class":2841},[1050,6486,1390],{"class":6302},[1050,6488,1303],{"class":1115},[1050,6490,1410],{"class":1138},[1050,6492,6493],{"class":1060},"arn:aws:s3:::my-bucket",[1050,6495,1390],{"class":1138},[1050,6497,1313],{"class":1115},[1050,6499,6500,6502,6505,6507,6509],{"class":1052,"line":1365},[1050,6501,6344],{"class":6302},[1050,6503,6504],{"class":2841},"Condition",[1050,6506,1390],{"class":6302},[1050,6508,1303],{"class":1115},[1050,6510,1289],{"class":1115},[1050,6512,6513,6515,6519,6521,6523],{"class":1052,"line":1371},[1050,6514,1400],{"class":6302},[1050,6516,6518],{"class":6517},"skNjk","StringLike",[1050,6520,1390],{"class":6302},[1050,6522,1303],{"class":1115},[1050,6524,1289],{"class":1115},[1050,6526,6527,6530,6534,6536,6538,6540,6543],{"class":1052,"line":1381},[1050,6528,6529],{"class":6302},"          \"",[1050,6531,6533],{"class":6532},"suXOh","s3:prefix",[1050,6535,1390],{"class":6302},[1050,6537,1303],{"class":1115},[1050,6539,1410],{"class":1138},[1050,6541,6542],{"class":1060},"uploads/*",[1050,6544,2964],{"class":1138},[1050,6546,6547],{"class":1052,"line":1397},[1050,6548,6549],{"class":1115},"        }\n",[1050,6551,6552],{"class":1052,"line":1420},[1050,6553,6554],{"class":1115},"      }\n",[1050,6556,6557],{"class":1052,"line":1434},[1050,6558,6559],{"class":1115},"    }\n",[1050,6561,6562],{"class":1052,"line":1452},[1050,6563,6564],{"class":1115},"  ]\n",[1050,6566,6567],{"class":1052,"line":1469},[1050,6568,1319],{"class":1115},[1030,6570,6572],{"id":6571},"monitoring-and-analytics","Monitoring and Analytics",[1035,6574,6576],{"id":6575},"cloud-storage-metrics","Cloud Storage Metrics",[1040,6578,6580],{"className":1071,"code":6579,"language":1073,"meta":1045,"style":1045},"# monitoring.py\nimport boto3\nfrom django.core.management.base import BaseCommand\n\nclass Command(BaseCommand):\n    \"\"\"Monitor S3 storage usage\"\"\"\n    \n    def handle(self, *args, **options):\n        s3_client = boto3.client('s3')\n        cloudwatch = boto3.client('cloudwatch')\n        \n        # Get bucket metrics\n        response = cloudwatch.get_metric_statistics(\n            Namespace='AWS/S3',\n            MetricName='BucketSizeBytes',\n            Dimensions=[\n                {\n                    'Name': 'BucketName',\n                    'Value': settings.AWS_STORAGE_BUCKET_NAME\n                },\n                {\n                    'Name': 'StorageType',\n                    'Value': 'StandardStorage'\n                }\n            ],\n            StartTime=datetime.utcnow() - timedelta(days=1),\n            EndTime=datetime.utcnow(),\n            Period=86400,\n            Statistics=['Average']\n        )\n        \n        if response['Datapoints']:\n            size_bytes = response['Datapoints'][0]['Average']\n            size_gb = size_bytes / (1024**3)\n            self.stdout.write(f\"Bucket size: {size_gb:.2f} GB\")\n",[1047,6581,6582,6587,6593,6617,6621,6635,6644,6648,6674,6696,6720,6724,6729,6746,6762,6778,6786,6791,6812,6830,6835,6839,6858,6875,6880,6885,6921,6937,6949,6967,6971,6975,6993,7025,7050],{"__ignoreMap":1045},[1050,6583,6584],{"class":1052,"line":1053},[1050,6585,6586],{"class":1080},"# monitoring.py\n",[1050,6588,6589,6591],{"class":1052,"line":1084},[1050,6590,1088],{"class":1087},[1050,6592,5990],{"class":1091},[1050,6594,6595,6597,6599,6601,6603,6605,6608,6610,6612,6614],{"class":1052,"line":1095},[1050,6596,1697],{"class":1087},[1050,6598,3610],{"class":1091},[1050,6600,1122],{"class":1115},[1050,6602,4128],{"class":1091},[1050,6604,1122],{"class":1115},[1050,6606,6607],{"class":1091},"management",[1050,6609,1122],{"class":1115},[1050,6611,4908],{"class":1091},[1050,6613,1088],{"class":1087},[1050,6615,6616],{"class":1091}," BaseCommand\n",[1050,6618,6619],{"class":1052,"line":1102},[1050,6620,1099],{"emptyLinePlaceholder":1098},[1050,6622,6623,6625,6628,6630,6633],{"class":1052,"line":1108},[1050,6624,1724],{"class":1263},[1050,6626,6627],{"class":1727}," Command",[1050,6629,1135],{"class":1115},[1050,6631,6632],{"class":1056},"BaseCommand",[1050,6634,1736],{"class":1115},[1050,6636,6637,6639,6642],{"class":1052,"line":1149},[1050,6638,1742],{"class":1741},[1050,6640,6641],{"class":1745},"Monitor S3 storage usage",[1050,6643,1749],{"class":1741},[1050,6645,6646],{"class":1052,"line":1177},[1050,6647,1973],{"class":1091},[1050,6649,6650,6652,6655,6657,6659,6661,6663,6665,6667,6669,6672],{"class":1052,"line":1205},[1050,6651,2808],{"class":1263},[1050,6653,6654],{"class":2895}," handle",[1050,6656,1135],{"class":1115},[1050,6658,2818],{"class":2817},[1050,6660,1231],{"class":1115},[1050,6662,2220],{"class":2219},[1050,6664,2826],{"class":2825},[1050,6666,1231],{"class":1115},[1050,6668,2831],{"class":2219},[1050,6670,6671],{"class":2825},"options",[1050,6673,1736],{"class":1115},[1050,6675,6676,6678,6680,6682,6684,6686,6688,6690,6692,6694],{"class":1052,"line":1244},[1050,6677,6106],{"class":1091},[1050,6679,1757],{"class":1115},[1050,6681,6111],{"class":1091},[1050,6683,1122],{"class":1115},[1050,6685,6116],{"class":1131},[1050,6687,1135],{"class":1115},[1050,6689,1139],{"class":1138},[1050,6691,6123],{"class":1060},[1050,6693,1139],{"class":1138},[1050,6695,1146],{"class":1115},[1050,6697,6698,6701,6703,6705,6707,6709,6711,6713,6716,6718],{"class":1052,"line":1249},[1050,6699,6700],{"class":1091},"        cloudwatch ",[1050,6702,1757],{"class":1115},[1050,6704,6111],{"class":1091},[1050,6706,1122],{"class":1115},[1050,6708,6116],{"class":1131},[1050,6710,1135],{"class":1115},[1050,6712,1139],{"class":1138},[1050,6714,6715],{"class":1060},"cloudwatch",[1050,6717,1139],{"class":1138},[1050,6719,1146],{"class":1115},[1050,6721,6722],{"class":1052,"line":1255},[1050,6723,2888],{"class":1091},[1050,6725,6726],{"class":1052,"line":1281},[1050,6727,6728],{"class":1080},"        # Get bucket metrics\n",[1050,6730,6731,6734,6736,6739,6741,6744],{"class":1052,"line":1292},[1050,6732,6733],{"class":1091},"        response ",[1050,6735,1757],{"class":1115},[1050,6737,6738],{"class":1091}," cloudwatch",[1050,6740,1122],{"class":1115},[1050,6742,6743],{"class":1131},"get_metric_statistics",[1050,6745,2042],{"class":1115},[1050,6747,6748,6751,6753,6755,6758,6760],{"class":1052,"line":1316},[1050,6749,6750],{"class":2017},"            Namespace",[1050,6752,1757],{"class":1115},[1050,6754,1139],{"class":1138},[1050,6756,6757],{"class":1060},"AWS/S3",[1050,6759,1139],{"class":1138},[1050,6761,1313],{"class":1115},[1050,6763,6764,6767,6769,6771,6774,6776],{"class":1052,"line":1322},[1050,6765,6766],{"class":2017},"            MetricName",[1050,6768,1757],{"class":1115},[1050,6770,1139],{"class":1138},[1050,6772,6773],{"class":1060},"BucketSizeBytes",[1050,6775,1139],{"class":1138},[1050,6777,1313],{"class":1115},[1050,6779,6780,6783],{"class":1052,"line":1338},[1050,6781,6782],{"class":2017},"            Dimensions",[1050,6784,6785],{"class":1115},"=[\n",[1050,6787,6788],{"class":1052,"line":1350},[1050,6789,6790],{"class":1115},"                {\n",[1050,6792,6793,6796,6799,6801,6803,6805,6808,6810],{"class":1052,"line":1360},[1050,6794,6795],{"class":1138},"                    '",[1050,6797,6798],{"class":1060},"Name",[1050,6800,1139],{"class":1138},[1050,6802,1303],{"class":1115},[1050,6804,1234],{"class":1138},[1050,6806,6807],{"class":1060},"BucketName",[1050,6809,1139],{"class":1138},[1050,6811,1313],{"class":1115},[1050,6813,6814,6816,6819,6821,6823,6825,6827],{"class":1052,"line":1365},[1050,6815,6795],{"class":1138},[1050,6817,6818],{"class":1060},"Value",[1050,6820,1139],{"class":1138},[1050,6822,1303],{"class":1115},[1050,6824,6177],{"class":1131},[1050,6826,1122],{"class":1115},[1050,6828,6829],{"class":5790},"AWS_STORAGE_BUCKET_NAME\n",[1050,6831,6832],{"class":1052,"line":1371},[1050,6833,6834],{"class":1115},"                },\n",[1050,6836,6837],{"class":1052,"line":1381},[1050,6838,6790],{"class":1115},[1050,6840,6841,6843,6845,6847,6849,6851,6854,6856],{"class":1052,"line":1397},[1050,6842,6795],{"class":1138},[1050,6844,6798],{"class":1060},[1050,6846,1139],{"class":1138},[1050,6848,1303],{"class":1115},[1050,6850,1234],{"class":1138},[1050,6852,6853],{"class":1060},"StorageType",[1050,6855,1139],{"class":1138},[1050,6857,1313],{"class":1115},[1050,6859,6860,6862,6864,6866,6868,6870,6873],{"class":1052,"line":1420},[1050,6861,6795],{"class":1138},[1050,6863,6818],{"class":1060},[1050,6865,1139],{"class":1138},[1050,6867,1303],{"class":1115},[1050,6869,1234],{"class":1138},[1050,6871,6872],{"class":1060},"StandardStorage",[1050,6874,1335],{"class":1138},[1050,6876,6877],{"class":1052,"line":1434},[1050,6878,6879],{"class":1115},"                }\n",[1050,6881,6882],{"class":1052,"line":1452},[1050,6883,6884],{"class":1115},"            ],\n",[1050,6886,6887,6890,6892,6895,6897,6900,6903,6906,6909,6911,6914,6916,6918],{"class":1052,"line":1469},[1050,6888,6889],{"class":2017},"            StartTime",[1050,6891,1757],{"class":1115},[1050,6893,6894],{"class":1131},"datetime",[1050,6896,1122],{"class":1115},[1050,6898,6899],{"class":1131},"utcnow",[1050,6901,6902],{"class":1115},"()",[1050,6904,6905],{"class":2219}," -",[1050,6907,6908],{"class":1131}," timedelta",[1050,6910,1135],{"class":1115},[1050,6912,6913],{"class":2017},"days",[1050,6915,1757],{"class":1115},[1050,6917,5748],{"class":1901},[1050,6919,6920],{"class":1115},"),\n",[1050,6922,6923,6926,6928,6930,6932,6934],{"class":1052,"line":1486},[1050,6924,6925],{"class":2017},"            EndTime",[1050,6927,1757],{"class":1115},[1050,6929,6894],{"class":1131},[1050,6931,1122],{"class":1115},[1050,6933,6899],{"class":1131},[1050,6935,6936],{"class":1115},"(),\n",[1050,6938,6939,6942,6944,6947],{"class":1052,"line":1503},[1050,6940,6941],{"class":2017},"            Period",[1050,6943,1757],{"class":1115},[1050,6945,6946],{"class":1901},"86400",[1050,6948,1313],{"class":1115},[1050,6950,6951,6954,6957,6959,6962,6964],{"class":1052,"line":1520},[1050,6952,6953],{"class":2017},"            Statistics",[1050,6955,6956],{"class":1115},"=[",[1050,6958,1139],{"class":1138},[1050,6960,6961],{"class":1060},"Average",[1050,6963,1139],{"class":1138},[1050,6965,6966],{"class":1115},"]\n",[1050,6968,6969],{"class":1052,"line":1537},[1050,6970,3105],{"class":1115},[1050,6972,6973],{"class":1052,"line":1554},[1050,6974,2888],{"class":1091},[1050,6976,6977,6979,6982,6984,6986,6989,6991],{"class":1052,"line":1571},[1050,6978,2922],{"class":1087},[1050,6980,6981],{"class":1091}," response",[1050,6983,3113],{"class":1115},[1050,6985,1139],{"class":1138},[1050,6987,6988],{"class":1060},"Datapoints",[1050,6990,1139],{"class":1138},[1050,6992,5761],{"class":1115},[1050,6994,6995,6998,7000,7002,7004,7006,7008,7010,7013,7015,7017,7019,7021,7023],{"class":1052,"line":1577},[1050,6996,6997],{"class":1091},"            size_bytes ",[1050,6999,1757],{"class":1115},[1050,7001,6981],{"class":1091},[1050,7003,3113],{"class":1115},[1050,7005,1139],{"class":1138},[1050,7007,6988],{"class":1060},[1050,7009,1139],{"class":1138},[1050,7011,7012],{"class":1115},"][",[1050,7014,5053],{"class":1901},[1050,7016,7012],{"class":1115},[1050,7018,1139],{"class":1138},[1050,7020,6961],{"class":1060},[1050,7022,1139],{"class":1138},[1050,7024,6966],{"class":1115},[1050,7026,7027,7030,7032,7035,7037,7039,7042,7045,7048],{"class":1052,"line":1583},[1050,7028,7029],{"class":1091},"            size_gb ",[1050,7031,1757],{"class":1115},[1050,7033,7034],{"class":1091}," size_bytes ",[1050,7036,2954],{"class":2219},[1050,7038,4551],{"class":1115},[1050,7040,7041],{"class":1901},"1024",[1050,7043,7044],{"class":2219},"**",[1050,7046,7047],{"class":1901},"3",[1050,7049,1146],{"class":1115},[1050,7051,7052,7054,7056,7059,7061,7064,7066,7068,7071,7073,7076,7079,7081,7084],{"class":1052,"line":1597},[1050,7053,4060],{"class":1111},[1050,7055,1122],{"class":1115},[1050,7057,7058],{"class":1125},"stdout",[1050,7060,1122],{"class":1115},[1050,7062,7063],{"class":1131},"write",[1050,7065,1135],{"class":1115},[1050,7067,4349],{"class":1263},[1050,7069,7070],{"class":1060},"\"Bucket size: ",[1050,7072,1270],{"class":1269},[1050,7074,7075],{"class":1131},"size_gb",[1050,7077,7078],{"class":1263},":.2f",[1050,7080,1275],{"class":1269},[1050,7082,7083],{"class":1060}," GB\"",[1050,7085,1146],{"class":1115},[1030,7087,921],{"id":7088},"best-practices",[1035,7090,7092],{"id":7091},"performance","Performance",[7094,7095,7096,7100,7103,7106],"ul",{},[7097,7098,7099],"li",{},"Use CDN for static assets and frequently accessed files",[7097,7101,7102],{},"Implement proper caching headers",[7097,7104,7105],{},"Compress files when appropriate",[7097,7107,7108],{},"Use multipart uploads for large files",[1035,7110,541],{"id":7111},"security",[7094,7113,7114,7117,7120,7123],{},[7097,7115,7116],{},"Use IAM roles and policies for access control",[7097,7118,7119],{},"Implement signed URLs for private files",[7097,7121,7122],{},"Validate file types and content",[7097,7124,7125],{},"Enable versioning and backup strategies",[1035,7127,7129],{"id":7128},"cost-optimization","Cost Optimization",[7094,7131,7132,7135,7138,7141],{},[7097,7133,7134],{},"Use appropriate storage classes (Standard, IA, Glacier)",[7097,7136,7137],{},"Implement lifecycle policies",[7097,7139,7140],{},"Monitor usage and costs",[7097,7142,7143],{},"Clean up unused files regularly",[1035,7145,7147],{"id":7146},"reliability","Reliability",[7094,7149,7150,7153,7156,7159],{},[7097,7151,7152],{},"Implement failover strategies",[7097,7154,7155],{},"Use multiple regions for critical files",[7097,7157,7158],{},"Monitor service health and performance",[7097,7160,7161],{},"Have backup and recovery plans",[1030,7163,7165],{"id":7164},"next-steps","Next Steps",[1026,7167,7168],{},"Now that you understand cloud storage integration, let's explore how to manage media files effectively in production environments, including optimization, security, and scaling strategies.",[7170,7171,7172],"style",{},"html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}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 .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .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 .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--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 .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}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 .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}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 .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s4Jsk, html code.shiki .s4Jsk{--shiki-light:#39ADB5;--shiki-default:#99841877;--shiki-dark:#B8A96577}html pre.shiki code .sLorS, html code.shiki .sLorS{--shiki-light:#9C3EDA;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .skNjk, html code.shiki .skNjk{--shiki-light:#F76D47;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .suXOh, html code.shiki .suXOh{--shiki-light:#E53935;--shiki-default:#998418;--shiki-dark:#B8A965}",{"title":1045,"searchDepth":1053,"depth":1084,"links":7174},[7175,7181,7186,7191,7195,7200,7204,7207,7213],{"id":1032,"depth":1084,"text":1033,"children":7176},[7177,7178,7179,7180],{"id":1037,"depth":1095,"text":1038},{"id":1067,"depth":1095,"text":1068},{"id":1681,"depth":1095,"text":1682},{"id":2124,"depth":1095,"text":2125},{"id":2379,"depth":1084,"text":2380,"children":7182},[7183,7184,7185],{"id":2383,"depth":1095,"text":1038},{"id":2400,"depth":1095,"text":1068},{"id":2705,"depth":1095,"text":2706},{"id":3152,"depth":1084,"text":3153,"children":7187},[7188,7189,7190],{"id":3156,"depth":1095,"text":1038},{"id":3173,"depth":1095,"text":1068},{"id":3411,"depth":1095,"text":3412},{"id":3589,"depth":1084,"text":3590,"children":7192},[7193,7194],{"id":3593,"depth":1095,"text":3594},{"id":4100,"depth":1095,"text":4101},{"id":4710,"depth":1084,"text":4711,"children":7196},[7197,7198,7199],{"id":4714,"depth":1095,"text":4715},{"id":4865,"depth":1095,"text":4866},{"id":5239,"depth":1095,"text":5240},{"id":5909,"depth":1084,"text":5910,"children":7201},[7202,7203],{"id":5913,"depth":1095,"text":5914},{"id":6284,"depth":1095,"text":6285},{"id":6571,"depth":1084,"text":6572,"children":7205},[7206],{"id":6575,"depth":1095,"text":6576},{"id":7088,"depth":1084,"text":921,"children":7208},[7209,7210,7211,7212],{"id":7091,"depth":1095,"text":7092},{"id":7111,"depth":1095,"text":541},{"id":7128,"depth":1095,"text":7129},{"id":7146,"depth":1095,"text":7147},{"id":7164,"depth":1084,"text":7165},"md",null,{},{"title":481,"description":1028},"8mmMxwkddIzajNqU0CKpz5f9drivU0c3HHWvnpI8Tcc",[7220,7222],{"title":477,"path":478,"stem":479,"description":7221,"children":-1},"Django's storage system provides an abstraction layer for file operations, allowing you to switch between different storage backends without changing your application code. This flexibility is essential for scalable applications that need to handle files efficiently.",{"title":485,"path":486,"stem":487,"description":7223,"children":-1},"Production media management requires careful consideration of performance, security, scalability, and cost. This chapter covers best practices and strategies for handling files in production Django applications.",1772474933866]