장고는 내장 auth
사용자가 등록, 로그인, 로그 아웃을 달성하고 개발자들이 많은 노력을 절약 할 수 있도록 암호 및 기타 기능을 변경할 수 있도록 모듈을.
인증 모듈
당신이 모델을 만들 때, 장고 내부라는 이름의 파일이 생성됩니다 auth_user
사용자 인증 정보를 저장하기위한 데이터 테이블을.
auth
모듈, 방법의 일련의 제공은 사용하기 전에 가져와야합니다 :
from django.contrib import auth
인증 () 方法
사용자 인증을 제공, 사용자 이름과 암호 등 올 바르고 확인합니다. 성공하면, 그것은 반환 User
개체를.
from django.contrib import auth
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 用户认证,验证用户名、密码是否正确,并返回一个 user 对象
# username、password 字段对应 auth_user 表中相应字段
user_obj = auth.authenticate(username=username, password=password)
로그인 () 메소드
사용자가 배경에 로그인을 구현할 사용자 로그인 기능 생성 session
데이터.
from django.contrib import auth
auth.login(request, user_obj)
from django.contrib.auth import login
login(request, user_obj)
두 개의 매개 변수, 제 중 하나를 수용 HTTPRequest
객체와 타겟 인증 된 사용자 (즉, authenticate()
인증 된 사용자 객체).
from django.contrib import auth
def login(request):
"""登录"""
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 用户认证,验证用户名、密码是否正确,并返回一个 user 对象
user_obj = auth.authenticate(username=username, password=password)
if user_obj:
# 将验证成功的用户封装到 request.user 对象中
auth.login(request, user_obj)
return redirect('home')
else:
return '错误信息'
return render(request, 'login.html')
성공적인 사용자 인증 개체는 실행 login()
그렇지 않으면 오류 메시지를 반환합니다, 로그인 기능을 구현, 방법.
팁
실행 된 login()
사용자 개체의 방법은 통과 할 수 request.user
그렇지 않으면 익명 사용자 개체를 할 것이라고는 현재, 따라서 사용자에 대한 정보를 제거, 사용자 개체에 기록 얻을 AnonymounsUser Object
.
login(request, user_obj)
# 获得当前登录用户对象
user = request.user
# 获得当前登录用户对象的用户名
username = request.user.username
아웃 () 메소드
상기 방법은, 취소 기능을 가능 현재 로그인 된 사용자 데이터베이스 취소 session
수신 데이터를 HttpRequest
어떤 값도 반환하지 타겟.
from django.contrib import auth
def logout(request):
"""注销"""
auth.logout(request)
# 注销后重定向到登录页面
return redirect('login')
is_authenticated 属性
현재 사용자가 부울 값으로 인증되는지 여부를 결정한다.
def home(request):
"""首页"""
ret = request.user.is_authenticated
print(ret) # True
login_required () 메소드
쉽게보기 위해 로그인 체크를 추가 할 수있는 장식 도구에서 제공하는 인증 템플릿입니다.
- 사용자가 로그인하지 않은 경우, 디폴트로 이동합니다
accounts/login/
, 현재 절대 경로에 액세스 할 수있는 URL을 전달합니다. - 사용자 지정 경로를 이동, 간단하게
settings.py
추가 :
# 当用户没有登录,访问某个视图时将会跳转到登录页面
LOGIN_URL = '/login/'
from django.contrib.auth.decorators import login_required
# 添加装饰器
@login_required
def home(request):
"""首页"""
return render(request, 'home.html')
사용자가 액세스 할 때 home
페이지, 그렇지 않은 경우 로그인 페이지로 logged'll 점프, 그렇지 않으면 home
페이지를.
사용자 관련
모든 관련 전술의 등록 정보, 다음은 만드는 방법을 설명합니다 auth_user
, 사용자를 만들고 암호를 변경, 암호를 확인합니다.
create_superuser () 메소드
수신 수퍼 사용자 생성 방법 username、password
두 가지 필수 파라미터. 실시 효과 python manage.py createsuperuser
등가물.
from django.contrib.auth.models import User
user_obj = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)
CREATE_USER () 메소드
일반적인 create_superuser()
방법은 거의 사용하지 않는 가장 일반적으로 사용되는입니다 create_user()
방법, 그것은 종종 등록보기에 사용되는 일반 사용자를 작성합니다.
, 필요한 사용자의 요구 필드 만들기 auth_user
테이블 내의 대응 데이터 필드.
from django.contrib.auth.models import User
def signup(request):
# 创建新用户
user_obj = User.objects.create_user(username='lila', password='1234')
return HttpResponse('创建成功')
팁
에 기억 새로 생성 된 사용자 auth_user
테이블의 암호 데이터는 암호화됩니다.
은 check_password () 메소드
로그인 사용자 암호가 올바른지 확인, 우리는 현재 사용자의 암호를 요청해야합니다.
from django.contrib.auth.models import User
def signup(request):
# 创建新用户
user_obj = User.objects.create_user(username='lila', password='1234')
ret = user_obj.check_password('123456')
print(ret) # False
return HttpResponse('创建成功')
암호는 올바른 반환 참, 그렇지 않으면 False입니다.
또는 사용자에 대한 올바른 원래 암호는 현재 요청을 확인 오브젝트 여부 :
obj = request.user.check_password(raw_password='原始密码')
set_password () 메소드
이 방법은 마지막으로 수행해야하는 인수로 새 암호를 수신하기 위해 암호를 변경하는 데 사용됩니다 save()
, 그렇지 않으면 무효, 보존 방법.
def set_password(request):
"""
修改密码,request.user 中封装了已认证且执行了登录功能的用户对象
:param request:
:return:
"""
request.user.set_password('12')
password = request.user.password
request.user.save()
print(password)
return HttpResponse('修改成功')
암호 예 변경
이 예제는 로그인 한 사용자에게 적용, 내부적으로 암호를 변경, 등록되지 않은 사용자는 로그인 페이지로 이동합니다.
from django.shortcuts import render, redirect, HttpResponse
from django.contrib.auth.decorators import login_required
@login_required
def set_password(request):
"""
修改密码,request.user 中封装了已认证且执行了登录功能的用户对象
:param request:
:return:
"""
user = request.user
ret = {'message': None}
if request.method == 'POST':
old_password = request.POST.get('old_password')
new_password = request.POST.get('new_password')
# 重复新密码
repeat_password = request.POST.get('repeat_password')
# 检查旧密码是否正确
if user.check_password(old_password):
if not new_password:
ret['message'] = '新密码不能为空'
elif new_password != repeat_password:
ret['message'] = '两次密码输入不一致'
else:
user.set_password(new_password)
user.save()
return redirect('login')
else:
ret['message'] = '原密码不正确'
return render(request, 'set_password.html', ret)
인증 모듈 확장
정식 템플릿 때문에 auth_user
데이터 테이블 필드가 고정되어 우리는 인증 모듈을 사용할 때, 그래서, 당신은 추가 필드를 추가 할, 그들은 확장 될 필요가있다.
두 가지 방법으로 확장 :
- 새 테이블에서 모델과
auth_user
관련된 테이블 하나 - 내장 상속
AbstractUser
클래스 : 공통를
- 모델
models.py
에서 상속하는 새로운 클래스AbstractUser
:
from django.contrib.auth.models import User, AbstractUser # 导入 AbstractUser 类
class UserInfo(AbstractUser):
"""
继承 AbstractUser
新增字段:phone、addr
"""
phone = models.CharField(max_length=11, verbose_name='手机号码')
addr = models.CharField(max_length=128, verbose_name='家庭地址')
- 구성
settings.py
새로운 클래스 상속 AbstractUser
, 커버리지 확장됩니다 auth_user
구성 할 필요가 있으므로, 테이블을 settings
기본 인증의 인증을 사용할 테이블을 알고있다.
# settings.py
# 在最后添加如下代码
AUTH_USER_MODEL = 'app名.新增的类名'
AUTH_USER_MODEL = 'app.UserInfo' # 示例
- 마이그레이션 데이터 시트
python manage.py makemigrations
python manage.py migrate
- 사용자 만들기
인증 모듈의 확장 후, 더 이상 원래 사용되지 auth_user
테이블,하지만 새 테이블 app.UserInfo
테이블, 그렇게 할 때주의해야한다 사용자를 생성합니다.
# 拓展之前
from django.contrib.auth.models import User
user_obj = User.objects.create_user(username='lila', password='1234')
# 拓展之后
from app.models import UserInfo
user_obj = UserInfo.objects.create_user(username='lila', password='1234')
팁
- 마이그레이션이 모델이 된 경우, 인증 모듈을 확장, 당신은 할 필요가
migrations
: (예 : 파일 폴더0001_initial.py
그렇지 않으면보고됩니다, 파일 삭제)ValueError: Related model u'app.model' cannot be resolved
. - 어떤 마이그레이션 모델 경우, 정상적인 실행이 될 수 있습니다.