1. 程式人生 > >第72篇 Django auth模組完成使用者登入認證

第72篇 Django auth模組完成使用者登入認證

views

from django.shortcuts import render,redirect,HttpResponse
from django.contrib import auth
from app01.models import UserInfo
from django.contrib.auth.decorators import login_required

# Create your views here.


# 登入
def login(request):
    # 使用者輸入使用者名稱,密碼之後點選提交,收到POST請求
    if request.method=='POST':
        username= request.POST.get('username')
        password= request.POST.get('password')
        # 呼叫auth.authenticate方法 傳入使用者名稱密碼去驗證 拿到一個驗證之後的結果
        auth_obj = auth.authenticate(username=username,password=password)
        # 如果驗證通過
        if auth:          
            # 如果登入成功,把使用者的id儲存在session中
            auth.login(request,auth_obj)
            return redirect('/index/')
        # 如果驗證不成功,繼續返回登入頁面,並返回前端提示資訊
        else:
            return render(request,'logon.html',{'error_msg':'使用者名稱或密碼錯誤!!!'})
    # 使用者GET請求
    return render(request,'login.html')

# 首頁
@login_required
def index(request):
    return render(request,'index.html')

# 登出
def logout(request):
    # 清除使用者的登入session資訊 並跳轉回登入頁面
    auth.logout(request)
    return redirect('/login/')


# 註冊
def reg(request):
    if request.method =='POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        
        # 假設資料有效性經過驗證,去資料庫中新增記錄
        
        # 這裡千萬要小心是使用create_user在資料庫匯中總新增記錄
        UserInfo.objects.create_user(username=username,password=password)
        
        # 註冊成功跳轉到login頁面
        return redirect('/login/')
    
    
    
    return render(request,'reg.html')

 models

from django.db import models
# 繼承Django自帶的表格建立類 是一個抽象類
from django.contrib.auth.models import AbstractUser
# Create your models here.
GENDER_CHOICES = ((1,'女'),(2,'男'),(3,'保密'))
DEFAULT_GENDER = 3
# 使用自己建立的UesrInfo表 來替代Django,auth模組自動建立的表的基礎上自定義一些其他的欄位,
class UserInfo(AbstractUser):
    # 擴充套件auth表裡面沒有的欄位
    gender = models.PositiveSmallIntegerField(choices=GENDER_CHOICES,default=DEFAULT_GENDER)
    phone = models.CharField(max_length=11)

  setting

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/

STATIC_URL = '/static/'
# 靜態資料夾的配置資訊
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
]

# auth模組的配置
LOGIN_URL = '/login/'  # 專案登入頁面的路由

# 使用Django自帶的資料表 但是自定義增加一些其他的欄位 繼承使用的時候需要配置
AUTH_USER_MODEL = "app01.UserInfo"  # 中間不需要寫models

  index

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>index頁面!!!</title>
</head>
<body>
<h1>這是index頁面!!!</h1>
<h1>歡迎:{{ request.user.username }} 登入index頁面!!!</h1>
<a href="/logout/">登出</a>
</body>
</html>

  login

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>登入頁面!!</title>
</head>
<body>

<form action=""method="post">
    {% csrf_token %}
    <div>
        <label for="input_username">使用者名稱:</label>
        <input type="text" name="username" id="input_username">
    </div>

    <div>
        <label for="input_pwd">密碼:</label>
        <input type="password" name="password" id="input_pwd">
    </div>
    <input type="submit" name="" id="">
    <p>{{ error_msg }}</p>

</form>


</body>
</html>

  reg

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>註冊頁面!!!</title>
</head>
<body>

<form action=""method="post">
    {% csrf_token %}
    <div>
        <label for="input_username">使用者名稱:</label>
        <input type="text" name="username" id="input_username">
    </div>
    <div>
        <label for="input_pwd">密碼:</label>
        <input type="password" name="password" id="input_pwd">
    </div>
    <div>
        <label for="re_input_pwd">再次輸入密碼:</label>
        <input type="password" name="re_password" id="re_input_pwd">
    </div>
    <input type="submit" >
</form>


</body>
</html>