django1.11 Проблема с пользовательской аутентификацией - возврат неизвестного URL начинается с / user / xxx? - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь использовать пользовательский сервер аутентификации в 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 при входе в систему с помощью то же имя пользователя и пароль пользователя, что и пара для аутентификации.

1 Ответ

0 голосов
/ 23 марта 2019

Не уверен, что здесь может пойти не так, я думаю, один из ваших взглядов защищен декоратором или LoginRequiredMixin , который может быть настроен с user/login route.

Кроме того, вам не хватает того, чтобы добавить CustomBackend к вашему AUTHENTICATION_BACKENDS

AUTHENTICATION_BACKENDS = (
    'your_app.views.CustomBackend',
    'django.contrib.auth.backends.ModelBackend', 
    )

Кроме того, вместо отображения index.html при успешном входе в систему, перенаправьте на домашнюю страницу:

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 redirect(reverse('index'))
        else:
            return render(request, "login.html", {"msg": "name or password erro!"})
    elif request.method == "GET":
        return render(request, "login.html", {})

Кроме того, обновите login_html следующим образом:

<form action="{% url 'login' %}" method="post" id="jsLoginForm" autocomplete="off">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...