{"id":3294,"date":"2018-02-03T02:39:52","date_gmt":"2018-02-03T02:39:52","guid":{"rendered":"https:\/\/www.botreetechnologies.com\/blog\/?p=3294"},"modified":"2026-03-27T17:25:25","modified_gmt":"2026-03-27T11:55:25","slug":"django-asset-compression-and-storages","status":"publish","type":"post","link":"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/","title":{"rendered":"Django\u200aCompression and Storages"},"content":{"rendered":"\n<p>Django is an amazing <a href=\"https:\/\/www.botreetechnologies.com\/django-development\" target=\"_blank\" rel=\"noreferrer noopener\">Python-based framework<\/a> for building web applications. It is highly useful for statistics and numerical computations to develop AI apps. However, it also faces a few issues that need to be resolved through integrations.<\/p>\n\n\n\n<p>In our recent project, which is more or less similar to Airbnb, we face an issue related to CSS\/JS browser caching.<\/p>\n\n\n\n<p>The problem was, once we change something in the CSS\/JS, that change was not getting reflected on the client side and browser was taking the old files from the cache.<\/p>\n\n\n\n<p>To avoid this, we needed a mechanism to refresh the cache once anything has changed in the CSS\/JS.<\/p>\n\n\n\n<p>The obvious approach was to change the name or attach a version number to a CSS file each time we make a change. But we wanted this process to be automated so we came across <i>Django-compressor<\/i>.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><strong>Checkout <a href=\"https:\/\/www.botreetechnologies.com\/blog\/django-web-framework-startups\/\" target=\"_blank\" rel=\"noreferrer noopener\">7 reasons Django Web Framework is Perfect for Startups<\/a><\/strong><\/p><\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Django Compressor<\/h2>\n\n\n\n<p><i>Django-compressor<\/i> creates a versioned CSS\/JS file and stores it at a particular location provided by us. Django compress css creates a <i>manifest.json<\/i> file which has the mapping between the versioned files and the original files.<\/p>\n\n\n\n<p>On the client side versioned CSS\/JS files are rendered and not the original one in the Django pipeline.. It comes with an additional advantage that all these files are compressed and gzipped to reduce the loading time.<\/p>\n\n\n\n<p>Each time there is a change in the file, we need to run the compress command which will generate a new versioned file so that the browser automatically replaces the file into its cache.<\/p>\n\n\n\n<p>You can install <i><code>django_compressor<\/code><\/i> by running the following command.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><code>$ pip install django_compressor<\/code><\/p><\/blockquote>\n\n\n\n<p>We were serving our static files from <a href=\"https:\/\/aws.amazon.com\/s3\/\">Amazon S3<\/a>. Django Compressor requires files to be compressed in the local file system cache. Django Compressor is basically a <a href=\"https:\/\/docs.djangoproject.com\/en\/2.0\/topics\/http\/middleware\/\">middle-ware<\/a>.<\/p>\n\n\n\n<p>Middle-ware acts as a hook between request and response. Django Compressor css provides hooks to automatically have compressed files pushed to a remote back-end storage.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><b>Boto storage with Amazon S3<\/b><\/h3>\n\n\n\n<p>We used <a href=\"https:\/\/www.botreetechnologies.com\/blog\/complete-guide-for-implementing-amazon-s3-using-rails\/\" target=\"_blank\" rel=\"noreferrer noopener\">Amazon S3<\/a> to serve our static files so we need a backend storage to work with Amazon. We have used the <i>boto<\/i> backend storage from <i>Django-storages<\/i>.<\/p>\n\n\n\n<p>Run the following command to install <i>Django-storages<\/i><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><code>$ pip install django_storage<\/code><\/p><\/blockquote>\n\n\n\n<p>After this, we need to make the following changes in our <i>settings.py<\/i> to give the location of storage and for the compressed files.<script src=\"https:\/\/gist.github.com\/yogendra-btc\/034c55f526502fb5a2c45ff001db1adb.js\"><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>We have specified our Amazon S3 base URL in AWS_S3_CUSTOM_DOMAIN.<\/li><li>Make sure the COMPRESS_ROOT and STATIC_ROOT settings need to be the same.<\/li><li>We need to set COMPRESS_STORAGE and STATICFILES_STORAGE settings to our custom cached back-end storage.<\/li><li>We need to set STATIC_URL and COMPRESS_URL to be the same in order to serve static files correctly.<\/li><li>We also need to create a subclass to use S3 storage back-end to save files locally too.<\/li><\/ul>\n\n\n\n<p>As you can see we have used <i>mysite.storage.s3utils.CachedS3BotoStorage<\/i> as a value for <i>STATICFILES_STORAGE<\/i>, this basically gives us the path for the compressed files.<\/p>\n\n\n\n<p>So we create a separate file named <i>storage_backend.py<\/i> inside project folder with following code<script src=\"https:\/\/gist.github.com\/yogendra-btc\/3ac2ce7f8dd1c321c13acc2d282342f4.js\"><\/p>\n\n\n\n<p><b>Changes in a Template<\/b><\/p>\n\n\n\n<p>First, we need to load the <i>compress<\/i> tag at the top of the HTML file.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Everything enclosed within <code>{% compress %}<\/code> block will be considered as a code to be compressed.<\/li><li>You need to create <code>{% compress css %}<\/code> block to compress CSS files.<\/li><li><code>{% compress js % }<\/code> block is used to compress JS files.<\/li><li>We can use inline parameter inside <code>{% compress js inline %}<\/code> block for inline or local JS.<\/li><\/ul>\n\n\n\n<p><i>django_compression<\/i> links the inline JS\/CSS into a single cached file. So it will reduce the load from a browser and your response time become more faster.<script src=\"https:\/\/gist.github.com\/yogendra-btc\/eb6ff58fe7b5b358476b523d93753e70.js\"><\/p>\n\n\n\n<p>Please note that you cannot use context variable inside inline js block if you are using compress.<\/p>\n\n\n\n<p>Please refer the below example for invalid inline js.<script src=\"https:\/\/gist.github.com\/yogendra-btc\/c28e51d7a23b4608e87e9db80a2589f8.js\"><\/p>\n\n\n\n<p>Finally, we need to ask the framework to generate the compressed CSS\/JS so we need to run <i>collectstatic<\/i> first and then the compress command as follows.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><code>$ python manage.py collectstatic<\/code><\/p><p>$ python manage.py compress<\/p><\/blockquote>\n\n\n\n<p>And we are done, it will push all the CSS\/JS to the S3 and changes will be reflected in the browser!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/www.botreetechnologies.com\/contact\" target=\"_blank\" rel=\"noopener noreferrer\">Consulting is free<\/a> - let us help you grow!<\/h3>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Django is an amazing Python-based framework for building web applications&#8230;.<\/p>\n","protected":false},"author":27,"featured_media":14451,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[68,10],"tags":[],"class_list":["post-3294","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-django","category-technology"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Django\u200aCompression and Storages<\/title>\n<meta name=\"description\" content=\"The obvious approach was to change the name or attach a version number to a CSS file each time we make a change. But we wanted this process to be automated so we came across Django-compressor.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Django\u200aCompression and Storages\" \/>\n<meta property=\"og:description\" content=\"The obvious approach was to change the name or attach a version number to a CSS file each time we make a change. But we wanted this process to be automated so we came across Django-compressor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/\" \/>\n<meta property=\"og:site_name\" content=\"BoTree Technologies\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/BoTreeTechnologies\/\" \/>\n<meta property=\"article:published_time\" content=\"2018-02-03T02:39:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-27T11:55:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.botreetechnologies.com\/blog\/wp-content\/uploads\/2018\/02\/django-asset-compression-and-storages.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"852\" \/>\n\t<meta property=\"og:image:height\" content=\"479\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Yogendra Katewa\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@BoTreeTech\" \/>\n<meta name=\"twitter:site\" content=\"@BoTreeTech\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Yogendra Katewa\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/\"},\"author\":{\"name\":\"Yogendra Katewa\",\"@id\":\"https:\/\/www.botreetechnologies.com\/blog\/#\/schema\/person\/6d6e7cb5fcfc8a2d634d736b2e972d42\"},\"headline\":\"Django\u200aCompression and Storages\",\"datePublished\":\"2018-02-03T02:39:52+00:00\",\"dateModified\":\"2026-03-27T11:55:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/\"},\"wordCount\":695,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.botreetechnologies.com\/blog\/wp-content\/uploads\/2018\/02\/django-asset-compression-and-storages.jpg\",\"articleSection\":[\"Django\",\"Technology\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/\",\"url\":\"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/\",\"name\":\"Django\u200aCompression and Storages\",\"isPartOf\":{\"@id\":\"https:\/\/www.botreetechnologies.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.botreetechnologies.com\/blog\/wp-content\/uploads\/2018\/02\/django-asset-compression-and-storages.jpg\",\"datePublished\":\"2018-02-03T02:39:52+00:00\",\"dateModified\":\"2026-03-27T11:55:25+00:00\",\"author\":{\"@id\":\"https:\/\/www.botreetechnologies.com\/blog\/#\/schema\/person\/6d6e7cb5fcfc8a2d634d736b2e972d42\"},\"description\":\"The obvious approach was to change the name or attach a version number to a CSS file each time we make a change. But we wanted this process to be automated so we came across Django-compressor.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/#primaryimage\",\"url\":\"https:\/\/www.botreetechnologies.com\/blog\/wp-content\/uploads\/2018\/02\/django-asset-compression-and-storages.jpg\",\"contentUrl\":\"https:\/\/www.botreetechnologies.com\/blog\/wp-content\/uploads\/2018\/02\/django-asset-compression-and-storages.jpg\",\"width\":852,\"height\":479,\"caption\":\"Django\u200a- Asset Compression and Storages\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.botreetechnologies.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Django\u200aCompression and Storages\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.botreetechnologies.com\/blog\/#website\",\"url\":\"https:\/\/www.botreetechnologies.com\/blog\/\",\"name\":\"BoTree Technologies\",\"description\":\"Committed to inspire generation.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.botreetechnologies.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.botreetechnologies.com\/blog\/#\/schema\/person\/6d6e7cb5fcfc8a2d634d736b2e972d42\",\"name\":\"Yogendra Katewa\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.botreetechnologies.com\/blog\/wp-content\/uploads\/2020\/10\/yogendra-katewa-150x150.png\",\"url\":\"https:\/\/www.botreetechnologies.com\/blog\/wp-content\/uploads\/2020\/10\/yogendra-katewa-150x150.png\",\"contentUrl\":\"https:\/\/www.botreetechnologies.com\/blog\/wp-content\/uploads\/2020\/10\/yogendra-katewa-150x150.png\",\"caption\":\"Yogendra Katewa\"},\"description\":\"Yogendra is a Python developer. He also loves working in JavaScript frameworks. He is a foody, loves to read and is also a fitness enthusiast.\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Django\u200aCompression and Storages","description":"The obvious approach was to change the name or attach a version number to a CSS file each time we make a change. But we wanted this process to be automated so we came across Django-compressor.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/","og_locale":"en_US","og_type":"article","og_title":"Django\u200aCompression and Storages","og_description":"The obvious approach was to change the name or attach a version number to a CSS file each time we make a change. But we wanted this process to be automated so we came across Django-compressor.","og_url":"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/","og_site_name":"BoTree Technologies","article_publisher":"https:\/\/www.facebook.com\/BoTreeTechnologies\/","article_published_time":"2018-02-03T02:39:52+00:00","article_modified_time":"2026-03-27T11:55:25+00:00","og_image":[{"width":852,"height":479,"url":"https:\/\/www.botreetechnologies.com\/blog\/wp-content\/uploads\/2018\/02\/django-asset-compression-and-storages.jpg","type":"image\/jpeg"}],"author":"Yogendra Katewa","twitter_card":"summary_large_image","twitter_creator":"@BoTreeTech","twitter_site":"@BoTreeTech","twitter_misc":{"Written by":"Yogendra Katewa","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/#article","isPartOf":{"@id":"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/"},"author":{"name":"Yogendra Katewa","@id":"https:\/\/www.botreetechnologies.com\/blog\/#\/schema\/person\/6d6e7cb5fcfc8a2d634d736b2e972d42"},"headline":"Django\u200aCompression and Storages","datePublished":"2018-02-03T02:39:52+00:00","dateModified":"2026-03-27T11:55:25+00:00","mainEntityOfPage":{"@id":"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/"},"wordCount":695,"commentCount":0,"image":{"@id":"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/#primaryimage"},"thumbnailUrl":"https:\/\/www.botreetechnologies.com\/blog\/wp-content\/uploads\/2018\/02\/django-asset-compression-and-storages.jpg","articleSection":["Django","Technology"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/","url":"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/","name":"Django\u200aCompression and Storages","isPartOf":{"@id":"https:\/\/www.botreetechnologies.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/#primaryimage"},"image":{"@id":"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/#primaryimage"},"thumbnailUrl":"https:\/\/www.botreetechnologies.com\/blog\/wp-content\/uploads\/2018\/02\/django-asset-compression-and-storages.jpg","datePublished":"2018-02-03T02:39:52+00:00","dateModified":"2026-03-27T11:55:25+00:00","author":{"@id":"https:\/\/www.botreetechnologies.com\/blog\/#\/schema\/person\/6d6e7cb5fcfc8a2d634d736b2e972d42"},"description":"The obvious approach was to change the name or attach a version number to a CSS file each time we make a change. But we wanted this process to be automated so we came across Django-compressor.","breadcrumb":{"@id":"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/#primaryimage","url":"https:\/\/www.botreetechnologies.com\/blog\/wp-content\/uploads\/2018\/02\/django-asset-compression-and-storages.jpg","contentUrl":"https:\/\/www.botreetechnologies.com\/blog\/wp-content\/uploads\/2018\/02\/django-asset-compression-and-storages.jpg","width":852,"height":479,"caption":"Django\u200a- Asset Compression and Storages"},{"@type":"BreadcrumbList","@id":"https:\/\/www.botreetechnologies.com\/blog\/django-asset-compression-and-storages\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.botreetechnologies.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Django\u200aCompression and Storages"}]},{"@type":"WebSite","@id":"https:\/\/www.botreetechnologies.com\/blog\/#website","url":"https:\/\/www.botreetechnologies.com\/blog\/","name":"BoTree Technologies","description":"Committed to inspire generation.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.botreetechnologies.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.botreetechnologies.com\/blog\/#\/schema\/person\/6d6e7cb5fcfc8a2d634d736b2e972d42","name":"Yogendra Katewa","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.botreetechnologies.com\/blog\/wp-content\/uploads\/2020\/10\/yogendra-katewa-150x150.png","url":"https:\/\/www.botreetechnologies.com\/blog\/wp-content\/uploads\/2020\/10\/yogendra-katewa-150x150.png","contentUrl":"https:\/\/www.botreetechnologies.com\/blog\/wp-content\/uploads\/2020\/10\/yogendra-katewa-150x150.png","caption":"Yogendra Katewa"},"description":"Yogendra is a Python developer. He also loves working in JavaScript frameworks. He is a foody, loves to read and is also a fitness enthusiast."}]}},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.botreetechnologies.com\/blog\/wp-json\/wp\/v2\/posts\/3294","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.botreetechnologies.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.botreetechnologies.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.botreetechnologies.com\/blog\/wp-json\/wp\/v2\/users\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/www.botreetechnologies.com\/blog\/wp-json\/wp\/v2\/comments?post=3294"}],"version-history":[{"count":3,"href":"https:\/\/www.botreetechnologies.com\/blog\/wp-json\/wp\/v2\/posts\/3294\/revisions"}],"predecessor-version":[{"id":15465,"href":"https:\/\/www.botreetechnologies.com\/blog\/wp-json\/wp\/v2\/posts\/3294\/revisions\/15465"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.botreetechnologies.com\/blog\/wp-json\/wp\/v2\/media\/14451"}],"wp:attachment":[{"href":"https:\/\/www.botreetechnologies.com\/blog\/wp-json\/wp\/v2\/media?parent=3294"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.botreetechnologies.com\/blog\/wp-json\/wp\/v2\/categories?post=3294"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.botreetechnologies.com\/blog\/wp-json\/wp\/v2\/tags?post=3294"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}