
روز ۳۱: آپلود فایل و تصویر در جنگو
تقریباً هیچ پروژه وب واقعی بدون قابلیت آپلود فایل یا تصویر کامل محسوب نمیشود. از پروفایل کاربران و تصاویر مقالات گرفته تا فایلهای ضمیمه، مستندات و تصاویر محصولات، همگی نیازمند یک سیستم آپلود امن و قابل مدیریت هستند. جنگو به صورت پیشفرض ابزارهای بسیار قدرتمندی برای مدیریت فایلها و تصاویر ارائه میدهد که در صورت استفاده صحیح، هم امنیت پروژه حفظ میشود و هم تجربه کاربری حرفهایتری ایجاد خواهد شد. یادگیری این بخش یکی از نقاط عطف مهم در مسیر تبدیل شدن به یک توسعهدهنده جنگو حرفهای محسوب میشود.
آشنایی با Media Files در جنگو
در جنگو فایلهای آپلودی با نام Media Files شناخته میشوند و با فایلهای استاتیک تفاوت دارند. فایلهای استاتیک مانند CSS و JavaScript از قبل وجود دارند، اما فایلهای Media توسط کاربران آپلود میشوند و باید به صورت پویا مدیریت شوند. برای استفاده از Media Files ابتدا باید تنظیمات مربوط به آن را در فایل settings.py انجام دهیم تا جنگو بداند فایلها کجا ذخیره شوند و چگونه در محیط توسعه نمایش داده شوند.
MEDIA_URL = '/media/' MEDIA_ROOT = BASE_DIR / 'media'
با این تنظیمات، تمام فایلهای آپلود شده در پوشهای به نام media ذخیره میشوند و از طریق MEDIA_URL قابل دسترسی خواهند بود.
تنظیم مسیر Media در urls.py
پس از تعریف Media در settings، باید مسیر نمایش آنها را در urls.py اضافه کنیم تا در محیط توسعه بتوانیم تصاویر و فایلها را مشاهده کنیم. این مرحله برای جلوگیری از خطاهای رایج بسیار مهم است و بسیاری از توسعهدهندگان تازهکار آن را فراموش میکنند.
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# urls اصلی پروژه
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)این کد باعث میشود فایلهای آپلودی فقط در حالت توسعه نمایش داده شوند و در محیط Production از وبسرور استفاده شود.
استفاده از FileField و ImageField در Model
برای ذخیره فایل یا تصویر در دیتابیس، جنگو دو فیلد اصلی در اختیار ما قرار میدهد. FileField برای انواع فایلها و ImageField مخصوص تصاویر است. استفاده از ImageField نیازمند نصب کتابخانه Pillow میباشد که برای پردازش تصاویر استفاده میشود. انتخاب فیلد مناسب باعث مدیریت بهتر فایلها و جلوگیری از مشکلات بعدی خواهد شد.
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
image = models.ImageField(upload_to='articles/images/')
file = models.FileField(upload_to='articles/files/', blank=True, null=True)در این مثال تصاویر و فایلها در مسیرهای جداگانه ذخیره میشوند که به نظم پروژه کمک زیادی میکند.
ساخت فرم آپلود فایل و تصویر
برای دریافت فایل از کاربر، فرم جنگو باید از نوع multipart باشد و همچنین فرم ما باید فیلد مربوط به فایل یا تصویر را شامل شود. در غیر این صورت فایل به View ارسال نخواهد شد و با خطا مواجه میشویم. این نکته یکی از رایجترین اشتباهات در آپلود فایل است.
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">ذخیره</button>
</form>استفاده از enctype به جنگو اعلام میکند که فرم شامل دادههای باینری مانند فایل است.
مدیریت فایل آپلودی در View
در View باید علاوه بر request.POST، مقدار request.FILES را نیز به فرم ارسال کنیم تا فایلها به درستی پردازش شوند. اگر این بخش را فراموش کنیم، فرم معتبر نخواهد بود یا فایل ذخیره نمیشود.
def create_article(request):
if request.method == 'POST':
form = ArticleForm(request.POST, request.FILES)
if form.is_valid():
form.save()
else:
form = ArticleForm()این الگو پایهایترین و استانداردترین روش برای مدیریت آپلود فایل در جنگو است و در پروژههای بزرگ نیز به همین شکل استفاده میشود.
نمایش تصویر و فایل آپلود شده
پس از ذخیره فایل یا تصویر، نمایش آن در Template بسیار ساده است. جنگو به صورت خودکار مسیر فایل را در اختیار ما قرار میدهد و میتوانیم از آن استفاده کنیم. این بخش برای پروفایل کاربران، مقالات و صفحات محصول اهمیت زیادی دارد.
<img src="{{ article.image.url }}" alt="{{ article.title }}">
<a href="{{ article.file.url }}">دانلود فایل</a>استفاده صحیح از این قابلیت باعث میشود محتوای داینامیک جذابتر و کاربردیتر شود.
نکات امنیتی در آپلود فایل
آپلود فایل اگر به درستی مدیریت نشود میتواند باعث آسیبهای امنیتی جدی شود. محدود کردن نوع فایل، بررسی حجم فایل و استفاده از ImageField به جای FileField برای تصاویر، از جمله اقداماتی است که باید در نظر گرفته شود. همچنین بهتر است نام فایلها به صورت خودکار مدیریت شود تا از تداخل یا سوءاستفاده جلوگیری شود. جنگو ابزارهای مناسبی برای پیادهسازی این محدودیتها در اختیار توسعهدهنده قرار میدهد.
جمعبندی روز سیویکم
در روز سیویکم یاد گرفتیم چگونه فایل و تصویر را در جنگو آپلود، ذخیره و نمایش دهیم. با تنظیم Media، استفاده از Model مناسب، فرمهای صحیح و رعایت نکات امنیتی، میتوان یک سیستم آپلود حرفهای و قابل اعتماد ایجاد کرد. این مهارت در اکثر پروژههای واقعی جنگو مورد استفاده قرار میگیرد و پایه بسیاری از قابلیتهای پیشرفتهتر مانند پروفایل کاربران، سیستم مقالات و فروشگاههای اینترنتی است.