#django #heroku #django-models #django-views #django-urls
#django #heroku #django-модели #django-просмотры #django-urls
Вопрос:
Мое приложение предназначено для студентов, которые предоставляют свое удостоверение личности CNIC
для получения сертификатов. Функция download
в views.py
должна
- доступ к изображению (которое является пустым сертификатом)
- измените его, добавив
name
и градациюdate
, связанные сcnic
- сохраните его как pdf
- сделайте его доступным для скачивания
Все работает в процессе разработки на 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")