咱们学生管理之登陆实现一文中已经了解了本身写一个登陆逻辑的过程:html
urlpatterns = [
url(r'^login/$', views.login),
url(r'^index/$', views.index),
url(r'^logout/$', views.logout),
]
def login(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
user = models.User.objects.filter(username=username, password=password).first()
if user:
# 登录成功
request.session["is_login"] = "1"
request.session["user_id"] = user.id
# 1. 生成特殊的字符串
# 2. 特殊字符串当成key,在数据库的session表中对应一个session value
# 3. 在响应中向浏览器写了一个Cookie Cookie的值就是 特殊的字符串
return redirect("/index/")
return render(request, "login.html")
有一些内容是须要用户登陆以后才能查看,因此这里就涉及到了登陆限制。刚开始我写登陆的时候经过装饰器来实现:数据库
from functools import wraps
def login_required(f):
@wraps(f)
def inner(request, *args, **kwargs):
if request.session.get("is_login") == "1":
return f(request, *args, **kwargs)
else:
return redirect("/login/")
return inner
@login_required
def index(request):
user_id = request.session.get("user_id")
# 根据id去数据库中查找用户
user_obj = models.User.objects.filter(id=user_id).first()
if user_obj:
return render(request, "index.html", {"user": user_obj})
else:
return render(request, "index.html", {"user": "匿名用户"})
def logout(request):
request.session.flush()
return redirect("/login/")
本身实现登陆流程的话,通常是通过以上4个步骤。可是,Django是一个大而全的框架,它早已经为你写好了登陆模块。django
既然是已经写好的模块,那么咱们就能够开箱即用!flask
使用Django自带的Auth模块,只要直接使用里面写好的方法就行。后端
同上。浏览器
def login(request):
if request.method == "POST":
#获取用户提交数据
username = request.POST.get("username")
pwd = request.POST.get("password")
# 如何判断用户名和密码对不对
user = auth.authenticate(username=username, password=pwd)
if user:
ret = user.is_authenticated()
# 将登陆的用户封装到request.user
auth.login(request, user)
return redirect("/index/")
return render(request, "login.html")
导入装饰器session
from django.contrib.auth.decorators import login_required
使用装饰器app
@login_required
def index(request):
ret = request.user.is_authenticated()
return render(request, "index.html")
注意:须要在setttings中设置参数LOGIN_URL = "/login/",这样若是检测到须要登陆的页面没有登陆,则会直接跳转到:http://localhost:8000/login/?next=/index/框架
def logout(request):
auth.logout(request)
return redirect("/login/")
登出其实就是清理工做。函数
从上能够看出,其实总体流程仍是同样,只是auth模块帮咱们写好了一些逻辑,咱们只要调用其方法便可。
咱们在上面能够看到auth模块有一张已经生成好的用户表,包括username、passwd、email、last_date。。。等等,可是若是咱们但愿本身增长一些定制化的字段,怎么操做呢?
扩展流程:
一、新建一张表,继承AbstractUser
from django.contrib.auth.models import AbstractUser
models中新增字段:
class UserInfo(AbstractUser):
phone = models.CharField(max_length=11)
addr = models.CharField(max_length=128)
至关于对默认的auth_user表作了扩展, 而且代替auth_user
二、生成数据表makemigrations
三、添加变量
在settings.py中必定要加AUTH_USER_MODEL = 'app名.类名'
# 若是使用继承的方式 使用内置的auth模块,要在settings.py里面配置 默认用户认证时使用的是哪张表
AUTH_USER_MODEL = 'app01.UserInfo'
这样,就扩展了auth模块自带的user表。
Django真的很全,使用的时候你就会感受到,能想到的功能,Django基本上都帮你实现了,真棒!
authenticate方法会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登陆过程当中是须要的。
user = authenticate(username='theuser',password='thepassword')
该函数接受一个HttpRequest对象,以及一个通过认证的User对象。
该函数实现一个用户登陆的功能。它本质上会在后端为该用户生成相关session数据。
if user_obj: login(request, user_obj) # 跳转到登陆成功页面 ... else: # 返回错误信息 ...
该函数接受一个HttpRequest对象,无返回值。
当调用该函数时,当前请求的session信息会所有清除。该用户即便没有登陆,使用该函数也不会报错。主要是清理session工做。
request.session.flush()
该方法用来判断用户是否通过了认知
def my_view(request): if not request.user.is_authenticated(): return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
from django.contrib.auth.decorators import login_required @login_required def my_view(request): ...
from django.contrib.auth.models import User user_obj = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)
auth 提供的一个检查密码是否正确的方法,须要提供当前请求用户的密码。
密码正确返回True,不然返回False。
ret = user_obj.check_password('密码')
auth 提供的一个修改密码的方法,接收 要设置的新密码 做为参数。
注意:设置完必定要调用用户对象的save方法!!!
user_obj.set_password('新密码') user_obj.save()
User.objects.create_user(username='用户名',password='密码',email='邮箱',...)