To add 3rd-party module to Django

For example, use pip install django-disqus install the disqus app first.

Then, edit the settings.py of the project:

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.admindocs',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # to add site modules, must add the following line first
    # and set SITE_ID=1
    'django.contrib.sites',
    #'disqus',

    # all my apps
    'myapp',
    'books',
]
SITE_ID = 1

Problems

I used python manage.py collectstatic to collect all static files to the STATIC_ROOT that I have set. But it always shows 404 for the static files.

The Django is install inside a docker container together with uWSGI and Nginx.

Solutions

1. Check the settings

In my settings.py:

INSTALLED_APPS = [
    ...
    'django.contrib.staticfiles',
    ...
]

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

There is no problems with the settings

2. Check the Nginx

In the site configuration file under this path /etc/nginx/sites-enabled in the container:

upstream django {
    server unix:/opt/django/app.sock;
    }

server {
    listen 80 default_server;
    charset utf-8;
    client_max_body_size 75M;

    location /media  {
        alias /opt/django/persistent/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /opt/django/volatile/static; # your Django project's static files - amend as required
    }

    location / {
        uwsgi_pass django;
        include /opt/django/uwsgi_params; # the uwsgi_params file you installed
    }
}

Here I found that the mappings are different from my settings. So just need to either change the mapping in the Nginx, or change the STATIC_ROOT in the settings.

In order to not messing up my webfiles, I chose to change the mapping in the Nginx.

It is quite necessary to read the Dockerfile before using their image.