我在开发环境中将Windows 10用作操作系统,在生产环境中使用Ubuntu 18.04(AWS)。我最近(15天)部署了我的应用程序,但是现在我看到django不再在开发服务器中运行并且可以在生产服务器中完美运行时在开发服务器中提供媒体和静态文件(两个服务器中均为DEBUG = True)。我在生产服务器上使用带有gunicorn的Nginx服务器。
我已经尝试了StackOverflow中的几乎所有答案来解决此问题,但是它不起作用。
settings.py:
# MEDIA:
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
...
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
STATIC_URL = '/static/'
# STATICFILES_DIRS = ('static', )
#STATICFILES_DIRS = (os.path.join('static'), )
main_project / urls.py:
from django.contrib import admin
from django.urls import path, include
from django.conf import settings # new
from django.conf.urls.static import static # new
urlpatterns = [
path('', include('stock_management.urls', namespace='stock_management')),
path('auth/', include('django.contrib.auth.urls')),
path('admin/', admin.site.urls),
]
# if settings.DEBUG: # new
# urlpatterns += static(settings.STATIC_URL,
# document_root=settings.STATIC_ROOT)
# urlpatterns += static(settings.MEDIA_URL,
# document_root=settings.MEDIA_ROOT)
app / urls.py:
from django.urls import path, include
from .views import *
from django.conf import settings
app_name = 'stock_management'
urlpatterns = [
# Stock:
path('', stock_list, name='homepage'),
path('stock/', stock_list, name='stock_list'),
path('stock/add', stock_create_view, name='add_stock'),
path('stock/<pk>/edit', stock_edit, name='stock_edit'),
# Item:
path('items/', item_list, name='item_list'),
path('item/<pk>/edit', item_edit, name='item_edit'),
path('item/<pk>/delete', item_delete, name='item_delete'),
# API
path('api/items', item_list_API, name='item_list_API'),
# Gallery:
path('items/gallery', item_gallery, name='item_gallery'),
]
# if settings.DEBUG:
# # test mode
# from django.conf.urls.static import static
# urlpatterns += static(settings.STATIC_URL,
# document_root=settings.STATIC_ROOT)
# urlpatterns += static(settings.MEDIA_URL,
# document_root=settings.MEDIA_ROOT)
我想要一个解决方案,以便django也可以将静态文件和媒体文件提供给我的本地主机,并且在我进行任何更改的同时,它不会干扰生产环境。
编辑: 我已经取消注释 urls.py 文件中的settings.DEBUG条件,现在它正在提供媒体文件,而不是本地服务器中的静态文件。
if settings.DEBUG:
# test mode
from django.conf.urls.static import static
urlpatterns += static(settings.STATIC_URL,
document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)
if settings.DEBUG: # new
urlpatterns += static(settings.STATIC_URL,
document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)
答案 0 :(得分:1)
如果要在开发期间提供静态文件:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
此设置是您在设置文件中唯一需要的,我假设您的STATIC_URL
被定义为/static/
,然后注释掉这些行,它将起作用。
我从文档中摘录了这些内容。因此,您也可以为django的production
和development
使用单独的设置文件。因此,其中一个将具有DEBUG=True
,而另一个将被定义False
,我认为这就是发生您的问题的原因。
ps:根据您的BASE_DIR
设置。在settings.py
文件中的开发设置中添加两行
STATIC_ROOT = os.path.join(BASE_DIR, 'static_cdn')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
,对于urls.py,我使用以下行
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
答案 1 :(得分:0)
经过大量的努力,我想我已经找到了答案。 在开发服务器中,以下配置有效:
STATIC_ROOT = ''
STATIC_URL = '/static/'
STATICFILES_DIRS = ('static', )
在生产服务器中,已正确设置 Nginx以提供静态文件 ,以下配置就足够了:
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
STATIC_URL = '/static/'