Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django admin failing to login after upgrade to 2.1

After upgrading an old Django 1.8 to 2.1, when I try to login on my admin site, I get a 404 with message:

Using the URLconf defined in <mysite>.urls, Django tried these URL patterns, in this order:
[...]
The current path, login/, didn't match any of these.

Which I guess is true because it should be on __admin/login as in my urls.py I have:

urlpatterns = [
    ...
    path(r'__admin/', admin.site.urls),
    ...
]

But:

  • The GET request /__admin/login returns the login page as expected
  • The problem happens only in production (with passenger WSGI on a VPS), not on localhost
  • Logging in the user manually via manage.py shell and django.contrib.auth.authenticate() works correctly
  • Unfortunately the upgrade happened at the same time as a migration in VPS machine so there may also be a problem with the database.

Python version (on VPS): 3.6.7
Django version (on VPS): 2.1.3 (also tried with 2.1.4)

EDIT 1

I've commented out all other urls, so that now the only URL available is __admin. Now, when I login I get this error:

Using the URLconf defined in mysite.urls, Django tried these URL patterns, in this order:

     1. __admin/

The current path, login/, didn't match any of these.

It looks like django is looking for login/ rather than __admin/login. Is that possible and what could be causing this?

EDIT 2 Added settings file.

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
from django.contrib import messages

PROJ_SHORTNAME = '<removed>'
PROJ_NAME      = '<removed>'

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = <removed>

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []

# Application definition

INSTALLED_APPS = (
    'django.contrib.admin',        
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',
    'bootstrap3',
    'mysite',
    'blog',
    'envelope',         # required for contact page
    'crispy_forms',     # required for contact page
    'honeypot',         # required for contact page
    'braces',           # required for contact page
    'disqus',
    'markdownx',
)

MIDDLEWARE = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    # 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
)

ROOT_URLCONF = '<removed>.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.template.context_processors.media',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'mysite.context_preprocessors.proj_name',
            ],
        },
    },
]

WSGI_APPLICATION = '<removed>.wsgi.application'

# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': PROJ_SHORTNAME,
        'HOST': 'localhost',
        'USER': '<removed>',
        'PASSWORD': '<removed>',
    }
}


# Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/

LANGUAGE_CODE = 'en-gb'
TIME_ZONE = 'Europe/London'
USE_I18N = True
USE_L10N = True
USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.8/howto/static-files/

STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL  = '/media/'

## Markdown 
MARKDOWN_EXTENSIONS = ['extra', 'codehilite']

MESSAGE_TAGS = {
    messages.DEBUG: 'debug',
    messages.INFO: 'info',
    messages.SUCCESS: 'success',
    messages.WARNING: 'warning',
    messages.ERROR: 'danger' # 'error' by default
}

## contact (envelope)
HONEYPOT_FIELD_NAME = 'email2'
CRISPY_TEMPLATE_PACK = 'bootstrap3'
ENVELOPE_USE_HTML_EMAIL = False
ENVELOPE_SUBJECT_INTRO = "[<removed>] "
ENVELOPE_EMAIL_RECIPIENTS = ['<removed>']

## disqus
DISQUS_API_KEY = '<removed>'
DISQUS_WEBSITE_SHORTNAME = '<removed>'

## django sites
SITE_ID = 1

BOOTSTRAP3 = {

    # The URL to the jQuery JavaScript file
    'jquery_url': STATIC_URL+'mysite/js/jquery.min.js',

    # The Bootstrap base URL
    'base_url': STATIC_URL+'mysite/',

    # The complete URL to the Bootstrap CSS file (None means derive it from base_url)
    "css_url": {
        "url": "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css",
        "integrity": "sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u",
        "crossorigin": "anonymous",
    },

    # The complete URL to the Bootstrap CSS file (None means no theme)
    'theme_url': None,

    # The complete URL to the Bootstrap JavaScript file (None means derive it from base_url)
    "javascript_url": {
        "url": "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js",
        "integrity": "sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa",
        "crossorigin": "anonymous",
    },

    # Put JavaScript in the HEAD section of the HTML document (only relevant if you use bootstrap3.html)
    'javascript_in_head': False,

    # Include jQuery with Bootstrap JavaScript (affects django-bootstrap3 template tags)
    'include_jquery': False,

    # Label class to use in horizontal forms
    'horizontal_label_class': 'col-md-3',

    # Field class to use in horizontal forms
    'horizontal_field_class': 'col-md-9',

    # Set HTML required attribute on required fields
    'set_required': True,

    # Set HTML disabled attribute on disabled fields
    'set_disabled': False,

    # Set placeholder attributes to label if no placeholder is provided
    'set_placeholder': True,

    # Class to indicate required (better to set this in your Django form)
    'required_css_class': '',

    # Class to indicate error (better to set this in your Django form)
    'error_css_class': 'has-error',

    # Class to indicate success, meaning the field has valid input (better to set this in your Django form)
    'success_css_class': 'has-success',

    # Renderers (only set these if you have studied the source and understand the inner workings)
    'formset_renderers':{
        'default': 'bootstrap3.renderers.FormsetRenderer',
    },
    'form_renderers': {
        'default': 'bootstrap3.renderers.FormRenderer',
    },
    'field_renderers': {
        'default': 'bootstrap3.renderers.FieldRenderer',
        'inline': 'bootstrap3.renderers.InlineFieldRenderer',
    },
}


try:
    from <removed>.local_settings import *
except ImportError:
    pass

And the local_settings.py:

import os
DEBUG = False

STATIC_ROOT = '/home/<removed>/public_html/<removed>/static/'

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': '<removed>',
        'HOST': 'localhost',
        'USER': '<removed>',
        'PASSWORD': '<removed>',
    }
}

FROM_EMAIL = '<removed>'

BOOTSTRAP3 = {

    # The URL to the jQuery JavaScript file
    'jquery_url': '//code.jquery.com/jquery.min.js',
}

ALLOWED_HOSTS = [
    '<removed>', # Allow domain and subdomains
    '.<removed>.', # Also allow FQDN and subdomains
    '<removed>', # Also allow FQDN and subdomains
]

LOGIN_URL="/__admin/login/"

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': os.path.expanduser('~/logs/django/debug.log'),
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}
like image 605
gozzilli Avatar asked Dec 07 '18 00:12

gozzilli


People also ask

Why my Django admin is not working?

Problems running django-admin django-admin should be on your system path if you installed Django via pip . If it's not in your path, ensure you have your virtual environment activated and you can try running the equivalent command python -m django .

What is the default username and password for Django admin?

Run 'python manage.py migrate' to apply them. Username (leave blank to use 'chatru'): admin Email address: [email protected] Password: Password (again): The password is too similar to the username.

How do I authenticate username and password in Django?

from django. contrib. auth import authenticate user = authenticate(username='john', password='secret') if user is not None: if user. is_active: print "You provided a correct username and password!" else: print "Your account has been disabled!" else: print "Your username and password were incorrect."


2 Answers

TEST

I tried to reproduce your error creating an empty Django 2.1 project and then I modified projects file as you reported:

urls.py

from django.contrib import admin
from django.urls import path
urlpatterns = [path(r'__admin/', admin.site.urls)]

local_settings.py

DEBUG = False
ALLOWED_HOSTS = ['*']
LOGIN_URL = "/__admin/login/"

settings.py

import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = 'secret-key'
DEBUG = True
ALLOWED_HOSTS = []
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',
)
MIDDLEWARE = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
)
ROOT_URLCONF = 'so.urls'
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.template.context_processors.media',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
WSGI_APPLICATION = 'so.wsgi.application'
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/'
SITE_ID = 1
try:
    from so.local_settings import *  # noqa
except ImportError:
    pass

I was not able to reproduce your error and I think your code is ok.

Suggestion

I think the main motivations for your error on the VPS is on the VPS.

Do you have any stale .pyc or .pyo files on your VPS ?

If so, try deleting them and then restarting the VPS.

If you solve your error, in order to prevent this issue in future, you should remove .pyc or .pyo files before starting your VPS.

like image 107
Paolo Melchiorre Avatar answered Oct 18 '22 19:10

Paolo Melchiorre


It appears that this issue has to do with settings.py. I was facing the same issue and made changes to my settings.py

  1. MIDDLEWARE_CLASSES renamed to MIDDLEWARE

  2. commented reference to 'django.contrib.auth.middleware.SessionAuthenticationMiddleware'

and the problem disappeared

like image 30
bir singh Avatar answered Oct 18 '22 20:10

bir singh