为什么';t Django在设置中dubug=False时提供静态文件?
当我尝试运行项目时,静态文件丢失,settings.debug设置为False。实际上在Django中,当您在开发服务器上运行项目时,在将调试设置更改为False后尝试提供静态文件时,它不会提供静态文件。它将在生产或分段服务器上正常工作,但在本地主机服务器上不能正常工作。 不过,通过在不安全模式下运行开发服务器,您仍然可以实现这一点 试试这个为什么';t Django在设置中dubug=False时提供静态文件?,django,Django,当我尝试运行项目时,静态文件丢失,settings.debug设置为False。实际上在Django中,当您在开发服务器上运行项目时,在将调试设置更改为False后尝试提供静态文件时,它不会提供静态文件。它将在生产或分段服务器上正常工作,但在本地主机服务器上不能正常工作。 不过,通过在不安全模式下运行开发服务器,您仍然可以实现这一点 试试这个 python manage.py runserver --insecure 实际上,在Django中,当您在开发服务器上运行项目时,当您将调试设置更改为
python manage.py runserver --insecure
实际上,在Django中,当您在开发服务器上运行项目时,当您将调试设置更改为False后尝试提供静态文件时,它不会提供静态文件。它将在生产或分段服务器上正常工作,但在本地主机服务器上不能正常工作。 不过,通过在不安全模式下运行开发服务器,您仍然可以实现这一点 试试这个
python manage.py runserver --insecure
Django不在生产环境中提供静态文件(当
DEBUG=False
时),因为这样做是用他们自己的话(如文档部分所述):
这种方法效率极低,可能不安全,因此
它不适合生产
人们可能会说,为什么这是低效的?静态文件通常比普通的HTML文件大,加上一个网站肯定会有大量的静态文件。如果Django在生产环境中提供静态内容,那么服务器的大部分时间将浪费在提供这些静态文件上。另外,为了同时服务多个请求,我们同时运行多个Django进程,如果有多个静态文件请求,这将导致进程浪费时间服务它们,如果没有空闲进程,则会导致其他请求等待
另外,正如他们在评论中提到的,Django不能很好地处理压缩(人们可能希望压缩他们的静态文件,这样服务器和客户端都需要较少的带宽)。此外,Django应该更多地关注其设计的任务,即呈现用户请求的页面(一个CPU限制的任务),而提供静态文件主要只是一个输入/输出(I/O)任务,Django将时间花在这些任务上(即使在效率不高的情况下)显然是一种浪费
像NGINX或Apache这样的服务器可以更有效地服务静态文件,因此最好在生产中使用它们,而不是让Django来做。有关如何为生产配置静态文件的详细信息,请参见Django不在生产中提供静态文件(当
DEBUG=False
时),因为这样做是用他们自己的话(如文档部分所述):
这种方法效率极低,可能不安全,因此
它不适合生产
人们可能会说,为什么这是低效的?静态文件通常比普通的HTML文件大,加上一个网站肯定会有大量的静态文件。如果Django在生产环境中提供静态内容,那么服务器的大部分时间将浪费在提供这些静态文件上。另外,为了同时服务多个请求,我们同时运行多个Django进程,如果有多个静态文件请求,这将导致进程浪费时间服务它们,如果没有空闲进程,则会导致其他请求等待
另外,正如他们在评论中提到的,Django不能很好地处理压缩(人们可能希望压缩他们的静态文件,这样服务器和客户端都需要较少的带宽)。此外,Django应该更多地关注其设计的任务,即呈现用户请求的页面(一个CPU限制的任务),而提供静态文件主要只是一个输入/输出(I/O)任务,Django将时间花在这些任务上(即使在效率不高的情况下)显然是一种浪费
像NGINX或Apache这样的服务器可以更有效地服务静态文件,因此最好在生产中使用它们,而不是让Django来做。有关如何为生产配置静态文件的详细信息,请参见,不建议这样做,但如果您刚刚开始并想了解更多有关情况的信息,则还可以直接链接: URL.py:
from django.conf.urls.static import static
from django.contrib import admin
from djangoapp import settings
from webtools.views import *
from django.urls import path, include
"""
direct link on the server in production
"""
from django.views.static import serve as mediaserve
from django.conf.urls import url
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('webtools.urls')),
]
if settings.DEBUG:
import debug_toolbar
urlpatterns = [
path('__debug__/', include(debug_toolbar.urls)),
] + urlpatterns
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
else:
# direct link on server in production
urlpatterns += [
url(f'^{settings.MEDIA_URL.lstrip("/")}(?P<path>.*)$', mediaserve, {'document_root': settings.MEDIA_ROOT}),
url(f'^{settings.STATIC_URL.lstrip("/")}(?P<path>.*)$', mediaserve, {'document_root': settings.STATIC_ROOT}),
]
不建议这样做,但如果您刚刚开始,并且想了解更多正在发生的事情,那么您也可以直接链接: URL.py:
from django.conf.urls.static import static
from django.contrib import admin
from djangoapp import settings
from webtools.views import *
from django.urls import path, include
"""
direct link on the server in production
"""
from django.views.static import serve as mediaserve
from django.conf.urls import url
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('webtools.urls')),
]
if settings.DEBUG:
import debug_toolbar
urlpatterns = [
path('__debug__/', include(debug_toolbar.urls)),
] + urlpatterns
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
else:
# direct link on server in production
urlpatterns += [
url(f'^{settings.MEDIA_URL.lstrip("/")}(?P<path>.*)$', mediaserve, {'document_root': settings.MEDIA_ROOT}),
url(f'^{settings.STATIC_URL.lstrip("/")}(?P<path>.*)$', mediaserve, {'document_root': settings.STATIC_ROOT}),
]
我还要补充一点,django不能很好地处理压缩,这会将cpu绑定的工作负载(页面呈现…)与I/o绑定的工作负载(服务静态内容)混合在一起,所以这不是一个好主意……我还要补充一点,django不能很好地处理压缩,这会将cpu绑定的工作负载(页面呈现…)与I/o绑定的工作负载混合在一起(提供静态的东西)所以不是个好主意。。。