از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
آپلود فایل ها در AWS S3 با پایتون و جنگو
سرفصلهای مطلب
معرفی
در تلاش برای ساخت وبسایتهای تعاملیتر، ما نه تنها اطلاعات را به کاربران منتقل میکنیم، بلکه به آنها اجازه میدهیم تا دادههای خود را آپلود کنند. این فرصتها و راههای بیشتری را باز میکند که وبسایتهای ما میتوانند در خدمت کاربران نهایی باشند.
با اجازه دادن به کاربران برای آپلود فایلها، میتوانیم به آنها اجازه دهیم عکسها، فیلمها یا موسیقیها را با دیگران به اشتراک بگذارند یا از آنها برای حفظ امنیت نسخه پشتیبان تهیه کنند. همچنین میتوانیم به جای نصب برنامههای بومی، قابلیت مدیریت فایلها و تبدیل آنها به فرمتهای دیگر را از طریق وبسایتها فراهم کنیم.
ظهور رسانههای اجتماعی در سطح جهانی را میتوان به توانایی کاربران در آپلود فایلهای خود، عمدتاً به صورت تصویر و ویدیو برای دیدن سایر کاربران و همچنین به عنوان وسیلهای ارتباطی نسبت داد. با فعال کردن کاربران برای آپلود فایلها در وبسایتها و پلتفرمها، وسایل ارتباطی بهبود یافتهاند و اکنون میتوان اطلاعات را در قالبهای مختلف پخش کرد.
در این پست، بررسی خواهیم کرد که جنگو چگونه آپلود فایل را مدیریت میکند و چگونه میتوانیم این قابلیت را با فضای ذخیرهسازی ابری مطابق با نیازهایمان گسترش دهیم.
جنگو چگونه از ذخیره سازی فایل ها استفاده می کند
جنگو نه تنها به ما این امکان را می دهد که مفاهیم را به برنامه های کاربردی وب تبدیل کنیم، بلکه عملکردی را برای ما فراهم می کند تا فایل ها را مدیریت کنیم و به کاربران اجازه می دهد فایل ها را برای تعامل بیشتر در برنامه های وب ما آپلود کنند. از طریق فرمها، کاربران میتوانند فایلها را به درخواستهای خود پیوست کنند و فایلهای خود را آپلود و در سرورهای باطن ما ذخیره کنند.
قبل از اینکه یک فایل ذخیره شود، قبل از پردازش و ذخیره در مکان نهایی مورد نظر، به طور موقت در جایی ذخیره می شود. به عنوان مثال، اگر فایل آپلود شده کمتر از 2.5 مگابایت باشد، محتویات آن فایل در حافظه ذخیره می شود و پس از تکمیل تمام عملیات در حین پردازش، روی دیسک نوشته می شود.
این باعث می شود process سریع برای فایل های کوچک برای فایلهای بزرگتر از 2.5 مگابایت، ابتدا هنگام دریافت دادهها در یک مکان موقت نوشته میشوند، سپس پس از تکمیل پردازش، فایل به مقصد نهایی خود منتقل میشود.
رفتار فایل در جنگو را می توان از طریق تنظیمات مختلف سفارشی کرد، مانند FILE_UPLOAD_MAX_MEMORY_SIZE
، که به ما امکان می دهد اندازه محدودیت آپلود 2.5 مگابایتی را برای فایل هایی که ابتدا در حافظه نوشته می شوند و نه در یک مکان موقت تغییر دهیم. همچنین میتوانیم مجوزهای پیشفرض برای فایلهای آپلود شده را از طریق پیکربندی کنیم FILE_UPLOAD_PERMISSIONS
.
تنظیمات دیگر را می توان در آن یافت این بخش از اسناد رسمی جنگو.
کجا می توانیم فایل های خود را ذخیره کنیم؟
در یک برنامه تحت وب مجهز به جنگو، میتوانیم فایلهای آپلود شده را در مکانهای مختلف ذخیره کنیم. ما می توانیم آنها را ذخیره کنیم روی سرورهای خودمان که کد جنگو در آن مستقر شده است، یا می توانیم آنها را به سرورهای دیگری که ممکن است در جای دیگری برای اهداف ذخیره سازی راه اندازی شده اند ارسال کنیم.
در تلاش برای کاهش هزینههای نگهداری سرور و افزایش عملکرد، میتوانیم فایلهای آپلود شده را ذخیره نکنیم روی سرورهای خودمان در این صورت می توانیم آنها را به سایر ارائه دهندگان ذخیره سازی میزبانی مانند AWS، لاجوردی، یا یک درایو، بین دیگران.
چندین بسته وجود دارد که به ما امکان می دهد با API های ارائه شده توسط ارائه دهندگان خدمات مختلفی که ذکر کردیم تعامل داشته باشیم. آنها عبارتند از:
برای این پست از Django-s3direct بسته ای برای ذخیره فایل های ما روی S3 AWS.
برنامه ما – جنگو درایو
ما از جنگو برای ساخت یک برنامه وب استفاده می کنیم که در آن محتوا را برای مشاهده کاربران نهایی آپلود می کنیم. این با استفاده از رابط مدیریت جنگو، که همراه با چارچوب ارائه می شود، به دست می آید.
سایت ما برای فروش خودرو و روی در آن، ما جزئیات را نمایش می دهیم و تصاویر یا فیلم هایی از خودروها را اضافه می کنیم روی فروش.
تصاویر یا فیلم های ماشین ها روی فروش ذخیره خواهد شد روی S3. در حال حاضر برای اختصار، ثبت نام یا ورود کاربر را اجرا نمی کنیم.
برپایی
ما استفاده خواهیم کرد پیپنف برای راه اندازی و مدیریت محیط ایزوله خود که در آن برنامه جنگو خود را با اجرای دستور زیر برای تنظیم آن با استفاده از Python3 می سازیم:
$ pipenv install --three
با تنظیم محیط، اکنون می توانیم نصب کنیم جانگو و Django-s3direct برای مدیریت آپلود فایل های ما در S3:
$ pipenv install django django-s3direct
جنگو مجموعه ای از دستورات را برای بوت استرپ پروژه ما قبل از شروع اجرای عملکرد اصلی برنامه ارائه می دهد. پروژه درایو جنگو ما یک برنامه کاربردی خواهد داشت که تمرکز این پست خواهد بود. برای رسیدن به این هدف، دستورات زیر را اجرا می کنیم:
$ django-admin startproject django_drive && cd django_drive
$ django-admin startapp django_drive_app
را django-admin startproject ...
دستور پروژه را ایجاد می کند و django-admin startapp ...
دستور برنامه را ایجاد می کند.
آخرین مرحله راه اندازی ما ایجاد جداول پایگاه داده با اجرای آن است migrate
دستور:
$ python manage.py migrate
وقتی پروژه خود را با اجرای دستور شروع می کنیم python manage.py runserver
، مورد استقبال ما قرار می گیرد page، که تأیید می کند که راه اندازی ما موفقیت آمیز بوده است:
از آنجایی که ما فایل های خود را در AWS S3 آپلود خواهیم کرد، باید یک لایه آزاد راه اندازی کنیم حساب AWS برای اهداف نمایشی پس از راهاندازی، میتوانیم به داشبورد S3 بروید و یک سطل جدید ایجاد کنیم که حاوی آپلودهای ما باشد.
برای Django-s3direct
برای تعامل با راهاندازی AWS خود، باید اعتبارنامههای زیر را ارائه کنیم AWS_ACCESS_KEY_ID
، AWS_SECRET_ACCESS_KEY
، و AWS_STORAGE_BUCKET_NAME
.
در ادامه موارد زیر را به ما اضافه می کنیم django_drive/settings.py
فایل:
AWS_ACCESS_KEY_ID = 'aws-access-key-id'
AWS_SECRET_ACCESS_KEY = 'secret-access-key'
AWS_STORAGE_BUCKET_NAME = 'name-of-the-bucket'
AWS_S3_REGION_NAME = 'name-of-the-region'
AWS_S3_ENDPOINT_URL = 'https://s3.amazonaws.com'
S3DIRECT_DESTINATIONS = {
'primary_destination': {
'key': 'uploads/',
'allowed': ('image/jpg', 'image/jpeg', 'image/png', 'video/mp4'),
},
}
Django-s3direct
به ما اجازه می دهد تا بیش از یک مقصد را برای آپلودهای خود مشخص کنیم، به این ترتیب می توانیم فایل های مختلف را به سطل های S3 جداگانه هدایت کنیم. برای این پروژه، همه آپلودها را در یک سطل قرار می دهیم. یکی دیگر از ویژگی های جالب این است که ما همچنین می توانیم انواع فایل هایی را که می توان در وب سایت ما آپلود کرد محدود کنیم. در مورد ما، ما آن را فقط به ویدیوهای MP4، JPEG و تصاویر PNG محدود کردهایم.
توجه داشته باشید: جزئیات بیشتر در مورد راه اندازی Django-s3direct
، مانند CORS و دسترسی به تنظیمات، را می توان یافت اینجا.
همچنین باید ورودی های زیر را در قسمت اضافه کنیم django_drive/urls.py
فایل:
from django.urls import path, include
urlpatterns = (
...
path('', include('django_drive_app.urls')),
path('s3direct/', include('s3direct.urls')),
...
)
پیاده سازی
ما با ایجاد مدل برای داده های خودروی خود شروع خواهیم کرد، که به کاربران نهایی نمایش داده می شود. این مدل همچنین اطلاعاتی را که هنگام افزودن خودروها به پلتفرم خود در داشبورد مدیریت خود وارد میکنیم، تعریف میکند. مدل خودرو به شرح زیر خواهد بود:
from django.db import models
from s3direct.fields import S3DirectField
class Car(models.Model):
name = models.CharField(max_length=255, blank=False, null=False)
year_of_manufacture = models.CharField(max_length=255, blank=False, null=False)
price = models.CharField(max_length=255, blank=False, null=False)
image = S3DirectField(dest='primary_destination', blank=True)
video = S3DirectField(dest='primary_destination', blank=True)
def __str__(self):
return f"{self.name} ({self.year_of_manufacture}) - {self.price}"
برای هر خودرو، نام، سال ساخت، قیمت و تصویر یا ویدیوی آن را ذخیره می کنیم. پس از ایجاد مدل، اجازه دهید مهاجرت هایی را انجام دهیم تا جدولی را در پایگاه داده ایجاد کنیم که داده های ما را با اجرای:
$ python manage.py makemigrations
$ python manage.py migrate
از آنجایی که ما از داشبورد مدیریت جنگو برای مدیریت خودروها استفاده خواهیم کرد روی پلتفرم ما، باید مدل خود را در آن ثبت کنیم django_drive_app/admin.py
:
from django.contrib import admin
from.models import Car
admin.site.register(Car)
سپس ما باید با اجرای دستور زیر و دنبال کردن دستورات، ابرکاربری را ایجاد کنیم که وظیفه اضافه کردن ماشین ها را بر عهده دارد:
$ python manage.py createsuperuser
$ python manage.py runserver
را python manage.py runserver
دستور به سادگی برنامه ما را راه اندازی مجدد می کند.
پس از راهاندازی مجدد سرور، اکنون میتوانیم به داشبورد مدیریت در آدرس بروید http://127.0.0.1:8000/admin
و با مشخصاتی که قبلا مشخص کردیم وارد شوید. تحت مدیریت سایت، ما می توانیم خود را ببینیم DJANGO_DRIVE_APP
با امکان افزودن یا تغییر خودروهای موجود.
این فرمی است که برای اضافه کردن یک ماشین و جزئیات آن استفاده می کنیم:
هنگامی که ماشین خود را ذخیره می کنیم، می توانیم تصویری را که آپلود کرده ایم در سطل S3 خود پیدا کنیم روی AWS console. این بدان معناست که فایل ما در AWS آپلود شده است.
اکنون یک نمای برای نمایش خودروها و داده های آنها به کاربران نهایی وب سایت خود و همچنین نمایش تصاویر یا فیلم های مرتبط با هر خودرو ایجاد می کنیم. ما با ایجاد یک نمای در شروع خواهیم کرد django_drive_app/views.py
:
from django.shortcuts import render
from django.views.generic import TemplateView
from .models import Car
class CarView(TemplateView):
template_name = 'django_drive_app/cars.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context('cars') = Car.objects.all()
return context
در این دیدگاه از a استفاده می کنیم نمای جنگو مبتنی بر کلاس تا فایل HTML را برای نمایش اتومبیل هایمان رندر کنیم. به نظر ما، ما یک پرس و جو اجرا می کنیم تا همه ماشین ها را به صورت ذخیره شده در پایگاه داده ما واکشی کنیم.
بعد، اجازه دهید ایجاد کنیم django_drive_app/templates/django_drive_app/cars.html
برای رندر اتومبیل های ما:
<!DOCTYPE html>
<html>
<head>
<title>Django Drive</title>
</head>
<body>
<h3>Welcome to Django Drive. </h3>
<p>Here are the current cars available for sale: </p>
<div class="cars-container">
{% for car in cars %}
<div class="car">
<p>
<b> {{ car.name }} ({{ car.year_of_manufacture }}) </b> <br>
Price: {{ car.price }}
</p>
{% if car.image %}
<img src="{{ car.image }}" height="200" width="400"/>
{% endif %}
{% if car.video %}
<video width="320" height="240" controls>
<source src="{{ car.video }}" type="video/mp4">
Your browser does not support the video tag.
</video>
{% endif %}
</div>
<hr>
{% endfor %}
</div>
</body>
</html>
با نمای و الگو، اجازه دهید نقطه پایانی را که برای نمایش لیست خودروها به کاربران نهایی استفاده میشود، اضافه کنیم. django_drive_app/urls.py
:
from django.conf.urls import url
from .views import CarView
urlpatterns = (
url(r'^cars/$', CarView.as_view(), name="cars"),
)
ما import نمای ما را مشاهده کنید و یک ورودی URL اضافه کنید تا نقطه پایانی را به نمای نمایشی که خودروها را نمایش می دهد، ترسیم کنید. هنگامی که سرور خود را مجددا راه اندازی می کنیم و به آن می رویم 127.0.0.1:8000/cars/
، با موارد زیر مواجه می شویم:
همانطور که می بینیم، ماشین هایی را با تصاویر و ویدیوهای پیوست ایجاد کردیم و آنها را در سرویس S3 AWS آپلود کردیم. تصاویر و ویدیوهای مشابه پس از واکشی از AWS در برنامه وب ما ارائه شده است.
نتیجه
در این مقاله، ما یک برنامه ساده جنگو ایجاد کرده ایم که به مدیران اجازه می دهد تا فایل ها را از طریق داشبورد مدیریت جنگو در AWS S3 آپلود کنند. ما فایل های آپلود شده را به عنوان میزبان ارائه کردیم روی S3 روی فرود ما page، از جمله فیلم ها و تصاویر خودروهایی که کاربران مایل به خرید یا مشاهده آن هستند.
ما استفاده کردیم Django-s3direct
کتابخانه ای برای مدیریت تعامل بین برنامه جنگو و AWS S3 که فایل های ما در آن ذخیره می شوند. از طریق برنامه مدیریت جنگو، ما قادر به آپلود فایل هایی بودیم که در نهایت برای کاربران نهایی ارائه شد. روی فرود ما page. ما توانستیم هم تصاویر و هم ویدیوها را آپلود و رندر کنیم.
کد منبع این پروژه موجود است اینجا روی GitHub.
(برچسبها برای ترجمه)# aws
منتشر شده در 1403-01-19 23:59:04