Django框架之Admin用户系统复用

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

复用admin用户系统

from django.contrib.auth.models import User

用户字段

class User(AbstractUser):
  	username = models.CharField(
        _('username'),
        max_length=150,
        unique=True,
        help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
    
    
            'unique': _("A user with that username already exists."),
        },
    )
    # 必选。少于等于30个字符。 用户名可以包含字母、数字、_、@、+、.和-字符
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    # 可选。 少于等于30个字符
    last_name = models.CharField(_('last name'), max_length=150, blank=True)
    # 可选。少于30个字符
    email = models.EmailField(_('email address'), blank=True)
    # 可选。邮箱地址
    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_('Designates whether the user can log into this admin site.'),
    )
    # 布尔值。指示用户是否可以访问Admin站点
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )
    # 布尔值。用户的账号是否激活。常使用这个标志为False来代替删除账号
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now
    # 账户创建的时间。当账号创建时,默认设置为当前的datetime                                
    password = models.CharField(_('password'), max_length=128)
    # 必选。 密码的哈希及元数据。(Django不保存原始密码)。原始密码可以无限长而且可以包含任意字符
    last_login = models.DateTimeField(_('last login'), blank=True, null=True)
    # 用户最后一次登录的时间。如果这个用户没有登录过,这个字段将会是null,默认设置为的当前的datetime
    is_superuser = models.BooleanField(
        _('superuser status'),
        default=False,
        help_text=_(
            'Designates that this user has all permissions without '
            'explicitly assigning them.'
        ),
    )
    # 布尔值。指定这个用户拥有所有的权限而不需要给他们分配明确的权限                                   

用户实例方法

  • get_username()

获取到当前的用户的用户名属性

  • is_authenticated()

检查用户是否已通过认证

  • is_anonymous()

检查用户是否未通过认证

  • set_password(password)

设置保存用户的密码,并且会负责密码的哈希加密工作

通常修改密码之后还需要调用save()方法进行数据更新

用户表方法

  • create_user(username, email=None, password=None, **extra_fields)

django的用户创建需要使用User表管理器中的create_user函数进行

该函数可以创建并保存一个用户

  • create_superuser(username, email, password, **extra_fields)

与上一个创建用户函数功能相同,但是会额外设置用户的is_staffis_superuser属性为True

创建一个admin后台超级用户

其他方法

from django.contrib.auth import authenticate
authenticate(username,password)
# 验证是否为合法用户,如果用户存在合法则返回一个user对象

from django.contrib.auth import logout,login
logout(request)
# 清除当前浏览器下用户session
login(request,user)
# 登录并保存当前用户session,参数user必须为使用authenticate验证过后的User对象

用户登录

  • 登陆所需表单类
#forms.py
from django import forms
from django.contrib.auth.models import User
import re
class LoginForm(forms.Form):
	username = forms.CharField(label="用户名",required=True,)
    password = forms.CharField(
        widget=forms.PasswordInput(),
        label='密码',
        required=True,
        )
    def clean_username(self):
        username = self.cleaned_data.get("username").strip()
        try:
            User.objects.get(username=username)
        except User.DoesNotExist:
            raise forms.ValidationError("用户名 %s 不存在" % username)
        else:
                return username
  • 登录所需模板页面
<!DOCTYPE html>
<html>
<head>
	<title>登录</title>
</head>
<body>
	<form action='/login/' method="POST">
		{% csrf_token %}
		{
   
   { errors }}
			{% for field in form %}
				<label>
				{% if field.errors %}
				<ul>
					{% for error in field.errors%}
						<li>{
   
   { error }}</li>
					{% endfor %}
				</ul>
				{% endif %}
				</label>
			<p>{
   
   { field.label }}: {
   
   { field }}</p>
		{% endfor %}
	<input type="submit" value="登录">
</form>
</body>
</html>
  • 登陆主要视图逻辑
#views.py
from django.contrib.auth import authenticate,logout as auth_logout,login as auth_login
def login(request):
	if request.method == 'GET':
		form = userForm()
		return render(request, "login.html",{
    
    'form':form})
	form = userForm(request.POST)
    username = form.data['username']
    password = form.data['password']
    user = authenticate(username=username,password=password)
    # 验证当前账号密码是否匹配合法
    if user and user.is_active:
        auth_login(request, user)
        return redirect('/')
    else:
		return render(request, "login.html",{
    
    'form':form,'errors':'用户名或密码错误'})

在用户登录成功之后,将会重定向到主页,主页展示当前登录用户

登录用户可以直接在request.user属性中获取到,主页的模板内容如下

  • 主页模板
<!DOCTYPE html>
<html>
<head>
	<title>主页</title>
</head>
<body>
	欢迎你: {
   
   { user }}
</body>
</html>

主页视图函数可以通过装饰器@login_required或判断is_authenticated状态来查看用户是否登录

只有登录用户可以访问该站点

当使用装饰器@login_required时,需要在settings下设置LOGIN_URL = '/login/'

将该属性设置为登录路由

  • 首页视图函数
from django.contrib.auth.decorators import login_required
#@login_required
def index(request):
    if request.user.is_authenticated():
        return render(request, "index.html")
    else:
        return redirect('/login/')

注册功能

  • 注册所需表单
#forms.py
class RegisterForm(forms.Form):
    username = forms.CharField(label="用户名",
        max_length=30,
        required=True,
        error_messages={
    
    'max_length':'账号长度最长为30'},
    )
    password = forms.CharField(label="密码",
        min_length=6, max_length=30, 
        widget=forms.PasswordInput(), 
        required=True,
            error_messages={
    
    'min_length':'密码长度最短为6'},
        )
	check_password = forms.CharField(label="重复密码", 
		min_length=6, max_length=30, 
		widget=forms.PasswordInput(), 
		required=True,
		error_messages={
    
    'min_length':'密码长度最短为6'},
	)
	def clean_check_password(self):
		password = self.cleaned_data.get('password')
		check_password = self.cleaned_data.get('check_password')
		if password != check_password and password and check_password:
			raise ValidationError("重复输入密码错误")
	def clean_username(self):
		username = self.cleaned_data.get('username')
		if username[:1] == '_':
			raise forms.ValidationError("用户名不能以下划线打头")
		try:
			User.objects.get(username=username)
		except User.DoesNotExist:
			return username 
		raise forms.ValidationError("用户名已存在")

表单中,将对用户两次输入的密码进行校验并判断是否为空,而且不允许下划线作为用户名的开头字符

  • 注册主要视图函数逻辑
#views.py
def register(request):
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            User.objects.create_user(username=username,password=password)
            user = authenticate(username=username,password=password)
            auth_login(request, user)
            return redirect('/')
    else :
        form = RegisterForm()
    return render(request, "register.html",{
    
    'form':form})

通过表单验证,并获取到对应用户账号密码,创建成功之后,验证并登录,并且重定向到首页

  • 主页模板页面
<!DOCTYPE html>
<html>
<head>
	<title>注册</title>
</head>
<body>
	{% if request.user.is_authenticated %}
	 	<p>您已登录:</p> {
   
   { user }}
	{% else %}
	<form action='/register/' method="POST">
		{% csrf_token %}
		{% for field in form %}
			<label>
			{% if field.errors %}
			<ul>
			{% for error in field.errors%}
				<li>{
   
   { error }}</li>
				{% endfor %}
			</ul>
			{% endif %}
			</label>
			<p>{
   
   { field.label }}: {
   
   { field }}</p>
		{% endfor %}
		<input type="submit" value="注册">
	</form>
	{% endif %}
</body>
</html>

当用户已经登录时,显示当前登录用户,反之则展示表单,以供用户填写

猜你喜欢

转载自blog.csdn.net/HeroicLee/article/details/121406570