我正在开发一个多应用网站。我有一堆菜鸟问题。 我的目录结构如下所示:
/var/www/html/portal
src/
manage.py
portal/
static/
admin/
css/
img/
js/
fonts/
templates/
base.html
homepage.html
venv/
我的STATIC
文件设置是否正确?
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
或者应该是
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(PROJECT_DIR, 'static')
collectstatic
还是我可以在复制这些目录中的文件之前进行此操作?collectstatic
,我会得到一个例外
django.core.exceptions.ImproperlyConfigured: You're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.
但是当我用以下内容替换STATICFILES_DIRS时,我的.css文件停止服务。我做错了什么?
STATIC_ROOT = os.path.join(PROJECT_DIR, 'static')
答案 0 :(得分:3)
当您运行开发服务器并且staticfiles
设置为DEBUG
时,您无需运行True
。
然后可以通过网络流程(Docs)直接提供静态和媒体文件,并将这些行添加到您的主urls.py
:
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
对于整个STATIC_URL
,STATIC_ROOT
,MEDIA_URL
和MEDIA_ROOT
,它们都与您在生产中如何为您的应用提供服务相关网络服务器。
通常情况下,网络服务器(即Nginx)处理服务文件,而不是Django应用程序。但是Django应用程序需要知道它们在哪里。所以:
您的Django应用设置和网络服务器配置中的 STATIC_URL
和MEDIA_URL
必须相同,例如使用Nginx:
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
...
location /static {
alias /home/myusername/myproject/static/;
}
location /media {
alias /home/myusername/myproject/media/;
}
STATIC_ROOT
MEDIA_ROOT
100%关于您希望如何在服务器上构建项目。假设上述情况,您需要确定如何将其指向/home/myusername/myproject/static/
。
我的设置示例:
BASE_DIR = Path(__file__).parent.parent.parent
MEDIA_URL = '/media/'
MEDIA_ROOT = str(BASE_DIR.joinpath('media'))
STATIC_URL = '/static/'
STATIC_ROOT = str(BASE_DIR.joinpath('staticfiles'))
媒体文件将直接上传到MEDIA_ROOT
,但请注意,您需要以某种方式从应用程序中获取静态文件(可能位于多个文件夹中,您使用的库可能会有一些额外的静态文件文件,Django Admin等等)到Nginx指向的文件夹(应该与STATIC_ROOT
相同)。这就是collectstaticfiles
的来源,并将所有静态文件复制到该目录。
答案 1 :(得分:2)
关于目录结构,对如何设置存在意见分歧。快速谷歌搜索可以提出一些关于Django项目结构的网站和讨论。我建议您阅读一些信息,以确定最适合您和您项目的信息。
Django文档也有一个最佳实践页面,这是一个很好的资源/提醒。 Django Best Practices.
我主要遵循Django目录结构的两个Scoops。两个Scoops帮助我理解了这一点。我自己的扭曲看起来像这样。
src/
app/
templates/
app_name/
base.html
other_pages.html
tests/
tests.py
app_files.py
static/
images/
css/
etc..
templates/
global_includes/
include_file.html
base.html
collectstatic不应影响开发期间静态文件的提供。根据我的经验,当您从单独的服务器或aws,heroku等部署服务静态文件时,collectstatic更适合。更多信息可以在文档中找到:Managing Static Files,{{3 },staticfiles app
我了解到,如果我的CSS文件没有服务,它通常与我的路径有关。 Chrome开发者工具检查元素/控制台可以帮助我解决任何路径错误。
你有没有添加
+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
到你的主urlpattern / urls.py?
以下是有关在开发期间提供文件的更多信息:Deploying static files
最后检查您的BASE_DIR是否遵循项目的正确路径。您可能需要更改它。
我希望这会有所帮助。
答案 2 :(得分:2)
请记住,如果您将DEBUG设置为“False”,它将忽略staticfiles设置,因为预计您的网络服务器将直接提供此服务。这让我抓了几次,直到我意识到我没有更新staticfiles文件夹(由于我现在不记得的原因,我将其保存在一个单独的存储库中)。
答案 3 :(得分:0)
这似乎在当前的django(2.2)中有效:
from django.conf.urls.static import serve
urlpatterns += [
path(settings.STATIC_URL[1:], serve, {'document_root': settings.STATIC_ROOT })
]