版权所有,转载请注明出处:http://guangboo.org/2013/03/27/authentication-using-email-in-django
django自带的验证功能免去了我们的大量工作,它提供了验证、授权相关的接口,我们只有非常少的代码就可以实现,但是django自带的身份验证的方法只能使用用户名来进行验证,如果要想使用email进行验证的话,就需要自己编写一些代码了。
为使得我们能在使用django提供的验证功能时,能够使用email进行身份验证,本文提出一个简单的解决方案,使尽量少的编写代码,同时又能实现上面的功能。本文使用环境django(1.4.2)+python(2.7.3)。
django的身份验证授权等功能在模块django.contrib.auth模块下,该模块下提供了默认的验证表单,修改密码,找回密码等表单,验证,登录接口等。其中views.py下提供了login和logout方法,用户登录和注销,当然还包含其他的如登录跳转,重置密码,修改密码等。这些view方法都有很多的参数,都是为了扩展而添加的,这些方法我们可以直接拿来使用,如果我们不考虑email验证或登录界面的话,就可以使用如下代码:
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^login/$', 'django.contrib.auth.views.login', name = 'login'),
)
只要将上面的三行代码拷贝到urls.py文件中,就可以实现login的功能,只是登录界面是admin的登录界面,并且使用默认的用户名和密码进行验证。如果我们查看django.contrib.auth.views.login方法的源代码的话,就会发现login的方法签名为:
def login(request, template_name='registration/login.html',
redirect_field_name=REDIRECT_FIELD_NAME,
authentication_form=AuthenticationForm,
current_app=None, extra_context=None)
login方法有很多参数,并且都是有默认值的,对我们来说,最常用的就是template_name参数了,我们可以这样修改urls.py文件,实现登录界面的自定义。
urlpatterns = patterns('',
url(r'^login/$', 'django.contrib.auth.views.login', {'template_name':'account/long.html'}, name =
'login'),
)
与前面的代码比较,在url方法中添加了一个参数 {'template_name':'account/long.html'},该参数就会传递给login方法,从而就实现修改登录界面的目的了。也许你会疑惑,为什么login方法中为什么没有身份验证的代码,其实身份验证的功能是实现在form中的,就是默认的身份验证表单AuthenticationForm,我们继续阅读AuthenticationForm表单的源代码:django.contrib.auth.forms.AuthenticationForm,我们会发现身份验证功能的实现,是在方法clean中,代码如下:
def clean(self):
username = self.cleaned_data.get('username')
password = self.cleaned_data.get('password')
if username and password:
self.user_cache = authenticate(username=username,
password=password)
if self.user_cache is None:
raise forms.ValidationError(
self.error_messages['invalid_login'])
elif not self.user_cache.is_active:
raise forms.ValidationError(self.error_messages['inactive'])
self.check_for_test_cookie()
return self.cleaned_data
其中authenticate方法就是我们要找的验证代码,当然到此我们已经找到验证的实现,我们就可以重写一个验证表单,重新实现clean方法就可以实现我们自己的验证方式--使用email验证,然后在
{'template_name':'account/long.html'}参数中添加自定义的验证表单类,如:
urlpatterns = patterns('',
url(r'^login/$', 'django.contrib.auth.views.login',
{'template_name':'account/long.html','authentication_form':CustomAuthForm}, name = 'login'),
)
其中CustomAuthForm是我们自定义的验证表单,我们可以参考django自动的AuthenticationForm的实现编写我们自己的CustomAuthForm类,这里就不在给出实例,这是一种方法。
另一种方法,我们定义一个backend类,如下:
# -*- coding:utf-8 -*-
# backends.py
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
class EmailCheckModelBackend(ModelBackend):
def authenticate(self, username = None, password = None, is_staff = None):
try:
user = User.objects.get(email = username)
if user.check_password(password):
if is_staff is not None:
if user.is_staff == is_staff:
return user
else:
return None
return user
except User.DoesNotExist:
return None
并且在settings.py文件中添加如下代码即可:
AUTHENTICATION_BACKENDS = ('account.backends.EmailCheckModelBackend',)
需要说明的是,authenticate方法签名中的原有参数名称最后不要修改,因为admin的验证方式也会使用该backed,如果你仔细观察AuthenticationForm的clean方法的话,authenticate方法调用是传递了参数名的,如果我们将username参数名该成了email或者其他名称的话,admin就无法登陆了。
分享到:
相关推荐
django-email-as-username, 使用电子邮件地址而不是用户名进行用户身份验证 Django 电子邮件作为用户名使用电子邮件地址而非用户名进行用户身份验证。 作者:汤姆 Christie,@_tomchristie 。: django-email-login...
Django使用电子邮件作为用户名 Django应用程序,用于将电子邮件用作用户身份验证的用户名。特征没有用户名字段的自定义用户模型使用电子邮件作为用户名包含django-admin命令以快速安装对于新的Django项目和用户模型...
登录电子邮件django 使用Django中电子邮件字段的登录身份验证系统
使用用户的任何已验证电子邮件地址进行身份验证 新用户注册 使用经过验证的电子邮件重设密码 兼容性 Python: 3.6或更高版本 Django:版本2.2到3.1 Django REST Framework: 3.10或更高版本 增加功能 该软件包主要...
有很多应用程序可以使用Django 1.5之前的电子邮件地址进行身份验证。 随着Django 1.5的问世,Django核心团队通过设置AUTH_USER_MODEL使得使用任何模型进行身份验证变得非常容易。 不幸的是,如果您想要一个模型与...
app 具有基本用户身份验证的Django项目cd到开发目录mkvirtualenv did_django_user_app mkdir did_django_user_app 将存储库克隆到新目录点安装-r requirements.txt 使用您的电子邮件API信息更新settings.py EMAIL_...
.secrets-包含用于电子邮件/ redis /数据库的密钥/身份验证凭据的文件夹 创建秘密文件(名称应该很容易说明)/环境变量。 .django_secret_key .database_username .database_password .email_password 等等.. ...
使用Django的后端到目前为止的要求特征以Django 3为基础准备在Heroku上部署REST API API密钥(TODO) 用户管理自定义用户模型 完整的用户身份验证和授权工作流程(注册,登录,电子邮件激活,密码重置等) Cookie...
使用电子邮件作为USERNAME_FIELD进行身份验证。 快速开始 使用您最喜欢的Python软件包管理器安装django-custom-user: pip install django-custom-user 将'custom_user'添加到您的INSTALLED_APPS设置中: ...
具有基本用户身份验证的Django项目 cd到开发目录 mkvirtualenv did_django_google_places_api mkdir did_django_google_places_api 将存储库克隆到新目录 点安装-r requirements.txt 使用您的电子邮件API信息...
django中的用户登录和注册系统实现 Django是一个开源... 基于django的登录,注销和注册系统了解如何在geeksforgeeks上进行制作: ://www.geeksforgeeks.org/django-sign-up-and-login-with-confirmation-email-python
drfpasswordless是一种仅使用用户的电子邮件地址或手机号码(此处称为别名)将“无密码”身份验证集成到Django Rest Framework项目中的快速方法。 与DRF自己的TokenAuthentication系统配合使用时,它会向用户发送6...
如果可以对凭据进行身份验证,则为用户创建令牌 请求正文应为带有username和password的JSON对象 POST /api/auth/logout 破坏用户的访问令牌 标头应具有值为Token <user> Authorization GET /api/auth/user 获取...
Django默认提供身份验证系统配置。 用户对象是身份验证系统的核心。今天,我们将实现Django的身份验证系统。 基于django的登录,注销和注册系统 了解如何在geeksforgeeks上进行制作: ://...
API使用注意:某些端点需要身份验证。如何注册用户首先使用以下途径在应用程序中注册自己: POST 随着一些身体像: { " username " : " pablito " , " email " : " mail@mail.com " , " first_name " : " Pablito " ...
帐目Django的自定义电子邮件身份验证详细的文档位于“ docs”目录中。快速开始将“帐户”添加到您的INSTALLED_APPS设置中,如下所示: INSTALLED_APPS = ( ... 'accounts', 'bootstrapform',)将此添加到您的settings...
ckl-rest-auth 固执己见的Django应用,可提供用户身份验证。安装pip install cklauth 添加到您项目的INSTALLED_APPS : rest_framework rest_framework.authtoken corsheaders cklauth 在项目中包括ckl-rest-auth...
验证除了/signin/和/signup/之外,所有端点都需要身份验证才能访问。 注册后,从/signin/端点获取令牌,并将其添加到请求标头中。 Authorization : 'Bearer ' + jwt_token 你已准备好出发。 :thumbs_up_medium-dark_...