问题描述
在 Azure Web 应用程序上获得了我的 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 中确实创建了一个包含我所有静态数据的文件夹,但是当我加载我的模板时,它们没有显示,在 wen 控制台中,我收到 myimage.png 和 myimage2.png 的错误:
Failed to load resource: the server responded with a status of 404 (Not Found)
解决方法
找到了!!
只需将这个:+ static(settings.STATIC_URL,document_root=settings.STATIC_ROOT) 添加到这样的 url 模式中:
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)
它成功了,希望对其他人有帮助!!
,需要注意的几点:
下面的行会改变
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 将搜索的文件夹列表 除了每个应用程序的静态文件夹之外的其他静态文件 已安装。
此设置定义了 staticfiles 应用程序将要使用的其他位置 如果启用了 FileSystemFinder 查找器,则遍历,例如如果你使用 collectstatic 或 findstatic 管理命令或使用静态 文件服务视图。
如果问题仍然存在,请检查服务器中 apache mod_wsgi 配置文件中的静态文件目录是否配置正确。
查看此链接以获取帮助 >> https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/modwsgi/
干杯!!!
,我建议您查看 Whitenoise 以使用 Django 为您的静态文件提供服务。自从集成 Whitenoise 以来,我在为他们服务时没有遇到任何问题。尝试将其替换为您当前的静态文件查找器设置。
http://whitenoise.evans.io/en/stable/django.html
,Django 在生产模式下不提供静态文件。
它提供静态文件的唯一时间是当您将 DEBUG = True 设置为开发模式时,不建议在生产设置中这样做。
Django 建议通过 CND 或任何其他网络服务器提供静态文件。但是,如果您的网站很小并且没有获得大量流量,您可以使用 Django whitenoise 提供您的静态文件,这是您的操作方法。
以下解决方案适用于 python 3.7 和 Django 3.2
第一步:安装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 并运行服务器以验证它是否正常工作。
一些额外的资源可以进一步阅读: