未定义的路径显示了尝试通过在Django电子邮件或用户名进行登录时,

问题描述 投票:0回答:1

我想提出一个登录页面和Django通过任何用户名或邮箱登录。我开始一个应用程序的用户,在此应用程序,我已经定制了用户/ model.py

class UserProfile(AbstractUser):
    pass

在我的用户/ views.py,我的代码读取输入名称=“用户名”

from .models import UserProfile
from django.contrib.auth import authenticate
from django.contrib.auth import login as auth_login
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
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 Exception as e:
            return None
def login(request):
    if request.method == "POST":
        user_name = request.POST.get('username', '')
        password = request.POST.get('password', '')
        user = authenticate(username=user_name, password=password)
        if user is not None:
            auth_login(request,user)
            return render(request, 'index.html')
        else:
            return render(request, 'login.html',{})

    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>Username</label>
    <input name="username" id="account_l" type="text" placeholder="username or email" />
</div>
<div class="form-group marb8">
     <label>Password</label>
     <input name="password" id="password_l" type="password" placeholder="Enter your password" />
</div>
<div class="error btns login-form-tips" id="jsLoginTips"></div>
<div class="auto-box marb38">
    <label><input type="checkbox" id="jsAutoLogin"> Auto login</label>
    <a class="fr" href="forgetpwd.html">forget pwd?</a>
</div>
<input class="btn btn-green" id="jsLoginBtn" type="submit" value="login > " />
{% csrf_token %}
</form>

在urls.py

from users.views import login
urlpatterns = [
    url('^login/$',login, name='login'),
]

在settings.py

AUTH_USER_MODEL = 'users.UserProfile'
AUTHENTICATION_BACKENDS = [
"django.contrib.auth.backends.ModelBackend",
'users.views.CustomBackend',
]

其结果是,我可以登录使用的用户名和密码,它打印:

[03/Feb/2019 23:40:06] "POST /login/ HTTP/1.1" 200 37066 # 

但是当我在我的浏览器的电子邮件和密码,没有任何变化登录。在终端,它打印:

Not Found: /user/login/ 
[03/Feb/2019 23:41:30] "POST /user/login/ HTTP/1.1" 404 2213

我不知道这条道路“/用户/登录/”从何而来,它是从一个“/登录/”前不同。

解决:我发现这个问题是我从教程复制代码造成的,还有包括像`$阿贾克斯(网址:{url:“/用户/登录/”,})一login.js。而这发生在我使用电子邮件登录。

python django
1个回答
0
投票

请检查您使用的不是地方...

url(r'user/',  include(users.urls))

并尝试使用{% url ... %}标记为表单action属性。

在另一方面,我想你应该首先尝试把你的CustomBackend名单:

AUTHENTICATION_BACKENDS = [
    'users.views.CustomBackend',
    "django.contrib.auth.backends.ModelBackend"
]

您可以从文档阅读,为了事项:

AUTHENTICATION_BACKENDS事项的顺序,因此,如果同样的用户名和密码在多个后端有效,Django会在第一次正面比赛停止处理。

如果一个后端提出了PermissionDenied例外,认证会立即失效。 Django会不会检查后面的后端。

也许默认后端没有找到用户(你正在寻找通过电子邮件)。

© www.soinside.com 2019 - 2024. All rights reserved.