Я пытаюсь использовать пользовательский сервер аутентификации в Django 1.11 для создания функции (вход в систему с помощью электронной почты пользователя, а не обычный вход с именем пользователя. И имя пользователя, и имя пользователя сохраняются в одном объекте пользователя в базе данных. ).
С помощью следующего кода я могу успешно войти в систему с именем пользователя (я ввожу правильное значение имени пользователя в пустом имени пользователя формы HTML) и паролем в виде пары. Но, в свою очередь, пока я использую значение электронной почты из ввода формы HTML, он выдает сообщение об ошибке, как показано ниже в фоновом окне отладки:
ошибка "Не найдено: / user / login /;
"POST / пользователь / логин / HTTP / 1.1" 404 "
Мне очень любопытно, потому что во всех моих urls.py и users.views.py никогда не было «user / login». откуда это взялось?
Перед этим запросом о помощи я смотрю в официальном документе Django (версия 1.11) и других наводящих на размышления комментариях в нашем переполнении стека, но он все еще не имеет правильного ответа на этот вопрос.
Надеюсь, ваши ребята спасут меня и дадут ваши идеи.
Кстати, я также проверяю 1.11 Django Docs, там сказано, что
«
Do not forget to test for the is_active attribute of the user in your own backend permission methods.
Changed in Django 1.10:
In older versions, the ModelBackend allowed inactive users to authenticate.
Так что я когда-либо пытался устранить эту ошибку в соответствии с проверкой is_acitve, но, к сожалению, я пока не могу ее исправить.
- Обновление: в MySQL db я замечаю, что у текущего объекта пользователя есть поля
(is_staff =1; is_active=1)
но я не понимаю, как использовать информацию для решения моей текущей проблемы.
Я запускаю его в Pycharm IDE, Django1.11, py 3.6, mysql5.7 (как БД для сохранения пользовательской таблицы)
- Важное обновление
: изначально мой тестовый браузер был google chrome, после принятия следующего корректирующего предложения Ruddra новый код может успешно решить проблему в браузерах (MS Edge и Firefox), но все еще не в Гугл Хром. Так что теперь я предпочитаю классифицировать эту проблему как "
Пользовательские интерфейсы аутентификации Django 1.11 конфликтуют с браузером Chrome "
в setting.py,
AUTHENTICATION_BACKENDS = (
# 'django.contrib.auth.backends.ModelBackend',
'django.contrib.auth.backends.ModelBackend',
)
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users',
'courses',
'organization',
'operation',
'xadmin',
'crispy_forms',
'DjangoUeditor',
]
AUTH_USER_MODEL = "users.UserProfile"
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.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'django.template.context_processors.media',
],
},
},
]
в urls.py,
from django.conf.urls import url, include
from django.contrib import admin
from django.views.generic import TemplateView
import xadmin
from .settings import MEDIA_ROOT
from django.views.static import serve
from users. views import user_login
urlpatterns = [
url(r'^xadmin/', xadmin.site.urls),
url(r'^media/(?P.*)$', serve, {"document_root": MEDIA_ROOT}),
url('^$', TemplateView.as_view(template_name='index.html'), name='index'),
url('^login/$', user_login, name='login'),
name='upload'),
]
в users.views.py,
from django.shortcuts import render
from django.contrib.auth import authenticate, login
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from .models import UserProfile
class CustomBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
user = UserProfile.objects.get(Q(username=username) | Q(email=username))
if user.check_password(password):
return user
except UserProfile.DoesNotExist as e:
return None
def user_login(request):
if request.method == "POST":
user_name = request.POST.get("username", "")
pass_word = request.POST.get("password", "")
user = authenticate(username=user_name, password=pass_word)
if user is not None:
login(request, user)
return render(request, "index.html")
else:
return render(request, "login.html", {"msg": "name or password erro!"})
elif request.method == "GET":
return render(request, "login.html", {})
в login.html,
[
form action="/login/" method="post" id="jsLoginForm" autocomplete="off">
input type='hidden' name='csrfmiddlewaretoken' value='mymQDzHWl2REXIfPMg2mJaLqDfaS1sD5' />
div class="form-group marb20">
label>your name</label>
input name="username" id="account_l" type="text" placeholder="手机号/邮箱" />
/div>
div class="form-group marb8">
label>your password</label>
input name="password" id="password_l" type="password" placeholder="please input your password" />
/div>
div class="error btns login-form-tips" id="jsLoginTips">{{ msg }}</div>
div class="auto-box marb38">
label><input type="checkbox" id="jsAutoLogin"> instant login </label>
a class="fr" href="forgetpwd.html">forget your password?</a>
/div>
input class="btn btn-green" id="jsLoginBtn" type="submit" value="instant login > " />
{% csrf_token %}
/form>
]
В идеальной ситуации после того, как я введу правильное значение электронной почты пользователя и пароль в форме HTML, также нажав кнопку «Войти», я предполагаю увидеть, что могу войти в index.html при входе в систему с помощью то же имя пользователя и пароль пользователя, что и пара для аутентификации.