CSS not loading into Django template. Works when run locally - python

On my local PC I can do "python manage.py runserver" and the site runs perfectly, CSS and all. I just deployed the site to a public server and while most things work, CSS (and the images) are not loading into the templates.
I found some other questions with a similar issue, but my code did not appear to suffer from any of the same problems.
Within the Django project settings the same python function is being used to allow the app to see the templates and the static CSS / image files. The templates are being found by the views and are loading without issue.
Both from settings.py:
STATICFILES_DIRS = (
os.path.join(os.path.dirname(__file__), 'templates/css').replace('\\','/'),
os.path.join(os.path.dirname(__file__), 'content').replace('\\','/'),
)
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__), 'templates').replace('\\','/'),
)
In the base.html file which the rest of the templates all extend:
<head>
{% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{% static "style.css" %}" media="screen">
</head>
Directory structure:
|project_root/
|--manage.py
|--project/
| |--settings.py
| |--__init__.py
| |--content/
| | |--header.jpg
| |--templates/
| | |--base.html
| | |--css/
| | | |--style.css
My first thought when the CSS didn't load is that Django couldn't find the style.css file, but since I am using the same "os.path.dirname(file)" technique as with the templates, I am not sure this is the case.
What do I have wrong here?
Edit:
I neglected to mention that both the PC and server are running Python 2.7.5 and Django 1.5.5.

You never mentioned it in your post, so I am guessing:
You never ran ./manage.py collectstatic
collectstatic finds all static files (css, images, js) and puts them in a directory (Choose this directory with the django setting STATIC_ROOT) Then you point your webserver to that directory

You should deploy the static files using your server and not django.
The official documentation mentiones using collectstatic but unless your static files are messed up it's usually not a requirement. You just need to have some directory containing all your static files. Then you just push it with the server to the same place django will be looking.
Say you're STATIC_URL is '/static/', so you need to add an alias which would map '/static/' to the static directory. For example, using Apache, you should add this line to your http.conf:
Alias /static/ /path/to/mysite.com/static/
That's it! This thing goes true to media files as well, and it'd be wise to remove any serving of static files done by django for the development server (these kinds of urls). Finally, check out the documentation for even more information regarding other types of deployment

Related

Serving static files after deployment with django 2.2

I deployed my site at the level of my host, but the imgaes are not displayed.
I did python manage.py collectstatic and it copied the files to my STATIC_ROOT
myprojet/settings.py
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]
STATIC_URL = '/static/'
STATIC_ROOT='/home/www/mySite.com/static/'
index.html
{% extends 'layout/base.html' %}
{% load staticfiles %}
{% block content %}
<img src="{% static 'images/icone.png' %}" style="width:350px;height:100">
{% endblock content %}
I used {% load staticfiles %} as i am using django 2.2 but the images are not showing
I don't know where the problem is.
You need to configure your web server to serve the static files from the STATIC_ROOT directory. Django does not handle static files by itself in production, it only does so in development with the runserver command. Depending on your web server, you need to add some rules to tell it where to find the static files and how to serve them. For example, if you are using Apache, you can add something like this to your configuration file:
Alias /static/ /home/www/mySite.com/static/
<Directory /home/www/mySite.com/static>
Require all granted
</Directory>
This tells Apache to serve any request that starts with /static/ from the /home/www/mySite.com/static/ directory, and to allow access to it. You may need to restart or reload your web server for the changes to take effect.
Explanation:
Static files are files that do not change dynamically, such as images, CSS, JavaScript, etc. They are usually stored in a separate directory from the rest of the Django project, and they need to be collected and copied to a single location (the STATIC_ROOT) when deploying the project. This makes it easier to manage and optimize them, and to serve them efficiently with a web server.
Django provides some tools and settings to help with static files, such as the static template tag, the STATIC_URL, the STATICFILES_DIRS, and the collectstatic command. However, Django does not serve static files by itself in production, because it is not designed to be a web server and it would be inefficient and insecure to do so. Instead, it delegates the responsibility of serving static files to a web server, such as Apache, Nginx, etc. The web server is faster and more reliable at handling static files, and it can also apply some features such as compression, caching, etc.
To configure your web server to serve static files, you need to tell it where to find them and how to serve them. This depends on the web server you are using, and you may need to consult its documentation for the specific syntax and options. However, the general idea is to create an alias or a location that maps a URL path (such as /static/) to a directory on the file system (such as /home/www/mySite.com/static/). Then, you need to grant access and permissions to that directory, and optionally apply some settings to optimize the performance and security of serving static files.
Examples:
Here are some examples of how to configure different web servers to serve static files from Django:
Apache: https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/modwsgi/#serving-files
Nginx: https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/uwsgi/#serving-files
Gunicorn: https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/gunicorn/#serving-static-files
Heroku: https://devcenter.heroku.com/articles/django-assets'

Django Static Files not loaded in template but they are there

i am new to Django and web developement and am struggling with Static Files. I have seen this or similar questions in here before, but nothing seemed to bring me a solution. The Problem is: I can find the static files in Django, but they are not loaded within the template.
My Folder Structure is as follows (everything in a folder named Django):
media_root_folder
static_root_folder
Project
Project
manage.py
mysite
__init__.py
asgi.py
settings.py
urls.py
wsgi.py
templates
static
admin
Project
style.css
In Settings.py I have the following:
DEBUG = True
STATIC_URL = 'static/'
STATIC_ROOT = os.path.abspath(r'E:\LM\Django\static_root_folder')
STATICFILES_DIRS = [
BASE_DIR / "static"
]
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
'django.contrib.staticfiles' is added as well as Project to INSTALLED_APPS
I also even added this (I found in a Django Forum that this sometimes solves the Problem):
import mimetypes
mimetypes.add_type("text/css",".css", True)
Within urls.py i accordingly added
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Within my tempalte I am using:
{% load static %}
<link rel="stylesheet" type="text/css" href=" {% static 'Project/style.css' %} ">
If I run manage.py findstatic it finds the files and I also can open them directly in the browser. However if I manage.py runserver and load my site (even in incognito mode and after clearing cache and also in multiple browsers) the CSS is not used for the page at all. I only can see the plain html.
If I load the django/admin side the css is loaded and presented clearly.
What am I doing wrong and how can this be fixed?
Do you try to use collectstatic manage command?
$ python manage.py collectstatic
https://docs.djangoproject.com/en/4.0/ref/contrib/staticfiles/
The Problem was, that in every template I was extending the base.html .
When I was loading the CSS in base.html it worked without any problems.

Setup static file in Django from serving site in production mode

I am trying to run my static files from the same serving site in production mode. This is what I did.
In setting.py, I have set,
DEBUG = False
ALLOWED_HOSTS = ['12.10.100.11', 'localhost']
I included, 'django.contrib.staticfiles' in INSTALLED_APPS
I set the Static root directory to,
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static")
I ran,
python manage.py collectstatic
to copy all the static files to a local serving directory.
(following: https://djangobook.com/serving-files-production/)
I then point static url directory to,
STATIC_URL = ("/static/")
I then run,
python manage.py runserver 12.10.100.11:8000
However, on console inspect the error shows:
**Get http://12.10.100.11:8000/static/css/main.css 404 (not found)**
on my base.html looks something like this:
{% load static %}
<link rel="stylesheet" href="{% static '/css/main.css' %}" type="text/css" />
I am new to Django and need lots of advice, thanks
Jef
1)Pip install whitenoise
2)Include the following lines in wsgi.py
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)
You can't serve static files. django with DEBUG mode turned off isn't responsible for that. Ngnix is better option with chache mechanisms for that.
You should check out Heroku platform how they deploy production ready django projects with whitenoise for example. Github has a lot of examples of opensource projects powered with django that you can learn from

Configuring Django static folder for python anywhere

I am new in Django, previously I had a test site in which my static files were placed in static folders. There was a static folder for every app. But now I want to make a site, which will be deployed to python anywhere and so I have to have only one static folder.
This is the project folder: https://github.com/martin-varbanov96/fmi-fall-2016/tree/master/django/click_bait/miranda
You can see that in the settings file I have:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static")
in my target html file I have
<link rel="stylesheet" href="{% static 'home/css/style.css' %}" type="text/css">
which returns 404.
What is wrong how should I arrage my folders so that they are best working for the pythonanywhere host?
If you're getting a 404 error you should ensure debugging mode is on. If I assume it is on (as it is in the settings.py you have on GitHub), then your web server just isn't serving the static files. I would ensure you've run python manage.py collectstatic which will push the static files for the project to the static folder you've defined in settings.py.
I would also ensure that you've configured Python Anywhere to serve these files. According to their website (source: https://help.pythonanywhere.com/pages/DjangoStaticFiles/) you should ensure you have that static folder added so their server knows to serve the files. The steps at that link are as follows:
Go to the Web tab on the PythonAnywhere dashboard
Go to the Static Files section
Enter the same URL as STATIC_URL in the url section (typically, /static/)
Enter the path from STATIC_ROOT into the path section (the full path, including /home/username/etc)

how to point to static folder in django

I am learning django and I already have a bit noobish question. I can not point to my static folder and I tried all the combinations, watched people do it in youtube tutorials etc.
My settings.py looks something like this:
STATIC_ROOT = '/home/peter/brewery/static/'
TEMPLATE_DIRS = '/home/peter/brewery/mysite/templates/'
where brewery/ is the folder containing mysite/ and static/, mysite/ is the folder created by
django-admin.py startproject
where settings.py also lives...
It seems that templates folder is mapped correctly, since the page renders with proper templates, it just cannot access the css in the /static/css/ folder. I show the path in my template for css like this
<link ... href='/static/css/brewery.css' />
I have also tried to make href absolute path on my computer and it does not work.
I am using django 1.3 and am running the server provided by django (python manage.py runserver)
1 - In your settings file, define a static url and static root like this:
STATIC_URL = '/static/'
2 - Set DEBUG = True
3 - Make sure your TEMPLATE_CONTEXT_PROCESSORS variable includes django.core.context_processors.static.
4 - Reference it in your templates like...
<link ... href='{{ STATIC_URL }}css/brewery.css' />
Source: https://docs.djangoproject.com/en/dev/howto/static-files/
In debug mode STATIC_ROOT is not used, but staticfiles_urlpatterns() provides static files from all different apps. Put your static files either into static/ directory in one of your apps or define STATICFILES_DIRS in your settings and put static files for the site there.
STATIC_ROOT is just the location where all static files are collected from all apps and STATICFILES_DIRS when you call:
python manage.py collectstatic
And it is only used in production environment.

Categories