{"id":16252,"date":"2024-01-22T17:41:21","date_gmt":"2024-01-22T14:11:21","guid":{"rendered":"https:\/\/rasanegar.com\/blog\/%d9%88%d8%b8%d8%a7%db%8c%d9%81-%d9%86%d8%a7%d9%87%d9%85%d8%b2%d9%85%d8%a7%d9%86-%d8%af%d8%b1-%d8%ac%d9%86%da%af%d9%88-%d8%a8%d8%a7-%d8%b1%d8%af%db%8c%d8%b3-%d9%88-%da%a9%d8%b1%d9%81%d8%b3\/"},"modified":"2024-01-22T17:41:21","modified_gmt":"2024-01-22T14:11:21","slug":"%d9%88%d8%b8%d8%a7%db%8c%d9%81-%d9%86%d8%a7%d9%87%d9%85%d8%b2%d9%85%d8%a7%d9%86-%d8%af%d8%b1-%d8%ac%d9%86%da%af%d9%88-%d8%a8%d8%a7-%d8%b1%d8%af%db%8c%d8%b3-%d9%88-%da%a9%d8%b1%d9%81%d8%b3","status":"publish","type":"post","link":"https:\/\/rasanegaar.com\/blog\/%d9%88%d8%b8%d8%a7%db%8c%d9%81-%d9%86%d8%a7%d9%87%d9%85%d8%b2%d9%85%d8%a7%d9%86-%d8%af%d8%b1-%d8%ac%d9%86%da%af%d9%88-%d8%a8%d8%a7-%d8%b1%d8%af%db%8c%d8%b3-%d9%88-%da%a9%d8%b1%d9%81%d8%b3\/","title":{"rendered":"\u0648\u0638\u0627\u06cc\u0641 \u0646\u0627\u0647\u0645\u0632\u0645\u0627\u0646 \u062f\u0631 \u062c\u0646\u06af\u0648 \u0628\u0627 \u0631\u062f\u06cc\u0633 \u0648 \u06a9\u0631\u0641\u0633"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0633\u0631\u0641\u0635\u0644\u0647\u0627\u06cc \u0645\u0637\u0644\u0628<\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/rasanegaar.com\/blog\/%d9%88%d8%b8%d8%a7%db%8c%d9%81-%d9%86%d8%a7%d9%87%d9%85%d8%b2%d9%85%d8%a7%d9%86-%d8%af%d8%b1-%d8%ac%d9%86%da%af%d9%88-%d8%a8%d8%a7-%d8%b1%d8%af%db%8c%d8%b3-%d9%88-%da%a9%d8%b1%d9%81%d8%b3\/#%d9%85%d8%b9%d8%b1%d9%81%db%8c\" >\u0645\u0639\u0631\u0641\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/rasanegaar.com\/blog\/%d9%88%d8%b8%d8%a7%db%8c%d9%81-%d9%86%d8%a7%d9%87%d9%85%d8%b2%d9%85%d8%a7%d9%86-%d8%af%d8%b1-%d8%ac%d9%86%da%af%d9%88-%d8%a8%d8%a7-%d8%b1%d8%af%db%8c%d8%b3-%d9%88-%da%a9%d8%b1%d9%81%d8%b3\/#%d8%b2%d9%85%db%8c%d9%86%d9%87_%d8%b1%d9%88%db%8c_%d8%b5%d9%81_%d9%87%d8%a7%db%8c_%d9%be%db%8c%d8%a7%d9%85_%d8%a8%d8%a7_celery_%d9%88_redis\" >\u0632\u0645\u06cc\u0646\u0647 \u0631\u0648\u06cc \u0635\u0641 \u0647\u0627\u06cc \u067e\u06cc\u0627\u0645 \u0628\u0627 Celery \u0648 Redis<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/rasanegaar.com\/blog\/%d9%88%d8%b8%d8%a7%db%8c%d9%81-%d9%86%d8%a7%d9%87%d9%85%d8%b2%d9%85%d8%a7%d9%86-%d8%af%d8%b1-%d8%ac%d9%86%da%af%d9%88-%d8%a8%d8%a7-%d8%b1%d8%af%db%8c%d8%b3-%d9%88-%da%a9%d8%b1%d9%81%d8%b3\/#local_dev_setup_%d8%a8%d8%a7_django%d8%8c_celery_%d9%88_redis\" >Local  Dev Setup \u0628\u0627 Django\u060c Celery \u0648 Redis<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/rasanegaar.com\/blog\/%d9%88%d8%b8%d8%a7%db%8c%d9%81-%d9%86%d8%a7%d9%87%d9%85%d8%b2%d9%85%d8%a7%d9%86-%d8%af%d8%b1-%d8%ac%d9%86%da%af%d9%88-%d8%a8%d8%a7-%d8%b1%d8%af%db%8c%d8%b3-%d9%88-%da%a9%d8%b1%d9%81%d8%b3\/#%d8%a7%db%8c%d8%ac%d8%a7%d8%af_%d8%b1%db%8c%d8%b2_%d8%b9%da%a9%d8%b3%d9%87%d8%a7_%d8%af%d8%b1_%db%8c%da%a9_%da%a9%d8%a7%d8%b1_celery\" >\u0627\u06cc\u062c\u0627\u062f \u0631\u06cc\u0632 \u0639\u06a9\u0633\u0647\u0627 \u062f\u0631 \u06cc\u06a9 \u06a9\u0627\u0631 Celery<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/rasanegaar.com\/blog\/%d9%88%d8%b8%d8%a7%db%8c%d9%81-%d9%86%d8%a7%d9%87%d9%85%d8%b2%d9%85%d8%a7%d9%86-%d8%af%d8%b1-%d8%ac%d9%86%da%af%d9%88-%d8%a8%d8%a7-%d8%b1%d8%af%db%8c%d8%b3-%d9%88-%da%a9%d8%b1%d9%81%d8%b3\/#%d8%a7%d8%b3%d8%aa%d9%82%d8%b1%d8%a7%d8%b1_%d8%af%d8%b1_%d8%b3%d8%b1%d9%88%d8%b1_%d8%a7%d9%88%d8%a8%d9%88%d9%86%d8%aa%d9%88\" >\u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062f\u0631 \u0633\u0631\u0648\u0631 \u0627\u0648\u0628\u0648\u0646\u062a\u0648<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/rasanegaar.com\/blog\/%d9%88%d8%b8%d8%a7%db%8c%d9%81-%d9%86%d8%a7%d9%87%d9%85%d8%b2%d9%85%d8%a7%d9%86-%d8%af%d8%b1-%d8%ac%d9%86%da%af%d9%88-%d8%a8%d8%a7-%d8%b1%d8%af%db%8c%d8%b3-%d9%88-%da%a9%d8%b1%d9%81%d8%b3\/#%d9%86%d8%aa%db%8c%d8%ac%d9%87\" >\u0646\u062a\u06cc\u062c\u0647<\/a><\/li><\/ul><\/nav><\/div>\n<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">\u0632\u0645\u0627\u0646 \u0644\u0627\u0632\u0645 \u0628\u0631\u0627\u06cc \u0645\u0637\u0627\u0644\u0639\u0647: <\/span> <span class=\"rt-time\"> 15<\/span> <span class=\"rt-label rt-postfix\">\u062f\u0642\u06cc\u0642\u0647<\/span><\/span><p> <br \/>\n<\/p>\n<div><noscript><\/noscript><\/p>\n<h2 id=\"introduction\"><span class=\"ez-toc-section\" id=\"%d9%85%d8%b9%d8%b1%d9%81%db%8c\"><\/span>\u0645\u0639\u0631\u0641\u06cc<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0645\u0646 \u06cc\u06a9 \u062f\u0631\u06a9 \u06a9\u0644\u06cc \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0686\u0631\u0627 \u0635\u0641 \u067e\u06cc\u0627\u0645 \u0647\u0627\u06cc \u06a9\u0631\u0641\u0633 \u0627\u0631\u0632\u0634\u0645\u0646\u062f \u0647\u0633\u062a\u0646\u062f \u0647\u0645\u0631\u0627\u0647 \u0628\u0627 \u0631\u0648\u0634 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u0631\u0641\u0633 \u062f\u0631 \u0627\u0631\u062a\u0628\u0627\u0637 \u0628\u0627 Redis \u062f\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u0646\u06af\u0648 \u0627\u0631\u0627\u0626\u0647 \u062e\u0648\u0627\u0647\u0645 \u06a9\u0631\u062f.  \u0628\u0631\u0627\u06cc \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0646 \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc\u060c \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u067e\u0631\u062f\u0627\u0632\u0634 \u062a\u0635\u0648\u06cc\u0631 \u0645\u06cc\u0646\u06cc\u0645\u0627\u0644\u06cc\u0633\u062a\u06cc \u0645\u06cc\u200c\u0633\u0627\u0632\u0645 \u06a9\u0647 \u062a\u0635\u0627\u0648\u06cc\u0631 \u06a9\u0648\u0686\u06a9\u06cc \u0627\u0632 \u062a\u0635\u0627\u0648\u06cc\u0631 \u0627\u0631\u0633\u0627\u0644 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0631\u0627 \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n<p>\u0645\u0648\u0636\u0648\u0639\u0627\u062a \u0632\u06cc\u0631 \u067e\u0648\u0634\u0634 \u062f\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0634\u062f:<\/p>\n<p>\u06a9\u062f \u0627\u06cc\u0646 \u0645\u062b\u0627\u0644 \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u06cc\u0627\u0641\u062a \u0631\u0648\u06cc <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/amcquistan\/image_parroter\">GitHub<\/a> \u0628\u0647 \u0647\u0645\u0631\u0627\u0647 \u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644\u200c\u0647\u0627\u06cc \u0646\u0635\u0628 \u0648 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0627\u06af\u0631 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0628\u0647 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u06a9\u0627\u0645\u0644 \u0628\u0631\u0648\u06cc\u062f\u060c \u062f\u0631 \u063a\u06cc\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u062f\u0631 \u0627\u062f\u0627\u0645\u0647 \u0645\u0642\u0627\u0644\u0647 \u0634\u0645\u0627 \u0631\u0627 \u0628\u0627 \u0631\u0648\u0634 \u0633\u0627\u062e\u062a \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0627\u0632 \u0627\u0628\u062a\u062f\u0627 \u0622\u0634\u0646\u0627 \u062e\u0648\u0627\u0647\u0645 \u06a9\u0631\u062f.<\/p>\n<h2 id=\"backgroundonmessagequeueswithceleryandredis\"><span class=\"ez-toc-section\" id=\"%d8%b2%d9%85%db%8c%d9%86%d9%87_%d8%b1%d9%88%db%8c_%d8%b5%d9%81_%d9%87%d8%a7%db%8c_%d9%be%db%8c%d8%a7%d9%85_%d8%a8%d8%a7_celery_%d9%88_redis\"><\/span>\u0632\u0645\u06cc\u0646\u0647 \u0631\u0648\u06cc \u0635\u0641 \u0647\u0627\u06cc \u067e\u06cc\u0627\u0645 \u0628\u0627 Celery \u0648 Redis<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Celery \u06cc\u06a9 \u0628\u0633\u062a\u0647 \u0646\u0631\u0645\u200c\u0627\u0641\u0632\u0627\u0631\u06cc \u0628\u0631\u0627\u06cc \u0635\u0641\u200c\u0628\u0646\u062f\u06cc \u0648\u0638\u0627\u06cc\u0641 \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u067e\u0627\u06cc\u062a\u0648\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0627\u062c\u0631\u0627\u06cc \u0628\u0627\u0631\u0647\u0627\u06cc \u06a9\u0627\u0631\u06cc \u0645\u062d\u0627\u0633\u0628\u0627\u062a\u06cc \u0646\u0627\u0647\u0645\u0632\u0645\u0627\u0646 \u0631\u0627 \u0645\u0645\u06a9\u0646 \u0645\u06cc\u200c\u0633\u0627\u0632\u062f \u06a9\u0647 \u062a\u0648\u0633\u0637 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u0648\u062c\u0648\u062f \u062f\u0631 \u067e\u06cc\u0627\u0645\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u062f\u0631 \u06a9\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc\u200c\u0634\u0648\u0646\u062f (\u062c\u0627\u0646\u06af\u0648 \u062f\u0631 \u0627\u06cc\u0646 \u0645\u062b\u0627\u0644) \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0635\u0641 \u06a9\u0627\u0631 Celery \u062a\u0639\u06cc\u06cc\u0646 \u0634\u062f\u0647\u200c\u0627\u0646\u062f\u060c \u0647\u062f\u0627\u06cc\u062a \u0645\u06cc\u200c\u0634\u0648\u0646\u062f.  \u06a9\u0631\u0641\u0633 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0648\u0638\u0627\u06cc\u0641 \u062a\u06a9\u0631\u0627\u0631 \u0634\u0648\u0646\u062f\u0647 (\u06cc\u0639\u0646\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u06cc\u0632\u06cc \u0634\u062f\u0647) \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0634\u0648\u062f\u060c \u0627\u0645\u0627 \u062a\u0645\u0631\u06a9\u0632 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0646\u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n<p>\u06a9\u0631\u0641\u0633 \u0628\u0647 \u0628\u0647\u062a\u0631\u06cc\u0646 \u0648\u062c\u0647 \u0647\u0645\u0631\u0627\u0647 \u0628\u0627 \u0645\u062d\u0644\u0648\u0644 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0647 \u0627\u063a\u0644\u0628 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0648\u0627\u0633\u0637\u0647 \u067e\u06cc\u0627\u0645 \u0627\u0632 \u0622\u0646 \u06cc\u0627\u062f \u0645\u06cc \u0634\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f.  \u06cc\u06a9 \u06a9\u0627\u0631\u06af\u0632\u0627\u0631 \u067e\u06cc\u0627\u0645 \u0631\u0627\u06cc\u062c \u06a9\u0647 \u0628\u0631\u0627\u06cc \u06a9\u0631\u0641\u0633 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f Redis \u0627\u0633\u062a \u06a9\u0647 \u06cc\u06a9 \u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0644\u06cc\u062f\u06cc-\u0645\u0642\u062f\u0627\u0631 \u0639\u0645\u0644\u06a9\u0631\u062f\u06cc \u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u0627\u0633\u062a.  \u0628\u0647 \u0637\u0648\u0631 \u062e\u0627\u0635\u060c Redis \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u067e\u06cc\u0627\u0645\u200c\u0647\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u06a9\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f \u06a9\u0647 \u06a9\u0627\u0631 \u0631\u0627 \u062f\u0631 \u0635\u0641 \u0648\u0638\u0627\u06cc\u0641 Celery \u062a\u0648\u0635\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u062f.  Redis \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc \u0646\u062a\u0627\u06cc\u062c\u06cc \u06a9\u0647 \u0627\u0632 \u0635\u0641\u200c\u0647\u0627\u06cc \u06a9\u0631\u0641\u0633 \u062e\u0627\u0631\u062c \u0645\u06cc\u200c\u0634\u0648\u0646\u062f \u0648 \u0633\u067e\u0633 \u062a\u0648\u0633\u0637 \u0645\u0635\u0631\u0641\u200c\u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u0635\u0641 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0645\u06cc\u200c\u0634\u0648\u0646\u062f\u060c \u0639\u0645\u0644 \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n<h2 id=\"localdevsetupwithdjangoceleryandredis\"><span class=\"ez-toc-section\" id=\"local_dev_setup_%d8%a8%d8%a7_django%d8%8c_celery_%d9%88_redis\"><\/span>Local  Dev Setup \u0628\u0627 Django\u060c Celery \u0648 Redis<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0645\u0646 \u0627\u0628\u062a\u062f\u0627 \u0628\u0627 \u0633\u062e\u062a \u062a\u0631\u06cc\u0646 \u0642\u0633\u0645\u062a \u06a9\u0647 \u0646\u0635\u0628 Redis \u0627\u0633\u062a \u0634\u0631\u0648\u0639 \u0645\u06cc \u06a9\u0646\u0645.<\/p>\n<p><strong>\u0646\u0635\u0628 Redis \u0631\u0648\u06cc \u067e\u0646\u062c\u0631\u0647 \u0647\u0627<\/strong><\/p>\n<ol>\n<li>Redis \u0631\u0627 \u062f\u0627\u0646\u0644\u0648\u062f \u06a9\u0646\u06cc\u062f <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/microsoftarchive\/redis\/releases\/tag\/win-3.2.100\">\u0641\u0627\u06cc\u0644 \u0641\u0634\u0631\u062f\u0647<\/a> \u0648 \u0627\u0632 \u062d\u0627\u0644\u062a \u0641\u0634\u0631\u062f\u0647 \u062e\u0627\u0631\u062c \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0641\u0627\u06cc\u0644 \u0646\u0627\u0645\u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647 \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f <code>redis-server.exe<\/code> \u0648 \u062f\u0648\u0628\u0627\u0631 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0633\u0631\u0648\u0631 \u062f\u0631 \u06cc\u06a9 \u067e\u0646\u062c\u0631\u0647 \u0641\u0631\u0645\u0627\u0646 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0634\u0648\u062f<\/li>\n<li>\u0628\u0647 \u0637\u0648\u0631 \u0645\u0634\u0627\u0628\u0647\u060c \u0641\u0627\u06cc\u0644 \u062f\u06cc\u06af\u0631\u06cc \u0628\u0647 \u0646\u0627\u0645 redis-cli.exe \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f \u0648 \u0631\u0648\u06cc \u0622\u0646 \u062f\u0648\u0628\u0627\u0631 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0631 \u06cc\u06a9 \u067e\u0646\u062c\u0631\u0647 \u062f\u0633\u062a\u0648\u0631 \u062c\u062f\u0627\u06af\u0627\u0646\u0647 \u0628\u0627\u0632 \u0634\u0648\u062f.<\/li>\n<li>\u062f\u0631 \u067e\u0646\u062c\u0631\u0647 \u0641\u0631\u0645\u0627\u0646\u06cc \u06a9\u0647 \u06a9\u0644\u0627\u06cc\u0646\u062a cli \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0627 \u0635\u062f\u0648\u0631 \u0641\u0631\u0645\u0627\u0646 \u0628\u0627 \u0633\u0631\u0648\u0631 \u0635\u062d\u0628\u062a \u06a9\u0646\u062f <code>ping<\/code> \u0648 \u0627\u06af\u0631 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u062e\u0648\u0628 \u067e\u06cc\u0634 \u0628\u0631\u0648\u062f \u06cc\u06a9 \u067e\u0627\u0633\u062e \u0627\u0632 <code>PONG<\/code> \u0628\u0627\u06cc\u062f \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647 \u0634\u0648\u062f<\/li>\n<\/ol>\n<p><strong>\u0646\u0635\u0628 Redis \u0631\u0648\u06cc Mac OSX \/ Linux<\/strong><\/p>\n<ol>\n<li>Redis \u0631\u0627 \u062f\u0627\u0646\u0644\u0648\u062f \u06a9\u0646\u06cc\u062f <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/redis.io\/download\" class=\"broken_link\">\u0641\u0627\u06cc\u0644 \u062a\u0631\u0628\u0627\u0644<\/a> \u0648 \u0622\u0646 \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0627 <code>make install<\/code> \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a\u0646 \u0628\u0631\u0646\u0627\u0645\u0647<\/li>\n<li>a \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f terminal \u067e\u0646\u062c\u0631\u0647 \u0648 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f <code>redis-server<\/code> \u0641\u0631\u0645\u0627\u0646<\/li>\n<li>\u062f\u0631 \u062f\u06cc\u06af\u0631\u06cc terminal \u0627\u062c\u0631\u0627\u06cc \u067e\u0646\u062c\u0631\u0647 <code>redis-cli<\/code><\/li>\n<li>\u062f\u0631 \u062f\u0627\u062e\u0644 terminal \u067e\u0646\u062c\u0631\u0647 \u0627\u06cc \u06a9\u0647 \u06a9\u0644\u0627\u06cc\u0646\u062a cli \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f\u060c \u062a\u0633\u062a \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u0634\u0648\u062f \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0627 \u0635\u062f\u0648\u0631 \u062f\u0633\u062a\u0648\u0631 \u0628\u0627 \u0633\u0631\u0648\u0631 \u0635\u062d\u0628\u062a \u06a9\u0646\u062f <code>ping<\/code> \u0648 \u0627\u06af\u0631 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u062e\u0648\u0628 \u067e\u06cc\u0634 \u0628\u0631\u0648\u062f \u06cc\u06a9 \u067e\u0627\u0633\u062e \u0627\u0632 <code>PONG<\/code> \u0628\u0627\u06cc\u062f \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647 \u0634\u0648\u062f<\/li>\n<\/ol>\n<p><strong>Python Virtual Env \u0648 Dependencies \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f<\/strong><\/p>\n<p>\u0627\u0644\u0627\u0646 \u0645\u06cc\u062a\u0648\u0646\u0645 \u062d\u0631\u06a9\u062a \u06a9\u0646\u0645 \u0631\u0648\u06cc \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u0645\u062c\u0627\u0632\u06cc Python3 \u0648 \u0646\u0635\u0628 \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0644\u0627\u0632\u0645 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639 \u0645\u0646 \u06cc\u06a9 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0628\u0631\u0627\u06cc \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u0646 \u0686\u06cc\u0632\u0647\u0627\u06cc\u06cc \u0628\u0647 \u0646\u0627\u0645 image_parroter \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u0645 \u0633\u067e\u0633 \u062f\u0631 \u062f\u0627\u062e\u0644 \u0622\u0646 \u0645\u062d\u06cc\u0637 \u0645\u062c\u0627\u0632\u06cc \u062e\u0648\u062f \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u0645.  \u062a\u0645\u0627\u0645 \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0627\u0632 \u0627\u06cc\u0646\u062c\u0627 \u0628\u0647 \u0628\u0639\u062f \u0641\u0642\u0637 \u0627\u0632 \u0646\u0648\u0639 \u06cc\u0648\u0646\u06cc\u06a9\u0633 \u062e\u0648\u0627\u0647\u0646\u062f \u0628\u0648\u062f\u060c \u0627\u0645\u0627 \u0627\u06a9\u062b\u0631 \u0622\u0646\u0647\u0627 \u0627\u06af\u0631 \u0646\u06af\u0648\u06cc\u06cc\u0645 \u0647\u0645\u0647 \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u0648\u06cc\u0646\u062f\u0648\u0632 \u06cc\u06a9\u0633\u0627\u0646 \u062e\u0648\u0627\u0647\u0646\u062f \u0628\u0648\u062f.<\/p>\n<pre><code class=\"hljs\"><span class=\"hljs-meta\">$<\/span><span class=\"bash\"> mkdir image_parroter<\/span>\n<span class=\"hljs-meta\">$<\/span><span class=\"bash\"> <span class=\"hljs-built_in\">cd<\/span> image_parroter<\/span>\n<span class=\"hljs-meta\">$<\/span><span class=\"bash\"> python3 -m venv venv<\/span>\n<span class=\"hljs-meta\">$<\/span><span class=\"bash\"> <span class=\"hljs-built_in\">source<\/span> venv\/bin\/activate<\/span>\n<\/code><\/pre>\n<p>\u0628\u0627 \u0641\u0639\u0627\u0644 \u0634\u062f\u0646 \u0645\u062d\u06cc\u0637 \u0645\u062c\u0627\u0632\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc \u067e\u0627\u06cc\u062a\u0648\u0646 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u0645.<\/p>\n<pre><code class=\"hljs\">(venv) $ pip install Django Celery redis Pillow django-widget-tweaks\n(venv) $ pip freeze &gt; requirements.txt\n<\/code><\/pre>\n<ul>\n<li>Pillow \u06cc\u06a9 \u0628\u0633\u062a\u0647 \u067e\u0627\u06cc\u062a\u0648\u0646 \u063a\u06cc\u0631 \u0645\u0631\u062a\u0628\u0637 \u0628\u0627 \u06a9\u0631\u0641\u0633 \u0628\u0631\u0627\u06cc \u067e\u0631\u062f\u0627\u0632\u0634 \u062a\u0635\u0648\u06cc\u0631 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0639\u062f\u0627\u064b \u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0628\u0631\u0627\u06cc \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0646 \u06cc\u06a9 \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062f\u0631 \u062f\u0646\u06cc\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0647\u0627\u06cc \u06a9\u0631\u0641\u0633 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u0645 \u06a9\u0631\u062f.<\/li>\n<li>Django Widget Tweaks \u06cc\u06a9 \u067e\u0644\u0627\u06af\u06cc\u0646 \u062c\u0646\u06af\u0648 \u0628\u0631\u0627\u06cc \u0627\u0631\u0627\u0626\u0647 \u0627\u0646\u0639\u0637\u0627\u0641 \u067e\u0630\u06cc\u0631\u06cc \u062f\u0631 \u0631\u0648\u0634 \u0627\u0631\u0627\u0626\u0647 \u0648\u0631\u0648\u062f\u06cc \u0647\u0627\u06cc \u0641\u0631\u0645 \u0627\u0633\u062a.<\/li>\n<\/ul>\n<p><strong>\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u067e\u0631\u0648\u0698\u0647 \u062c\u0646\u06af\u0648<\/strong><\/p>\n<p>\u062f\u0631 \u062d\u0627\u0644 \u062d\u0631\u06a9\u062a \u0631\u0648\u06cc\u060c \u0645\u0646 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u062c\u0646\u06af\u0648 \u0628\u0627 \u0646\u0627\u0645 image_parroter \u0648 \u0633\u067e\u0633 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u0646\u06af\u0648 \u0628\u0647 \u0646\u0627\u0645 thumbnailer \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u0645.<\/p>\n<pre><code class=\"hljs\">(venv) $ django-admin startproject image_parroter\n(venv) $ cd image_parroter\n(venv) $ python manage.py startapp thumbnailer\n<\/code><\/pre>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647 \u0633\u0627\u062e\u062a\u0627\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0628\u0647 \u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n<pre><code class=\"hljs\"><span class=\"hljs-meta\">$<\/span><span class=\"bash\"> tree -I venv<\/span>\n.\n\u2514\u2500\u2500 image_parroter\n    \u251c\u2500\u2500 image_parroter\n    \u2502   \u251c\u2500\u2500 __init__.py\n    \u2502   \u251c\u2500\u2500 settings.py\n    \u2502   \u251c\u2500\u2500 urls.py\n    \u2502   \u2514\u2500\u2500 wsgi.py\n    \u251c\u2500\u2500 manage.py\n    \u2514\u2500\u2500 thumbnailer\n        \u251c\u2500\u2500 __init__.py\n        \u251c\u2500\u2500 admin.py\n        \u251c\u2500\u2500 apps.py\n        \u251c\u2500\u2500 migrations\n        \u2502   \u2514\u2500\u2500 __init__.py\n        \u251c\u2500\u2500 models.py\n        \u251c\u2500\u2500 tests.py\n        \u2514\u2500\u2500 views.py\n<\/code><\/pre>\n<p>\u0628\u0631\u0627\u06cc \u0627\u062f\u063a\u0627\u0645 Celery \u062f\u0631 \u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u062c\u0646\u06af\u0648\u060c \u0645\u0627\u0698\u0648\u0644 \u062c\u062f\u06cc\u062f\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0645 <code>image\\_parroter\/image\\_parrroter\/celery.py<\/code> \u06a9\u0646\u0648\u0627\u0646\u0633\u06cc\u0648\u0646 \u0647\u0627\u06cc \u0632\u06cc\u0631 \u0634\u0631\u062d \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u062f\u0631 <a rel=\"nofollow noopener\" target=\"_blank\" href=\"http:\/\/docs.celeryproject.org\/en\/latest\/django\/first-steps-with-django.html#django-first-steps\">\u0627\u0633\u0646\u0627\u062f \u06a9\u0631\u0641\u0633<\/a>.  \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0627\u0698\u0648\u0644 \u062c\u062f\u06cc\u062f \u067e\u0627\u06cc\u062a\u0648\u0646 I import \u0631\u0627 <code>os<\/code> \u0628\u0633\u062a\u0647 \u0648 <code>Celery<\/code> \u06a9\u0644\u0627\u0633 \u0627\u0632 \u0628\u0633\u062a\u0647 \u06a9\u0631\u0641\u0633.<\/p>\n<p>\u0627\u06cc\u0646 <code>os<\/code> \u0645\u0627\u0698\u0648\u0644 \u0628\u0631\u0627\u06cc \u0645\u0631\u062a\u0628\u0637 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u0645\u062a\u063a\u06cc\u0631 \u0645\u062d\u06cc\u0637\u06cc Celery \u0628\u0647 \u0646\u0627\u0645 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f <code>DJANGO_SETTINGS_MODULE<\/code> \u0628\u0627 \u0645\u0627\u0698\u0648\u0644 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u067e\u0631\u0648\u0698\u0647 \u062c\u0646\u06af\u0648.  \u067e\u0633 \u0627\u0632 \u0622\u0646 \u0645\u0646 \u0646\u0645\u0648\u0646\u0647 \u0627\u06cc \u0627\u0632 \u0622\u0646 \u0631\u0627 \u0646\u0645\u0648\u0646\u0647 \u0645\u06cc \u06a9\u0646\u0645 <code>Celery<\/code> \u06a9\u0644\u0627\u0633 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f <code>celery_app<\/code> \u0645\u062a\u063a\u06cc\u0631\u0646\u0645\u0648\u0646\u0647.  \u0633\u067e\u0633 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 Celery \u0631\u0627 \u0628\u0627 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a\u06cc \u06a9\u0647 \u0628\u0647 \u0632\u0648\u062f\u06cc \u062f\u0631 \u0641\u0627\u06cc\u0644 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u067e\u0631\u0648\u0698\u0647 \u062c\u0646\u06af\u0648 \u0642\u0627\u0628\u0644 \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u0628\u0627 \u067e\u06cc\u0634\u0648\u0646\u062f &#8220;CELERY_&#8221; \u0642\u0631\u0627\u0631 \u062e\u0648\u0627\u0647\u0645 \u062f\u0627\u062f\u060c \u0628\u0647 \u0631\u0648\u0632 \u0645\u06cc \u06a9\u0646\u0645.  \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u0628\u0647 \u062a\u0627\u0632\u0647 \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u0645\u06cc \u06af\u0648\u06cc\u0645 <code>celery_app<\/code> \u0646\u0645\u0648\u0646\u0647 \u0627\u06cc \u0628\u0631\u0627\u06cc \u06a9\u0634\u0641 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0648\u0638\u0627\u06cc\u0641 \u062f\u0631 \u067e\u0631\u0648\u0698\u0647.<\/p>\n<p>\u062a\u06a9\u0645\u06cc\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a <code>celery.py<\/code> \u0645\u0627\u0698\u0648\u0644 \u062f\u0631 \u0632\u06cc\u0631 \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<pre><code class=\"hljs\">\n\n<span class=\"hljs-keyword\">import<\/span> os\n<span class=\"hljs-keyword\">from<\/span> celery <span class=\"hljs-keyword\">import<\/span> Celery\n\nos.environ.setdefault(<span class=\"hljs-string\">'DJANGO_SETTINGS_MODULE'<\/span>, <span class=\"hljs-string\">'image_parroter.settings'<\/span>)\n\ncelery_app = Celery(<span class=\"hljs-string\">'image_parroter'<\/span>)\ncelery_app.config_from_object(<span class=\"hljs-string\">'django.conf:settings'<\/span>, namespace=<span class=\"hljs-string\">'CELERY'<\/span>)\ncelery_app.autodiscover_tasks()\n<\/code><\/pre>\n<p>\u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631 \u062f\u0631 \u067e\u0631\u0648\u0698\u0647 \u0627\u0633\u062a <code>settings.py<\/code> \u0645\u0627\u0698\u0648\u0644\u060c \u062f\u0631 \u067e\u0627\u06cc\u06cc\u0646\u060c \u06cc\u06a9 \u0628\u062e\u0634 \u0628\u0631\u0627\u06cc \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u06a9\u0631\u0641\u0633 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u0645 \u0648 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a\u06cc \u0631\u0627 \u06a9\u0647 \u062f\u0631 \u0632\u06cc\u0631 \u0645\u06cc \u0628\u06cc\u0646\u06cc\u062f \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u06a9\u0646\u0645.  \u0627\u06cc\u0646 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0628\u0647 Celery \u0645\u06cc\u200c\u06af\u0648\u06cc\u062f \u06a9\u0647 \u0627\u0632 Redis \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0648\u0627\u0633\u0637\u0647 \u067e\u06cc\u0627\u0645 \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u062d\u0644 \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u062f.  \u0622\u0646\u0647\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0647 Celery \u0645\u06cc \u06af\u0648\u06cc\u0646\u062f \u06a9\u0647 \u0627\u0646\u062a\u0638\u0627\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f \u067e\u06cc\u0627\u0645 \u0647\u0627 \u0628\u06cc\u0646 \u0635\u0641 \u0647\u0627\u06cc \u0648\u0638\u06cc\u0641\u0647 Celery \u0648 \u0648\u0627\u0633\u0637\u0647 \u067e\u06cc\u0627\u0645 Redis \u062f\u0631 \u0646\u0648\u0639 mime \u0627\u0631\u0633\u0627\u0644 \u0634\u0648\u0646\u062f. <code>application\/json<\/code>.<\/p>\n<pre><code class=\"hljs\">\n\n<span class=\"hljs-meta\">... <\/span>skipping to the bottom\n\n\nCELERY_BROKER_URL = <span class=\"hljs-string\">'redis:\/\/localhost:6379'<\/span>\nCELERY_RESULT_BACKEND = <span class=\"hljs-string\">'redis:\/\/localhost:6379'<\/span>\nCELERY_ACCEPT_CONTENT = (<span class=\"hljs-string\">'application\/json'<\/span>)\nCELERY_RESULT_SERIALIZER = <span class=\"hljs-string\">'json'<\/span>\nCELERY_TASK_SERIALIZER = <span class=\"hljs-string\">'json'<\/span>\n<\/code><\/pre>\n<p>\u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f\u060c \u0628\u0627\u06cc\u062f \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u0645 \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 cellery \u06a9\u0647 \u0642\u0628\u0644\u0627\u064b \u0627\u06cc\u062c\u0627\u062f \u0648 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u0646\u06af\u0648 \u062a\u0632\u0631\u06cc\u0642 \u0645\u06cc \u0634\u0648\u062f.  \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0628\u0627 \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 Celery \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u06cc \u067e\u0631\u0648\u0698\u0647 \u062c\u0646\u06af\u0648 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u0634\u0648\u062f <code>\\_\\_init\\_\\_.py<\/code> \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0648 \u062b\u0628\u062a \u0635\u0631\u06cc\u062d \u0622\u0646 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0646\u0645\u0627\u062f \u0641\u0636\u0627\u06cc \u0646\u0627\u0645 \u062f\u0631 \u062f\u0627\u062e\u0644 <code>image\\_parroter<\/code> \u067e\u06a9\u06cc\u062c \u062c\u0646\u06af\u0648.<\/p>\n<pre><code class=\"hljs\">\n\n<span class=\"hljs-keyword\">from<\/span> .celery <span class=\"hljs-keyword\">import<\/span> celery_app\n\n__all__ = (<span class=\"hljs-string\">'celery_app'<\/span>,)\n<\/code><\/pre>\n<p>\u0645\u0646 \u0647\u0645\u0686\u0646\u0627\u0646 \u0628\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u0645\u0627\u0698\u0648\u0644 \u062c\u062f\u06cc\u062f \u0628\u0647 \u0646\u0627\u0645\u060c \u0628\u0647 \u062f\u0646\u0628\u0627\u0644 \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u0647\u0627\u06cc \u067e\u06cc\u0634\u0646\u0647\u0627\u062f\u06cc \u0647\u0633\u062a\u0645 <code>tasks.py<\/code> \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 &#8220;\u062a\u0635\u0648\u06cc\u0631 \u06a9\u0648\u0686\u06a9&#8221;  \u062f\u0631\u0648\u0646 <code>tasks.py<\/code> \u0645\u0627\u0698\u0648\u0644 I import \u0631\u0627 <code>shared_tasks<\/code> \u062a\u0627\u0628\u0639 \u062f\u06a9\u0648\u0631\u0627\u062a\u0648\u0631 \u0648 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0646 \u0628\u0631\u0627\u06cc \u062a\u0639\u0631\u06cc\u0641 \u062a\u0627\u0628\u0639 \u0648\u0638\u06cc\u0641\u0647 \u06a9\u0631\u0641\u0633 \u0628\u0647 \u0646\u0627\u0645 <code>adding_task<\/code>\u060c \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 \u0632\u06cc\u0631 \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<pre><code class=\"hljs\">\n\n<span class=\"hljs-keyword\">from<\/span> celery <span class=\"hljs-keyword\">import<\/span> shared_task\n\n<span class=\"hljs-meta\">@shared_task<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">adding_task<\/span>(<span class=\"hljs-params\">x, y<\/span>):<\/span>\n    <span class=\"hljs-keyword\">return<\/span> x + y\n<\/code><\/pre>\n<p>\u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u0645\u0646 \u0628\u0627\u06cc\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u0648\u0686\u06a9 \u0631\u0627 \u0628\u0647 \u0644\u06cc\u0633\u062a \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0645 <code>INSTALLED_APPS<\/code> \u062f\u0631 \u067e\u0631\u0648\u0698\u0647 image_parroter <code>settings.py<\/code> \u0645\u062f\u0648\u0644.  \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0645\u0646 \u062f\u0631 \u0622\u0646\u062c\u0627 \u0647\u0633\u062a\u0645\u060c \u0628\u0627\u06cc\u062f \u0628\u0631\u0646\u0627\u0645\u0647 &#8220;widget_tweaks&#8221; \u0631\u0627 \u0646\u06cc\u0632 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0645 \u062a\u0627 \u0628\u0631\u0627\u06cc \u06a9\u0646\u062a\u0631\u0644 \u0631\u0646\u062f\u0631 \u0648\u0631\u0648\u062f\u06cc \u0641\u0631\u0645 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0634\u0648\u062f \u06a9\u0647 \u0628\u0639\u062f\u0627\u064b \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u0645 \u06a9\u0631\u062f \u062a\u0627 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0627\u062c\u0627\u0632\u0647 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u0647\u0627 \u0631\u0627 \u0628\u062f\u0647\u0645.<\/p>\n<pre><code class=\"hljs\">\n\n<span class=\"hljs-meta\">... <\/span>skipping to the INSTALLED_APPS\n\nINSTALLED_APPS = (\n    <span class=\"hljs-string\">'django.contrib.admin'<\/span>,\n    <span class=\"hljs-string\">'django.contrib.auth'<\/span>,\n    <span class=\"hljs-string\">'django.contrib.contenttypes'<\/span>,\n    <span class=\"hljs-string\">'django.contrib.sessions'<\/span>,\n    <span class=\"hljs-string\">'django.contrib.messages'<\/span>,\n    <span class=\"hljs-string\">'django.contrib.staticfiles'<\/span>,\n    <span class=\"hljs-string\">'thumbnailer.apps.ThumbnailerConfig'<\/span>,\n    <span class=\"hljs-string\">'widget_tweaks'<\/span>,\n)\n<\/code><\/pre>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0686\u0646\u062f \u062f\u0633\u062a\u0648\u0631 \u0633\u0627\u062f\u0647 \u062f\u0631 \u0633\u0647 \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u0686\u06cc\u0632\u0647\u0627 \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u0645.<\/p>\n<p>\u062f\u0631 \u06cc\u06a9 terminal \u0645\u0646 \u0628\u0627\u06cc\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0645 <code>redis-server<\/code> \u062f\u0648\u06cc\u062f\u0646\u060c \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646:<\/p>\n<pre><code class=\"hljs\"><span class=\"hljs-meta\">$<\/span><span class=\"bash\"> redis-server<\/span>\n48621:C 21 May 21:55:23.706 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo\n48621:C 21 May 21:55:23.707 # Redis version=4.0.8, bits=64, commit=00000000, modified=0, pid=48621, just started\n48621:C 21 May 21:55:23.707 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server \/path\/to\/redis.conf\n48621:M 21 May 21:55:23.708 * Increased maximum number of open files to 10032 (it was originally set to 2560).\n                _._                                                  \n           _.-``__ ''-._                                             \n      _.-``    `.  `_.  ''-._           Redis 4.0.8 (00000000\/0) 64 bit\n  .-`` .-```.  ```\\\/    _.,_ ''-._                                   \n (    '      ,       .-`  | `,    )     Running in standalone mode\n |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379\n |    `-._   `._    \/     _.-'    |     PID: 48621\n  `-._    `-._  `-.\/  _.-'    _.-'                                   \n |`-._`-._    `-.__.-'    _.-'_.-'|                                  \n |    `-._`-._        _.-'_.-'    |           http:\/\/redis.io        \n  `-._    `-._`-.__.-'_.-'    _.-'                                   \n |`-._`-._    `-.__.-'    _.-'_.-'|                                  \n |    `-._`-._        _.-'_.-'    |                                  \n  `-._    `-._`-.__.-'_.-'    _.-'                                   \n      `-._    `-.__.-'    _.-'                                       \n          `-._        _.-'                                           \n              `-.__.-'                                               \n\n48621:M 21 May 21:55:23.712 # Server initialized\n48621:M 21 May 21:55:23.712 * Ready to accept connections\n<\/code><\/pre>\n<p>\u062f\u0631 \u06cc\u06a9 \u062b\u0627\u0646\u06cc\u0647 terminal\u060c \u0628\u0627 \u06cc\u06a9 \u0646\u0645\u0648\u0646\u0647 \u0641\u0639\u0627\u0644 \u0627\u0632 \u0645\u062d\u06cc\u0637 \u0645\u062c\u0627\u0632\u06cc \u067e\u0627\u06cc\u062a\u0648\u0646 \u06a9\u0647 \u0642\u0628\u0644\u0627\u064b \u062f\u0631 \u067e\u0631\u0648\u0698\u0647 \u0646\u0635\u0628 \u0634\u062f\u0647 \u0627\u0633\u062a root \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0628\u0633\u062a\u0647 (\u0647\u0645\u0627\u0646 \u0645\u0648\u0631\u062f\u06cc \u06a9\u0647 \u0634\u0627\u0645\u0644 <code>manage.py<\/code> \u0645\u0627\u0698\u0648\u0644) \u0628\u0631\u0646\u0627\u0645\u0647 cellery \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u0645.<\/p>\n<pre><code class=\"hljs\">(venv) $ celery worker -A image_parroter --loglevel=info\n \n -------------- (email\u00a0protected) v4.3.0 (rhubarb)\n---- **** ----- \n--- * ***  * -- Darwin-18.5.0-x86_64-i386-64bit 2019-05-22 03:01:38\n-- * - **** --- \n- ** ---------- (config)\n- ** ---------- .&gt; app:         image_parroter:0x110b18eb8\n- ** ---------- .&gt; transport:   redis:\/\/localhost:6379\/\/\n- ** ---------- .&gt; results:     redis:\/\/localhost:6379\/\n- *** --- * --- .&gt; concurrency: 8 (prefork)\n-- ******* ---- .&gt; task events: OFF (enable -E to monitor tasks in this worker)\n--- ***** ----- \n -------------- (queues)\n                .&gt; celery           exchange=celery(direct) key=celery\n                \n\n(tasks)\n  . thumbnailer.tasks.adding_task\n<\/code><\/pre>\n<p>\u062f\u0631 \u0633\u0648\u0645\u06cc\u0646 \u0648 \u067e\u0627\u06cc\u0627\u0646\u06cc terminal\u060c \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0627 \u0641\u0639\u0627\u0644 \u0628\u0648\u062f\u0646 \u0645\u062d\u06cc\u0637 \u0645\u062c\u0627\u0632\u06cc \u067e\u0627\u06cc\u062a\u0648\u0646\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0645 \u067e\u0648\u0633\u062a\u0647 \u062c\u0646\u06af\u0648 \u067e\u0627\u06cc\u062a\u0648\u0646 \u0631\u0627 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u0645 \u0648 \u062e\u0648\u062f\u0645 \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u0645. <code>adding_task<\/code>\u060c \u0645\u0627\u0646\u0646\u062f:<\/p>\n<pre><code class=\"hljs\">(venv) $ python manage.py shell\nPython 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 11:07:29) \n<span class=\"hljs-meta\">&gt;<\/span><span class=\"bash\">&gt;&gt; from thumbnailer.tasks import adding_task<\/span>\n<span class=\"hljs-meta\">&gt;<\/span><span class=\"bash\">&gt;&gt; task = adding_task.delay(2, 5)<\/span>\n<span class=\"hljs-meta\">&gt;<\/span><span class=\"bash\">&gt;&gt; <span class=\"hljs-built_in\">print<\/span>(f<span class=\"hljs-string\">\"id={task.id}, state={task.state}, status={task.status}\"<\/span>)<\/span> \nid=86167f65-1256-497e-b5d9-0819f24e95bc, state=SUCCESS, status=SUCCESS\n<span class=\"hljs-meta\">&gt;<\/span><span class=\"bash\">&gt;&gt; task.get()<\/span>\n7\n<\/code><\/pre>\n<p>\u0628\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <code>.delay(...)<\/code> \u0631\u0648\u0634 \u0631\u0648\u06cc \u0631\u0627 <code>adding_task<\/code> \u0647\u062f\u0641 &#8211; \u0634\u06cc.  \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0645\u062a\u062f\u0627\u0648\u0644 \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u0647\u0631 \u067e\u0627\u0631\u0627\u0645\u062a\u0631 \u0644\u0627\u0632\u0645 \u0628\u0647 \u0634\u06cc\u0621 \u0648\u0638\u06cc\u0641\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0628\u0627 \u0622\u0646 \u06a9\u0627\u0631 \u0645\u06cc \u0634\u0648\u062f \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0627\u0631\u0633\u0627\u0644 \u0622\u0646 \u0628\u0647 \u06a9\u0627\u0631\u06af\u0632\u0627\u0631 \u067e\u06cc\u0627\u0645 \u0648 \u0635\u0641 \u06a9\u0627\u0631 \u0622\u063a\u0627\u0632 \u0645\u06cc \u0634\u0648\u062f.  \u0646\u062a\u06cc\u062c\u0647 \u062a\u0645\u0627\u0633 \u0628\u0627 <code>.delay(...)<\/code> \u0645\u062a\u062f \u06cc\u06a9 \u0645\u0642\u062f\u0627\u0631 \u0628\u0627\u0632\u06af\u0634\u062a\u06cc \u0648\u0639\u062f\u0647 \u0645\u0627\u0646\u0646\u062f \u0627\u0632 \u0646\u0648\u0639 \u0627\u0633\u062a <code>celery.result.AsyncResult<\/code>.  \u0627\u06cc\u0646 \u0645\u0642\u062f\u0627\u0631 \u0628\u0627\u0632\u06af\u0634\u062a\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u0645\u0627\u0646\u0646\u062f \u0634\u0646\u0627\u0633\u0647 \u06a9\u0627\u0631\u060c \u0648\u0636\u0639\u06cc\u062a \u0627\u062c\u0631\u0627\u06cc \u0622\u0646\u060c \u0648 \u0648\u0636\u0639\u06cc\u062a \u0648\u0638\u06cc\u0641\u0647 \u0631\u0627 \u0628\u0647 \u0647\u0645\u0631\u0627\u0647 \u062a\u0648\u0627\u0646\u0627\u06cc\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u0646\u062a\u0627\u06cc\u062c \u062a\u0648\u0644\u06cc\u062f \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u06a9\u0627\u0631 \u0627\u0632 \u0637\u0631\u06cc\u0642 <code>.get()<\/code> \u0631\u0648\u0634 \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 \u0645\u062b\u0627\u0644 \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<h2 id=\"creatingimagethumbnailswithinacelerytask\"><span class=\"ez-toc-section\" id=\"%d8%a7%db%8c%d8%ac%d8%a7%d8%af_%d8%b1%db%8c%d8%b2_%d8%b9%da%a9%d8%b3%d9%87%d8%a7_%d8%af%d8%b1_%db%8c%da%a9_%da%a9%d8%a7%d8%b1_celery\"><\/span>\u0627\u06cc\u062c\u0627\u062f \u0631\u06cc\u0632 \u0639\u06a9\u0633\u0647\u0627 \u062f\u0631 \u06cc\u06a9 \u06a9\u0627\u0631 Celery<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u06a9\u0647 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0635\u0641\u062d\u0647 \u062f\u06cc\u06af \u0628\u0631\u0627\u06cc \u0627\u062f\u063a\u0627\u0645 \u0646\u0645\u0648\u0646\u0647 Celery \u0628\u0627 \u067e\u0634\u062a\u0648\u0627\u0646\u0647 Redis \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u0646\u06af\u0648\u060c \u062f\u06cc\u06af\u0631 \u0646\u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0645 \u062d\u0631\u06a9\u062a \u06a9\u0646\u0645. \u0631\u0648\u06cc \u0628\u0631\u0627\u06cc \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0646 \u0628\u0631\u062e\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f\u0647\u0627\u06cc \u0645\u0641\u06cc\u062f\u062a\u0631 \u0628\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0646\u062f\u0627\u0646\u06af\u0634\u062a\u06cc \u06a9\u0647 \u0642\u0628\u0644\u0627 \u0630\u06a9\u0631 \u0634\u062f.<\/p>\n<p>\u0628\u0631\u06af\u0634\u062a \u062f\u0631 <code>tasks.py<\/code> \u0645\u0627\u0698\u0648\u0644\u060c I import \u0631\u0627 <code>Image<\/code> \u06a9\u0644\u0627\u0633 \u0627\u0632 <code>PIL<\/code> \u0628\u0633\u062a\u0647\u060c \u0633\u067e\u0633 \u06cc\u06a9 \u06a9\u0627\u0631 \u062c\u062f\u06cc\u062f \u0628\u0647 \u0646\u0627\u0645 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f <code>make_thumbnails<\/code>\u060c \u06a9\u0647 \u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644 \u062a\u0635\u0648\u06cc\u0631 \u0648 \u0644\u06cc\u0633\u062a\u06cc \u0627\u0632 \u0627\u0628\u0639\u0627\u062f \u0639\u0631\u0636 \u0648 \u0627\u0631\u062a\u0641\u0627\u0639 2 \u062a\u0627\u06cc\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0631\u06cc\u0632 \u0639\u06a9\u0633\u0647\u0627 \u0645\u06cc \u067e\u0630\u06cc\u0631\u062f.<\/p>\n<pre><code class=\"hljs\">\n<span class=\"hljs-keyword\">import<\/span> os\n<span class=\"hljs-keyword\">from<\/span> zipfile <span class=\"hljs-keyword\">import<\/span> ZipFile\n\n<span class=\"hljs-keyword\">from<\/span> celery <span class=\"hljs-keyword\">import<\/span> shared_task\n<span class=\"hljs-keyword\">from<\/span> PIL <span class=\"hljs-keyword\">import<\/span> Image\n\n<span class=\"hljs-keyword\">from<\/span> django.conf <span class=\"hljs-keyword\">import<\/span> settings\n\n<span class=\"hljs-meta\">@shared_task<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">make_thumbnails<\/span>(<span class=\"hljs-params\">file_path, thumbnails=()<\/span>):<\/span>\n    os.chdir(settings.IMAGES_DIR)\n    path, file = os.path.split(file_path)\n    file_name, ext = os.path.splitext(file)\n\n    zip_file = <span class=\"hljs-string\">f\"<span class=\"hljs-subst\">{file_name}<\/span>.zip\"<\/span>\n    results = {<span class=\"hljs-string\">'archive_path'<\/span>: <span class=\"hljs-string\">f\"<span class=\"hljs-subst\">{settings.MEDIA_URL}<\/span>images\/<span class=\"hljs-subst\">{zip_file}<\/span>\"<\/span>}\n    <span class=\"hljs-keyword\">try<\/span>:\n        img = Image.<span class=\"hljs-built_in\">open<\/span>(file_path)\n        zipper = ZipFile(zip_file, <span class=\"hljs-string\">'w'<\/span>)\n        zipper.write(file)\n        os.remove(file_path)\n        <span class=\"hljs-keyword\">for<\/span> w, h <span class=\"hljs-keyword\">in<\/span> thumbnails:\n            img_copy = img.copy()\n            img_copy.thumbnail((w, h))\n            thumbnail_file = <span class=\"hljs-string\">f'<span class=\"hljs-subst\">{file_name}<\/span>_<span class=\"hljs-subst\">{w}<\/span>x<span class=\"hljs-subst\">{h}<\/span>.<span class=\"hljs-subst\">{ext}<\/span>'<\/span>\n            img_copy.save(thumbnail_file)\n            zipper.write(thumbnail_file)\n            os.remove(thumbnail_file)\n\n        img.close()\n        zipper.close()\n    <span class=\"hljs-keyword\">except<\/span> IOError <span class=\"hljs-keyword\">as<\/span> e:\n        <span class=\"hljs-built_in\">print<\/span>(e)\n\n    <span class=\"hljs-keyword\">return<\/span> results\n<\/code><\/pre>\n<p>\u06a9\u0627\u0631 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u0648\u0686\u06a9 \u0628\u0627\u0644\u0627 \u0628\u0647 \u0633\u0627\u062f\u06af\u06cc \u0641\u0627\u06cc\u0644 \u062a\u0635\u0648\u06cc\u0631 \u0648\u0631\u0648\u062f\u06cc \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0646\u0645\u0648\u0646\u0647 Pillow Image \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0633\u067e\u0633 \u0628\u0631 \u0631\u0648\u06cc \u0644\u06cc\u0633\u062a \u0627\u0628\u0639\u0627\u062f \u0627\u0631\u0633\u0627\u0644 \u0634\u062f\u0647 \u0628\u0647 \u06a9\u0627\u0631 \u062d\u0644\u0642\u0647 \u0645\u06cc\u200c\u0632\u0646\u062f \u0648 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u0648\u0686\u06a9 \u0628\u0631\u0627\u06cc \u0647\u0631 \u06a9\u062f\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0647\u0631 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u0648\u0686\u06a9 \u0631\u0627 \u0628\u0647 \u0628\u0627\u06cc\u06af\u0627\u0646\u06cc \u0641\u0634\u0631\u062f\u0647 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u062f\u0631 \u0639\u06cc\u0646 \u062d\u0627\u0644 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0645\u06cc\u0627\u0646\u06cc \u0631\u0627 \u0646\u06cc\u0632 \u062a\u0645\u06cc\u0632 \u0645\u06cc\u200c\u06a9\u0646\u062f.  \u06cc\u06a9 \u0641\u0631\u0647\u0646\u06af \u0644\u063a\u062a \u0633\u0627\u062f\u0647 \u0628\u0627\u0632\u06af\u0631\u062f\u0627\u0646\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f \u06a9\u0647 \u0646\u0634\u0627\u0646\u06cc \u0627\u06cc\u0646\u062a\u0631\u0646\u062a\u06cc \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0628\u0627\u06cc\u06af\u0627\u0646\u06cc \u0641\u0634\u0631\u062f\u0647 \u062a\u0635\u0627\u0648\u06cc\u0631 \u06a9\u0648\u0686\u06a9 \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0627\u0632 \u0622\u0646 \u062f\u0627\u0646\u0644\u0648\u062f \u06a9\u0631\u062f.<\/p>\n<p>\u0628\u0627 \u062a\u0639\u06cc\u06cc\u0646 \u062a\u06a9\u0644\u06cc\u0641 \u06a9\u0631\u0641\u0633 \u062d\u0631\u06a9\u062a \u0645\u06cc \u06a9\u0646\u0645 \u0631\u0648\u06cc \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u0627\u0647\u0627\u06cc \u062c\u0646\u06af\u0648 \u0628\u0631\u0627\u06cc \u0627\u0631\u0627\u0626\u0647 \u06cc\u06a9 \u0627\u0644\u06af\u0648 \u0628\u0627 \u0641\u0631\u0645 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639 \u0628\u0647 \u067e\u0631\u0648\u0698\u0647 \u062c\u0646\u06af\u0648 a <code>MEDIA_ROOT<\/code> \u0645\u06a9\u0627\u0646\u06cc \u06a9\u0647 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u062a\u0635\u0648\u06cc\u0631\u06cc \u0648 \u0628\u0627\u06cc\u06af\u0627\u0646\u06cc \u0647\u0627\u06cc \u0641\u0634\u0631\u062f\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u062f\u0631 \u0622\u0646 \u0642\u0631\u0627\u0631 \u06af\u06cc\u0631\u0646\u062f (\u0645\u0646 \u0627\u0632 \u0627\u06cc\u0646 \u062f\u0631 \u0645\u062b\u0627\u0644 \u0628\u0627\u0644\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0645) \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u0634\u062e\u0635 \u06a9\u0646\u06cc\u062f <code>MEDIA_URL<\/code> \u0627\u0632 \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0645\u062d\u062a\u0648\u0627 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u06a9\u0631\u062f.  \u062f\u0631 <code>image\\_parroter\/settings.py<\/code> \u0645\u0627\u0698\u0648\u0644 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u06a9\u0646\u0645 <code>MEDIA_ROOT<\/code>\u060c <code>MEDIA_URL<\/code>\u060c <code>IMAGES_DIR<\/code> \u0645\u06a9\u0627\u0646\u200c\u0647\u0627\u06cc \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0633\u067e\u0633 \u0645\u0646\u0637\u0642 \u0627\u06cc\u062c\u0627\u062f \u0627\u06cc\u0646 \u0645\u06a9\u0627\u0646\u200c\u0647\u0627 \u0631\u0627 \u062f\u0631 \u0635\u0648\u0631\u062a \u0639\u062f\u0645 \u0648\u062c\u0648\u062f \u0622\u0646\u0647\u0627 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f.<\/p>\n<pre><code class=\"hljs\">\n\n<span class=\"hljs-meta\">... <\/span>skipping down to the static files section\n\n\n\n\nSTATIC_URL = <span class=\"hljs-string\">'\/static\/'<\/span>\nMEDIA_URL = <span class=\"hljs-string\">'\/media\/'<\/span>\n\nMEDIA_ROOT = os.path.abspath(os.path.join(BASE_DIR, <span class=\"hljs-string\">'media'<\/span>))\nIMAGES_DIR = os.path.join(MEDIA_ROOT, <span class=\"hljs-string\">'images'<\/span>)\n\n<span class=\"hljs-keyword\">if<\/span> <span class=\"hljs-keyword\">not<\/span> os.path.exists(MEDIA_ROOT) <span class=\"hljs-keyword\">or<\/span> <span class=\"hljs-keyword\">not<\/span> os.path.exists(IMAGES_DIR):\n    os.makedirs(IMAGES_DIR)\n<\/code><\/pre>\n<p>\u062f\u0631\u0648\u0646 <code>thumbnailer\/views.py<\/code> \u0645\u0627\u0698\u0648\u0644\u060c I import \u0631\u0627 <code>django.views.View<\/code> \u06a9\u0644\u0627\u0633 \u0648 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0646 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 <code>HomeView<\/code> \u06a9\u0644\u0627\u0633 \u062d\u0627\u0648\u06cc <code>get<\/code> \u0648 <code>post<\/code> \u0631\u0648\u0634 \u0647\u0627\u060c \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 \u0632\u06cc\u0631 \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u0627\u06cc\u0646 <code>get<\/code> \u0645\u062a\u062f \u0628\u0647 \u0633\u0627\u062f\u06af\u06cc \u06cc\u06a9 \u0627\u0644\u06af\u0648\u06cc home.html \u0631\u0627 \u06a9\u0647 \u0642\u0631\u0627\u0631 \u0627\u0633\u062a \u0628\u0647 \u0632\u0648\u062f\u06cc \u0627\u06cc\u062c\u0627\u062f \u0634\u0648\u062f\u060c \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f \u0648 \u0622\u0646 \u0631\u0627 a <code>FileUploadForm<\/code> \u0634\u0627\u0645\u0644 \u06cc\u06a9 <code>ImageField<\/code> \u0645\u06cc\u062f\u0627\u0646 \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 \u0628\u0627\u0644\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f <code>HomeView<\/code> \u06a9\u0644\u0627\u0633<\/p>\n<p>\u0627\u06cc\u0646 <code>post<\/code> \u0631\u0648\u0634 \u0633\u0627\u062e\u062a <code>FileUploadForm<\/code> \u0634\u06cc\u0621 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u0634\u062f\u0647 \u062f\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u060c \u0627\u0639\u062a\u0628\u0627\u0631 \u0622\u0646 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc \u06a9\u0646\u062f\u060c \u0633\u067e\u0633 \u0627\u06af\u0631 \u0645\u0639\u062a\u0628\u0631 \u0628\u0627\u0634\u062f\u060c \u0641\u0627\u06cc\u0644 \u0622\u067e\u0644\u0648\u062f \u0634\u062f\u0647 \u0631\u0627 \u062f\u0631 \u0641\u0627\u06cc\u0644 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u06a9\u0646\u062f. <code>IMAGES_DIR<\/code> \u0648 \u0627\u0644\u0641 \u0631\u0627 \u0634\u0631\u0648\u0639 \u0645\u06cc \u06a9\u0646\u062f <code>make_thumbnails<\/code> \u0648\u0638\u06cc\u0641\u0647 \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u06af\u0631\u0641\u062a\u0646 \u06a9\u0627\u0631 <code>id<\/code> \u0648 \u0648\u0636\u0639\u06cc\u062a \u0631\u0627 \u0628\u0647 \u0642\u0627\u0644\u0628 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0646\u062f\u060c \u06cc\u0627 \u0641\u0631\u0645 \u0631\u0627 \u0628\u0627 \u062e\u0637\u0627\u0647\u0627\u06cc\u0634 \u0628\u0647 \u0642\u0627\u0644\u0628 home.html \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f.<\/p>\n<pre><code class=\"hljs\">\n\n<span class=\"hljs-keyword\">import<\/span> os\n\n<span class=\"hljs-keyword\">from<\/span> celery <span class=\"hljs-keyword\">import<\/span> current_app\n\n<span class=\"hljs-keyword\">from<\/span> django <span class=\"hljs-keyword\">import<\/span> forms\n<span class=\"hljs-keyword\">from<\/span> django.conf <span class=\"hljs-keyword\">import<\/span> settings\n<span class=\"hljs-keyword\">from<\/span> django.http <span class=\"hljs-keyword\">import<\/span> JsonResponse\n<span class=\"hljs-keyword\">from<\/span> django.shortcuts <span class=\"hljs-keyword\">import<\/span> render\n<span class=\"hljs-keyword\">from<\/span> django.views <span class=\"hljs-keyword\">import<\/span> View\n\n<span class=\"hljs-keyword\">from<\/span> .tasks <span class=\"hljs-keyword\">import<\/span> make_thumbnails\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">FileUploadForm<\/span>(<span class=\"hljs-params\">forms.Form<\/span>):<\/span>\n    image_file = forms.ImageField(required=<span class=\"hljs-literal\">True<\/span>)\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">HomeView<\/span>(<span class=\"hljs-params\">View<\/span>):<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">get<\/span>(<span class=\"hljs-params\">self, request<\/span>):<\/span>\n        form = FileUploadForm()\n        <span class=\"hljs-keyword\">return<\/span> render(request, <span class=\"hljs-string\">'thumbnailer\/home.html'<\/span>, { <span class=\"hljs-string\">'form'<\/span>: form })\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">post<\/span>(<span class=\"hljs-params\">self, request<\/span>):<\/span>\n        form = FileUploadForm(request.POST, request.FILES)\n        context = {}\n\n        <span class=\"hljs-keyword\">if<\/span> form.is_valid():\n            file_path = os.path.join(settings.IMAGES_DIR, request.FILES(<span class=\"hljs-string\">'image_file'<\/span>).name)\n\n            <span class=\"hljs-keyword\">with<\/span> <span class=\"hljs-built_in\">open<\/span>(file_path, <span class=\"hljs-string\">'wb+'<\/span>) <span class=\"hljs-keyword\">as<\/span> fp:\n                <span class=\"hljs-keyword\">for<\/span> chunk <span class=\"hljs-keyword\">in<\/span> request.FILES(<span class=\"hljs-string\">'image_file'<\/span>):\n                    fp.write(chunk)\n\n            task = make_thumbnails.delay(file_path, thumbnails=((<span class=\"hljs-number\">128<\/span>, <span class=\"hljs-number\">128<\/span>)))\n\n            context(<span class=\"hljs-string\">'task_id'<\/span>) = task.<span class=\"hljs-built_in\">id<\/span>\n            context(<span class=\"hljs-string\">'task_status'<\/span>) = task.status\n\n            <span class=\"hljs-keyword\">return<\/span> render(request, <span class=\"hljs-string\">'thumbnailer\/home.html'<\/span>, context)\n\n        context(<span class=\"hljs-string\">'form'<\/span>) = form\n\n        <span class=\"hljs-keyword\">return<\/span> render(request, <span class=\"hljs-string\">'thumbnailer\/home.html'<\/span>, context)\n\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TaskView<\/span>(<span class=\"hljs-params\">View<\/span>):<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">get<\/span>(<span class=\"hljs-params\">self, request, task_id<\/span>):<\/span>\n        task = current_app.AsyncResult(task_id)\n        response_data = {<span class=\"hljs-string\">'task_status'<\/span>: task.status, <span class=\"hljs-string\">'task_id'<\/span>: task.<span class=\"hljs-built_in\">id<\/span>}\n\n        <span class=\"hljs-keyword\">if<\/span> task.status == <span class=\"hljs-string\">'SUCCESS'<\/span>:\n            response_data(<span class=\"hljs-string\">'results'<\/span>) = task.get()\n\n        <span class=\"hljs-keyword\">return<\/span> JsonResponse(response_data)\n<\/code><\/pre>\n<p>\u0632\u06cc\u0631 <code>HomeView<\/code> \u06a9\u0644\u0627\u0633\u06cc \u06a9\u0647 \u0645\u0646 \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u0647 \u0627\u0645 <code>TaskView<\/code> \u06a9\u0644\u0627\u0633 \u06a9\u0647 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a AJAX \u0628\u0631\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u0648\u0636\u0639\u06cc\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f <code>make_thumbnails<\/code> \u0648\u0638\u06cc\u0641\u0647.  \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u062a\u0648\u062c\u0647 \u062e\u0648\u0627\u0647\u06cc\u062f \u0634\u062f \u06a9\u0647 \u0645\u0646 \u0622\u0646 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0647 \u0627\u0645 <code>current_app<\/code> \u0634\u06cc \u0627\u0632 \u0628\u0633\u062a\u0647 \u06a9\u0631\u0641\u0633 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f \u0648 \u0627\u0632 \u0622\u0646 \u0628\u0631\u0627\u06cc \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0648\u0638\u06cc\u0641\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f <code>AsyncResult<\/code> \u0634\u06cc \u0645\u0631\u062a\u0628\u0637 \u0628\u0627 <code>task_id<\/code> \u0627\u0632 \u062f\u0631\u062e\u0648\u0627\u0633\u062a  \u0645\u0646 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u0645 <code>response_data<\/code> \u0641\u0631\u0647\u0646\u06af \u0644\u063a\u062a \u0648\u0636\u0639\u06cc\u062a \u0648 \u0634\u0646\u0627\u0633\u0647 \u06a9\u0627\u0631\u060c \u0633\u067e\u0633 \u0627\u06af\u0631 \u0648\u0636\u0639\u06cc\u062a \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u06a9\u0627\u0631 \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u0627\u062c\u0631\u0627 \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u0646\u062a\u0627\u06cc\u062c \u0631\u0627 \u0628\u0627 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0648\u0627\u06a9\u0634\u06cc \u0645\u06cc \u06a9\u0646\u0645 <code>get()<\/code> \u0631\u0648\u0634 \u0627\u0632 <code>AsyncResult<\/code> \u0634\u06cc \u0627\u062e\u062a\u0635\u0627\u0635 \u062f\u0627\u062f\u0646 \u0622\u0646 \u0628\u0647 <code>results<\/code> \u06a9\u0644\u06cc\u062f \u0627\u0632 <code>response_data<\/code> \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 JSON \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0646\u0646\u062f\u0647 HTTP \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647 \u0634\u0648\u062f.<\/p>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u062a\u0648\u0627\u0646\u0645 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0642\u0627\u0644\u0628 \u0631\u0627 \u0628\u0633\u0627\u0632\u0645\u060c \u0628\u0627\u06cc\u062f \u06a9\u0644\u0627\u0633\u200c\u0647\u0627\u06cc \u0646\u0645\u0627\u0647\u0627\u06cc \u062c\u0646\u06af\u0648 \u0631\u0627 \u0628\u0647 \u0686\u0646\u062f URL \u0645\u0639\u0642\u0648\u0644 \u0646\u06af\u0627\u0634\u062a \u06a9\u0646\u0645.  \u0645\u0646 \u0628\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u0634\u0631\u0648\u0639 \u0645\u06cc \u06a9\u0646\u0645 <code>urls.py<\/code> \u0645\u0627\u0698\u0648\u0644 \u062f\u0627\u062e\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 thumbnailer \u0648 URL \u0647\u0627\u06cc \u0632\u06cc\u0631 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code class=\"hljs\">\n\n<span class=\"hljs-keyword\">from<\/span> django.urls <span class=\"hljs-keyword\">import<\/span> path\n\n<span class=\"hljs-keyword\">from<\/span> . <span class=\"hljs-keyword\">import<\/span> views\n\nurlpatterns = (\n  path(<span class=\"hljs-string\">''<\/span>, views.HomeView.as_view(), name=<span class=\"hljs-string\">'home'<\/span>),\n  path(<span class=\"hljs-string\">'task\/&lt;str:task_id&gt;\/'<\/span>, views.TaskView.as_view(), name=<span class=\"hljs-string\">'task'<\/span>),\n)\n<\/code><\/pre>\n<p>\u0633\u067e\u0633 \u062f\u0631 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc URL \u0627\u0635\u0644\u06cc \u067e\u0631\u0648\u0698\u0647\u060c \u0628\u0627\u06cc\u062f URL \u0647\u0627\u06cc \u0633\u0637\u062d \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0645 \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0622\u0646 \u0631\u0627 \u0627\u0632 URL \u0631\u0633\u0627\u0646\u0647 \u0622\u06af\u0627\u0647 \u06a9\u0646\u0645\u060c \u0645\u0627\u0646\u0646\u062f:<\/p>\n<pre><code class=\"hljs\">\n\n<span class=\"hljs-keyword\">from<\/span> django.contrib <span class=\"hljs-keyword\">import<\/span> admin\n<span class=\"hljs-keyword\">from<\/span> django.urls <span class=\"hljs-keyword\">import<\/span> path, include\n<span class=\"hljs-keyword\">from<\/span> django.conf <span class=\"hljs-keyword\">import<\/span> settings\n<span class=\"hljs-keyword\">from<\/span> django.conf.urls.static <span class=\"hljs-keyword\">import<\/span> static\n\nurlpatterns = (\n    path(<span class=\"hljs-string\">'admin\/'<\/span>, admin.site.urls),\n    path(<span class=\"hljs-string\">''<\/span>, include(<span class=\"hljs-string\">'thumbnailer.urls'<\/span>)),\n) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)\n<\/code><\/pre>\n<p>\u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f \u0645\u0646 \u0634\u0631\u0648\u0639 \u0628\u0647 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0646\u0645\u0627\u06cc \u0642\u0627\u0644\u0628 \u0633\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc \u06a9\u0646\u0645 \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u062f \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062a\u0635\u0648\u06cc\u0631\u06cc \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u062f \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0648\u0636\u0639\u06cc\u062a \u0641\u0627\u06cc\u0644 \u0627\u0631\u0633\u0627\u0644\u06cc \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u062f. <code>make_thumbnails<\/code> \u0648\u0638\u0627\u06cc\u0641 \u0648 \u062f\u0627\u0646\u0644\u0648\u062f \u0631\u06cc\u0632 \u0639\u06a9\u0633\u0647\u0627\u06cc \u062d\u0627\u0635\u0644 \u0631\u0627 \u0622\u063a\u0627\u0632 \u06a9\u0646\u06cc\u062f.  \u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639\u060c \u0645\u0646 \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0645 \u062a\u0627 \u0627\u06cc\u0646 \u0627\u0644\u06af\u0648\u06cc \u0648\u0627\u062d\u062f \u0631\u0627 \u062f\u0631 \u0641\u0647\u0631\u0633\u062a \u0628\u0646\u062f\u0627\u0646\u06af\u0634\u062a\u06cc \u0642\u0631\u0627\u0631 \u062f\u0647\u062f\u060c \u0628\u0647 \u0634\u0631\u062d \u0632\u06cc\u0631:<\/p>\n<pre><code class=\"hljs\">(venv) $ mkdir -p thumbnailer\/templates\/thumbnailer\n<\/code><\/pre>\n<p>\u0633\u067e\u0633 \u062f\u0631 \u0627\u06cc\u0646 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc templates\/thumbnailer \u06cc\u06a9 \u0627\u0644\u06af\u0648 \u0628\u0647 \u0646\u0627\u0645 home.html \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u06a9\u0646\u0645.  Inside home.html \u0628\u0627 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0628\u0631\u0686\u0633\u0628 \u0647\u0627\u06cc \u0642\u0627\u0644\u0628 &#8220;widget_tweaks&#8221; \u0634\u0631\u0648\u0639 \u0645\u06cc \u06a9\u0646\u0645\u060c \u0633\u067e\u0633 \u062d\u0631\u06a9\u062a \u0645\u06cc \u06a9\u0646\u0645 \u0631\u0648\u06cc \u0628\u0631\u0627\u06cc \u062a\u0639\u0631\u06cc\u0641 HTML \u0628\u0627 \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u0686\u0627\u0631\u0686\u0648\u0628 CSS \u0628\u0647 \u0646\u0627\u0645 <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/bulma.io\/\">bulma CSS<\/a>\u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0628\u0647 \u0646\u0627\u0645 <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/axios\/axios\">Axios.js<\/a>.  \u062f\u0631 \u0628\u062f\u0646\u0647 HTML page \u0645\u0646 \u06cc\u06a9 \u0639\u0646\u0648\u0627\u0646\u060c \u06cc\u06a9 \u0645\u06a9\u0627\u0646 \u0646\u06af\u0647\u062f\u0627\u0631 \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u067e\u06cc\u0627\u0645 \u0646\u062a\u0627\u06cc\u062c \u062f\u0631 \u062d\u0627\u0644 \u067e\u06cc\u0634\u0631\u0641\u062a \u0648 \u0641\u0631\u0645 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u06a9\u0646\u0645.<\/p>\n<pre><code class=\"hljs\">\n{% load widget_tweaks %}\n<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> <span class=\"hljs-attr\">lang<\/span>=<span class=\"hljs-string\">\"en\"<\/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\">meta<\/span> <span class=\"hljs-attr\">charset<\/span>=<span class=\"hljs-string\">\"UTF-8\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"viewport\"<\/span> <span class=\"hljs-attr\">content<\/span>=<span class=\"hljs-string\">\"width=device-width, initial-scale=1.0\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta<\/span> <span class=\"hljs-attr\">http-equiv<\/span>=<span class=\"hljs-string\">\"X-UA-Compatible\"<\/span> <span class=\"hljs-attr\">content<\/span>=<span class=\"hljs-string\">\"ie=edge\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title<\/span>&gt;<\/span>Thumbnailer<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">title<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link<\/span> <span class=\"hljs-attr\">rel<\/span>=<span class=\"hljs-string\">\"stylesheet\"<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/bulma\/0.7.5\/css\/bulma.min.css\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"https:\/\/cdn.jsdelivr.net\/npm\/vue\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/axios\/0.18.0\/axios.min.js\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">defer<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"https:\/\/use.fontawesome.com\/releases\/v5.0.7\/js\/all.js\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/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\">nav<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"navbar\"<\/span> <span class=\"hljs-attr\">role<\/span>=<span class=\"hljs-string\">\"navigation\"<\/span> <span class=\"hljs-attr\">aria-label<\/span>=<span class=\"hljs-string\">\"main navigation\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"navbar-brand\"<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"navbar-item\"<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"\/\"<\/span>&gt;<\/span>\n        Thumbnailer\n      <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">nav<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">section<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"hero is-primary is-fullheight-with-navbar\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"hero-body\"<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"container\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"title is-size-1 has-text-centered\"<\/span>&gt;<\/span>Thumbnail Generator<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"subtitle has-text-centered\"<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"progress-title\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"columns is-centered\"<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"column is-8\"<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">form<\/span> <span class=\"hljs-attr\">action<\/span>=<span class=\"hljs-string\">\"{% url 'home' %}\"<\/span> <span class=\"hljs-attr\">method<\/span>=<span class=\"hljs-string\">\"POST\"<\/span> <span class=\"hljs-attr\">enctype<\/span>=<span class=\"hljs-string\">\"multipart\/form-data\"<\/span>&gt;<\/span>\n              {% csrf_token %}\n              <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"file is-large has-name\"<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">label<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"file-label\"<\/span>&gt;<\/span>\n                  {{ form.image_file|add_class:\"file-input\" }}\n                  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">span<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"file-cta\"<\/span>&gt;<\/span>\n                    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">span<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"file-icon\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">i<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"fas fa-upload\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">i<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">span<\/span>&gt;<\/span>\n                    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">span<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"file-label\"<\/span>&gt;<\/span>Browse image<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">span<\/span>&gt;<\/span>\n                  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">span<\/span>&gt;<\/span>\n                  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">span<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"file-name\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"file-name\"<\/span> \n                    <span class=\"hljs-attr\">style<\/span>=<span class=\"hljs-string\">\"background-color: white; color: black; min-width: 450px;\"<\/span>&gt;<\/span>\n                  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">span<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">label<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"button is-link is-large\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"submit\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"Submit\"<\/span>&gt;<\/span>\n              <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n              \n            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">section<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n  <span class=\"hljs-keyword\">var<\/span> file = <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">'{{form.image_file.id_for_label}}'<\/span>);\n  file.onchange = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n    <span class=\"hljs-keyword\">if<\/span>(file.files.length &gt; <span class=\"hljs-number\">0<\/span>) {\n      <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">'file-name'<\/span>).innerHTML = file.files(<span class=\"hljs-number\">0<\/span>).name;\n    }\n  };\n  <\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n\n  {% if task_id %}\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n  <span class=\"hljs-keyword\">var<\/span> taskUrl = <span class=\"hljs-string\">\"{% url 'task' task_id=task_id %}\"<\/span>;\n  <span class=\"hljs-keyword\">var<\/span> dots = <span class=\"hljs-number\">1<\/span>;\n  <span class=\"hljs-keyword\">var<\/span> progressTitle = <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">'progress-title'<\/span>);\n  updateProgressTitle();\n  <span class=\"hljs-keyword\">var<\/span> timer = <span class=\"hljs-built_in\">setInterval<\/span>(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n    updateProgressTitle();\n    axios.get(taskUrl)\n      .then(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>(<span class=\"hljs-params\">response<\/span>)<\/span>{\n        <span class=\"hljs-keyword\">var<\/span> taskStatus = response.data.task_status\n        <span class=\"hljs-keyword\">if<\/span> (taskStatus === <span class=\"hljs-string\">'SUCCESS'<\/span>) {\n          clearTimer(<span class=\"hljs-string\">'Check downloads for results'<\/span>);\n          <span class=\"hljs-keyword\">var<\/span> url = <span class=\"hljs-built_in\">window<\/span>.location.protocol + <span class=\"hljs-string\">'\/\/'<\/span> + <span class=\"hljs-built_in\">window<\/span>.location.host + response.data.results.archive_path;\n          <span class=\"hljs-keyword\">var<\/span> a = <span class=\"hljs-built_in\">document<\/span>.createElement(<span class=\"hljs-string\">\"a\"<\/span>);\n          a.target = <span class=\"hljs-string\">'_BLANK'<\/span>;\n          <span class=\"hljs-built_in\">document<\/span>.body.appendChild(a);\n          a.style = <span class=\"hljs-string\">\"display: none\"<\/span>;\n          a.href = url;\n          a.download = <span class=\"hljs-string\">'results.zip'<\/span>;\n          a.click();\n          <span class=\"hljs-built_in\">document<\/span>.body.removeChild(a);\n        } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (taskStatus === <span class=\"hljs-string\">'FAILURE'<\/span>) {\n          clearTimer(<span class=\"hljs-string\">'An error occurred'<\/span>);\n        }\n      })\n      .catch(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>(<span class=\"hljs-params\">err<\/span>)<\/span>{\n        <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">'err'<\/span>, err);\n        clearTimer(<span class=\"hljs-string\">'An error occurred'<\/span>);\n      });\n  }, <span class=\"hljs-number\">800<\/span>);\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">updateProgressTitle<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n    dots++;\n    <span class=\"hljs-keyword\">if<\/span> (dots &gt; <span class=\"hljs-number\">3<\/span>) {\n      dots = <span class=\"hljs-number\">1<\/span>;\n    }\n    progressTitle.innerHTML = <span class=\"hljs-string\">'processing images '<\/span>;\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">var<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; dots; i++) {\n      progressTitle.innerHTML += <span class=\"hljs-string\">'.'<\/span>;\n    }\n  }\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">clearTimer<\/span>(<span class=\"hljs-params\">message<\/span>) <\/span>{\n    <span class=\"hljs-built_in\">clearInterval<\/span>(timer);\n    progressTitle.innerHTML = message;\n  }\n  <\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span> \n  {% endif %}\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>\n<\/code><\/pre>\n<p>\u062f\u0631 \u067e\u0627\u06cc\u06cc\u0646 <code>body<\/code> \u0639\u0646\u0635\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0631\u0627\u0626\u0647 \u0628\u0631\u062e\u06cc \u0631\u0641\u062a\u0627\u0631\u0647\u0627\u06cc \u0627\u0636\u0627\u0641\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0647 \u0627\u0645.  \u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u0645\u0631\u062c\u0639 \u0628\u0647 \u0641\u06cc\u0644\u062f \u0648\u0631\u0648\u062f\u06cc \u0641\u0627\u06cc\u0644 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u0645 \u0648 \u06cc\u06a9 \u0634\u0646\u0648\u0646\u062f\u0647 \u062a\u063a\u06cc\u06cc\u0631 \u062b\u0628\u062a \u0645\u06cc \u06a9\u0646\u0645\u060c \u06a9\u0647 \u0628\u0647 \u0633\u0627\u062f\u06af\u06cc \u0646\u0627\u0645 \u0641\u0627\u06cc\u0644 \u0627\u0646\u062a\u062e\u0627\u0628 \u0634\u062f\u0647 \u0631\u0627 \u067e\u0633 \u0627\u0632 \u0627\u0646\u062a\u062e\u0627\u0628 \u0628\u0647 UI \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0628\u0639\u062f \u0642\u0633\u0645\u062a \u0645\u0631\u062a\u0628\u0637 \u062a\u0631 \u0645\u06cc \u0622\u06cc\u062f.  \u0645\u0646 \u0627\u0632 \u0642\u0627\u0644\u0628 \u0645\u0646\u0637\u0642\u06cc \u062c\u0646\u06af\u0648 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645 <code>if<\/code> \u0627\u067e\u0631\u0627\u062a\u0648\u0631 \u0628\u0631\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u0648\u062c\u0648\u062f a <code>task_id<\/code> \u062f\u0631 \u062d\u0627\u0644 \u062a\u062d\u0648\u06cc\u0644 \u0627\u0632 <code>HomeView<\/code> \u0646\u0645\u0627\u06cc \u06a9\u0644\u0627\u0633  \u0627\u06cc\u0646 \u0646\u0634\u0627\u0646 \u062f\u0647\u0646\u062f\u0647 \u067e\u0627\u0633\u062e \u067e\u0633 \u0627\u0632 a \u0627\u0633\u062a <code>make_thumbnails<\/code> \u0648\u0638\u06cc\u0641\u0647 \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.  \u0633\u067e\u0633 \u0627\u0632 \u062c\u0646\u06af\u0648 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645 <code>url<\/code> \u062a\u06af \u0627\u0644\u06af\u0648 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a\u0646 \u06cc\u06a9 URL \u0628\u0631\u0631\u0633\u06cc \u0648\u0636\u0639\u06cc\u062a \u0648\u0638\u06cc\u0641\u0647 \u0645\u0646\u0627\u0633\u0628 \u0648 \u0634\u0631\u0648\u0639 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a AJAX \u0632\u0645\u0627\u0646 \u0628\u0646\u062f\u06cc \u0634\u062f\u0647 \u0628\u0647 \u0622\u0646 URL \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <code>Axios<\/code> \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u06cc \u06a9\u0647 \u0642\u0628\u0644\u0627 \u0630\u06a9\u0631 \u06a9\u0631\u062f\u0645<\/p>\n<p>\u0627\u06af\u0631 \u0648\u0636\u0639\u06cc\u062a \u06cc\u06a9 \u06a9\u0627\u0631 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 &#8220;\u0645\u0648\u0641\u0642\u06cc\u062a&#8221; \u06af\u0632\u0627\u0631\u0634 \u0634\u0648\u062f\u060c \u0645\u0646 \u06cc\u06a9 \u0644\u06cc\u0646\u06a9 \u062f\u0627\u0646\u0644\u0648\u062f \u0631\u0627 \u0628\u0647 DOM \u062a\u0632\u0631\u06cc\u0642 \u0645\u06cc \u06a9\u0646\u0645 \u0648 \u0628\u0627\u0639\u062b \u0631\u0648\u0634\u0646 \u0634\u062f\u0646 \u0622\u0646 \u0645\u06cc \u0634\u0648\u0645\u060c \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0631\u0627 \u0622\u063a\u0627\u0632 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u062a\u0627\u06cc\u0645\u0631 \u0641\u0627\u0635\u0644\u0647 \u0631\u0627 \u067e\u0627\u06a9 \u0645\u06cc \u06a9\u0646\u062f.  \u0627\u06af\u0631 \u0648\u0636\u0639\u06cc\u062a \u06cc\u06a9 &#8220;\u0634\u06a9\u0633\u062a&#8221; \u0628\u0627\u0634\u062f\u060c \u0645\u0646 \u0628\u0647 \u0633\u0627\u062f\u06af\u06cc \u0641\u0627\u0635\u0644\u0647 \u0631\u0627 \u067e\u0627\u06a9 \u0645\u06cc \u06a9\u0646\u0645\u060c \u0648 \u0627\u06af\u0631 \u0648\u0636\u0639\u06cc\u062a \u0646\u0647 &#8220;\u0645\u0648\u0641\u0642\u06cc\u062a&#8221; \u06cc\u0627 &#8220;\u0634\u06a9\u0633\u062a&#8221; \u0628\u0627\u0634\u062f\u060c \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0628\u0627\u0632\u0647 \u0628\u0639\u062f\u06cc \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0646\u0634\u0648\u062f\u060c \u06a9\u0627\u0631\u06cc \u0627\u0646\u062c\u0627\u0645 \u0646\u0645\u06cc \u062f\u0647\u0645.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u06cc\u06a9\u06cc \u062f\u06cc\u06af\u0631 \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u0645 terminal\u060c \u06cc\u06a9 \u0628\u0627\u0631 \u062f\u06cc\u06af\u0631 \u0628\u0627 \u0645\u062d\u06cc\u0637 \u0645\u062c\u0627\u0632\u06cc \u067e\u0627\u06cc\u062a\u0648\u0646 \u0641\u0639\u0627\u0644\u060c \u0648 \u0633\u0631\u0648\u0631 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \u062c\u0646\u06af\u0648 \u0631\u0627 \u0645\u0627\u0646\u0646\u062f \u0634\u06a9\u0644 \u0632\u06cc\u0631 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code class=\"hljs\">(venv) $ python manage.py runserver\n<\/code><\/pre>\n<ul>\n<li>\u0627\u06cc\u0646 <code>redis-server<\/code> \u0648 \u067e\u0627\u06cc\u0627\u0646\u0647\u200c\u0647\u0627\u06cc \u0648\u0638\u06cc\u0641\u0647 cellery \u06a9\u0647 \u0642\u0628\u0644\u0627 \u062a\u0648\u0636\u06cc\u062d \u062f\u0627\u062f\u0647 \u0634\u062f \u0646\u06cc\u0632 \u0628\u0627\u06cc\u062f \u0627\u062c\u0631\u0627 \u0634\u0648\u0646\u062f\u060c \u0648 \u0627\u06af\u0631 \u0627\u0632 \u0632\u0645\u0627\u0646 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0622\u0646\u060c Celery worker \u0631\u0627 \u062f\u0648\u0628\u0627\u0631\u0647 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0646\u06a9\u0631\u062f\u0647\u200c\u0627\u06cc\u062f. <code>make_thumbnails<\/code> \u0648\u0638\u06cc\u0641\u0647 \u0627\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f <code>Ctrl+C<\/code> \u062a\u0627 \u06a9\u0627\u0631\u06af\u0631 \u0645\u062a\u0648\u0642\u0641 \u0634\u0648\u062f \u0648 \u0633\u067e\u0633 \u0635\u0627\u062f\u0631 \u0634\u0648\u062f <code>celery worker -A image_parroter --loglevel=info<\/code> \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0631\u0627\u06cc \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0645\u062c\u062f\u062f  \u0647\u0631 \u0628\u0627\u0631 \u06a9\u0647 \u06a9\u062f \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u06a9\u0627\u0631 \u06a9\u0631\u0641\u0633 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc \u06a9\u0646\u062f\u060c \u06a9\u0627\u0631\u06af\u0631\u0627\u0646 \u06a9\u0631\u0641\u0633 \u0628\u0627\u06cc\u062f \u062f\u0648\u0628\u0627\u0631\u0647 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0634\u0648\u0646\u062f.<\/li>\n<\/ul>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u0646\u0645\u0627\u06cc home.html \u0631\u0627 \u062f\u0631 \u0645\u0631\u0648\u0631\u06af\u0631 \u062e\u0648\u062f \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u06a9\u0646\u0645 <a rel=\"nofollow noopener\" target=\"_blank\" href=\"http:\/\/localhost:8000\">http:\/\/localhost:8000<\/a>\u060c \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062a\u0635\u0648\u06cc\u0631\u06cc \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627\u06cc\u062f \u0628\u0627 a \u067e\u0627\u0633\u062e \u062f\u0647\u062f <code>results.zip<\/code> \u0628\u0627\u06cc\u06af\u0627\u0646\u06cc \u062d\u0627\u0648\u06cc \u062a\u0635\u0648\u06cc\u0631 \u0627\u0635\u0644\u06cc \u0648 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u0648\u0686\u06a9 128&#215;128 \u067e\u06cc\u06a9\u0633\u0644.<\/p>\n<h2 id=\"deployingtoanubuntuserver\"><span class=\"ez-toc-section\" id=\"%d8%a7%d8%b3%d8%aa%d9%82%d8%b1%d8%a7%d8%b1_%d8%af%d8%b1_%d8%b3%d8%b1%d9%88%d8%b1_%d8%a7%d9%88%d8%a8%d9%88%d9%86%d8%aa%d9%88\"><\/span>\u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062f\u0631 \u0633\u0631\u0648\u0631 \u0627\u0648\u0628\u0648\u0646\u062a\u0648<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0631\u0627\u06cc \u062a\u06a9\u0645\u06cc\u0644 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647\u060c \u0631\u0648\u0634 \u0646\u0635\u0628 \u0648 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u0646\u06af\u0648 \u0631\u0627 \u0646\u0634\u0627\u0646 \u062e\u0648\u0627\u0647\u0645 \u062f\u0627\u062f \u06a9\u0647 \u0627\u0632 Redis \u0648 Celery \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0647\u0627\u06cc \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647 \u0646\u0627\u0647\u0645\u0632\u0645\u0627\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0631\u0648\u06cc \u06cc\u06a9 \u0633\u0631\u0648\u0631 Ubuntu v18 LTS.<\/p>\n<p>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 SSH \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0642\u0631\u0627\u0631 \u06af\u0631\u0641\u062a\u060c \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u0645\u06cc \u06a9\u0646\u0645 \u0648 \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0631\u0627 \u0646\u0635\u0628 \u0645\u06cc \u06a9\u0646\u0645.<\/p>\n<pre><code class=\"hljs\"><span class=\"hljs-meta\">#<\/span><span class=\"bash\"> apt-get update<\/span>\n<span class=\"hljs-meta\">#<\/span><span class=\"bash\"> apt-get install python3-pip python3-dev python3-venv nginx redis-server -y<\/span>\n<\/code><\/pre>\n<p>\u06cc\u0647 \u06cc\u0648\u0632\u0631 \u0647\u0645 \u0645\u06cc\u0633\u0627\u0632\u0645 \u0628\u0647 \u0627\u0633\u0645 <code>webapp<\/code>\u060c \u06a9\u0647 \u0628\u0647 \u0645\u0646 \u06cc\u06a9 \u0641\u0647\u0631\u0633\u062a \u0627\u0635\u0644\u06cc \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u067e\u0631\u0648\u0698\u0647 \u062c\u0646\u06af\u0648 \u0631\u0627 \u062f\u0631 \u0622\u0646 \u0646\u0635\u0628 \u06a9\u0646\u0645.<\/p>\n<pre><code class=\"hljs\"><span class=\"hljs-meta\">#<\/span><span class=\"bash\"> adduser webapp<\/span>\n<\/code><\/pre>\n<p>\u067e\u0633 \u0627\u0632 \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631\u060c \u0645\u0646 \u0622\u0646 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u06a9\u0646\u0645 <code>webapp<\/code> \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 <code>sudo<\/code> \u0648 <code>www-data<\/code> \u06af\u0631\u0648\u0647 \u0647\u0627\u060c \u0628\u0647 <code>webapp<\/code> \u06a9\u0627\u0631\u0628\u0631\u060c \u067e\u0633 <code>cd<\/code> \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0627\u0635\u0644\u06cc \u0622\u0646<\/p>\n<pre><code class=\"hljs\"><span class=\"hljs-meta\">#<\/span><span class=\"bash\"> usermod -aG sudo webapp<\/span>\n<span class=\"hljs-meta\">#<\/span><span class=\"bash\"> usermod -aG www-data webapp<\/span>\n<span class=\"hljs-meta\">$<\/span><span class=\"bash\"> su webapp<\/span>\n<span class=\"hljs-meta\">$<\/span><span class=\"bash\"> <span class=\"hljs-built_in\">cd<\/span><\/span>\n<\/code><\/pre>\n<p>\u062f\u0631 \u062f\u0627\u062e\u0644 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u0645\u062e\u0632\u0646 image_parroter GitHub \u0631\u0627 \u06a9\u0644\u0648\u0646 \u06a9\u0646\u0645\u060c <code>cd<\/code> \u062f\u0631 \u0645\u062e\u0632\u0646\u060c \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u0645\u062c\u0627\u0632\u06cc \u067e\u0627\u06cc\u062a\u0648\u0646 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f\u060c \u0622\u0646 \u0631\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f\u060c \u0633\u067e\u0633 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627 \u0631\u0627 \u0627\u0632 \u0622\u0646 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f <code>requirements.txt<\/code> \u0641\u0627\u06cc\u0644.<\/p>\n<pre><code class=\"hljs\"><span class=\"hljs-meta\">$<\/span><span class=\"bash\"> git <span class=\"hljs-built_in\">clone<\/span> https:\/\/github.com\/amcquistan\/image_parroter.git<\/span>\n<span class=\"hljs-meta\">$<\/span><span class=\"bash\"> python3 -m venv venv<\/span>\n<span class=\"hljs-meta\">$<\/span><span class=\"bash\"> . venv\/bin\/activate<\/span>\n(venv) $ pip install -r requirements.txt\n<\/code><\/pre>\n<p>\u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u0644\u0632\u0627\u0645\u0627\u062a\u06cc \u06a9\u0647 \u0628\u0647 \u062a\u0627\u0632\u06af\u06cc \u0646\u0635\u0628 \u06a9\u0631\u062f\u0645\u060c \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u0645 \u0645\u0648\u0631\u062f \u062c\u062f\u06cc\u062f\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 uWSGI \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0645 container \u06a9\u0647 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u0646\u06af\u0648 \u062e\u062f\u0645\u062a \u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f.<\/p>\n<pre><code class=\"hljs\">(venv) $ pip install uWSGI\n<\/code><\/pre>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u062d\u0631\u06a9\u062a \u0631\u0648\u06cc \u0647\u0631 \u0686\u0647 \u0628\u06cc\u0634\u062a\u0631\u060c \u0632\u0645\u0627\u0646 \u062e\u0648\u0628\u06cc \u0628\u0631\u0627\u06cc \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f <code>settings.py<\/code> \u0628\u0631\u0627\u06cc \u062a\u0628\u062f\u06cc\u0644 \u0645\u0642\u062f\u0627\u0631 DEBUG \u0628\u0647 False \u0648 \u0627\u0641\u0632\u0648\u062f\u0646 \u0622\u062f\u0631\u0633 IP \u0628\u0647 \u0644\u06cc\u0633\u062a <code>ALLOWED_HOSTS<\/code>.<\/p>\n<p>\u067e\u0633 \u0627\u0632 \u0622\u0646\u060c \u0628\u0647 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u0631\u0648\u0698\u0647 Django image_parroter (\u06a9\u0647 \u062d\u0627\u0648\u06cc <code>wsgi.py<\/code> \u0645\u0627\u0698\u0648\u0644) \u0648 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062c\u062f\u06cc\u062f \u0628\u0631\u0627\u06cc \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc uWSGI \u0628\u0627 \u0646\u0627\u0645 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f <code>uwsgi.ini<\/code>\u0648 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u0631\u0627 \u062f\u0631 \u0622\u0646 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f:<\/p>\n<pre><code class=\"hljs\"># uwsgi.ini\n(uwsgi)\nchdir=\/home\/webapp\/image_parroter\/image_parroter\nmodule=image_parroter.wsgi:application\nmaster=True\nprocesses=4\nharakiri=20\n\nsocket=\/home\/webapp\/image_parroter\/image_parroter\/image_parroter\/webapp.sock  \nchmod-socket=660  \nvacuum=True\nlogto=\/var\/log\/uwsgi\/uwsgi.log\ndie-\u0631\u0648\u06cc-term=True \n<\/code><\/pre>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0641\u0631\u0627\u0645\u0648\u0634 \u06a9\u0646\u0645 \u0628\u0627\u06cc\u062f \u0627\u062f\u0627\u0645\u0647 \u062f\u0647\u0645 \u0648 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0645 \u0648 \u0645\u062c\u0648\u0632\u0647\u0627 \u0648 \u0645\u0627\u0644\u06a9\u06cc\u062a \u0645\u0646\u0627\u0633\u0628 \u0631\u0627 \u0628\u0647 \u0622\u0646 \u0628\u062f\u0647\u0645.<\/p>\n<pre><code class=\"hljs\">(venv) $ sudo mkdir \/var\/log\/uwsgi\n(venv) $ sudo chown webapp:www-data \/var\/log\/uwsgi \n<\/code><\/pre>\n<p>\u0628\u0639\u062f \u0645\u0646 \u06cc\u06a9 <code>systemd<\/code> \u0641\u0627\u06cc\u0644 \u0633\u0631\u0648\u06cc\u0633 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0633\u0631\u0648\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 uWSGI \u06a9\u0647 \u200b\u200b\u062f\u0631 \u0622\u0646 \u0642\u0631\u0627\u0631 \u062f\u0627\u0631\u062f <code>\/etc\/systemd\/system\/uwsgi.service<\/code> \u0648 \u0634\u0627\u0645\u0644 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n<pre><code class=\"hljs\"># uwsgi.service\n(Unit)\nDescription=uWSGI Python container server  \nAfter=network.target\n\n(Service)\nUser=webapp\nGroup=www-data\nWorkingDirectory=\/home\/webapp\/image_parroter\/image_parroter\nEnvironment=\"\/home\/webapp\/image_parroter\/venv\/bin:\/usr\/local\/sbin:\/usr\/local\/bin:\/usr\/sbin:\/usr\/bin:\/sbin\"\nExecStart=\/home\/webapp\/image_parroter\/venv\/bin\/uwsgi --ini image_parroter\/uwsgi.ini\n\n(Install)\nWantedBy=multi-user.target\n<\/code><\/pre>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u0633\u0631\u0648\u06cc\u0633 uWSGI \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u0645\u060c \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u0645 \u06a9\u0647 \u0648\u0636\u0639\u06cc\u062a \u0622\u0646 \u062e\u0648\u0628 \u0627\u0633\u062a \u0648 \u0622\u0646 \u0631\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0646\u0645 \u062a\u0627 \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u062f\u0631 \u0647\u0646\u06af\u0627\u0645 \u0628\u0648\u062a \u0634\u0631\u0648\u0639 \u0634\u0648\u062f.<\/p>\n<pre><code class=\"hljs\">(venv) $ sudo systemctl start uwsgi.service\n(venv) $ sudo systemctl status uwsgi.service\n(venv) $ sudo systemctl enable uwsgi.service\n<\/code><\/pre>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u0646\u06af\u0648 \u0648 \u0633\u0631\u0648\u06cc\u0633 uWSGI \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0645\u06cc \u0634\u0648\u062f \u0648 \u0645\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u062d\u0631\u06a9\u062a \u06a9\u0646\u0645 \u0631\u0648\u06cc \u0628\u0631\u0627\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc <code>redis-server<\/code>.<\/p>\n<p>\u0645\u0646 \u0634\u062e\u0635\u0627 \u062a\u0631\u062c\u06cc\u062d \u0645\u06cc \u062f\u0647\u0645 \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0645 <code>systemd<\/code> \u062e\u062f\u0645\u0627\u062a\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u0646 \u0622\u0646 \u0631\u0627 \u0648\u06cc\u0631\u0627\u06cc\u0634 \u062e\u0648\u0627\u0647\u0645 \u06a9\u0631\u062f <code>\/etc\/redis\/redis.conf<\/code> \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0628\u0627 \u062a\u0646\u0638\u06cc\u0645 <code>supervised<\/code> \u067e\u0627\u0631\u0627\u0645\u062a\u0631 \u0628\u0631\u0627\u0628\u0631 \u0627\u0633\u062a <code>systemd<\/code>.  \u0628\u0639\u062f \u0627\u0632 \u0622\u0646 \u062f\u0648\u0628\u0627\u0631\u0647 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u0645 <code>redis-server<\/code>\u060c \u0648\u0636\u0639\u06cc\u062a \u0622\u0646 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f \u0648 \u0622\u0646 \u0631\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u062f\u0631 \u0647\u0646\u06af\u0627\u0645 \u0628\u0648\u062a \u0634\u0631\u0648\u0639 \u0634\u0648\u062f.<\/p>\n<pre><code class=\"hljs\">(venv) $ sudo systemctl restart redis-server\n(venv) $ sudo systemctl status redis-server\n(venv) $ sudo systemctl enable redis-server\n<\/code><\/pre>\n<p>\u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0631\u0641\u0633 \u0627\u0633\u062a.  \u0645\u0646 \u0627\u06cc\u0646 \u0631\u0627 \u0634\u0631\u0648\u0639 \u0645\u06cc \u06a9\u0646\u0645 process \u0628\u0627 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0645\u06a9\u0627\u0646 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0628\u0631\u0627\u06cc Celery \u0648 \u062f\u0627\u062f\u0646 \u0645\u062c\u0648\u0632\u0647\u0627 \u0648 \u0645\u0627\u0644\u06a9\u06cc\u062a \u0645\u0646\u0627\u0633\u0628 \u0628\u0647 \u0627\u06cc\u0646 \u0645\u06a9\u0627\u0646\u060c \u0645\u0627\u0646\u0646\u062f:<\/p>\n<pre><code class=\"hljs\">(venv) $ sudo mkdir \/var\/log\/celery\n(venv) $ sudo chown webapp:www-data \/var\/log\/celery\n<\/code><\/pre>\n<p>\u067e\u0633 \u0627\u0632 \u0622\u0646 \u0645\u0646 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Celery \u0628\u0647 \u0646\u0627\u0645 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u06a9\u0646\u0645 <code>celery.conf<\/code>\u060c \u062f\u0631 \u0647\u0645\u0627\u0646 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc <code>uwsgi.ini<\/code> \u0641\u0627\u06cc\u0644\u06cc \u06a9\u0647 \u0642\u0628\u0644\u0627 \u062a\u0648\u0636\u06cc\u062d \u062f\u0627\u062f\u0647 \u0634\u062f\u060c \u0628\u0627 \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u0646 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u062f\u0631 \u0622\u0646:<\/p>\n<pre><code class=\"hljs\"># celery.conf\n\nCELERYD_NODES=\"worker1 worker2\"\nCELERY_BIN=\"\/home\/webapp\/image_parroter\/venv\/bin\/celery\"\nCELERY_APP=\"image_parroter\"\nCELERYD_MULTI=\"multi\"\nCELERYD_PID_FILE=\"\/home\/webapp\/image_parroter\/image_parroter\/image_parroter\/%n.pid\"\nCELERYD_LOG_FILE=\"\/var\/log\/celery\/%n%I.log\"\nCELERYD_LOG_LEVEL=\"INFO\"\n<\/code><\/pre>\n<p>\u0628\u0631\u0627\u06cc \u062a\u06a9\u0645\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0631\u0641\u0633\u060c \u062e\u0648\u062f\u0634 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u06a9\u0646\u0645 <code>systemd<\/code> \u0641\u0627\u06cc\u0644 \u0633\u0631\u0648\u06cc\u0633 \u062f\u0631 <code>\/etc\/systemd\/system\/celery.service<\/code> \u0648 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u0631\u0627 \u062f\u0631 \u0622\u0646 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f:<\/p>\n<pre><code class=\"hljs\"># celery.service\n(Unit)\nDescription=Celery Service\nAfter=network.target\n\n(Service)\nType=forking\nUser=webapp\nGroup=webapp\nEnvironmentFile=\/home\/webapp\/image_parroter\/image_parroter\/image_parroter\/celery.conf\nWorkingDirectory=\/home\/webapp\/image_parroter\/image_parroter\nExecStart=\/bin\/sh -c '${CELERY_BIN} multi start ${CELERYD_NODES} \\\n  -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \\\n  --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL}'\nExecStop=\/bin\/sh -c '${CELERY_BIN} multi stopwait ${CELERYD_NODES} \\\n  --pidfile=${CELERYD_PID_FILE}'\nExecReload=\/bin\/sh -c '${CELERY_BIN} multi restart ${CELERYD_NODES} \\\n  -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \\\n  --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL}'\n\n(Install)\nWantedBy=multi-user.target\n<\/code><\/pre>\n<p>\u0622\u062e\u0631\u06cc\u0646 \u06a9\u0627\u0631\u06cc \u06a9\u0647 \u0628\u0627\u06cc\u062f \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 nginx \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u067e\u0631\u0648\u06a9\u0633\u06cc \u0645\u0639\u06a9\u0648\u0633 \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 uwsgi\/django \u06a9\u0627\u0631 \u06a9\u0646\u062f \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u062d\u062a\u0648\u0627 \u0631\u0627 \u062f\u0631 \u0641\u0647\u0631\u0633\u062a \u0631\u0633\u0627\u0646\u0647 \u0647\u0627 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u062f.  \u0645\u0646 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0628\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc nginx \u062f\u0631 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u200c\u062f\u0647\u0645 <code>\/etc\/nginx\/sites-available\/image_parroter<\/code>\u060c \u06a9\u0647 \u0634\u0627\u0645\u0644 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n<pre><code class=\"hljs\">server {\n  listen 80;\n  server_name _;\n\n  location \/favicon.ico { access_log off; log_not_found off; }\n  location \/media\/ {\n    root \/home\/webapp\/image_parroter\/image_parroter;\n  }\n\n  location \/ {\n    include uwsgi_params;\n    uwsgi_pass unix:\/home\/webapp\/image_parroter\/image_parroter\/image_parroter\/webapp.sock;\n  }\n}\n<\/code><\/pre>\n<p>\u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f\u060c \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 nginx \u0631\u0627 \u062d\u0630\u0641 \u0645\u06cc\u200c\u06a9\u0646\u0645 \u06a9\u0647 \u0628\u0647 \u0645\u0646 \u0627\u0645\u06a9\u0627\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0646 \u0631\u0627 \u0645\u06cc\u200c\u062f\u0647\u062f <code>server_name _;<\/code> \u0628\u0631\u0627\u06cc \u06af\u0631\u0641\u062a\u0646 \u062a\u0645\u0627\u0645 \u062a\u0631\u0627\u0641\u06cc\u06a9 http \u0631\u0648\u06cc \u067e\u0648\u0631\u062a 80\u060c \u0633\u067e\u0633 \u06cc\u06a9 \u067e\u06cc\u0648\u0646\u062f \u0646\u0645\u0627\u062f\u06cc\u0646 \u0628\u06cc\u0646 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0647 \u0628\u0647 \u062a\u0627\u0632\u06af\u06cc \u062f\u0631 \u0641\u0647\u0631\u0633\u062a &#8220;sites-available&#8221; \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0645\u060c \u0628\u0647 \u0641\u0647\u0631\u0633\u062a &#8220;sites-enabled&#8221; \u0645\u062c\u0627\u0648\u0631 \u0622\u0646 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u0645.<\/p>\n<pre><code class=\"hljs\"><span class=\"hljs-meta\">$<\/span><span class=\"bash\"> sudo rm \/etc\/nginx\/sites-enabled\/default<\/span>\n<span class=\"hljs-meta\">$<\/span><span class=\"bash\"> sudo ln -s \/etc\/nginx\/sites-available\/image_parroter \/etc\/nginx\/sites-enabled\/image_parroter<\/span>\n<\/code><\/pre>\n<p>\u067e\u0633 \u0627\u0632 \u0627\u0646\u062c\u0627\u0645 \u0627\u06cc\u0646 \u06a9\u0627\u0631\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0645 nginx \u0631\u0627 \u0645\u062c\u062f\u062f\u0627\u064b \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u0645\u060c \u0648\u0636\u0639\u06cc\u062a \u0622\u0646 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0631\u062f\u0647 \u0648 \u0622\u0646 \u0631\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0646\u0645 \u062a\u0627 \u062f\u0631 \u0628\u0648\u062a \u0634\u0631\u0648\u0639 \u0634\u0648\u062f.<\/p>\n<pre><code class=\"hljs\"><span class=\"hljs-meta\">$<\/span><span class=\"bash\"> sudo systemctl restart nginx<\/span>\n<span class=\"hljs-meta\">$<\/span><span class=\"bash\"> sudo systemctl status nginx<\/span>\n<span class=\"hljs-meta\">$<\/span><span class=\"bash\"> sudo systemctl <span class=\"hljs-built_in\">enable<\/span> nginx<\/span>\n<\/code><\/pre>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u0645\u0631\u0648\u0631\u06af\u0631 \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0622\u062f\u0631\u0633 IP \u0627\u06cc\u0646 \u0633\u0631\u0648\u0631 \u0627\u0648\u0628\u0648\u0646\u062a\u0648 \u0646\u0634\u0627\u0646 \u062f\u0647\u0645 \u0648 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0646\u062f\u0627\u0646\u06af\u0634\u062a\u06cc \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u0645.<\/p>\n<p><img decoding=\"async\" class=\"img-responsive\" src=\"https:\/\/rasanegar.com\/blog\/wp-content\/uploads\/2024\/01\/asynchronous-tasks-django-with-redis-celery-1.png\" alt=\"\" title=\"\"><\/p>\n<h2 id=\"conclusion\"><span class=\"ez-toc-section\" id=\"%d9%86%d8%aa%db%8c%d8%ac%d9%87\"><\/span>\u0646\u062a\u06cc\u062c\u0647<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u062f\u0644\u06cc\u0644 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0631\u0648\u0634 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u0631\u0641\u0633 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0647\u062f\u0641 \u0645\u0634\u062a\u0631\u06a9 \u0634\u0631\u0648\u0639 \u06cc\u06a9 \u06a9\u0627\u0631 \u0646\u0627\u0647\u0645\u0632\u0645\u0627\u0646 \u06a9\u0647 \u062e\u0627\u0645\u0648\u0634 \u0645\u06cc\u200c\u0634\u0648\u062f \u0648 \u0628\u0647 \u0635\u0648\u0631\u062a \u0633\u0631\u06cc\u0627\u0644\u06cc \u06a9\u0627\u0645\u0644 \u0645\u06cc\u200c\u0634\u0648\u062f\u060c \u062a\u0648\u0636\u06cc\u062d \u062f\u0627\u062f.  \u0627\u06cc\u0646 \u0645\u0646\u062c\u0631 \u0628\u0647 \u0628\u0647\u0628\u0648\u062f \u0642\u0627\u0628\u0644 \u062a\u0648\u062c\u0647\u06cc \u062f\u0631 \u062a\u062c\u0631\u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc\u200c\u0634\u0648\u062f \u0648 \u062a\u0623\u062b\u06cc\u0631 \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u06a9\u062f \u0637\u0648\u0644\u0627\u0646\u06cc\u200c\u0645\u062f\u062a \u0631\u0627 \u06a9\u0627\u0647\u0634 \u0645\u06cc\u200c\u062f\u0647\u062f \u06a9\u0647 \u0633\u0631\u0648\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0631\u0627 \u0627\u0632 \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631 \u0645\u0633\u062f\u0648\u062f \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n<p>\u0645\u0646 \u062a\u0645\u0627\u0645 \u062a\u0644\u0627\u0634\u0645 \u0631\u0627 \u06a9\u0631\u062f\u0647\u200c\u0627\u0645 \u062a\u0627 \u062a\u0648\u0636\u06cc\u062d \u0645\u0641\u0635\u0644\u06cc \u0627\u0632 \u0634\u0631\u0648\u0639 \u062a\u0627 \u067e\u0627\u06cc\u0627\u0646 \u0627\u0631\u0627\u0626\u0647 \u06a9\u0646\u0645 process \u0627\u0632 \u062a\u0646\u0638\u06cc\u0645 \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u062a\u0648\u0633\u0639\u0647\u060c \u0627\u062c\u0631\u0627\u06cc \u0648\u0638\u0627\u06cc\u0641 cellery\u060c \u062a\u0648\u0644\u06cc\u062f \u0648\u0638\u0627\u06cc\u0641 \u062f\u0631 \u06a9\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u0646\u06af\u0648\u060c \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u0635\u0631\u0641 \u0646\u062a\u0627\u06cc\u062c \u0627\u0632 \u0637\u0631\u06cc\u0642 \u062c\u0646\u06af\u0648 \u0648 \u0686\u0646\u062f \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0633\u0627\u062f\u0647.<\/p>\n<p>\u0645\u0645\u0646\u0648\u0646 \u06a9\u0647 \u062e\u0648\u0627\u0646\u062f\u06cc\u062f \u0648 \u0645\u062b\u0644 \u0647\u0645\u06cc\u0634\u0647 \u0627\u0632 \u0646\u0638\u0631 \u062f\u0627\u062f\u0646 \u06cc\u0627 \u0627\u0646\u062a\u0642\u0627\u062f \u062f\u0631 \u0632\u06cc\u0631 \u062e\u062c\u0627\u0644\u062a \u0646\u06a9\u0634\u06cc\u062f.<\/p>\n<\/div>\n<p><script>\n                        !function(f,b,e,v,n,t,s)\n                        {if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n                        n.callMethod.apply(n,arguments):n.queue.push(arguments)};\n                        if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';\n                        n.queue=();t=b.createElement(e);t.async=!0;\n                        t.src=v;s=b.getElementsByTagName(e)(0);\n                        s.parentNode.insertBefore(t,s)}(window, document,'script',\n                        'https:\/\/connect.facebook.net\/en_US\/fbevents.js');\n                        fbq('init', '525232124909042');\n                        fbq('track', 'PageView');\n                    <\/script>    (\u0628\u0631\u0686\u0633\u0628\u200c\u0647\u0627 \u0628\u0647 \u062a\u0631\u062c\u0645\u0647)# python<br \/>\n<br \/><br \/>\n<br \/>\u0645\u0646\u062a\u0634\u0631 \u0634\u062f\u0647 \u062f\u0631 1403-01-22 17:41:03<br \/>\n<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-center kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;center&quot;,&quot;id&quot;:&quot;16252&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;0&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;0&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;5&quot;,&quot;greet&quot;:&quot;\u0627\u0645\u062a\u06cc\u0627\u0632 \u0634\u0645\u0627 \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0637\u0644\u0628&quot;,&quot;legend&quot;:&quot;0\\\/5 (0 \u0631\u0627\u06cc)&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;\u0648\u0638\u0627\u06cc\u0641 \u0646\u0627\u0647\u0645\u0632\u0645\u0627\u0646 \u062f\u0631 \u062c\u0646\u06af\u0648 \u0628\u0627 \u0631\u062f\u06cc\u0633 \u0648 \u06a9\u0631\u0641\u0633&quot;,&quot;width&quot;:&quot;0&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ({count} \u0631\u0627\u06cc)&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 0px;\">\n            <div class=\"kksr-star\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 24px;\">\n            <span class=\"kksr-muted\">\u0627\u0645\u062a\u06cc\u0627\u0632 \u0634\u0645\u0627 \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0637\u0644\u0628<\/span>\n    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">\u0632\u0645\u0627\u0646 \u0644\u0627\u0632\u0645 \u0628\u0631\u0627\u06cc \u0645\u0637\u0627\u0644\u0639\u0647: <\/span> <span class=\"rt-time\"> 15<\/span> <span class=\"rt-label rt-postfix\">\u062f\u0642\u06cc\u0642\u0647<\/span><\/span>\u0645\u0639\u0631\u0641\u06cc \u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0645\u0646 \u06cc\u06a9 \u062f\u0631\u06a9 \u06a9\u0644\u06cc \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0686\u0631\u0627 \u0635\u0641 \u067e\u06cc\u0627\u0645 \u0647\u0627\u06cc \u06a9\u0631\u0641\u0633 \u0627\u0631\u0632\u0634\u0645\u0646\u062f \u0647\u0633\u062a\u0646\u062f \u0647\u0645\u0631\u0627\u0647 \u0628\u0627 \u0631\u0648\u0634 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u0631\u0641\u0633 \u062f\u0631 \u0627\u0631\u062a\u0628\u0627\u0637 \u0628\u0627 Redis \u062f\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u0646\u06af\u0648 \u0627\u0631\u0627\u0626\u0647 \u062e\u0648\u0627\u0647\u0645 \u06a9\u0631\u062f. \u0628\u0631\u0627\u06cc \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0646 \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc\u060c \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u067e\u0631\u062f\u0627\u0632\u0634 \u062a\u0635\u0648\u06cc\u0631 \u0645\u06cc\u0646\u06cc\u0645\u0627\u0644\u06cc\u0633\u062a\u06cc \u0645\u06cc\u200c\u0633\u0627\u0632\u0645 \u06a9\u0647 \u062a\u0635\u0627\u0648\u06cc\u0631 \u06a9\u0648\u0686\u06a9\u06cc \u0627\u0632 \u062a\u0635\u0627\u0648\u06cc\u0631 \u0627\u0631\u0633\u0627\u0644 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0631\u0627 [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":16253,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1743,620],"tags":[],"class_list":["post-16252","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python","category-programming"],"acf":[],"_links":{"self":[{"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/posts\/16252","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/comments?post=16252"}],"version-history":[{"count":0,"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/posts\/16252\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/media\/16253"}],"wp:attachment":[{"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/media?parent=16252"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/categories?post=16252"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/tags?post=16252"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}