django爲方便實現用戶功能,包括登錄註冊註銷修改信息等,提供了auth模塊,實現操做簡單化。html
超級用戶: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())
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表了。
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', ]