{"id":39349,"date":"2025-12-11T09:38:02","date_gmt":"2025-12-11T17:38:02","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=39349"},"modified":"2025-12-11T09:38:03","modified_gmt":"2025-12-11T17:38:03","slug":"managing-media-files-in-flask","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask","title":{"rendered":"Managing Media Files in Flask (Images, Videos, and Audio)"},"content":{"rendered":"\n<p>You&#8217;re building an app for a small business or website, maybe a portfolio site or boutique store, and you know high-quality visuals are key for attracting buyers and showcasing your work. But without a designer on the team, you&#8217;re responsible for handling all the images and videos yourself.<\/p>\n\n\n\n<p>So how do you manage a moderate amount of media files in the simplest and most efficient way?<\/p>\n\n\n\n<p>In this blog post, we\u2019ll unveil transformative techniques for managing media files in Flask with Cloudinary to make your life easier as a developer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Benefits of Streamlined Media Management          <\/h2>\n\n\n\n<p>Before we get into the practical steps, here some of the advantages of establishing a solid media management approach in your Flask application:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Less custom code and reduced storage complexity.<\/strong> Offloading large media files from your database or filesystem keeps your application simpler and avoids managing bulky binary data.<\/li>\n\n\n\n<li><strong>Reliable uploads that scale.<\/strong> A predictable upload flow prevents issues with file size limits, timeouts, or custom route handling, especially when users submit large images or videos.<\/li>\n\n\n\n<li><strong>Consistent, high-quality digital media.<\/strong> Automated tasks like resizing, compression, tagging, and background removal help keep your images and videos optimized without manual editing.<\/li>\n\n\n\n<li><strong>Optimized, searchable delivery.<\/strong> Well-structured metadata and scalable search make assets easier to find, while delivering the right size and format improves performance across devices.<\/li>\n<\/ul>\n\n\n\n<p>By <a href=\"https:\/\/cloudinary.com\/documentation\/solution_overview#storage\">storing your digital media in Cloudinary<\/a> instead of on your server or in your database, you can take advantage of these benefits immediately, while keeping your Flask codebase lightweight and focused on application logic.<\/p>\n\n\n\n<p>Managing media files in Flask becomes much simpler with the steps we cover next (tap the icons to navigate to the related section):<\/p>\n\n\n\n<div style=\"width:100%;max-width:850px;position:relative;\">\n<img decoding=\"async\" style=\"max-width:100%;\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/v1698223367\/blog\/django_media_management.png\" \/>\n<a style=\"height:100%;position:absolute;left:0%;top:0%;width:20%;\" href=\"#setup_and_configuration\" target=\"_self\" rel=\"noopener\"><\/a>\n<a style=\"height:100%;position:absolute;left:20%;top:0%;width:20%;\" href=\"#enhanced_media_processing_with_upload_presets\" target=\"_self\" rel=\"noopener\"><\/a>\n<a style=\"height:100%;position:absolute;left:40%;top:0%;width:20%;\" href=\"#uploading_media_with_python_and_flask\" target=\"_self\" rel=\"noopener\"><\/a>\n<a style=\"height:100%;position:absolute;left:60%;top:0%;width:20%;\" href=\"#searching_made_simple\" target=\"_self\" rel=\"noopener\"><\/a>\n<a style=\"height:100%;position:absolute;left:80%;top:0%;width:20%;\" href=\"#delivering_your_media\" target=\"_self\" rel=\"noopener\"><\/a>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Setup and Configuration<\/h2>\n\n\n\n<p>Before we dive into the specifics of media management with Python and Flask, you&#8217;ll need to sign up for <a href=\"https:\/\/cloudinary.com\/users\/register\/free\" target=\"_blank\" rel=\"noreferrer noopener\">Cloudinary<\/a>. It&#8217;s quick and straightforward.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Installing and Configuring Cloudinary in Your Python\/Flask App<\/h3>\n\n\n\n<p>To get started with Cloudinary in your Python\/Flask app, follow these steps:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Install the Cloudinary Python library using <code>pip install cloudinary<\/code>.<\/li>\n\n\n\n<li>Configure Cloudinary in your Flask application, typically inside <code>app.py<\/code> or a separate <code>config.py<\/code> file:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-comment\"># config.py or app.py<\/span>\nimport cloudinary\nimport cloudinary.uploader\nimport cloudinary.api\n\ncloudinary.config(\n    cloud_name=<span class=\"hljs-string\">\"your_cloud_name\"<\/span>,\n    api_key=<span class=\"hljs-string\">\"your_api_key\"<\/span>,\n    api_secret=<span class=\"hljs-string\">\"your_api_secret\"<\/span>\n)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<div class='c-callout  c-callout--inline-title c-callout--note'><strong class='c-callout__title'>Note:<\/strong> <p>Replace <code>your_cloud_name<\/code>, <code>your_api_key<\/code>, and <code>your_api_secret<\/code> with your actual Cloudinary credentials, which you can find on the <a href=\"https:\/\/console.cloudinary.com\/app\/settings\/api-keys\">API keys<\/a> page of the Console Settings.<\/p>\n<\/div>\n\n\n<ol start=\"3\"><li>If you&#8217;re using a <code>config.py<\/code>, you&#8217;d load it in your Flask app like this:<\/li><\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">from flask import Flask\nimport config  <span class=\"hljs-comment\"># or your preferred config structure<\/span>\n\napp = Flask(__name__)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>With these steps, you&#8217;ve successfully integrated Cloudinary into your Flask project, and you&#8217;re ready to leverage its powerful media management capabilities.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Enhanced Media Processing With Upload Presets<\/h2>\n\n\n\n<p>Upload presets in Cloudinary help you automate your media workflow by applying transformations, metadata rules, and upload behaviors the moment a file arrives. This means less processing in your Flask routes and far more consistent results across all your media.<\/p>\n\n\n\n<p>In this article, we\u2019ll focus on two powerful capabilities you can unlock through presets: <strong>automated transformations<\/strong> and <strong>auto-tagging<\/strong>. You can explore many other preset options in Cloudinary\u2019s <a href=\"https:\/\/cloudinary.com\/documentation\/upload_presets\" target=\"_blank\" rel=\"noreferrer noopener\">documentation<\/a>, but these two alone can dramatically simplify your media pipeline.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Automating Transformation Settings<\/h3>\n\n\n\n<p>Upload presets allow you to automatically apply transformations such as resizing, cropping, recoloring, background removal, and more, without writing additional code in Flask. For example, you can create presets that remove backgrounds from uploaded logos, ensure all portfolio images are a consistent size, or sharpen older or lower-quality photos. <\/p>\n\n\n\n<p>Each preset applies its rules automatically when the file is uploaded.<\/p>\n\n\n<div class='c-callout  c-callout--inline-title c-callout--tip'><strong class='c-callout__title'>Tip:<\/strong> <p>By applying the <a href=\"https:\/\/cloudinary.com\/documentation\/transformation_reference#g_auto\">g_auto<\/a> AI-powered transformation, you can ensure that crops preserve the important parts of your images and keep the main subject of your videos in focus.<\/p>\n<\/div>\n\n\n<p>By defining these settings once, every uploaded media file stays consistent and optimized with no manual editing or external image processing tools required.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img width=\"500\" height=\"303\" data-public-id=\"Web_Assets\/blog\/crop-1\/crop-1.gif\" loading=\"lazy\" decoding=\"async\" data-id=\"31589\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_500,h_303,c_scale\/f_auto,q_auto\/v1698140121\/Web_Assets\/blog\/crop-1\/crop-1.gif?_i=AA\" alt=\"Image showing example of Cloudinary Django automated image transformation: crop and resize of a picture of a room with a cactus\" class=\"wp-post-39349 wp-image-31589\" data-format=\"gif\" data-transformations=\"f_auto,q_auto\" data-version=\"1698140121\" data-seo=\"1\" \/><figcaption class=\"wp-element-caption\">Crop &amp; Resize<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img width=\"500\" height=\"303\" data-public-id=\"Web_Assets\/blog\/enhance-1\/enhance-1.gif\" loading=\"lazy\" decoding=\"async\" data-id=\"31593\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_500,h_303,c_scale\/f_auto,q_auto\/v1698140111\/Web_Assets\/blog\/enhance-1\/enhance-1.gif?_i=AA\" alt=\"Image showing example of Cloudinary Django automated image transformation: sharpen a picture of a cactus planter\" class=\"wp-post-39349 wp-image-31593\" data-format=\"gif\" data-transformations=\"f_auto,q_auto\" data-version=\"1698140111\" data-seo=\"1\" \/><figcaption class=\"wp-element-caption\">Sharpen<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img width=\"500\" height=\"303\" data-public-id=\"Web_Assets\/blog\/remove_obj\/remove_obj.gif\" loading=\"lazy\" decoding=\"async\" data-id=\"31595\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_500,h_303,c_scale\/f_auto,q_auto\/v1698140102\/Web_Assets\/blog\/remove_obj\/remove_obj.gif?_i=AA\" alt=\"managing Flask media files\" class=\"wp-post-39349 wp-image-31595\" data-format=\"gif\" data-transformations=\"f_auto,q_auto\" data-version=\"1698140102\" data-seo=\"1\" \/><figcaption class=\"wp-element-caption\">Remove Objects<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img width=\"500\" height=\"303\" data-public-id=\"Web_Assets\/blog\/recolor\/recolor.gif\" loading=\"lazy\" decoding=\"async\" data-id=\"31594\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_500,h_303,c_scale\/f_auto,q_auto\/v1698140107\/Web_Assets\/blog\/recolor\/recolor.gif?_i=AA\" alt=\"Image showing example of Cloudinary Django automated image transformation: recolor of a picture of a flower\" class=\"wp-post-39349 wp-image-31594\" data-format=\"gif\" data-transformations=\"f_auto,q_auto\" data-version=\"1698140107\" data-seo=\"1\" \/><figcaption class=\"wp-element-caption\">Recolor<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img width=\"500\" height=\"303\" data-public-id=\"Web_Assets\/blog\/overlay\/overlay.gif\" loading=\"lazy\" decoding=\"async\" data-id=\"31588\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_500,h_303,c_scale\/f_auto,q_auto\/v1698140126\/Web_Assets\/blog\/overlay\/overlay.gif?_i=AA\" alt=\"Image showing example of Cloudinary Django automated image transformation: image overlay of a picture of a room with cacti\" class=\"wp-post-39349 wp-image-31588\" data-format=\"gif\" data-transformations=\"f_auto,q_auto\" data-version=\"1698140126\" data-seo=\"1\" \/><figcaption class=\"wp-element-caption\">Image Overlay<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img width=\"500\" height=\"303\" data-public-id=\"Web_Assets\/blog\/background-1\/background-1.gif\" loading=\"lazy\" decoding=\"async\" data-id=\"31590\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_500,h_303,c_scale\/f_auto,q_auto\/v1698140116\/Web_Assets\/blog\/background-1\/background-1.gif?_i=AA\" alt=\"Image showing example of Cloudinary Django automated image transformation: background removal of a picture of a succulent in a pot\" class=\"wp-post-39349 wp-image-31590\" data-format=\"gif\" data-transformations=\"f_auto,q_auto\" data-version=\"1698140116\" data-seo=\"1\" \/><figcaption class=\"wp-element-caption\">Background Removal<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Leveraging Auto-Tagging<\/h3>\n\n\n\n<p>If you enable auto-tagging through Cloudinary\u2019s categorization engines, images are automatically analyzed and tagged based on their content. These tags can support a variety of downstream tasks, including:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>organizing assets<\/li>\n\n\n\n<li>improving searchability<\/li>\n\n\n\n<li>enabling content discovery<\/li>\n\n\n\n<li>powering filters in your UI or internal tools<\/li>\n<\/ul>\n\n\n\n<p>For example, an image of a woman on a city street using a smartphone and carrying a bag might receive tags such as &#8220;woman,&#8221; &#8220;bag,&#8221; &#8220;mobile phone,&#8221; &#8220;purse,&#8221; or &#8220;car,&#8221; depending on the AI model you use.<\/p>\n\n\n<div class='c-callout  c-callout--inline-title c-callout--info'><strong class='c-callout__title'>Important:<\/strong> <p>To use auto-tagging, you\u2019ll need to subscribe to one of Cloudinary\u2019s <a href=\"https:\/\/cloudinary.com\/documentation\/cloudinary_add_ons#auto_tagging\">auto-tagging add-ons<\/a>. The examples in this blog use the\n<a href=\"aws_rekognition_auto_tagging_addon\">Rekognition Auto Tagging<\/a> add-on.<\/p>\n<\/div>\n\n\n<figure class=\"wp-block-image size-large\"><img width=\"1024\" height=\"683\" data-public-id=\"Web_Assets\/blog\/woman-business-suit\/woman-business-suit.jpg\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_1024,h_683,c_scale\/f_auto,q_auto\/v1764259730\/Web_Assets\/blog\/woman-business-suit\/woman-business-suit.jpg?_i=AA\" alt=\"managing Flask media files\" class=\"wp-post-39349 wp-image-39479\" data-format=\"jpg\" data-transformations=\"f_auto,q_auto\" data-version=\"1764259730\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764259730\/Web_Assets\/blog\/woman-business-suit\/woman-business-suit.jpg?_i=AA 6720w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764259730\/Web_Assets\/blog\/woman-business-suit\/woman-business-suit.jpg?_i=AA 300w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764259730\/Web_Assets\/blog\/woman-business-suit\/woman-business-suit.jpg?_i=AA 768w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764259730\/Web_Assets\/blog\/woman-business-suit\/woman-business-suit.jpg?_i=AA 1024w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764259730\/Web_Assets\/blog\/woman-business-suit\/woman-business-suit.jpg?_i=AA 1536w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764259730\/Web_Assets\/blog\/woman-business-suit\/woman-business-suit.jpg?_i=AA 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Red-haired woman in stylish outfit chatting on phone<\/figcaption><\/figure>\n\n\n<div class='c-callout  c-callout--inline-title c-callout--tip'><strong class='c-callout__title'>Tip:<\/strong> <p>Check out the <a href=\"https:\/\/cloudinary.com\/documentation\/analyze_assets#sample_project_computer_vision_demo\">Computer Vision Image Analysis for Your E-commerce Website<\/a> demo to see Cloudinary in action, returning information about the content it identifies in your images.\u00a0<\/p>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Creating an Upload Preset&nbsp;<\/h3>\n\n\n\n<p>You can create an upload preset using the Cloudinary Admin API right from your Flask application or a setup script. Here&#8217;s an example using the Python SDK:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-comment\"># Define the upload preset details<\/span>\nupload_preset_name = <span class=\"hljs-string\">\"my_preset\"<\/span>\nupload_preset_options = {\n    <span class=\"hljs-string\">\"unsigned\"<\/span>: <span class=\"hljs-keyword\">False<\/span>,\n    <span class=\"hljs-string\">\"folder\"<\/span>: <span class=\"hljs-string\">\"my_folder\"<\/span>,\n    <span class=\"hljs-string\">\"tags\"<\/span>: <span class=\"hljs-string\">\"my_tags\"<\/span>,\n    <span class=\"hljs-string\">\"transformation\"<\/span>: &#91;\n        {<span class=\"hljs-string\">\"width\"<\/span>: <span class=\"hljs-number\">500<\/span>, <span class=\"hljs-string\">\"height\"<\/span>: <span class=\"hljs-number\">500<\/span>, <span class=\"hljs-string\">\"crop\"<\/span>: <span class=\"hljs-string\">\"fill\"<\/span>},\n        {<span class=\"hljs-string\">\"effect\"<\/span>: <span class=\"hljs-string\">\"vignette\"<\/span>},\n    ],\n    <span class=\"hljs-string\">\"categorization\"<\/span>: <span class=\"hljs-string\">\"aws_rek_tagging\"<\/span>,\n    <span class=\"hljs-string\">\"auto_tagging\"<\/span>: <span class=\"hljs-number\">0.9<\/span>\n}\n\n<span class=\"hljs-comment\"># Create the upload preset using the SDK<\/span>\nupload_preset = cloudinary.api.create_upload_preset(\n    name=upload_preset_name,\n    settings=upload_preset_options\n)\n\n<span class=\"hljs-comment\"># Check if the upload preset was created successfully<\/span>\n<span class=\"hljs-keyword\">if<\/span> upload_preset.get(<span class=\"hljs-string\">\"name\"<\/span>) == upload_preset_name:\n    <span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"Upload preset created successfully.\"<\/span>)\n<span class=\"hljs-keyword\">else<\/span>:\n    <span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"Failed to create upload preset.\"<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Once created, simply reference the preset name during upload, and all rules will apply automatically.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Uploading Media With Python and Flask<\/h2>\n\n\n\n<p>Uploading files is central to your Flask workflow, and Cloudinary provides two flexible methods: the <strong>Upload Widget<\/strong> for client-side uploads and <strong>server-side uploads<\/strong> from your Flask routes.<\/p>\n\n\n\n<p>Let\u2019s explore both.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Upload Widget<\/h3>\n\n\n\n<p>If your app accepts user-generated content (UGC), such as portfolio images from creators or product photos submitted by small business owners, the Cloudinary Upload Widget provides a smooth, reliable upload experience directly from the browser. You can attach any upload presets you\u2019ve created so transformations, optimization, tagging, and other processing happen automatically on upload, without additional Flask code.<\/p>\n\n\n<div class='c-callout  c-callout--inline-title c-callout--tip'><strong class='c-callout__title'>Tip:<\/strong> <p>You can also create a preset that automatically <a href=\"https:\/\/cloudinary.com\/documentation\/user_generated_content#moderate\">moderates<\/a> user-uploaded images and videos to help ensure that the content appearing on your site is appropriate.<\/p>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img width=\"1024\" height=\"791\" data-public-id=\"Web_Assets\/blog\/upload_widget_accessible-1_3948189bcb\/upload_widget_accessible-1_3948189bcb.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_1024,h_791,c_scale\/f_auto,q_auto\/v1764260271\/Web_Assets\/blog\/upload_widget_accessible-1_3948189bcb\/upload_widget_accessible-1_3948189bcb.png?_i=AA\" alt=\"Cloudinary Upload Widget\" class=\"wp-post-39349 wp-image-39481\" style=\"aspect-ratio:1.2608695652173914;width:462px;height:auto\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1764260271\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764260271\/Web_Assets\/blog\/upload_widget_accessible-1_3948189bcb\/upload_widget_accessible-1_3948189bcb.png?_i=AA 1580w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764260271\/Web_Assets\/blog\/upload_widget_accessible-1_3948189bcb\/upload_widget_accessible-1_3948189bcb.png?_i=AA 300w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764260271\/Web_Assets\/blog\/upload_widget_accessible-1_3948189bcb\/upload_widget_accessible-1_3948189bcb.png?_i=AA 768w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764260271\/Web_Assets\/blog\/upload_widget_accessible-1_3948189bcb\/upload_widget_accessible-1_3948189bcb.png?_i=AA 1024w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764260271\/Web_Assets\/blog\/upload_widget_accessible-1_3948189bcb\/upload_widget_accessible-1_3948189bcb.png?_i=AA 1536w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<h4 class=\"wp-block-heading\">Example Use Case<\/h4>\n\n\n\n<p>A portfolio gallery or a simple shop catalog where users can upload photos or videos is an ideal scenario for the Upload Widget. It handles the entire client-side upload flow, while your presets manage all media processing in the background.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-5 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_scale,w_500\/l_moon_layer\/c_scale,w_150\/l_text:roboto_20_bold:Moonlight\/fl_layer_apply\/fl_layer_apply,g_north_east\/city_night_time.jpg\" alt=\"managing Flask media files\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/demo-res.cloudinary.com\/w_500\/l_docs:wedding.jpg,c_pad,w_250,h_250\/l_radialize\/fl_layer_apply,e_displace,y_-8\/fl_layer_apply,x_10,b_transparent\/left_mug\" alt=\"managing Flask media files\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/v1489074100\/girl_camera.jpg\" alt=\"managing Flask media files\"\/><\/figure>\n<\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">How to Implement the Upload Widget in Flask<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create a route that renders the template:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-comment\"># app.py<\/span>\nfrom flask import Flask, render_template\n\napp = Flask(__name__)\n\n@app.route(<span class=\"hljs-string\">\"\/upload-media\"<\/span>)\ndef upload_media():\n    <span class=\"hljs-keyword\">return<\/span> render_template(<span class=\"hljs-string\">\"upload_media.html\"<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol start=\"2\"><li>Create the template (<code>templates\/upload_media.html<\/code>):<\/li><\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-meta\">&lt;!DOCTYPE <span class=\"hljs-meta-keyword\">html<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">html<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title<\/span>&gt;<\/span>Media Upload<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">title<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"upload_widget\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"cloudinary-button\"<\/span>&gt;<\/span>Upload files<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"https:\/\/upload-widget.cloudinary.com\/global\/all.js\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\/javascript\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>  \n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\/javascript\"<\/span>&gt;<\/span><span class=\"javascript\">  \n        <span class=\"hljs-keyword\">var<\/span> myWidget = cloudinary.createUploadWidget({\n            <span class=\"hljs-attr\">cloudName<\/span>: <span class=\"hljs-string\">'my_cloud_name'<\/span>,\n            <span class=\"hljs-attr\">uploadPreset<\/span>: <span class=\"hljs-string\">'my_preset'<\/span>\n        }, (error, result) =&gt; {\n            <span class=\"hljs-keyword\">if<\/span> (!error &amp;&amp; result &amp;&amp; result.event === <span class=\"hljs-string\">\"success\"<\/span>) {\n                <span class=\"hljs-keyword\">const<\/span> imageUrl = result.info.secure_url;\n                <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"Done! Here is the file info: \"<\/span>, result.info);\n\n                <span class=\"hljs-comment\">\/\/ Optional: Send imageUrl to your Flask backend<\/span>\n                <span class=\"hljs-comment\">\/\/ fetch('\/save-media', { method: 'POST', body: JSON.stringify({ url: imageUrl }) })<\/span>\n            }\n        });\n\n        <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">\"upload_widget\"<\/span>).addEventListener(<span class=\"hljs-string\">\"click\"<\/span>, <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n            myWidget.open();\n        }, <span class=\"hljs-literal\">false<\/span>);\n    <\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol start=\"3\"><li>Add the URL rule (if not using decorators):<\/li><\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-comment\"># app.py<\/span>\napp.add_url_rule(<span class=\"hljs-string\">\"\/upload-media\"<\/span>, view_func=upload_media)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol start=\"4\"><li>Test it by visiting:<\/li><\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">http:<span class=\"hljs-comment\">\/\/localhost:5000\/upload-media<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>You now have a complete client-side upload flow, with Cloudinary handling media processing automatically.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Server-Side Upload<\/h3>\n\n\n\n<p>Server-side uploads are perfect when you need automation or want to process files uploaded through a traditional <code>&lt;form&gt;<\/code>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Example Use Case<\/h4>\n\n\n\n<p>News aggregators, podcast platforms, or content curation apps often automate large-scale ingestion:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>analyze images<\/li>\n\n\n\n<li>apply tags<\/li>\n\n\n\n<li>create captions<\/li>\n\n\n\n<li>run moderation<\/li>\n\n\n\n<li>convert formats<\/li>\n<\/ul>\n\n\n\n<p>Cloudinary can handle these tasks server-side with very little code.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Uploading From Flask<\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-keyword\">from<\/span> flask <span class=\"hljs-keyword\">import<\/span> request\n<span class=\"hljs-keyword\">import<\/span> cloudinary.uploader\n\n@app.route(<span class=\"hljs-string\">\"\/upload\"<\/span>, methods=&#91;<span class=\"hljs-string\">\"POST\"<\/span>])\ndef upload():\n    file_to_upload = request.files&#91;<span class=\"hljs-string\">\"file\"<\/span>]\n    result = cloudinary.uploader.upload(\n        file_to_upload,\n        upload_preset=<span class=\"hljs-string\">\"my_upload_preset\"<\/span>\n    )\n    <span class=\"hljs-keyword\">return<\/span> {<span class=\"hljs-string\">\"url\"<\/span>: result&#91;<span class=\"hljs-string\">\"secure_url\"<\/span>]}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>And that\u2019s it. Your media is uploaded, transformed, stored, and ready to deliver.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Searching Made Simple<\/h2>\n\n\n\n<p>Once your assets are stored in Cloudinary, especially with auto-tagging enabled, searching becomes incredibly fast.<\/p>\n\n\n\n<p>Instead of digging through folders or writing custom queries, you can retrieve matching media with a single expression:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">def search_media_by_tags(tags):\n    <span class=\"hljs-keyword\">return<\/span> cloudinary.Search().expression(f<span class=\"hljs-string\">\"tags:{tags}\"<\/span>).execute()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Example queries:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>tags:portrait<\/code><\/li>\n\n\n\n<li><code>tags:handmade<\/code><\/li>\n\n\n\n<li><code>resource_type:video AND tags:nature<\/code><\/li>\n<\/ul>\n\n\n\n<p>Use search to build quick admin dashboards, galleries, filters, or automated content workflows.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Delivering Your Media<\/h2>\n\n\n\n<p>With Cloudinary managing your media, delivery becomes as powerful as upload. You can apply <strong>on-the-fly transformations<\/strong> directly in the image or video URL with no processing required in Flask.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example: Dynamic Image Sizing in a Flask Template<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">img<\/span> \n  <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"{{ cloudinary_url(public_id, width=width, height=height, crop='fill') }}\"<\/span>\n  <span class=\"hljs-attr\">alt<\/span>=<span class=\"hljs-string\">\"Your Image\"<\/span>\n\/&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Or, using the SDK:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-keyword\">from<\/span> cloudinary.utils <span class=\"hljs-keyword\">import<\/span> cloudinary_url\n\nurl, options = cloudinary_url(\n    public_id,\n    width=<span class=\"hljs-number\">400<\/span>,\n    height=<span class=\"hljs-number\">300<\/span>,\n    crop=<span class=\"hljs-string\">\"fill\"<\/span>\n)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Why It\u2019s Powerful<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You don\u2019t store multiple versions of each image<\/li>\n\n\n\n<li>Users automatically receive optimized formats (WebP, AVIF, MP4, etc.)<\/li>\n\n\n\n<li>Dynamic resizing keeps your site lightweight and fast<\/li>\n<\/ul>\n\n\n\n<p>For responsive layouts, check out:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/cloudinary.com\/documentation\/responsive_html\" target=\"_blank\" rel=\"noreferrer noopener\">Responsive images using HTML and dynamic image transformations<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/documentation\/video_overview\" target=\"_blank\" rel=\"noreferrer noopener\">Managing and delivering videos at scale<\/a>.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img width=\"1024\" height=\"512\" data-public-id=\"Web_Assets\/blog\/guitar-man-1\/guitar-man-1.jpeg\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_1024,h_512,c_scale\/f_auto,q_auto\/v1698149581\/Web_Assets\/blog\/guitar-man-1\/guitar-man-1.jpeg?_i=AA\" alt=\"Example how Cloudinary helps you Manage Media Files in Django using templat tags: large image of man playing guitar with hat on\" class=\"wp-post-39349 wp-image-31619\" style=\"width:434px;height:217px\" data-format=\"jpeg\" data-transformations=\"f_auto,q_auto\" data-version=\"1698149581\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1698149581\/Web_Assets\/blog\/guitar-man-1\/guitar-man-1.jpeg?_i=AA 1600w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1698149581\/Web_Assets\/blog\/guitar-man-1\/guitar-man-1.jpeg?_i=AA 300w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1698149581\/Web_Assets\/blog\/guitar-man-1\/guitar-man-1.jpeg?_i=AA 768w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1698149581\/Web_Assets\/blog\/guitar-man-1\/guitar-man-1.jpeg?_i=AA 1024w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1698149581\/Web_Assets\/blog\/guitar-man-1\/guitar-man-1.jpeg?_i=AA 1536w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div><\/div>\n<\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img width=\"600\" height=\"400\" data-public-id=\"Web_Assets\/blog\/guitar-man2-1\/guitar-man2-1.jpeg\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_600,h_400,c_scale\/f_auto,q_auto\/v1698149585\/Web_Assets\/blog\/guitar-man2-1\/guitar-man2-1.jpeg?_i=AA\" alt=\"Example how Cloudinary helps you Manage Media Files in Django using templat tags: medium image of man playing guitar with hat on\" class=\"wp-post-39349 wp-image-31618\" style=\"width:319px;height:213px\" data-format=\"jpeg\" data-transformations=\"f_auto,q_auto\" data-version=\"1698149585\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1698149585\/Web_Assets\/blog\/guitar-man2-1\/guitar-man2-1.jpeg?_i=AA 600w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1698149585\/Web_Assets\/blog\/guitar-man2-1\/guitar-man2-1.jpeg?_i=AA 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/figure><\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img width=\"400\" height=\"400\" data-public-id=\"Web_Assets\/blog\/guitar-man3-1\/guitar-man3-1.jpeg\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_400,h_400,c_fill,g_auto\/f_auto,q_auto\/v1698149587\/Web_Assets\/blog\/guitar-man3-1\/guitar-man3-1.jpeg?_i=AA\" alt=\"Example how Cloudinary helps you Manage Media Files in Django using templat tags: small image of man playing guitar with hat on\" class=\"wp-post-39349 wp-image-31617\" style=\"width:200px;height:200px\" data-format=\"jpeg\" data-transformations=\"f_auto,q_auto\" data-version=\"1698149587\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1698149587\/Web_Assets\/blog\/guitar-man3-1\/guitar-man3-1.jpeg?_i=AA 400w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1698149587\/Web_Assets\/blog\/guitar-man3-1\/guitar-man3-1.jpeg?_i=AA 150w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1698149587\/Web_Assets\/blog\/guitar-man3-1\/guitar-man3-1.jpeg?_i=AA 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/figure><\/div>\n\n\n<h2 class=\"wp-block-heading\">Secret to Media File Management<\/h2>\n\n\n\n<p>In short, the features we\u2019ve covered include upload presets, smart uploads, AI-powered search, and dynamic delivery. Apply these features to take managing media files in Flask from \u201cpainful but necessary\u201d to \u201ceffortless and scalable.\u201d<\/p>\n\n\n\n<p>Instead of writing boilerplate logic for uploads, storage, and optimization, you can focus on building features your users care about.<\/p>\n\n\n\n<p>Cloudinary was <a href=\"https:\/\/cloudinary.com\/developers\">built for developers<\/a> who ship fast, iterate often, and want tools that stay out of the way.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>You&#8217;re building an app for a small business or website, maybe a portfolio site or boutique store, and you know high-quality visuals are key for attracting buyers and showcasing your work. But without a designer on the team, you&#8217;re responsible for handling all the images and videos yourself. So how do you manage a moderate [&hellip;]<\/p>\n","protected":false},"author":52,"featured_media":39596,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[25,286],"class_list":["post-39349","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-asset-management","tag-tagging"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Managing Media Files in Flask (Images, Videos, and Audio)<\/title>\n<meta name=\"description\" content=\"Managing Flask media files doesn\u2019t have to be complex. Learn how to upload, process, and deliver optimized images &amp; videos using Cloudinary.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Managing Media Files in Flask (Images, Videos, and Audio)\" \/>\n<meta property=\"og:description\" content=\"Managing Flask media files doesn\u2019t have to be complex. Learn how to upload, process, and deliver optimized images &amp; videos using Cloudinary.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-11T17:38:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-11T17:38:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1765400507\/Managing_Media_Files_in_Flask-blog\/Managing_Media_Files_in_Flask-blog.jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"sharonyelenik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask\"},\"author\":{\"name\":\"sharonyelenik\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/dc4e70df8d22a9cfdad676a82fa92a73\"},\"headline\":\"Managing Media Files in Flask (Images, Videos, and Audio)\",\"datePublished\":\"2025-12-11T17:38:02+00:00\",\"dateModified\":\"2025-12-11T17:38:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask\"},\"wordCount\":1197,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1765400507\/Managing_Media_Files_in_Flask-blog\/Managing_Media_Files_in_Flask-blog.jpg?_i=AA\",\"keywords\":[\"Asset Management\",\"Tagging\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask\",\"url\":\"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask\",\"name\":\"Managing Media Files in Flask (Images, Videos, and Audio)\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1765400507\/Managing_Media_Files_in_Flask-blog\/Managing_Media_Files_in_Flask-blog.jpg?_i=AA\",\"datePublished\":\"2025-12-11T17:38:02+00:00\",\"dateModified\":\"2025-12-11T17:38:03+00:00\",\"description\":\"Managing Flask media files doesn\u2019t have to be complex. Learn how to upload, process, and deliver optimized images & videos using Cloudinary.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1765400507\/Managing_Media_Files_in_Flask-blog\/Managing_Media_Files_in_Flask-blog.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1765400507\/Managing_Media_Files_in_Flask-blog\/Managing_Media_Files_in_Flask-blog.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Managing Media Files in Flask (Images, Videos, and Audio)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/dc4e70df8d22a9cfdad676a82fa92a73\",\"name\":\"sharonyelenik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6565cdd768a04e9b6ea3932764886209dd9de8baeeef1504eaad8fe776677f92?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6565cdd768a04e9b6ea3932764886209dd9de8baeeef1504eaad8fe776677f92?s=96&d=mm&r=g\",\"caption\":\"sharonyelenik\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Managing Media Files in Flask (Images, Videos, and Audio)","description":"Managing Flask media files doesn\u2019t have to be complex. Learn how to upload, process, and deliver optimized images & videos using Cloudinary.","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:\/\/cloudinary.com\/blog\/managing-media-files-in-flask","og_locale":"en_US","og_type":"article","og_title":"Managing Media Files in Flask (Images, Videos, and Audio)","og_description":"Managing Flask media files doesn\u2019t have to be complex. Learn how to upload, process, and deliver optimized images & videos using Cloudinary.","og_url":"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask","og_site_name":"Cloudinary Blog","article_published_time":"2025-12-11T17:38:02+00:00","article_modified_time":"2025-12-11T17:38:03+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1765400507\/Managing_Media_Files_in_Flask-blog\/Managing_Media_Files_in_Flask-blog.jpg?_i=AA","type":"image\/jpeg"}],"author":"sharonyelenik","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask"},"author":{"name":"sharonyelenik","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/dc4e70df8d22a9cfdad676a82fa92a73"},"headline":"Managing Media Files in Flask (Images, Videos, and Audio)","datePublished":"2025-12-11T17:38:02+00:00","dateModified":"2025-12-11T17:38:03+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask"},"wordCount":1197,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1765400507\/Managing_Media_Files_in_Flask-blog\/Managing_Media_Files_in_Flask-blog.jpg?_i=AA","keywords":["Asset Management","Tagging"],"inLanguage":"en-US","copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask","url":"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask","name":"Managing Media Files in Flask (Images, Videos, and Audio)","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1765400507\/Managing_Media_Files_in_Flask-blog\/Managing_Media_Files_in_Flask-blog.jpg?_i=AA","datePublished":"2025-12-11T17:38:02+00:00","dateModified":"2025-12-11T17:38:03+00:00","description":"Managing Flask media files doesn\u2019t have to be complex. Learn how to upload, process, and deliver optimized images & videos using Cloudinary.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1765400507\/Managing_Media_Files_in_Flask-blog\/Managing_Media_Files_in_Flask-blog.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1765400507\/Managing_Media_Files_in_Flask-blog\/Managing_Media_Files_in_Flask-blog.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/managing-media-files-in-flask#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Managing Media Files in Flask (Images, Videos, and Audio)"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/dc4e70df8d22a9cfdad676a82fa92a73","name":"sharonyelenik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/6565cdd768a04e9b6ea3932764886209dd9de8baeeef1504eaad8fe776677f92?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6565cdd768a04e9b6ea3932764886209dd9de8baeeef1504eaad8fe776677f92?s=96&d=mm&r=g","caption":"sharonyelenik"}}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1765400507\/Managing_Media_Files_in_Flask-blog\/Managing_Media_Files_in_Flask-blog.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39349","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/52"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=39349"}],"version-history":[{"count":12,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39349\/revisions"}],"predecessor-version":[{"id":39946,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39349\/revisions\/39946"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/39596"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=39349"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=39349"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=39349"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}