用户登陆认证组件——网课内容

组件介绍

简介

功能

用session记录登陆验证状态

前提

用户表——用auth_user表(django建表的时候默认创建的)——也可以自己拓展表

terminal中创建超级用户

python manage.py createsuperuser

然后在表auth_user中可以看到记录

常用的API

auth模块里的

from django.contrib import auth

authenticate

如果验证成功返回user对象,失败返回None
特别注意,这里是从数据库中的固定表auth_user表中查询的
auth_user表中的数据是创建“超级用户的用户名跟密码”!
whw whw12345

#username与password也是auth_user表的字段
user = auth.authenticate(username=user,password=pwd)

login

通过session有一个request.user对象:request.user=user

#request.user为当前登陆对象
auth.login(request, user)

logout

注销

def logout(request):
    auth.logout(request)
    return redirect('/login/')

user对象里的

from django.contrib.auth.models import User

对应的是auth_user表

is_authenticated()

判断用户是否已经登录了   登录了返回True,没登录返回Fasle

create_user方法

user = User.objects.create_user(username=user,password=pwd)

重点总结

用的最多的是 request.user

if not auth.login(request,user):

request.user等于一个匿名用户对象AnnoymousUser() if auth.login(request,user): 表示登陆了,

request.user等于当前登陆对象,且是一个全局变量,可以在任何视图与模板中直接使用!!

————最大的优点是,只要登陆了直接用 request.user就可以了!

+++++++++++++++++++++++++++++++

用户认证装饰器

引入

from django.contrib.auth.decorators import login_required

使用

@login_required  #自动会跳转一个路径
def home(request):
    # if request.user.is_authenticated(): #判断用户是否已经登录了
    return render(request,'home.html')

配置跳转路径

settings配置文件:

LOGIN_URL = '/login/'

具体实例

1、路由

from django.contrib import admin
from django.urls import path,re_path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path('^login/$',views.login),
    re_path('^index/$',views.index),
    re_path('^logout/$',views.logout),
    re_path('^register/$',views.register),
    re_path('^order/$',views.order),
]

2、models.py

————必须注意,用的不是这个app01_auth表,而是django生成的auth_user表!!!
from django.db import models
    
class Auth(models.Model):
    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)

3、视图views.py

##注意引入的东西
from django.shortcuts import render,HttpResponse,redirect
from django.contrib import auth
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required

def login(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        ##如果验证成功返回user对象,失败返回None
        ###特别注意,这里是从数据库中的固定表auth_user表中查询的
        ###auth_user表中的数据是创建“超级用户的用户名跟密码”!
        ###whw  whw12345
        ###username与password也是auth_user表的字段
        user = auth.authenticate(username=user,password=pwd)
        if user:
            ##通过session有一个request.user对象:request.user=user
            ##request.user为当前登陆对象
            auth.login(request, user)
            ##用“装饰器”实现的时候,这里不写死,。根据“之前想要访问的网站”返回响应的页面
            # next_url = request.GET.get('next')
            # return redirect(next_url)
            ##但是不用装饰器实现的话还是写死!否则会报错
            return redirect('/index/')
    return render(request,'login.html')

##index
def index(request):
    #
    print('request.user:',request.user)  #request.user: whw
    print('request.user.username:',request.user.username)#固定的  request.user.username: whw
    print('request.user.id:',request.user.id)#固定的  request.user.id: 2
    ##是否是匿名的  request.user.is_anonymous: False;True表示没有登陆过;False表示登陆认证成功
    print('request.user.is_anonymous:',request.user.is_anonymous)
    ##登陆验证过的话:
    '''
    也可以:
    if request.user.is_authenticated():
          return render(request, 'index.html',locals()) 
    '''
    if request.user:
        return render(request, 'index.html',locals())
    ##没有验证成功跳转到登录界面
    else:
        return redirect('/login/')

##order——利用装饰器实现
@login_required
def order(request):
    # if not request.user.is_authenticated:
    #     return redirect('/login/')
    ##认证成功才返回order.html页面
    return render(request,'order.html')

##注销
def logout(request):
    auth.logout(request)
    return redirect('/login/')

##注册
def register(request):
    ##往auth_user表添加记录
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        ##create_user方法!
        user = User.objects.create_user(username=user,password=pwd)
        #注册成功跳转到登录页面
        return redirect('/login/')

    return render(request,'register.html')

4、login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
<h3>登陆</h3>
<form action="" method="post">
    {% csrf_token %}
    用户名: <input type="text" name="user">
    密码: <input type="text" name="pwd">
    <input type="submit" value="提交">
</form>
</body>
</html>

5、index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>  {# 注意这里用request取值 #}
<p>Hello!{{ request.user.username }}</p>
<p><a href="/logout/">注销</a></p>
</body>
</html>

6、order.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Order</title>
</head>
<body>
Order!
</body>
</html>

7、register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
</head>
<body>
<h3>注册</h3>
<form action="" method="post">
    {% csrf_token %}
    用户名: <input type="text" name="user">
    密码: <input type="text" name="pwd">
    <input type="submit" value="注册">
</form>
</body>
</html>

all

 

posted on 2019-06-07 14:42  江湖乄夜雨  阅读(123)  评论(0编辑  收藏  举报