it-roy-ru.com

Администратор Django не может войти в систему после обновления до 2.1

После обновления старого Django 1.8 до 2.1, когда я пытаюсь войти на свой сайт администратора, я получаю 404 с сообщением:

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.

Что я думаю, это правда, потому что это должно быть на __admin/login, как в моем urls.py у меня есть:

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

Но:

  • Запрос GET /__admin/login возвращает страницу входа в систему, как и ожидалось
  • Проблема происходит только в производстве (с пассажирским WSGI на VPS), а не на localhost
  • Вход пользователя вручную через manage.py Shell и Django.contrib.auth.authenticate() работает правильно
  • К сожалению, обновление произошло одновременно с миграцией на VPS-машине, поэтому могут возникнуть проблемы с базой данных. 

версия Python (на VPS): 3.6.7
Версия Django (на VPS): 2.1.3 (также пробовал с 2.1.4)

Правка 1

Я закомментировал все остальные urls, так что теперь единственным доступным URL является __admin. Теперь, когда я вхожу, я получаю эту ошибку:

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.

Похоже, Django ищет login/, а не __admin/login. Это возможно и что может быть причиной этого?

РЕДАКТИРОВАТЬ 2 Добавлен файл настроек. 

# 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

И 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,
        },
    },
}
5
gozzilli

ТЕСТОВОЕ ЗАДАНИЕ

Я попытался воспроизвести вашу ошибку, создав пустой проект Django 2.1, а затем изменил файл проектов, как вы сообщили:

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

Я не смог воспроизвести вашу ошибку, и я думаю, что ваш код в порядке.

Предложение

Я думаю, что основные мотивы вашей ошибки на VPS на VPS.

Есть ли на вашем VPS устаревшие файлы .pyc или .pyo?

Если это так, попробуйте удалить их, а затем перезапустите VPS.

Если вы решите свою ошибку, чтобы предотвратить эту проблему в будущем, вы должны удалить файлы .pyc или .pyo перед запуском VPS.

1
Paolo Melchiorre

Попробуйте установить LOGIN_URL в вашем settings.py

LOGIN_URL = '__admin/login'

https://docs.djangoproject.com/en/2.1/ref/settings/#login-url

По умолчанию: '/accounts/login/'

URL-адрес, куда перенаправляются запросы для входа в систему, особенно при использовании декоратора login_required().

0
Nour Chawich

Похоже, что эта проблема связана с settings.py. Я столкнулся с той же проблемой и внес изменения в мои settings.py 

  1. MIDDLEWARE_CLASSES переименован в MIDDLEWARE

  2. прокомментированная ссылка на «Django.contrib.auth.middleware.SessionAuthenticationMiddleware»

и проблема исчезла

0
bir singh