【问题标题】:Django app on Azure not getting static filesAzure 上的 Django 应用程序没有获取静态文件
【发布时间】:2021-04-02 11:49:30
【问题描述】:

在 Azure webapp 上获得了我的 Django 项目,但是当我在 SSH 终端上调用时:

Python manage.py collectstatic

它说复制了 252 个文件,但我的静态文件在我的模板上不可见,并且 wwwroot 中的静态文件夹是空的...这是我的 wwwroot 结构:

wwwroot
|---Myproject
|---manage.py
|---oryx-manifest.toml
|---hostingstart.html
|---static //With all my static files
├── myapp
│   ├── migrations
│   ├── __pycache__
│   ├── static
|   |   |---Images
|   |   |   |--myimage.png
|   |   |   |--myimage2.png
│   └── templates

这是我的 settings.py:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
   ('myapp', os.path.join(BASE_DIR, 'myapp', 'static')),
)
STATICFILES_FINDERS = (
  'django.contrib.staticfiles.finders.FileSystemFinder',
  'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

知道为什么或我做错了什么吗?Azure 收集的是否不同?

编辑>当我访问我的网站时,我的图像不显示...我在模板上这样称呼它们:

{% load static %}
<img src="{% static 'Images/myimage.png' %}" /><br>

编辑 2 /////

在 wwwroot 中确实创建了一个包含我所有静态信息的文件夹,但是当我加载我的模板时,它们没有显示,在我的控制台中,myimage.png 和 myimage2.png 出现此错误:

Failed to load resource: the server responded with a status of 404 (Not Found)

【问题讨论】:

  • 是不是在根目录(与 myapp/ 相同的目录)找不到名为 staticfiles 的文件夹?不确定这一行“我的静态文件在我的模板上不可见”。能否请您在 wwwroot 中发布文件夹结构?
  • @DorisLv 感谢您的回复,当然,我已经更新了我的问题以添加 wwwroot 文件夹结构,现在它说复制了 252 个文件但静态文件夹仍然是空的,并且我的图像没有显示在我的网站上。
  • @jsanchezs 您如何将应用部署到 Azure?
  • @BhargaviAnnadevara 我使用了 Azure 门户上的部署中心。
  • @jsanchezs 您是否尝试过手动复制它们并检查?还是使用不同的部署方法?

标签: django azure azure-web-app-service django-staticfiles


【解决方案1】:

找到了!!

只需将这个:+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 添加到这样的 url 模式中:

from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
        path('myapp/', include('myapp.urls')),
        path('admin/', admin.site.urls),
    ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

它成功了,希望对其他人有帮助!

【讨论】:

  • 别忘了导入设置:from django.conf import settings
  • 你知道为什么本地不需要,但 Azure 需要吗?
【解决方案2】:

Django 在生产模式下不提供静态文件。

它提供静态文件的唯一时间是当您将 DEBUG = True 设置为开发模式时,不建议在生产设置中这样做。

Django 建议通过 CND 或任何其他网络服务器提供静态文件。但是,如果您的网站很小并且没有获得大量流量,您可以使用 Django whitenoise 提供静态文件,这就是您的做法。

以下解决方案适用于 python 3.7 和 Django 3.2

第 1 步:安装 whitenoise 包

pip install whitenoise

第 2 步:确保您的 BASE_DIR 如下所示

BASE_DIR = Path(__file__).resolve().parent.parent

第 3 步:将这些添加到您的 settings.py。如果您遇到任何错误,请尝试注释掉 STATICFILES_STORAGE 并检查

STATIC_ROOT = BASE_DIR / 'staticfiles'
STATIC_URL = '/static/'
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

第 4 步:WhiteNoise 中间件应直接放在 Django SecurityMiddleware 之后(如果您正在使用它)和所有其他中间件之前

MIDDLEWARE = [
  'django.middleware.security.SecurityMiddleware',
  'whitenoise.middleware.WhiteNoiseMiddleware',
  # ...
]

第 5 步:确保这是您在模板中引用静态文件的方式(还要检查您的模板中是否提到了 {% load static %}

<link rel="stylesheet" type="text/css" href="{% static 'appname/styles.css' %}">

第 6 步:运行 collect static

python manage.py collectstatic

第 7 步:将 DEBUG = False 并运行服务器以验证它是否正常工作。

一些额外的资源可以进一步阅读:

whitenoise
Django on Azure - beyond "hello world"

【讨论】:

    【解决方案3】:

    注意几点:

    下面一行会改变

    STATIC_ROOT = (os.path.join(BASE_DIR, 'Myproject/static_files/'))
    

    STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
    

    您在这里使用指向完全不同的文件夹。因此始终为空您需要 collectstatic 命令将文件复制到 项目 > 静态目录


    删除下面的行 os.path.join(BASE_DIR, 'static/')...

    STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static/'), #Not Required since you already mentioned it in STATIC_URL
    ('myapp', os.path.join(BASE_DIR, 'myapp', 'static')),
    )
    

    原因:

    • STATIC_ROOT 是以后存放静态文件的文件夹 使用 manage.py collectstatic

    collectstatic 将收集的目录的绝对路径 用于部署的静态文件。

    如果启用了 staticfiles contrib 应用程序(默认),则 collectstatic 管理命令会将静态文件收集到此 目录。有关更多详细信息,请参阅管理静态文件的操作指南 关于使用情况。

    • STATICFILES_DIRS 是 Django 将搜索的文件夹列表 除了每个应用程序的静态文件夹之外的其他静态文件 已安装。

    此设置定义了静态文件应用程序将使用的其他位置 如果启用了 FileSystemFinder 查找器,则遍历,例如如果你使用 collectstatic 或 findstatic 管理命令或使用 static 文件服务视图。

    如果问题仍然存在,请检查服务器中 apache mod_wsgi 配置文件中的静态文件目录是否配置正确。

    查看此链接以获得帮助 >> https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/modwsgi/


    干杯!!!

    【讨论】:

    • 感谢您的友好回复。做了你告诉我的但仍然没有得到静态数据,我的意思是,在 wwwroot collectstatics 中确实创建了一个包含所有内容的文件夹,但是当我加载我的页面时它们不显示并且在 Web 控制台中显示:加载资源失败:服务器响应状态为 404(未找到)...
    • 您能否分享您在 Azure 中的 django 应用程序的部署配置?您如何以及在哪里将您的静态文件夹指向您的配置?
    • 太棒了。祝你好运! :)
    • @jsanchezs 这仅在您打开调试模式时有效,并且在您关闭无法用于生产的调试时立即停止工作。它是否在 DEBUG = False 时工作?
    【解决方案4】:

    我建议查看 Whitenoise 以使用 Django 为您的静态文件提供服务。自从集成 Whitenoise 以来,我没有遇到过为他们服务的问题。尝试将其换成您当前的静态文件查找器设置。

    http://whitenoise.evans.io/en/stable/django.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 2015-01-24
      • 2019-07-11
      • 2021-09-09
      • 2011-10-24
      • 2014-02-05
      • 2020-04-08
      相关资源
      最近更新 更多