auth模塊

auth模塊

建立超級管理員

超級用戶 用於登陸django admin的後臺管理python

createsuperuser面試

校驗用戶名和密碼是否正確

user_obj = auth.authenticate(username=username,password=password)  # 返回的是數據對象  沒有返回None

username=username,password=password這兩個參數必需要有,不能只寫一個。數據庫

1572492323301

保存用戶登陸狀態

auth.login(request,user_obj)  # 執行完這一句以後 主要是可以拿到request的地方 
# 均可以經過request.user獲取到當前登陸用戶對象

判斷當前用戶是否登陸

request.user.is_authenticated()  #存在返回True,不存在返回False

獲取當前用戶數據對象

request.user

校驗是否登陸裝飾器

當用戶沒有登陸的狀況下 跳轉的url有兩種配置方式django

  • 在裝飾器括號內經過login_url參數局部指定
  • 全局配置 用戶沒有登陸的狀況下 全部的視圖統一跳轉到一個url,配置文件中LOGIN_URL = '/login/'
from django.contrib.auth.decorators import login_required

# @login_required(login_url='/xxx/')  # 局部配置
@login_required  # 全局配置
def home(request):
return HttpResponse('home頁面')

修改密碼

校驗原密碼是否正確

is_right = request.user.check_password(old_password)

設置新密碼

request.user.set_password(new_password)
request.user.save()   #記得必定要使用save()方法

用戶註冊

from django.contrib.auth.models import User

#User.objects.create(username=username,password=password)  # 不用使用create 密碼會直接存成明文
User.objects.create_user(username=username,password=password)  # 建立普通用戶
User.objects.create_superuser(username=username,password=password,email='123@qq.com')  # 建立超級用戶  郵箱字段必須填寫

擴展auth_user表的字段

第一步:本身寫一個默寫類 繼承原來的auth_user類緩存

from django.db import models
from django.contrib.auth.models import AbstractUser

# Create your models here.
class Userinfo(AbstractUser):
    """
    強調 繼承了AbstractUser以後 你自定義的表中 字段不能跟原有的衝突
    """
    phone = models.BigIntegerField()
    avatar = models.FileField()
    register_time = models.DateField(auto_now_add=True)

第二步:在settings配置文件中設置,告訴django使用新建的類來替代auth_user表session

固定語法: AUTH_USER_MODEL = '應用名.表名'app

AUTH_USER_MODEL = 'app01.Userinfo'

auth實現用戶的登陸註冊

from django.shortcuts import render, HttpResponse, redirect, reverse

from django.contrib import auth

from django.contrib.auth.models import User

# Create your views here.
#登陸
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        #models.User.objects.filter(username=username,password=password).first()
        user_obj = auth.authenticate(username=username, password=password)
        """
        該方法會有一個返回值  當條件存在的狀況下 返回就是數據對象自己
        條件不知足 直接返回None
        """
        if user_obj:
            # 必定要記錄用戶狀態 纔算真正的用戶登陸
            request.session['user'] = user_obj
            auth.login(request, user_obj)
            """該方法會主動幫你操做session表 而且只要執行了該方法
             你就能夠在任何位置經過request.user獲取到當前登陸的用戶對象
            """
            old_path = request.GET.get('next')
            if old_path:
                return redirect(old_path)
            else:
                return redirect('/home/')
    return render(request, 'login.html')


def index(request):
    print(request.user)  # 直接拿到登陸用戶的用戶對象
    print(request.user.is_authenticated())  # 簡單快捷的判斷用戶是否登陸
    return HttpResponse('index')


from django.contrib.auth.decorators import login_required

# @login_required(login_url='/login/')  # 局部配置
@login_required  #全局配置
def set_password(request):
    if request.method == 'POST':
        old_password = request.POST.get('old_password')
        new_password = request.POST.get('new_password')
        # 校驗原密碼對不對
        is_right = request.user.check_password(old_password)
        # print(is_right)
        if is_right:
            # 修改密碼
            request.user.set_password(new_password)  # 僅僅只會在內存中產生一個緩存 並不會直接修改數據庫
            request.user.save()  # 必定要點save方法保存 才能真正的操做數據庫
            return redirect('/login/')
    return render(request, 'set_password.html', locals())


# @login_required(login_url='/xxx/')
@login_required
def home(request):
    return HttpResponse('home頁面')


def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # User.objects.create(username=username,password=password)  # 不能直接使用create 密碼會直接存成明文
        # User.objects.create_user(username=username,password=password)  # 建立普通用戶
        User.objects.create_superuser(username=username, password=password, email='123@qq.com')  # 建立超級用戶  郵箱字段必須填寫

    return render(request, 'register.html')

每日面試題

1.請寫一個裝飾器,經過一次調用使函數重複執行5次

from functools import wraps
def wrapper(func):
    wraps(func)  #裝飾器修復技術
    def inner(*args,**kwargs):
        for i in range(5):
            func(*args, **kwargs)
    return inner

@wrapper
def func():
    print('hello')
func()

2.有一個列表[3,4,1,2,5,6,6,5,4,3,3]請寫一個函數,找出該列表中沒有重複的數的總和

方法一:

lis = [3, 4, 1, 2, 5, 6, 6, 5, 4, 3, 3]


def func(lis):
    lis = list(set(lis))
    sum = 0
    for i in lis:
        sum += i
    return sum


print(func(lis))

方法二:

def func():
    list = [3, 4, 1, 2, 5, 6, 6, 5, 4, 3, 3]
    list2 = []
    for i in list:
        if i not in list2:
            list2.append(i)
    print(sum(list2))


func()

方法三:

'''
count() 方法用於統計某個元素在元祖中出現的次數。
用法:count(obj)  obj爲元祖中統計的對象。
返回值爲元素在元祖中出現的次數
'''
lis = [1, 2, 1, 2, 3, 3, 4]
li_set = set(lis)  #轉爲元組
sum = 0
for i in li_set:  #遍歷元祖
    if lis.count(i) == 1:
        sum += 1
print(sum)

3.列舉面向對象中帶雙下滑線的特殊方法及觸發場景

'''
__call__:對象的構造方法,對象加上(),能夠觸發這個類的__call__方法。
__len__:內置函數的len函數是依賴類中的__len__方法
__eq__:判斷值是否相等的時候依賴__eq__方法
__hash__:判斷hash值是否相等的時候依賴__hash__方法(拓展:set的去重機制其實就是根據__hash__和__eq__方法實現的)
__str__:和str() print() %s 都是息息相關的,返回值必定是字符串類型,重寫__str__的時候,優先打印__str__的內容
__repr__:和 repr() %r都是息息相關的,在沒有__str__方法時,__repr__能夠徹底取代__str__。
__del__ :析構方法,對應着一個對象的刪除以前執行的內容
__new__:構造方法,建立一個對象,實例化時第一個被執行,返回一個建立好的對象及__init__(self)的self,
    只有繼承了object的類纔會有這個方法
__init__:初始化方法,__init__在__new__的基礎上完成一些其它初始化的動做,__init__沒有返回值
'''
相關文章
相關標籤/搜索