下面我将详细讲解一下“Django实战之用户认证(用户登录与注销)”的完整攻略,包含两条示例说明。
首先,我们需要在命令行中创建一个新的Django项目,可以通过以下命令实现:
django-admin startproject project_name
其中,project_name
是项目名,可以为任意名字。
接下来,我们进入项目所在的目录,并创建名为 accounts
的应用,可以使用以下命令:
cd project_name
python manage.py startapp accounts
在 accounts/models.py
中创建用户模型:
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
class UserManager(BaseUserManager):
def create_user(self, email, password=None, **kwargs):
if not email:
raise ValueError('Users must have an email address')
user = self.model(email=self.normalize_email(email), **kwargs)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password=None, **kwargs):
kwargs.setdefault('is_staff', True)
kwargs.setdefault('is_superuser', True)
return self.create_user(email, password, **kwargs)
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True)
name = models.CharField(max_length=256)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['name']
objects = UserManager()
def __str__(self):
return self.email
def get_full_name(self):
return self.name
def get_short_name(self):
return self.name
在 project_name/settings.py
中添加如下代码,在支持 email 做用户名登录的同时,使用新创建的用户模型:
AUTH_USER_MODEL = 'accounts.User'
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend', # 默认认证后端
'accounts.backends.EmailBackend', # 自定义认证后端
]
在accounts/backends.py中,我们将编写自己的认证后端来支持通过电子邮件登录用户。示例代码如下:
from django.contrib.auth.backends import ModelBackend
from .models import User
class EmailBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
user = User.objects.get(email=username)
except User.DoesNotExist:
return None
if user.check_password(password):
return user
else:
return None
在 accounts/views.py
中,编写login和logout视图用于实现用户的登录和注销。示例代码如下:
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
def login_view(request):
if request.method == 'POST':
email = request.POST.get('email')
password = request.POST.get('password')
user = authenticate(request=request, username=email, password=password)
if user is not None:
login(request, user)
return redirect('home')
else:
return render(request, 'login.html', {'error': 'Email and password combination is incorrect'})
return render(request, 'login.html')
def logout_view(request):
logout(request)
return redirect('home')
在 accounts/templates/login.html
中,编写登录页面,示例代码如下:
<form action="{% url 'login' %}" method="post">
{% csrf_token %}
<label for="email">Email</label>
<input type="email" name="email" id="email" required>
<label for="password">Password</label>
<input type="password" name="password" id="password" required>
{% if error %}
<p>{{ error }}</p>
{% endif %}
<button type="submit">Login</button>
</form>
在 project_name/urls.py
中,注册 /login/
和 /logout/
URL,示例代码如下:
from django.urls import path
from . import views
urlpatterns = [
path('login/', views.login_view, name='login'),
path('logout/', views.logout_view, name='logout'),
]
至此,我们已经完成了 Django实战之用户认证(用户登录与注销)
的完整攻略,接下来我将给出两个示例:
用户通过邮件进行登录,可以在登录页面输入邮件地址和密码进行登录。
用户可以通过第三方服务,如社交媒体平台或Google OAuth等进行登录,可以采用Python第三方库如oauthlib或social-auth-app-django。
本文链接:http://task.lmcjl.com/news/16030.html