1、创建用户
from django.contrib.auth.models import User
user = User.objects.create_user('用户名','邮箱','密码')
2、修改密码
user.set_password('新密码')
user.save()
3、用户验证
用来验证是否有该数据,认证通过则返回一个User类对象,一项都没通过或者抛出了PermissionDenied异常,则返回一个None。
from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
4、has_perm 权限测试
假设你现在有个app叫做foo,有个model叫做bar
add: user.has_perm('foo.add_bar')
change: user.has_perm('foo.change_bar')
delete: user.has_perm('foo.delete_bar')
view: user.has_perm('foo.view_bar')
5、添加权限
添加权限后,并不会直接有效,需要重新获取该用户才能使添加的权限有效
from myapp.models import BlogPost
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
content_type = ContentType.objects.get_for_model(BlogPost)
permission = Permission.objects.create(
codename='can_publish',
name='Can Publish Posts',
content_type=content_type,
)
user = get_object_or_404(User,pk=1)
user.user_permission.add(permission)
6、登陆操作
每一次请求中都包含一个request.user属性,表示当前用户。如果该用户未登陆,该属性的值是一个AnonymousUser实例(匿名用户),如果已经登录,该属性就是一个User模型的实例。并且在登陆之前应该先判断该用户名和密码是否有效
from django.contrib.auth import authenticate, login, logout
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
7、注销操作
logout(request)
8、判断是否登陆
方法一:
if request.user.is_authenticated:
已登陆
else:
未登陆
方法二:
使用装饰器@login_required(redirect_field_name='next', login_url=None)
login_url :如果没有登陆。将重定向到这个url,或者设置settings.LOGIN_URL
redirect_field_name='next': 默认未next,会将当前url的相对路径构成一个next做key的查询字符对附加到 settings.LOGIN_URL后面
使用LoginRequired mixin,通过继承LoginRequiredMixin类的方式限制用户。在多继承时,该类必须是最左边的父类。
from django.contrib.auth.mixins import LoginRequiredMixin
class MyView(LoginRequiredMixin, View):
login_url = '/login/'
redirect_field_name = 'redirect_to'
9、限制用户访问
方法一:
user_passes_test(test_func,login_url = None,redirect_field_name ='next')
from django.contrib.auth.decorators import user_passes_test
def email_check(user):
return user.email.endswith('@example.com')
@user_passes_test(email_check)
def my_view(request):
该装饰器需要获取一个可调用的User对象
方法二:
使用 UserPassesTestMixin
必须覆盖test_func()类的方法以提供执行的测试
from django.contrib.auth.mixins import UserPassesTestMixin
class MyView(UserPassesTestMixin, View):
def test_func(self):
return self.request.user.email.endswith('@example.com')
9、权限需求装饰器
权限的格式为:< app_name>: < permission codename>
如果raise_exception为True,则装饰器将引发 PermissionDenied,提示403(HTTP Forbidden)视图而不是重定向到登录页面。
若使用了raise_exception还想提供登陆,则需要与login_required一起使用
from django.contrib.auth.decorators import permission_required
@permission_required('polls.can_vote', login_url=url, raise_exception=True)
10、防止密码修改后登陆无效
update_session_auth_hash(request, user)
使用方法:
from django.contrib.auth import update_session_auth_hash
def password_change(request):
if request.method == 'POST':
form = PasswordChangeForm(user=request.user, data=request.POST)
if form.is_valid():
form.save()
update_session_auth_hash(request, form.user)