وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

مدیریت آپلود فایل با جنگو

0 94
زمان لازم برای مطالعه: 12 دقیقه


معرفی

شبکه جهانی وب باعث انتقال مقادیر عظیمی از داده ها بین رایانه های شبکه شده و جامعه ای است که داده ها را به وفور ایجاد و به اشتراک می گذارد. این داده ها می توانند اشکال و اشکال مختلفی داشته باشند و برخی از فرمت های متداول قابل تفسیر توسط انسان، تصاویر، فیلم ها و فایل های صوتی هستند.

کاربران چنان برای به اشتراک گذاری در طیف گسترده ای از نرم افزار استفاده می شوند ، که تازگی آن بسیار دور است و عملکرد آن اغلب اوقات استاندارد در نظر گرفته می شود.

در این راهنما، روش آپلود یک فایل با پایتون را در یک برنامه وب مبتنی بر جنگو بررسی خواهیم کرد.

فایل‌هایی که آپلود می‌شوند می‌توانند علاوه بر این به اشکال مختلف پردازش شوند یا می‌توانند در حالت خام باقی بمانند. آپلود فایل ها نیز یک سوال را ایجاد می کند ذخیره سازی (جایی که فایل ها به پایان می رسند) و همچنین نمایش دادن (چگونه می توان آنها را بازیابی و نمایش داد). در طول راهنما ، ما این سؤالات را مورد توجه قرار می دهیم ، ساخت یک پروژه کوچک که به کاربر امکان بارگذاری پرونده ها را در یک برنامه وب Django ارائه می دهد.

راه اندازی پروژه

ما در حال ساختن یک پروژه کوچک خواهیم بود که در آن می توانیم پرونده های بارگذاری ، ذخیره سازی و نمایش عملکرد Django را با یک بانک اطلاعاتی اجرا کنیم ، با این حال ، تصاویر را ذخیره می کنیم روی یک هارد دیسک

بیایید فرض کنیم که ما در یک جهان خیالی زندگی می کنیم که در کنار موجودات جادویی کتابهای هری پاتر زندگی می کنیم ، و متخصصان جادوگران جهان ما برای پیگیری اطلاعات در مورد هر موجود جادویی که مطالعه می کنند ، نیاز به برنامه ای دارند. ما فرمی ایجاد می کنیم که از طریق آن می توانند توضیحات و تصاویر را برای هر جانور ثبت کنند، سپس آن فرم را ارائه می کنیم، اطلاعات را ذخیره می کنیم و در صورت نیاز به کاربر نمایش می دهیم.

اگر با جنگو و ماژول های آن آشنا نیستید، مانند django-admin – می توانید راهنمای کلی ایجاد API های REST را بخوانید که عناصر اصلی جنگو را پوشش می دهد. در طول این راهنما، ما دانش اولیه جنگو را در نظر می گیریم و به سرعت تنظیمات را انجام می دهیم processهر چند، اگر می خواهید درک عمیق تری از ایجاد پروژه به دست آورید process، راهنمای ما برای ایجاد یک REST API در پایتون با جنگو را بخوانید!

ما با ایجاد یک محیط مجازی شروع می کنیم تا از اینکه وابستگی های ما باعث مشکلات عدم تطابق نسخه با پروژه های دیگر نشود، شروع می کنیم. این مرحله اختیاری است، اما به شدت توصیه می‌شود و تمرین خوبی برای تمیز نگه داشتن محیط‌های پایتون در نظر گرفته می‌شود. بیایید یک دایرکتوری ایجاد کنیم که به عنوان a عمل کند container برای محیط زیست

Command Prompt/Shell خود را باز کنید و در داخل دایرکتوری که به تازگی ایجاد کرده ایم، اجرا کنید:

$ mkdir fileupload
$ cd fileupload
$ python -m venv ./myenv
# OR
$ python3 -m venv ./myenv

اکنون که محیط مجازی ما ایجاد شده است، تنها کاری که باید انجام دهید این است که با اجرای آن، آن را فعال کنید activate اسکریپت:

# Windows
$ myenv/Scripts/activate.bat
# Linux
$ source myenv/Scripts/activate
# MacOS
$ source env/bin/activate

پس از فعال شدن محیط، اگر وابستگی ها را نصب کنیم، فقط برای آن محیط قابل اجرا هستند و با محیط های دیگر یا حتی محیط سیستم برخورد نمی کنند. در اینجا، ما می توانیم جنگو را از طریق نصب کنیم pip:

$ pip install "Django==3.0.*"

حالا بیایید یک پروژه با نام ایجاد کنیم fantasticbeasts از طریق startproject فرمان از django-admin مدول. هنگامی که یک اسکلت پروژه ایجاد شد، می‌توانیم به آن دایرکتوری برویم و برنامه را از طریق آن شروع کنیم startapp:

$ django-admin startproject fantasticbeasts
$ cd fantasticbeasts
$ django-admin startapp beasts

و در نهایت، اجازه دهید این برنامه را در fantasticbeasts/settings.py فایل، با افزودن آن به لیست INSTALLED_APPS:

INSTALLED_APPS = (
    'beasts',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

عالی! اکنون همه ما آماده ایم. ما می توانیم یک مدل ساده برای a تعریف کنیم Beast، یک فرم و قالب ایجاد کنید تا آن را به کاربر نهایی نمایش دهید و همچنین فایل هایی را که آنها از طریق فرم ارسال می کنند مدیریت کنید.

آپلود فایل با جنگو

ایجاد مدل

بیایید با تعریف یک مدل از a شروع کنیم Beast، که مستقیماً با جدول پایگاه داده مطابقت دارد. سپس می‌توان یک فرم برای نشان دادن یک صفحه خالی از این مدل ایجاد کرد که به کاربر اجازه می‌دهد جزئیات را پر کند. در beasts/models.py فایل، ما می توانیم مدلی را تعریف کنیم که گسترش می دهد models.Model کلاس، که سپس عملکرد ذخیره شده در پایگاه داده را به ارث می برد:

from django.db import models

class Beast(models.Model):
    MOM_CLASSIFICATIONS = (
    ('XXXXX', 'Known Wizard  Killer'),
    ('XXXX', 'Dangerous'),
    ('XXX', 'Competent wizard should cope'),
    ('XX', 'Harmless'),
    ('X', 'Boring'),
 )
    name = models.CharField(max_length=60)
    mom_classification = models.CharField(max_length=5, choices=MOM_CLASSIFICATIONS)
    description = models.TextField()
    media = models.FileField(null=True, blank=True)

هر جانوری یک name، description، مشایعت media (دیدن جانور) و همچنین الف mom_classification (MOM مخفف وزارت سحر و جادو است).

media نمونه ای از a است FileField که با مقداردهی اولیه شد null آرگومان تنظیم شده است True. این مقداردهی اولیه به پایگاه داده اطلاع می دهد که برای آن مشکلی ندارد media اگر کاربری که داده‌ها را وارد می‌کند رسانه‌ای برای پیوست کردن نداشته باشد، فیلد خالی باشد. از آنجایی که ما این مدل را به یک فرم نگاشت خواهیم کرد – و جنگو از اعتبار سنجی برای ما مراقبت می کند، باید به جنگو اطلاع دهیم که فرمورودی برای media می تواند خالی باشد، بنابراین هیچ استثنایی در طول اعتبار سنجی ایجاد نمی کند. null به پایگاه داده اشاره دارد، در حالی که blank به اعتبار سنجی پایان کاربر اشاره دارد، و به طور کلی، شما می خواهید که این دو برای سازگاری روی یک مقدار تنظیم شوند.

توجه داشته باشید: اگر می‌خواهید افزودن رسانه توسط کاربر را اعمال کنید، این آرگومان‌ها را روی آن تنظیم کنید False.

آ FileField به طور پیش فرض فقط یک فایل را مدیریت می کند و به کاربر اجازه می دهد یک مورد را از سیستم فایل خود آپلود کند. در بخش بعدی، نگاهی به آن خواهیم داشت روش آپلود چند فایل همچنین.

ایجاد فرم مدل

هنگامی که مدل ما تعریف شد، آن را به یک فرم متصل می کنیم. ما نیازی به انجام این کار به صورت دستی نداریم روی قسمت جلویی، زیرا جنگو می تواند این قابلیت را برای ما بوت استرپ کند:

from django.forms import ModelForm
from .models import Beast

class BeastForm(ModelForm):
    class Meta: 
        model = Beast
        fields = '__all__'

ما فقط یک را ایجاد کردیم BeastForm و مقید شد Beast برای آن مدل کنید ما همچنین تنظیم کردیم fields به __all__ بنابراین تمام فیلدهای مدل ما هنگام استفاده از آن نمایش داده می شود روی یک HTML page. هر چند برای مدل ساده ما، می‌توانید فیلدها را به‌صورت جداگانه تغییر دهید.

ثبت مدل ها با ادمین

جنگو به طور خودکار یک سایت مدیریت برای توسعه دهندگان ایجاد می کند تا در طول توسعه از آن استفاده کنند process. در اینجا، ما می‌توانیم مدل‌ها و زمینه‌های خود را بدون نیاز به چرخش صفحات خودمان آزمایش کنیم. با این حال، برای کاربران، باید آنها را ایجاد کنید و وب سایت مدیریت را قبل از پخش زنده غیرفعال کنید.

بیایید مدل خود را با افزودن آن به وب سایت مدیریت ثبت کنیم beasts/admin.py فایل:

from django.contrib import admin
from .models import Beast

admin.site.register(Beast)

ثبت مسیرهای URL

با ساختار برنامه آماده، یک مدل تعریف و ثبت شده، و همچنین به یک فرم متصل شده است – اجازه دهید مسیرهای URL را پیکربندی کنیم که به کاربر اجازه می دهد از این برنامه استفاده کند. برای انجام این کار، اجازه دهید یک را ایجاد کنیم urls.py فایل داخل برنامه ما بعد میتونیم بریم روی و محتوای آن را در سطح پروژه “شامل” کنید urls.py فایل.

ما beasts/urls.py چیزی شبیه به این خواهد بود:

from django.urls import path
from .import views

urlpatterns = (
    path("", views.addbeast,  name='addbeast')
 )

و سطح پروژه (urls.py) این را اضافه خواهد کرد:

urlpatterns = (
    path("", include("reviews.urls"))
)

ما یک رشته خالی برای URL خود اضافه می کنیم زیرا این یک پروژه در اندازه جیبی است و نیازی به پیچیده کردن آن نیست. ما قبلاً یک نما ایجاد نکرده‌ایم، اما قبل از ایجاد نام آن را در اینجا ثبت کرده‌ایم. بیایید قالب HTML و views.addbeast مشاهده بعدی

ایجاد یک الگو برای نمایش فرم ما

برای نگهداری قالب‌هایمان، a ایجاد می‌کنیم templates پوشه زیر ما beasts فهرست راهنما. این نام غیرقابل مذاکره است زیرا جنگو فقط در زیر پوشه های نامگذاری شده به دنبال قالب های HTML می گردد. templates.

داخل پوشه جدیدمان، بیایید یک عدد اضافه کنیم entry.html فایلی که دارای یک <form> که زمینه های مربوط به a را می پذیرد Beast:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Fantastic Beasts</title>
</head>
<body>
    <form action="/" method="POST" enctype="multipart/form-data">
        {% csrf_token %}
        {% for entry in form %}
           <div>
                {{ entry.label_tag }}
           </div>
           <div>
               {{entry}}
           </div>
        {% endfor %}
        <button>
            Save!
        </button>
    </form>
</body>
</html>

این action="/" هنگامی که کاربر آن را انتخاب می کند، ویژگی به کنترل کننده درخواست اشاره می کند “صرفه جویی!” دکمه. ورودی فرم روش کدگذاری داده ها را دیکته می کند، بنابراین ما آن را تنظیم کرده ایم enctype به یک multipart/form-data تایپ کنید تا امکان آپلود فایل فراهم شود. هر زمان که یک ورودی از نوع اضافه می کنید "file" به فرم جنگو، باید آن را تنظیم کنید enctype به multipart/form-data.

این {% csrf_token %} یکی دیگر از موارد ضروری برای هر فرمی است action = "POST". این یک توکن منحصر به فرد است که جنگو با مهربانی برای هر مشتری ایجاد می کند تا هنگام پذیرش درخواست ها از امنیت اطمینان حاصل کند. یک توکن CSRF برای همه منحصر به فرد است POST از این فرم درخواست کنید و حملات CSRF را غیرممکن می کنند.

حملات CSRF شامل کاربران مخربی است که درخواستی را به جای کاربر دیگر، معمولاً از طریق دامنه دیگری جعل می کنند، و اگر یک توکن معتبر از دست رفته باشد، درخواست به سرور رد می شود.

این form متغیر ما در حال تکرار در برای هر حلقه ({% for entry in form %}) توسط view به این قالب HTML منتقل می شود. این متغیر یک نمونه از ما است BeastForm، و با برخی از ترفندهای جالب همراه است. ما استفاده می کنیم entry.label_tag، که برچسب آن فیلد Model Form را به ما برمی گرداند (برچسب نام فیلد خواهد بود مگر اینکه طور دیگری مشخص شده باشد) و ما فیلد فرم را در یک div تا فرم ما مناسب به نظر برسد.

ایجاد یک نمای برای رندر قالب ما

حال، بیایید یک نمای برای رندر کردن این الگو ایجاد کنیم و آن را به بک‌اند خود متصل کنیم. ما با وارد کردن render و HttpResponseRedirect کلاس ها – که هر دو در کنار کلاس های جنگو داخلی هستند BeastForm هدف – شی.

به جای یک نمای کلاسی، می‌توانیم یک نمای مبتنی بر تابع ایجاد کنیم که برای نمونه‌های اولیه و دموهای ساده مانند این به خوبی عمل می‌کند.

اگر درخواست ورودی یک باشد POST درخواست، جدید BeastForm نمونه با بدن ایجاد شده است POST درخواست (فیلدها) و فایل های ارسال شده از طریق درخواست. جنگو به طور خودکار داده‌های بدن را به یک شیء تبدیل می‌کند و آن را تزریق می‌کند request.FILES به عنوان فیلد فایل ما:

from django.shortcuts import render
from .forms import BeastForm
from django.http import HttpResponseRedirect

def entry(request):
    if request.method == 'POST':
        form = BeastForm(request.POST, request.FILES)
        
        if form.is_valid():
            form.save()
            return HttpResponseRedirect("/") 
    else:
        form = BeastForm()

    return render(request, "entry.html", {
        "form": form
    })

برای اعتبارسنجی ورودی، چون ممکن است نامعتبر باشد، می‌توانیم از آن استفاده کنیم is_valid() روش از BeastForm به عنوان مثال ، پاک کردن فرم در صورت نامعتبر بودن. در غیر این صورت، اگر فرم معتبر است – آن را از طریق آدرس در پایگاه داده ذخیره می کنیم save() روش ، و کاربر را به homepage (که ما هم هست entry.html page) از کاربر می خواهد که اطلاعات حیوان دیگری را وارد کند.

فایل ها کجا هستند؟

توجه داشته باشید: از طریق این رویکرد، فایل ها در پایگاه داده ذخیره می شوند و نیازی به مدیریت فایل نیست. اگرچه کار می کند، اما این یک استراتژی توصیه شده نیست، و ما آن را با یک سیستم مدیریت فایل مناسب در بخش بعدی اصلاح خواهیم کرد.

در حال حاضر، بیایید مهاجرت ها را انجام دهیم و برای ایجاد تغییرات در طرح مدل مهاجرت کنیم (زیرا قبلاً این کار را انجام نداده ایم). هنگامی که پروژه را اجرا می کنیم، می توانیم ببینیم که همه اینها چگونه به نظر می رسد روی سرور توسعه از terminal، در حالی که محیط مجازی هنوز فعال است، اجرا کنید:

$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py runserver

حالا یک بار که زدیم http://127.0.0.1:8000/ با استفاده از یک مرورگر، باید چیزی شبیه به این را ببینید:

فرم مدل جنگو

می توانید ادامه دهید و فرم را با مقداری ورودی تصادفی پر کنید و اضافه کنید روی یک فایل؛ هر نوع فایلی این کار را انجام می دهد زیرا ما نام فیلد را “media” گذاشتیم اما آن را a اختصاص دادیم FileField که عمومی است.

توجه داشته باشید: می‌توانید انواع فایل‌های خاصی مانند تصاویر را از طریق جنگو اعمال کنید، که به محض پوشش یک سیستم ذخیره‌سازی فایل معتبرتر، و مدیریت چند فایل به جای یک فایل، نگاهی به آن‌ها خواهیم انداخت.

پس از ارسال فرم ، می توانید داده های خود را مشاهده کنید روی پایگاه داده از طریق مدیر page!

ذخیره سازی فایل ها روی یک HDD به جای بانک اطلاعاتی

در حال حاضر کد ما قادر به ذخیره فایل ها در پایگاه داده است. با این حال ، این یک عمل مطلوب نیست. با گذشت زمان پایگاه داده ما “چاق” و کند می شود و ما نمی خواهیم این اتفاق بیفتد. تصاویر در پایگاه داده به عنوان حباب ذخیره نشده اند مدتی است، و شما به طور معمول تصاویر را ذخیره خواهید کرد روی سرور شخصی شما که در آن برنامه میزبانی شده است روی، یا روی یک سرور یا سرویس خارجی مانند S3 AWS.

اگر می‌خواهید درباره آپلود فایل‌ها در سرویس‌هایی مانند AWS S3 اطلاعات بیشتری کسب کنید – راهنمای ما برای آپلود فایل‌ها در AWS S3 در Python با جنگو را بخوانید!

بیایید ببینیم که چگونه می توانیم پرونده های بارگذاری شده را ذخیره کنیم روی دیسک ، در یک پوشه کوچک خوب تحت پروژه ما. برای قرار دادن آنها ، بیایید اضافه کنیم uploads پوشه زیر beasts و اصلاح کنید BeastFormفیلد رسانه ای برای هدف قرار دادن یک پوشه به جای پایگاه داده:

media = models.FileField(upload_to="media", null=True, blank=True)

ما تنظیم کرده ایم FileFieldپوشه هدف به "media"، که هنوز وجود ندارد. از آنجایی که احتمالاً فایل های دیگری نیز می توانند آپلود شوند، uploads پوشه دارای یک زیر شاخه به نام خواهد بود "media" برای کاربران برای آپلود تصاویر جانوران به.

برای اینکه جنگو بداند این کجاست "media" دایرکتوری است، ما آن را به آن اضافه می کنیم settings.py فایل:

MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads/')

os.path.join(BASE_DIR, 'uploads/') ضمیمه می کند "/uploads" به BASE_DIR -متغیر داخلی که مسیر مطلق پوشه پروژه ما را نگه می دارد. MEDIA_ROOT به جنگو می گوید که فایل های ما در کجا قرار می گیرند.

بیایید همه تغییراتی را که انجام داده‌ایم ذخیره کنیم و پس از اعمال مهاجرت، جنگو پوشه‌ای به نام ایجاد می‌کند. "media"، مانند (upload_to="media")، زیر uploads.

تمام فایل های ارسالی پس از آن در آن پوشه ذخیره می شوند. نفخ پایگاه داده رفع شد!

آپلود چندین فایل با جنگو

برای انجام بارگذاری چندین فایل، کار اضافی زیادی لازم نیست. تنها کاری که باید انجام دهیم این است که به فرم مدل خود بگوییم که اشکالی ندارد که حوزه رسانه بیش از یک ورودی داشته باشد.

این کار را با اضافه کردن a انجام می دهیم widgets زمینه در ما BeastForm:

from django.forms import ModelForm, ClearableFileInput
from .models import Beast

class BeastForm(ModelForm):
    class Meta: 
        model = Beast
        fields = '__all__'
        widgets = {
            'media': ClearableFileInput(attrs={'multiple': True})
        }

حالا کی روی را entry.html page، یک کاربر مجاز است چندین فایل را انتخاب کند و request.FILES ویژگی به جای یک فایل حاوی فایل های بیشتری خواهد بود.

اجرای فایل های تصویری با جنگو با استفاده از ImageField

جنگو یک نوع فیلد اضافی را تعریف می کند – an ImageField، که می تواند ورودی کاربر را به فایل های تصویری محدود کند. ما انواع مختلفی از فایل‌ها را برای مستندات جانوران خود جمع‌آوری کرده‌ایم، اما اغلب در برنامه‌های خود، از کاربر یک ورودی فایل خاص می‌خواهیم.

اجازه دهید swap ما FileField با یک ImageField:

media = models.ImageField(upload_to="media", null=True, blank=True,)

این ImageField است روی بالش images، که یک کتابخانه Python پرکاربرد برای مدیریت و دستکاری تصاویر است، بنابراین اگر آن را قبلاً نصب نکرده‌اید، با یک استثنا از شما خواسته می‌شود:

Cannot use ImageField because Pillow is not installed.
        HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "python -m pip install Pillow".

بیایید جلو برویم و به آن پایبند باشیم terminalتوصیه های برای اجرای یک لحظه سرور را ترک کنید:

$ python -m pip install Pillow

حال، اگر ادامه دهیم و مهاجرت های خود را انجام داده و اعمال کنیم و سرور توسعه خود را اجرا کنیم، خواهیم دید که وقتی می خواهیم یک فایل را آپلود کنیم، گزینه های ما محدود به تصاویر است.

نمایش تصاویر آپلود شده

ما به خط پایان خیلی نزدیک هستیم. بیایید ببینیم چگونه می توانیم تصاویر ذخیره شده خود را بازیابی و نمایش دهیم و آن را یک روز صدا کنیم.

برو جلو و باز کن beasts/views.py فایل. ما خودمان را تغییر خواهیم داد جمله شرطی به طوری که وقتی یک فرم با موفقیت ارسال شد، نمای آن را دوباره بارگذاری نمی کند page اما در عوض ما را به دیگری هدایت می کند که شامل لیستی از همه جانوران و اطلاعات آنها به همراه تصویر مرتبط آنها خواهد بود:

 if form.is_valid():
      form.save()
      return HttpResponseRedirect("/success") 

حالا بیایید جلو برویم و دیدگاهی برای ارائه موفقیت ایجاد کنیم page. داخل ما beasts/views.py فایل، درج:

def success(request):
    beasts = Beast.objects.order_by('name')
    return render(request, "success.html", {
        "beasts": beasts
    })

بر روی … ما “موفقیت” page، نام و تصاویر جانوران را در پایگاه داده خود فهرست می کنیم. برای انجام این کار، ما به سادگی آن را جمع آوری می کنیم Beast اشیاء، آنها را به نام خود مرتب کنید و آنها را در رندر کنید success.html قالب:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Fantastic Beasts</title>
</head>
<body>
    {% for beast in beasts %}
       <div>
            {{ beast.name }}
       </div>
       {% if beast.media %}
        <div>
            <img src="{{ beast.media.url }}" width="500" height=auto alt="">
        </div>
       {% endif %}
    {% endfor %}   
</body>
</html>

قبلاً اشاره کردیم که وظیفه پایگاه داده ذخیره فایل ها نیست، وظیفه آن ذخیره سازی است راه ها به آن فایل ها هر نمونه ای از FileField یا ImageField یک ویژگی URL خواهد داشت که به مکان فایل در سیستم فایل اشاره می کند. در یک <img> تگ، ما این ویژگی را به src ویژگی برای نمایش تصاویر برای جانوران ما.

به طور پیش‌فرض، امنیت جنگو به ما کمک می‌کند تا ما را از ارائه فایل‌هایی از پروژه به بیرون باز دارد، که این یک بررسی امنیتی است. هرچند، ما خواستن فایل های موجود در "media" فایل، بنابراین ما باید یک URL رسانه تعریف کنیم و آن را به آن اضافه کنیم urls.py فایل:

در settings.py فایل، بیایید اضافه کنیم MEDIA_URL:

MEDIA_URL = "/beast-media/"

اینجا /name-between/ می‌تواند هر چیزی باشد که شما می‌خواهید، اگرچه باید در گیومه و اسلش پیچیده شود. اکنون، سطح پروژه را تغییر دهید urls.py فایل شامل الف ایستا پوشه ای که خدمت می کند ایستا فایل ها:

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = (
    path('admin/', admin.site.urls),
    path("", include("ency.urls"))
)  + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

این static() تابع را نقشه می کشد MEDIA_URL، به مسیر واقعی محل سکونت فایل های ما، MEDIA_ROOT. درخواست هایی که سعی می کنند به هر یک از فایل های ما دسترسی پیدا کنند می توانند از این طریق دسترسی داشته باشند MEDIA_URL، که به طور خودکار پیشوند (url) ویژگی از FileField و ImageField نمونه ها

اگر تغییرات خود را ذخیره کنیم و به سرور توسعه خود برویم، اکنون می بینیم که همه چیز به آرامی کار می کند.

توجه داشته باشید: این روش فقط در توسعه و تنها در صورتی قابل استفاده است MEDIA_URL محلی است.

اگر فایل‌ها را در HDD خود ذخیره نمی‌کنید، بلکه در یک سرویس متفاوت هستید، راهنمای ما برای ارائه فایل‌های استاتیک در پایتون با جنگو، AWS S3 و WhiteNoise را بخوانید!

نتیجه

در این راهنما روش آپلود فایل ها، ذخیره فایل ها و در نهایت سرویس فایل ها با جنگو را توضیح داده ایم.

ما یک برنامه کوچک ایجاد کرده ایم که برای اهدافی غیر از آموزش، چندان مفید نیست. با این حال، برای شروع آزمایش با آپلود فایل، باید پله ای محکم باشد.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-08 09:30:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید