'Django media files not showing with Debug = False on production - Django 1.10
I currently have two kind of files static files and media files.The static files contain my css,js and other static content. The media files contain stuff that the user uploads.The static folder is right next to the media folder.Now on my deployed machine. If I set the DEBUG = False
my static files are presented just fine however my media content is never displayed. I get a 404 not found
error.
My quuestion is how do I display media content in production environment when DEBUG = False. With DEBUG= True everything seems to work fine ? I read the following page and tried these things out.
1-Tried creating a separate folder for static media just like static content.
Currently my static content is being managed by the collectstatic
command. I am using apache on webfaction.I have a static folder called static_content
when I ran ./manage.py collectstatic
all of my content in static folder was copied to the static_content
folder.I tried creating another static folder called static_media
. However when I ran ./manage.py collectstatic
the content of my media
folder got copied to static_content
and not to static_media
like it should have. Can anyone tell me why the collectstatic command did not paste the content to static_media
instead ?
This is what my configuration looks like
ALLOWED_HOSTS = [
"*",
'mywebsite.com',
'www.mywebsite.com.com',
]
STATIC_URL = 'http://mywebsite.com.com/static/'
STATIC_ROOT = '/home/admin/webapps/static_content'
STATICFILES_DIRS = (
'/home/admin/webapps/mainfolder/mainapp/static',
'/home/admin/webapps/mainfolder/mainapp/media',
)
PROJECT_PATH = os.path.join(BASE_DIR, 'static')
MEDIA_URL = 'http://mywebsite.com.com/media/'
MEDIA_ROOT = '/home/admin/webapps/static_media'
This is what my urls.py looks like
admin.autodiscover()
urlpatterns = [
....
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Am I using the correct approach creating a separate folder for managing my media content just like for my static content for when DEBUG=False ? If so then why is collectstatic command dumping all my media content into my static_content
folder instead of static_media
folder ? Also if I use a static folder for managing my media content when a user uploads data where will that be uploaded to media
or static_media
.
Solution 1:[1]
You shouldn't use collectstatic
for your media directory. Remove '/home/admin/webapps/mainfolder/mainapp/media'
from STATICFILES_DIRS
, then set
MEDIA_ROOT = '/home/admin/webapps/mainfolder/mainapp/media'
Once you've done this, the static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
should serve media files when DEBUG = True
.
For DEBUG = False
, you have to configure Apache to serve the media files.
Solution 2:[2]
In your urls.py
file:
add this line
from django.views.static import serve
add those two urls in urlpatterns:
url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),
url(r'^static/(?P<path>.*)$', serve,{'document_root': settings.STATIC_ROOT}),
It worked for me :)
Solution 3:[3]
If you are using Nginx, let it to serve media files
For Example
go to nginx/sites-available & add this
location /media/ { root */home/myprojectdir/myproject*; }
Solution 4:[4]
I have faced the same issue with DEBUG=False
. I solved it by configuring Nginx media location in the server block like this
location /media/ {
root FULL_PATH_TO_APP;
}
FULL_PATH_TO_APP is the full path to the directory where my media
folder exists.
Solution 5:[5]
In Pythonanywhere server Just add Static file url and Directory
URL
/static/
/media/
Directory path
/home/taukir707/myblog/static
/home/taukir707/myblog/media
Solution 6:[6]
This is the best solution. Keep you media folder inside your static folder. And use this code in
Settings.py
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/
if(DEBUG==True):
STATIC_URL = '/static/'
MEDIA_URL = '/static/media/'
STATICFILES_DIRS=[
os.path.join(BASE_DIR,'static')
]
STATIC_ROOT='/home/username/websitedomain/static'
MEDIA_ROOT='/home/username/websitedomain/static/media'
else:
STATIC_URL = '/static/'
MEDIA_URL='static/media/'
STATIC_ROOT=os.path.join(BASE_DIR,'static')
MEDIA_ROOT=os.path.join(BASE_DIR,'static/media/')
Solution 7:[7]
The simple article to serve media files is here you can read it and there are two simple steps only: Article Link
Thanks, Community!
Solution 8:[8]
this helps me a lot
settings.py
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'
INSTALLED_APPS = [
'django.contrib.staticfiles',
'whitenoise.runserver_nostatic',
]
in url.py import URL and give static and media file URL
from django.views.static import serve
from django.conf.urls import url
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Alasdair |
Solution 2 | Axnyff |
Solution 3 | Antu |
Solution 4 | Mahbubur Rahman |
Solution 5 | Mohd Tauovir Khan |
Solution 6 | REVANTH N D |
Solution 7 | Mayur Gupta |
Solution 8 | Usman Maqbool |