下面是“Django实现单用户登录的方法示例”的完整攻略:
简述
简单单一用户系统是网络应用程序中的常见需求。为了降低开发成本和提高开发效率,一般采用现成的框架和工具进行开发。Django是一款开发Web应用程序的高级Python框架,提供了一系列功能齐备的组件,支持单一用户系统的快速开发。本文将介绍Django实现单用户登录的方法示例。
示例一:基于Django内置的User模型
Django内置了user模型,用于实现用户验证、权限管理等相关功能,可以方便地实现单一用户系统。下面是具体步骤:
- 在settings.py文件中添加以下代码:
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
)
这个是用内置的User模型实现的验证方法,如果在settings中没有这个配置,DJango会默认使用auth-core,与内置的User模型没有关系。
- 在urls.py文件中添加以下代码:
```
from django.contrib.auth.views import LoginView,LogoutView,PasswordResetView,PasswordChangeView
# import login_view to use google login
from account.views import change_password, profile
urlpatterns = [
path('login/', LoginView.as_view(template_name='account/login.html'), name='login'),
path('logout/', LogoutView.as_view(next_page='/'), name='logout'),
path('profile/', profile, name='profile'),
path('password-reset/', PasswordResetView.as_view(template_name='account/password_reset.html'),
'password_reset_done/', name='password_reset_done'),
path('password-change/', change_password, name='password_change'),
path('admin/password_change/', PasswordChangeView.as_view(), name='password_change'),
]
```
这里我们添加了一些关于用户登录等的路由,其中LoginView.as_view(template_name='account/login.html')就用于实现默认的登录页面(前提是已经创建好了页面)
- 创建一个登录表单。在Django中,可以使用内置的表单组件实现登录表单。首先,在forms.py文件中定义表单组件:
```
from django import forms
from django.contrib.auth.forms import AuthenticationForm
class UserLoginForm(AuthenticationForm):
username=forms.CharField(widget=forms.TextInput(attrs={'placeholder':'Username'}))
password=forms.CharField(widget=forms.PasswordInput(attrs={'placeholder':'Password'}))
```
这里我们使用了AuthenticationForm表单组件,并对其进行了定制化(更改了展示方式)。
- 创建登录页面。在templates目录下创建account/login.html文件,添加以下代码:
```
{% extends 'base.html' %}
{% block body %}
Login
{% endblock %}
```
这里我们使用了base.html作为登录页面的基础模板,通过{{ form.as_p }}添加登录表单。
- 在视图函数中添加用户验证逻辑。在views.py文件中添加以下代码:
```
from django.contrib.auth.views import LoginView, LogoutView
from django.shortcuts import render, redirect
from django.contrib import messages
from account.forms import UserLoginForm
def login(request):
if request.method=='POST':
form=UserLoginForm(request.POST)
if form.is_valid():
username=request.POST['username']
password=request.POST['password']
user=authenticate(username=username, password=password)
if user is not None:
#如果用户验证通过,将用户对象添加到session中,表示用户已登录
login(request, user)
return redirect('home')
else:
messages.error(request,'用户名或密码错误')
else:
form=UserLoginForm()
return render(request,'account/login.html',{'form':form})
```
这里我们使用了authenticate方法进行用户验证,如果验证成功,调用login方法将用户添加到session中,表示用户已登录。
示例二:基于自定义User模型
如果需要实现更加个性化、灵活的用户系统,则可以自定义User模型。下面是具体步骤:
- 在models.py文件中定义自定义的User模型。首先,导入Django自带的BaseUserManager和AbstractBaseUser模块:
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
然后,编写UserManager和User两个模型:
```
class UserManager(BaseUserManager):
def create_user(self,email,password=None,extra_fields):
if not email:
raise ValueError('Email must be provided')
user=self.model(email=self.normalize_email(email),extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self,email,password,**extra_fields):
extra_fields.setdefault('is_staff',True)
extra_fields.setdefault('is_superuser',True)
return self.create_user(email,password=password,**extra_fields)
class User(AbstractBaseUser,PermissionsMixin):
email=models.EmailField(unique=True)
name=models.CharField(max_length=50,null=True)
is_active=models.BooleanField(default=True)
is_staff=models.BooleanField(default=False)
date_joined=models.DateTimeField(auto_now_add=True)
USERNAME_FIELD='email'
EMAIL_FIELD='email'
objects=UserManager()
def __str__(self):
return self.email
```
- 配置settings.py文件,将新的User模型设为Django认证系统默认的用户模型。
AUTH_USER_MODEL='account.User'
- 创建一个注册表单。在forms.py文件中定义表单组件:
```
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import get_user_model
User=get_user_model()
class UserRegistrationForm(UserCreationForm):
email=forms.EmailField(required=True,widget=forms.TextInput(attrs={'placeholder':'Email'}))
password1=forms.CharField(required=True, widget=forms.PasswordInput(attrs={'placeholder':'Password'}))
password2=forms.CharField(required=True, widget=forms.PasswordInput(attrs={'placeholder':'Confirm Password'}))
class Meta:
model=User
fields=('email', 'password1', 'password2')
```
- 创建注册页面。在templates目录下创建account/register.html文件,添加以下代码:
```
{% extends 'base.html' %}
{% block body %}
Register
{% endblock %}
```
- 在视图函数中添加用户信息保存逻辑。在views.py文件中添加以下代码:
```
from django.shortcuts import render, redirect
from django.contrib.auth import login, authenticate
from django.contrib.auth.forms import AuthenticationForm
from account.forms import UserRegistrationForm
def register(request):
if request.method=='POST':
form=UserRegistrationForm(request.POST)
if form.is_valid():
user=form.save()
email=form.cleaned_data.get('email')
password=form.cleaned_data.get('password1')
user=authenticate(request, email=email, password=password)
login(request,user)
return redirect('home')
else:
form=UserRegistrationForm()
return render(request,'account/register.html',{'form':form})
```
这里我们使用了自定义的User模型,用户注册成功后,将用户信息保存到数据库中,使用了authenticate方法进行用户验证,并调用login方法将用户添加到session中,表示用户已登录。
到此,我们完成了基于Django实现单一用户系统的方法示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django实现单用户登录的方法示例 - Python技术站