为什么需要进行设置
在开发环境中(debug=True),django的
django.contrib.staticfiles
会自动帮我们进行静态资源的处理,然而在生产环境中(debug=False),就不起作用了,这时候就要进行额外的设置
一,debug=False时:
Tips:在生产环境中一般不会使用Django处理静态文件。
1.修改setting.py:
#设置debug=false
debug=false
...
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
2.收集静态文件
- 这个步骤是必须的,即使你已经将静态资源放在了
STATIC_ROOT
中,这么做的目的是为了收集其它地方例如Admin后台的静态资源
#使用该命令前,需要先配置STATIC_ROOT
$ python manage.py collectstatic
可通过命令:
python manage.py collectstatic --help
查看帮助
3.在urls.py中新增以下内容:
该部分内容就是用来代替django.contrib.staticfiles
的,配置好后,我们还可以直接通过url链接访问static
和media
里面的资源
from django.views.static import serve
from django.conf import settings
urlpatterns = [
path('admin/', admin.site.urls),
...
#新增以下内容:debug=False
re_path(r'^static/(?P<path>.*)/$', serve, {'document_root': settings.STATIC_ROOT}),
re_path(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
]
当debug=Fasle时,如果仍希望静态资源应用程序提供静态资源,Django提供了
insecure
参数来强制处理静态资源,但是这样处理静态资源效率非常低,而且极不安全。因此,仅用于本地开发,不要在生产环境中使用。
$ python manage.py runserver --insecure
二,debug=True时
settings.py部分
debug=True
...
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
#无需配置STATIC_ROOT
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
如果希望通过url直接访问media资源,还可在主路由urls.py进行这样配置,注意这里的配置和debug=False的配置不一样:
...
from django.conf.urls.static import static
from django.conf import settings
...
urlpatterns = [
path('admin/', admin.site.urls),
]
#新增部分 debug=True,static部分不用加,原因是Django会自动帮我们处理
#urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
假设现在static和media文件夹下各有一个名为1.png的文件,我们可以直接通过链接访问(服务器为:127.0.0.1:8000):
http://localhost:8000/static/1.png
http://localhost:8000/media/1.png