Having an Error with STATIC_ROOT when using heroku in Django - python

django.core.exceptions.ImproperlyConfigured: You’re using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.
Having this error despite me having set the STATIC_ROOT:
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

Check the static file root. If it's on correct location. For heroku try to put that file on git. I am assuming it's a blank directory so it's not being pushed to git repo. Put .keep kind of file and add/commit and try. Hope it will solve your issue.

Related

trouble with media folder pythonanywhere

pythonanywhere cant find files in me media folder
But I have this file!
roots in my settings.py
STATIC_URL = '/static/'
STATIC_ROOT = '/home/dimabytes/my-first-blog/static'
MEDIA_ROOT = '/home/dimabytes/my-first-blog/media'
MEDIA_URL = '/media/'
me web page at pythonanywhere
The problem was that I automatically displayed the working directory in the folder with my name. It was necessary to finish the path of the project
It's because you have your path configured incorrectly, either when you call for the media or your MEDIA_ROOT and MEDIA_URL, most likely the former. If you look at your pythonanywhere file storage and your error output, it's looking for the file in media/static/<file_here>. Your targeted file is in /media/file/<file_here>.

Django collect the static files fails

While I run python manage.py collectstatic
It says You're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.
This is my settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
]
How can I solve this issue?
You need to add STATIC_ROOT as a parameter to your settings.py.
Here is how it works with those static files:
In STATICFILES_DIRS you tell django where to go and look for static files. This not primarily to serve them, but to collect them! The point is that on a productive server, django is not supposed to server static files, this task should be handled by the web server. Check the docs for details. The idea is that you run the command python manage.py collectstatic and django will go through all the paths in STATICFILES_DIRS, collect the static files and put them... - exactly! - into the STATIC_ROOT folder.
At this point 2 things should become clear:
1. You need to provide STATIC_ROOT in your settings.py.
2. The path provided in STATIC_ROOT cannot be part of STATICFILES_DIRS, as this would mean django would need to put the folder into itself.
Again, this is in the case of a productive server. During development django can handle static files without help of a web server, here is more from the docs on that. Nevertheless, the STATIC_ROOT parameter is always required.
Hope that helped to clarify things. Happy coding! :)
STATICFILES_DIRS tells django where to look for files to collect when using the collectstatic command
STATIC_ROOT="../my_real_static_folder" will tell django to put the static files it collects there and the static_url will get files from there.
... however be warned serving static files through django only works if debug is True (in settings.py) and is strongly discourages in production environments
Set STATIC_ROOT = 'path to ur static root directory' in settings.py.
Note that when you run collectstatic all files from ur static dirs are collected to the static root directory provided in static root path above. U can find more info about this in documentation here

Differences between STATICFILES_DIR, STATIC_ROOT and MEDIA_ROOT

What are the differences of these three static url?
I am not sure if I am right, I am using the MEDIA_ROOT to store my uploaded photos (via models.ImageField())
However, I created a JS script to my admin and in admin.py. I defined the media as below:
....
class Media:
js = ('/admin/custom.js', )
and my settings.py:
....
STATIC_ROOT = "/home/user/project/django1/top/listing/static"
and I added the custom.js to STATIC_ROOT/admin/custom.js, but it is not working. Throwing 404 not found error.
And then I change the STATIC_ROOT to STATICFILES_DIRS, and it works!!
....
STATICFILES_DIRS = "/home/user/project/django1/top/listing/static"
So, I am not understand what is going on here. In fact, I just don't understand what is the difference between STATIC_ROOT and STATICFILES_DIRS.
Currently I am testing Django in my machine via virtualenv, not deployed yet, is it the reason STATIC_ROOT not working??
Development
STATIC_ROOT is useless during development, it's only required for deployment.
While in development, STATIC_ROOT does nothing. You don't even need to set it. Django looks for static files inside each app's directory (myProject/appName/static) and serves them automatically.
This is the magic done by manage.py runserver when DEBUG=True.
Deployment
When your project goes live, things differ. Most likely you will serve dynamic content using Django and static files will be served by Nginx. Why? Because Nginx is incredibly efficient and will reduce the workload off Django.
This is where STATIC_ROOT becomes handy, as Nginx doesn't know anything about your Django project and doesn't know where to find static files.
So you set STATIC_ROOT = '/some/folder/' and tell Nginx to look for static files in /some/folder/. Then you run manage.py collectstatic and Django will copy static files from all the apps you have to /some/folder/.
Extra directories for static files
STATICFILES_DIRS is used to include additional directories for collectstatic to look for. For example, by default, Django doesn't recognize /myProject/static/. So you can include it yourself.
Example
STATIC_URL = '/static/'
if not DEBUG:
STATIC_ROOT = '/home/django/www-data/example.com/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static/'),
]
You can find these settings in the Django documentation. Here are my own definitions and quotations from the documentation:
MEDIA_ROOT is the folder where files uploaded using FileField will go.
Absolute filesystem path to the directory that will hold user-uploaded files.
STATIC_ROOT is the folder where static files will be stored after using manage.py collectstatic
The absolute path to the directory where collectstatic will collect static files for deployment.
If the staticfiles contrib app is enabled (default) the collectstatic management command will collect static files into this directory. See the howto on managing static files for more details about usage.
STATICFILES_DIRS is the list of folders where Django will search for additional static files aside from the static folder of each app installed.
This setting defines the additional locations the staticfiles app will traverse if the FileSystemFinder finder is enabled, e.g. if you use the collectstatic or findstatic management command or use the static file serving view.
In your settings, you should have:
MEDIA_ROOT = os.path.join(BASE_DIR, "media/")
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
# Make a tuple of strings instead of a string
STATICFILES_DIRS = ("/home/user/project/django1/top/listing/static", )
...where:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
as defined in the default Django settings.py now.
Difference between STATICFILES_DIRS and STATIC_ROOT
The STATICFILES_DIRS can contain other directories (not necessarily app directories) with static files and these static files will be collected into your STATIC_ROOT when you run collectstatic. These static files will then be served by your web server and they will be served from your STATIC_ROOT.
If you have files currently in your STATIC_ROOT that you wish to serve then you need to move these to a different directory and put that other directory in STATICFILES_DIRS. Your STATIC_ROOT directory should be empty and all static files should be collected into that directory.
MEDIA_ROOT where media files ,all uploaded files goes.
Example : Images, Files
class Media:
js = ('/admin/custom.js', )
but it is not working. Throwing 404 not found error.
The 404 error is in part because of the leading slash in the file path.

Heroku & Django: "OSError: No such file or directory: '/app/{myappname}/static'"

I have a Django app on Heroku. I am having some problems with static files (they are loading in one Heroku environment but not another), so I tried the debug command recommended here.
$ heroku run python manage.py collectstatic --noinput
Running `python manage.py collectstatic --noinput` attached to terminal... up, run.8771
OSError: [Errno 2] No such file or directory: '/app/{myappname}/static'
Here is my settings.py, which is the same thing Heroku recommends:
import os
import os.path
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = 'staticfiles'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
I get the error whether or not I actually have a directory "static" at the root level in my Git repo (tested it both ways).
Any ideas?
It's looking for a folder named 'static' that's next to the settings.py, i.e. in the project folder, not at the root of the git repo.
git root/
git root/{app name}
git root/{app name}/settings.py
git root/{app name}/static/ <- this is what you're missing
Note that empty folders aren't tracked by git, so you'll have to put a blank file in there if it's empty. Alternatively, remove the STATICFILES_DIRS setting until you need it.
I just had this same problem, and here's the solution that worked for me:
I changed:
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
to:
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'myappfolder/static'),
)
#joerick's answer above is the thing. However, if you do not want to place another 'static' folder (git root/{your app}/static), you might consider changing the BASE_DIR variable that is initially supplied by django-admin makeproject:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
which is just the (git root/) directory

Django - Static pictures not found

Helo all,
I am running a Django application in development mode. I have collected static files into a /static/images/ directory in my project.
In my template I try to link an example image:
<img src="{{ STATIC_URL }}items/no_image.jpeg"/>
{{ STATIC_URL }}items/no_image.jpeg
(The bottom line is printing for debug purposes)
The picture shows with a broken link, and the bottom line prints out the correct directory:
/static/items/no_image.jpeg
Inside my project, I do have the /static/items/no_image.jpeg file.
In my settings.py I have:
STATIC_ROOT = os.path.dirname(__file__)+'/static/'
STATIC_URL = '/static/'
Can anybody help?
Thank you !
Found out the problem. The problem was I was using the wrong directory. STATIC_URL was named /site_media/ when it should be /static/. Changed it and everything now works clear as water...
I think it's slash issue. Try
STATIC_ROOT = os.path.join(os.path.dirname(__file__), 'static')
Maybe you've misunderstood the collecting of static files. There's no need to collect them into a target directory with the collectstatic command during development. That's meant to be done for deployment.
During dev, you only add the django.contrib.staticfiles app, then specify the STATIC_ROOT, STATIC_URL and STATICFILES_DIRS as described here.
Then, in your base urlconf you need to add the url rules for the staticfiles as described here. That's it for "development mode".
In production mode, you run the collectstatic command first, then shove the resulting directory over to the server where your apache (or nginx or whatever) is running, and let him serve that directory unter www.yoururl.com/static/
The whole story about handling staticfiles in django almost drove me nuts ... and even today I have to think for some minutes when trying to remember it or explain it. :-/ Don't worry if it confuses you sometimes.
I think I recently had a similar issue. Try placing your images directly in /static/ instead of /static/items/. If you want to be able to directly link to /static/items/sample.jpg you need to add /static/items/ to your STATIC_ROOT in SETTINGS

Categories