auth模塊 + 插拔式思想

auth模塊 + 插拔式思想

1、auth模塊

​ django爲方便實現用戶功能,包括登錄註冊註銷修改信息等,提供了auth模塊,實現操做簡單化。html

1.1 經常使用方法

​ 超級用戶:python

# run manage.py Task:
createsuperuser

​ authenticate():用戶認證,認證成功會返回User對象,不成功返回None數據庫

from django.contrib import auth

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')

        # 驗證用戶是否存在
        user_obj = auth.authenticate(username=username, password=password)

​ login(HttpRequest,user):接受一個HttpRequest對象,以及一個驗證後的對象,會在後端爲這個用戶生成相關的session數據;django

# 保存登陸信息
auth.login(request,user_obj)   #執行後,能夠經過request.User獲取到登陸用戶對象

​ is_authenticated(): 判斷當前用戶是否登陸;後端

request.user.is_authenticated()

​ 獲取當前用戶:微信

user_obj = request.user

​ loginout(request): 接受一個HttpRequest,清楚當前請求的session信息。若是用戶未登陸,也不會報錯;session

from django.contrib.auth import logout

def llogout(request):
    logout(request)

​ login_required():登陸認證裝飾器;app

from django.contrib.auth.decorators importlogin_requird

# 局部配置
@login_required(login_url = '/xxx/')

# 全局配置
@login_required
def home(request):
    return HttpResponse('home頁面')
    
'''
當用戶沒有登陸的狀況下 跳轉的url有兩種配置方式:
    1.在裝飾器括號內經過login_url參數局部指定
    2.全局配置  用戶沒有登陸的狀況下 全部的視圖統一跳轉到一個url
'''

​ create_user():建立用戶;框架

from django.contrib.auth.models import User
# 這種方式不要使用,密碼會保存爲明文
User.objects.create(username=username, password=password)
# 使用這種方法建立普通用戶
User.objects.create_user(username=username, password=password)
# 建立超級用戶,郵箱字段必須填寫
User.objects.create_superuser(username=username, password=passwore, email='123@123.com')

​ check_password(password):檢查密碼,正確返回Ture,錯誤爲False;測試

​ set_password(password):設置新密碼;

@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)
        if is_right:
            # 設置新密碼
            request.user.set_password(new_password) # 此時值保存在內存中
            request.user.save()  # save()後才保存在數據庫中
            return redirect('/login/')
    return render(request, 'set_password.html', locals())

1.2 擴展默認表

​ auth模塊有內置表格和字段,可是隻是框架,使用時還須要其餘字段信息。能夠鍵一張一對一的auth_user表的關聯表,只要繼承AbstractUser便可。

from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser)  # 注意,自定義表中字段不能與auth_user表中的字段衝突
    phone = models.BigIntegerField()
    register_time = models.DataField(auto_now_add=Ture)
    
def __str__(self):
    return self.username

​ 注意:採用上述方式擴展auth_user表後必須在settings.py中配置:

AUTH_USER_MODEL = "app名.Userinfo"

​ 再注意:一旦制定了新的表,就須要在數據庫中重建表,不能繼續使用默認的auth_user表了。

2、參考django 中間件配置,實現功能的插拔式設計

​ django的中間件能夠按要求篩選信息,當不須要這個要求時,能夠在settings.py中將這條篩選要求註銷掉,即可以實現。這就提供了一種封裝功能的方法,例如廣播系統,採用短信、郵件、QQ等多種方法發佈信息,能夠經過在settings中實現註銷方法或者是增長增長新的方法。

​ 思路:將各類發送信息的功能封裝在不一樣的py文件中,都定義成鴨子類型。在配置文件中將寫下功能的路徑,在init文件中,對路徑進行處理,使用getattr的方法,設置方法。這樣新增新的方法,就能夠寫好方法的py文件再在配置文件中加入路徑,取消方法就在配置文件中註銷掉方法對應的路徑便可。

​ notify文件夾下:

​ __init__:

import settings
import importlib

def send_all(content):
    for module_path in settings.NOTIFY_LIST:
        module, class_name = module_path.rsplit('.', maxslipt=1)
        # module = 'notify.email'  class_name = 'Email'
        mod = importlib.import_module(module)  # mod時模塊名,例如email.py
        cls = getattr(mod, class_name)
        obj = cls()
        obj.send(content)

​ email.py:

class Email(object):
    def __init__(self):
        pass   # 省略相關配置操做
    
    def send(self, content):
        print('郵件通知:%s' % content)

​ msg.py:

class Msg(object):
    def __init__(self):
        pass  # 省略相關配置操做

    def send(self,content):
        print('短信通知:%s'%content)

​ wechat:

class WeChat(object):
    def __init__(self):
        pass  # 省略相關配置操做

    def send(self, content):
        print('微信通知:%s' % content)

​ qq.py:

class QQ(object):
    def __init__(self):
        pass   # 省略相關配置操做

    def send(self,content):
        print('qq通知:%s'%content)

​ run.py

import notify

notify.send_all('測試信息')

​ settings.py

NOTIFY_LIST = [
    'notify.email.Email',
    # 'notify.msg.Msg',   # 註銷掉msg,能夠關閉短信發送消息的功能
    'notify.wechat.WeChat',
    'notify.qq.QQ',
]
相關文章
相關標籤/搜索