django 内建的用户系统
django带有一个用户认证系统。它可以处理用户账号、组、权限以及给予cookie的用户会话。
用户可以直接使用django自带的用户表。
-
模型类:
- 位置:
from django.contrib.auth.models import User
- 属性有:username,password,email,first_name,last_name,is_superuser(是否是管理员账号),is_staff(是否可以访问admin管理界面,是自己的员工,还是公司的客户),is_active(用于伪删除),last_login(上一次的登录时间),date_joined(用户创建的时间)
- 可以在mysql中看,表名叫auth_user;(应用名叫auth,模型名叫User,按照常规的规则,表名就是应用名_模型类名的全小写
- 位置:
-
基本模型操作:
-
创建用户:
from django.contrib.auth.models import User user = User.objects.create_user(username='',password='',email='',.....) #create_user方法会自动处理密码的加密操作,
-
创建超级用户:
from django.contrib.auth.models import User user = User.objects.create_superuser(username='',password='')
-
删除用户:
from django.contrib.auth.models import User try: user = User.objects.get(username='用户名') user.is_active = False user.save() print("删除普通用户成功") except: print("删除普通用户失败")
-
校验密码:
from django.contrib.auth.models import User user = authenticate(username=username,password=password) #如果用户名和密码校验成功,则返回对应的user对象,否则返回None,
-
修改密码:
from django.contrib.auth.models import User try: user = User.objects.get(username='') user.set_password('') user.save() return HttpResponse('修改密码成功') except: return HttpResponse('修改密码失败')
-
登录状态保持:
from django.contrib.auth import login def login_view(request): #先校验用户名和密码是不是对的。 user = authenticate(username=username,password=password) #只存session,而且时间不可控,如果user存在的话就执行下面这个代码,None的话就执行其他的 if user: login(request,user)
-
登录状态校验:
from django.contrib.auth.decorators import login_required @login_required #哪个视图函数需要校验登陆状态,就放到哪个视图函数上边。如果登录了,就接着往下走,如果没登录,一般就弹到指定的网址,在settings中设置。 def index_view(request); #该视图必须为用户登录状态下才可以访问 #当前登录的用户可以通过request.user获取 login_user = request.user
-
登录状态取消:
from django.contrib.auth import logout def logout_view(request); logout(request)
-
扩展字段:
- 方案一: 自己创建个应用,再创建个表,把自己创建的表和内建的表做一个1对1,一对一映射,让新表的数据和内建的表产生关联。
- 方案二(推荐):继承內建的抽象user模型类(抽象user模型类指的是可以把它的所有字段继承过来)
-
步骤:
- 添加新的应用。
- 定义模型类,继承AbstractUser
- settings.py中指明AUTH_USER_MODEL=‘应用名.类名’
- 注意:此操作要在第一次makemigrations migrate之前进行。确保当前那个auth_user表没有被初始化出来。
-
举例:
- 创建应用(记得注册):
python manage.py startapp user
- 定义模型类:
from django.db import models from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): phone = models.CharField(max_length=11,default='')
- 在settings中配置:
AUTH_USER_MODEL='user.UserInfo'
- 数据库迁移,生成表:
python manage.py makemigrations ; python manage.py migrate
- 添加用户:(在django shell中就挺方便,python manage.py shell启动)
from user.models import UserInfo UserInfo.objects.create(username='',password='',phone='')
- 创建应用(记得注册):
-
-
-
案例:使用django內建的用户系统实现注册、登录、退出等功能
-
铺垫:
- 创建项目:django-admin startproject 项目名;
- 创建数据库:
mysql -uroot -p
进入mysql,使用create database 数据库名 default charset utf8
创建数据库; - 模板文件夹:手动创建templates文件夹,用于存放模板文件,并在settings中配置变量TEMPATES的DIRS:
'DIRS': [os.path.join(BASE_DIR,'templates')],
- 配置数据库:修改settings中的DATABASES:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'd_user', 'USER': 'root', 'PASSWORD': '你数据库的密码', 'HOST': '127.0.0.1', 'PORT': '3306' } }
- 语言和时区的配置:修改settings文件:
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
-
开发:
-
注册功能:
-
路由:先在urls.py文件中引入views:
from . import views
,再创建路由:path('register',views.register_view),
-
视图函数:
def register_view(request): #注册 #分get和post进行处理:点击注册时,是get请求,负责render一个页面,在注册界面提交信息时,是post请求,负责处理数据 if request.method == 'GET': return render(request,'register.html') elif request.method == 'POST': username = request.POST['username'] password_1 = request.POST['password_1'] password_2 = request.POST['password_2'] if password_1 != password_2: return HttpResponse('两次密码输入不一致') #TODO 查询用户名是否已经注册 #务必使用create_user创建用户 user = User.objects.create_user(username=username,password=password_1) #如果需要注册后免登录 # login(request,user) # return HttpResponseRedirect('/index') return HttpResponseRedirect('/login')
-
模板文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册</title> </head> <body> <form action="/register" method="post"> {% csrf_token %} <p> 用户名:<input type="text" name="username"> </p> <p> 密码:<input type="text" name="password_1"> </p> <p> 确认密码:<input type="text" name="password_2"> </p> <p> <input type="submit" value="注册"> </p> </form> </body> </html>
-
-
登录功能:
-
路由:
path('login',views.login_view),
-
视图函数:
def login_view(request): #登录 if request.method == 'GET': return render(request,'login.html') elif request.method == 'POST': username = request.POST['username'] password = request.POST['password'] #校验用户信息 user = authenticate(username=username,password=password) if not user: return HttpResponse('用户名或密码错误') else: #校验成功 #记录会话状态 login(request,user) return HttpResponseRedirect('/Info')
-
模板文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录</title> </head> <body> <form action="/login" method="post"> {% csrf_token %} <p> 用户名: <input type="text" name="username"> </p> <p> 密码: <input type="password" name="password"> </p> <p> <input type="submit" value="登录"> </p> </form> </body> </html>
-
-
退出功能:
- 路由:
path('logout',views.logout_view),
- 视图函数:
def logout_view(request): #退出 logout(request) return HttpResponse('已退出')
- 路由:
-
信息页:
- 路由:
path('Info',views.Info_view)
- 视图函数:
@login_required def Info_view(request): #首页,必须登录才能访问,未登录跳转至settings.LOGIN_URL user =request.user return HttpResponse('欢迎 %s 来到 测试内部验证的首页'%(user.username))
- 路由:
-
首页:因为只是测试内建用户系统的功能,所以首页和信息页设计的就很简单
- 路由:
path('index',views.index_view)
- 视图函数:
def index_view(request): return render(request,'index.html')
- 模板文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>test</title> </head> <body> <p> <a href="/register">注册</a> </p> <p> <a href="/login">登录</a> </p> </body> </html>
- 路由:
-
登录情况下的跳转地址:在settings中添加
LOGIN_URL = '/login'
-
-