在Django中创建数据库,会自动生成一个user表,表中有很多字段
其中username, password(必填项)password用哈希算法保存到数据库
导入auth模块
from django.contrib import auth
django.contrib.auth中提供了许多方法,这里主要介绍其中的三个:
1.authenticate()
提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数
如果认证信息有效,会返回一个 User 对象。authenticate()会在User 对象上设置一个属性来标识后端已经认证了该用户,
且该信息在后续的登录过程中是需要的。直接从user表中拿数据对比
user = auth.authenticate(username=username, password=pwd)
2.login(HttpRequest, user) 
必须时认证成功的用户才能用,此函数使用django的session框架给某个已认证的用户附加上session id等信息
session不能存放对象,而login将用户这个对象存起来,后续用到用户信息直接调用即可
如 print(request.user.username)
user = auth.authenticate(username=username, password=pwd)
if user:
# 将登录的用户封装到request.user
auth.login(request, user)
3.logout(request) 注销用户
def logout(request):
auth.logout(request) 相当于request.session.flush()
return redirect("/login/")
当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
4.装饰器:login_requierd()
使用@login_required能实现的功能:
1 用户登陆后才能访问某些页面,
2 如果用户没有登录就访问该页面的话直接跳到登录页面
3 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址
from django.contrib.auth.decorators import login_required
@login_required
def index(request):pass
若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' (这个值可以在settings.py文件中通过LOGIN_URL进行修改)
在setting中添加:
# 如果没有登录,默认跳转到那个URL
LOGIN_URL = "/login/"

User对象


User 对象属性:username, password(必填项)password用哈希算法保存到数据库
1.is_authenticated()
如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。
通过认证并不意味着用户拥有任何权限,
在后台用request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name
@login_required
def index(request):
ret = request.user.is_authenticated()
print(ret)
return render(request, "index.html")
2. create_user创建用户
from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')
3.check_password(passwd)校验密码
ret = user_obj.check_password("alex1234")正确返回True,错误为False
4.set_password() 修改密码
user_obj.set_password("alex3714")
user_obj.save()
def register(request):
    from django.contrib.auth.models import User
    # User.objects.create(username="alex", password="alexdsb")  # 密码为明文,不用这个
    创建用户
    user_obj = User.objects.create_user(username="alex5", password="alexdsb")
    # 校验密码是否正确
    ret = user_obj.check_password("alex1234")
    print(ret)
    # 修改密码
    user_obj.set_password("alex3714")
    user_obj.save()
    return HttpResponse("o98k")
手动创建认证
<h1>欢迎来到家目录</h1>
<h3>这是{{ use_obj.username }}的家目录</h3>
<a href="/logout/"><h4>注销</h4></a>
from functools import  wraps
def check_login(func):
    @wraps(func)
    def inner(request,*args,**kwargs):
        rep=request.session.get('is_login')
        if rep:
            return func(request,*args,**kwargs)
        else:
            return render(request,"login.html")
    return inner
def login(request):
    if request.method=='POST':
        name=request.POST.get("username")
        pwd=request.POST.get("passwd")
        print(name,pwd)
        user=models.Userinfo.objects.filter(username=name,passwd=pwd) #得到quersty
        if user:
            request.session['is_login']='1'
            ##也可设置其他项,表中有很多字段,一个个设置比较麻烦,可直接设置id,找到其他的信息
            request.session['user_id']=user[0].id ###user是个列表
            print(request.session.get('user_id'))
            return redirect("/home/")
    return render(request,"login.html")
@check_login
def home(request):
    use_id=request.session.get('user_id')
    use_obj=models.Userinfo.objects.get(id=use_id)
    return render(request,"home.html",{"use_obj":use_obj})
def logout(request):
    request.session.flush()
    return  render(request,"login.html")
Views.py

相关文章:

  • 2022-01-11
  • 2022-12-23
  • 2022-12-23
  • 2018-04-12
  • 2022-02-11
  • 2021-07-20
  • 2021-06-14
猜你喜欢
  • 2021-06-11
  • 2021-08-10
  • 2019-02-16
  • 2021-11-11
  • 2022-02-11
相关资源
相似解决方案