【问题标题】:Altering filepath after deployment to Heroku to access static files in views.py部署到 Heroku 后更改文件路径以访问 views.py 中的静态文件
【发布时间】:2021-01-03 10:48:17
【问题描述】:

我的应用程序适用于提供 ID CNIC 的学生以获取证书。 views.py 中的函数download 需要

  1. 访问图像(这是一个空白证书)
  2. 通过添加name 和与cnic 关联的毕业date 来修改它
  3. 另存为pdf
  4. 使其可供下载

所有工作都在 localhost 上进行开发,但是当部署到 Heroku 时,图像的文件路径不存在,这是有道理的,因为该应用不再是本地应用 - 任何人都可以访问它。

问题是,我们如何找到访问Certificate_0001.jpg的新路径,它最初存储在certificates\static\certificates

Views.py

def download (request, date, name):
    x = date.split(" ")
    date = f"29 {x[3]} {x[4]}"
    try: 
        image = Image.open("certificates\static\certificates\Certificate_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'certificates\static\certificates\{name}.pdf', "PDF", resolution=100.0)
    except:
        return HttpResponse("pdf did not save")
    try:
        with open(f'certificates\static\certificates\{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()

【问题讨论】:

    标签: django heroku django-models django-views django-urls


    【解决方案1】:

    我找到了解决方案。实际上,一旦将 Django 应用程序部署到 Heroku,所有文件都会放在一个名为 app 的新目录中。您也可以运行heroku run bash 并执行cd app 或通过cd .. 返回一个文件夹然后cd app。然后您可以在app_name/static/app_name/my_file.xyz 中查看您的文件。因此,为了在views.py 中访问您的staticfiles,您必须更改文件路径以使其在生产环境中运行。

    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")
    

    【讨论】:

      猜你喜欢
      • 2014-05-26
      • 2016-04-16
      • 2014-06-08
      • 2012-10-01
      • 2017-07-06
      • 2016-03-11
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多