Изменение пути к файлу после развертывания в Heroku для доступа к статическим файлам в views.py

#django #heroku #django-models #django-views #django-urls

#django #heroku #django-модели #django-просмотры #django-urls

Вопрос:

Мое приложение предназначено для студентов, которые предоставляют свое удостоверение личности CNIC для получения сертификатов. Функция download в views.py должна

  1. доступ к изображению (которое является пустым сертификатом)
  2. измените его, добавив name и градацию date , связанные с cnic
  3. сохраните его как pdf
  4. сделайте его доступным для скачивания

Все работает в процессе разработки на localhost но при развертывании в Heroku путь к файлу к изображению не существует, что имеет смысл, поскольку приложение больше не является локальным — оно доступно любому.

введите описание изображения здесь

Вопрос в том, как нам найти новый путь к доступу Certificate_0001.jpg , который изначально был сохранен в certificatesstaticcertificates

Views.py

 def download (request, date, name):
    x = date.split(" ")
    date = f"29 {x[3]} {x[4]}"
    try: 
        image = Image.open("certificatesstaticcertificatesCertificate_0001.jpg")
    except:
        return HttpResponse ("image did not load")
    font_type = ImageFont.truetype('arial.ttf', 70)
    font_type_2 = ImageFont.truetype('arial.ttf', 35)
    draw = ImageDraw.Draw(image)
    draw.text(xy=(600, 740), text=name, fill=(0,102,0), font=font_type)
    draw.text (xy=(330, 1230), text=date, fill=(0,102,0), font=font_type_2)
    try:
        image.save(f'certificatesstaticcertificates{name}.pdf', "PDF", resolution=100.0)
    except:
        return HttpResponse("pdf did not save")
    try:
        with open(f'certificatesstaticcertificates{name}.pdf', 'rb') as pdf:
            response = HttpResponse(pdf.read(), content_type='application/pdf')
            response['Content-Disposition'] = f'inline;filename=NFDP-{name}.pdf'
            return response
    except:
        return HttpResponse("pdf did not load")
  

Settings.py

 import os
import django_heroku
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware'
]

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'

django_heroku.settings(locals())
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
  

urls.py

 from django.urls import path

from . import views

app_name = "certificates"
urlpatterns = [
    path("", views.index, name="index"), 
    path("download/<str:name>/<str:date>", views.download, name="download")

]
  

wsgi.py

 import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'nfdp.settings')

application = get_wsgi_application()
  

Ответ №1:

Я нашел решение. На самом деле, как только приложение Django развертывается в Heroku, все файлы помещаются в новый каталог с именем app . Вы также можете запустить heroku run bash и сделать cd app или вернуться к одной папке cd .. и затем cd app . Затем вы можете увидеть свои файлы в app_name/static/app_name/my_file.xyz . Поэтому, чтобы получить доступ к вашему staticfiles in views.py , вы должны изменить путь к файлу, чтобы он запускался в рабочей среде.

 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
##BASE_DIR = /app/ in production (heroku) but your project name in development (locally)
path = os.path.join(BASE_DIR, "certificates/static/certificates/Certificate_0001.jpg")