+-
                                
                                    
                                
                                
                                    
                                
                                
                                    
                                        
                                        
                                        
                                        
                                        首页 专栏 django 文章详情   
 
  
   
     
   
    
     
        
      
 
      Bill 发布于 4 月 16 日 
      
     
      
     
      
     
      
     
     
      
       
     
     
       
     
   
   
    
     
       
      
  
       
        
      
      
       
      
       关注作者 
     
    
   
   
    
     
      
     
      
      
 
       
        
          
          
         
         
        
        
      
      
     
    
   
  
  
   
    
     
      
        
       
  
        
         
       
       
        
       
        关注作者 
      
     
    
    
     
      
     
    
    
     
      
       
      
       
        
       
       
        
       
       
        
       
      
     
    
    
     
    
    
     
      
       
        
         
         
        
       
      
     
    
   
  
 
                                            
                                        
                                        
                                    
                                
                            
                        
 
    0 
     
     
     
      
     
   
 
  django权限认证
Django权限认证系统
Django内置了强大的用户认证auth模块,系统默认使用auth_user表来存储用户数据。通过from django.contrib import auth可以导入auth模块,auth模块提供了许多函数用于认证
内置方法
authenticate(username='username',password='password'):提供了用户认证功能,即验证用户名以及密码是否正确,参数为username 和password;如果认证成功(用户名和密码正确有效),便会返回一个User对象。 login(Http Request, user):实现用户登录的功能,参数为HttpRequest对象和一个经过认证的User对象。如果未登录,request.user得到的是一个匿名用户对象Anonymous User对象。 is_authenticated():判断当前请求是否通过了认证。 logout(request):清除当前请求的全部session。create_user():创建新用户,至少提供用户名和用户密码,形如
user =User.objects.create_user(username='Tom',password='test',email='[email protected]')。 set_password(password):修改密码,形如user_obj.set_password('test')。 check_password(password):检查密码是否正确,形如user_obj.check_password('test')。 另外还有一个login_required装饰器,通过该装饰器能够使视图函数首先判断用户是否登录。如果未登录,网页会跳转到settings.py设置的LOGIN_URL参数对应的URL  
    from django.contrib.auth.decorators import login_required @login_requireddef index(request): 
    创建自定义权限的方法
通过定义数据模型增加权限,在定义模型时,可以在Meta中定义权限在执行python manage.py makemigrations和python manage.py migrate命令后,就会增加一条权限,权限的名字一般是APP_name.Permission_name的形式。假设我们在一个叫myapp的应用程序中建立以上数据模型,那么产生的权限名字就是myapp.add_test
class test(models.Model): name = models.CharField(max_length=32) class Meta: permissions = [('add_test','在test表中增加记录的权限')]  通过代码增加权限,权限是django.contrib.auth.Permission的实例对象,可理解为权限记录保存在Permission表中,它包含
    name、
    codename、
    content_type 3个字段,其中的content_type与数据模型相关联,可以理解为content_type表示一个权限在哪个应用程序中的哪个数据模型中定义  
    # views.py from django.http import HttpResponse from . import models from django.contrib.auth.models import Permission,ContentType # 在此处编写视图函数代码 def add_permission(request): content_type=ContentType.objects.get_for_model(models.test) # 生成一条权限记录并保存在Permission表中 permission=Permission.objects.create(codename='add_test',name='在test表中增加记录的权限',content_type=content_type) return HttpResponse('ok') 
    案例说明
案例应用为au
目录结构
au ├─__init__.py ├─admin.py ├─apps.py ├─models.py ├─tests.py ├─urls.py ├─views.py ├─migrations | ├─0001_initial.py | ├─__init__.py | ├─__pycache__ | | ├─0001_initial.cpython-37.pyc | | └__init__.cpython-37.pyc 
    views.py
# /au/views.py from django.contrib.auth import authenticate, login from django.http import HttpResponse, JsonResponse from django.views.decorators.csrf import csrf_exempt import json # 加入csrf认证防止跨域报错 @csrf_exempt def user_login(request): # 判断传输方式是否为get,登录传输表单需要post if request.method == 'GET': return HttpResponse('跳转test_auth/login') else: # 将post的body解析出username与password body = json.loads(request.body) username = body['username'] password = body['password'] # 通过解析传输过来的用户名与密码对用户认证 user_obj = authenticate(username=username, password=password) if user_obj: # 让用户处于登录状态 login(request, user_obj) return HttpResponse('跳转主页') else: return HttpResponse('跳转login') 
    models.py
# /au/models.py from django.db import models # 权限认证方法 from django.contrib.contenttypes.models import ContentType from django.contrib.auth.models import Permission class authority(models.Model): codename = models.CharField('权限代码', max_length=32) url = models.CharField('URL配置项名称', max_length=128) name = models.CharField('权限描述', max_length=120) # 重写数据模型的save()方法,实现了每增加一条记录,就增加一个权限 def save(self, *args, **kwargs): # 取得content_type对象,该对象与test_auth中的authority数据模型有关联 content_type_obj = ContentType.objects.get(app_label='au', model="authority") # 增加一个权限,权限代码与字段codename的值相同,权限名与字段name的值相同 permission = Permission.objects.create(codename=self.codename, name=self.name, content_type=content_type_obj) # 调用父类的save()方法将数据记录保存到数据库中 super(authority, self).save(*args, **kwargs) # 重写了数据模型的delete()方法,实现了每删除一条记录,就删除权限代码 def delete(self, *args, **kwargs): content_type_obj = ContentType.objects.get(app_label='au', models='authority') # 取出权限对象 permission = Permission.objects.get(codename=self.codename, content_type=content_type_obj) content_type = content_type_obj # 删除权限 permission.delete() # 调用父类的 delete()方法,删除这条记录 # 因为当前类重写了save与delete方法,所以为了原始操作只能调用为变更过的父类方法 super(authority, self).delete(*args, **kwargs) def __str__(self): return self.name class Meta: verbose_name = '权限表' verbose_name_plural = verbose_name 
    admin.py
# /au/admin.py from django.contrib import admin from . import models # 定义默认admin页面展示字段 class AuthorityAdmin(admin.ModelAdmin): list_display = ('codename', 'url', 'name') admin.site.register(models.authority, AuthorityAdmin)   
     django python3.x django-admin 
     
 
     阅读 42  发布于 4 月 16 日 
     
 
      举报 
      
 
      
      赞 
      收藏 
      
 
     
       分享 
      
 
      本作品系原创, 采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议 
    
 
   Bill
职业:网管
 
       151  声望 
      
 
       
       8  粉丝 
      
 
     0 条评论
 得票数 最新 
     
 
     
         提交评论 
       
 
      Bill
职业:网管
 
        151  声望 
       
 
        
        8  粉丝 
       
 
      宣传栏
目录
 ▲ 
 
Django权限认证系统
Django内置了强大的用户认证auth模块,系统默认使用auth_user表来存储用户数据。通过from django.contrib import auth可以导入auth模块,auth模块提供了许多函数用于认证
内置方法
authenticate(username='username',password='password'):提供了用户认证功能,即验证用户名以及密码是否正确,参数为username 和password;如果认证成功(用户名和密码正确有效),便会返回一个User对象。 login(Http Request, user):实现用户登录的功能,参数为HttpRequest对象和一个经过认证的User对象。如果未登录,request.user得到的是一个匿名用户对象Anonymous User对象。 is_authenticated():判断当前请求是否通过了认证。 logout(request):清除当前请求的全部session。create_user():创建新用户,至少提供用户名和用户密码,形如
user =User.objects.create_user(username='Tom',password='test',email='[email protected]')。 set_password(password):修改密码,形如user_obj.set_password('test')。 check_password(password):检查密码是否正确,形如user_obj.check_password('test')。 另外还有一个login_required装饰器,通过该装饰器能够使视图函数首先判断用户是否登录。如果未登录,网页会跳转到settings.py设置的LOGIN_URL参数对应的URL  
from django.contrib.auth.decorators import login_required @login_requireddef index(request): 
创建自定义权限的方法
通过定义数据模型增加权限,在定义模型时,可以在Meta中定义权限在执行python manage.py makemigrations和python manage.py migrate命令后,就会增加一条权限,权限的名字一般是APP_name.Permission_name的形式。假设我们在一个叫myapp的应用程序中建立以上数据模型,那么产生的权限名字就是myapp.add_test
class test(models.Model): name = models.CharField(max_length=32) class Meta: permissions = [('add_test','在test表中增加记录的权限')]  通过代码增加权限,权限是django.contrib.auth.Permission的实例对象,可理解为权限记录保存在Permission表中,它包含
name、
codename、
content_type 3个字段,其中的content_type与数据模型相关联,可以理解为content_type表示一个权限在哪个应用程序中的哪个数据模型中定义  
# views.py from django.http import HttpResponse from . import models from django.contrib.auth.models import Permission,ContentType # 在此处编写视图函数代码 def add_permission(request): content_type=ContentType.objects.get_for_model(models.test) # 生成一条权限记录并保存在Permission表中 permission=Permission.objects.create(codename='add_test',name='在test表中增加记录的权限',content_type=content_type) return HttpResponse('ok') 
案例说明
案例应用为au
目录结构
au ├─__init__.py ├─admin.py ├─apps.py ├─models.py ├─tests.py ├─urls.py ├─views.py ├─migrations | ├─0001_initial.py | ├─__init__.py | ├─__pycache__ | | ├─0001_initial.cpython-37.pyc | | └__init__.cpython-37.pyc 
views.py
# /au/views.py from django.contrib.auth import authenticate, login from django.http import HttpResponse, JsonResponse from django.views.decorators.csrf import csrf_exempt import json # 加入csrf认证防止跨域报错 @csrf_exempt def user_login(request): # 判断传输方式是否为get,登录传输表单需要post if request.method == 'GET': return HttpResponse('跳转test_auth/login') else: # 将post的body解析出username与password body = json.loads(request.body) username = body['username'] password = body['password'] # 通过解析传输过来的用户名与密码对用户认证 user_obj = authenticate(username=username, password=password) if user_obj: # 让用户处于登录状态 login(request, user_obj) return HttpResponse('跳转主页') else: return HttpResponse('跳转login') 
models.py
# /au/models.py from django.db import models # 权限认证方法 from django.contrib.contenttypes.models import ContentType from django.contrib.auth.models import Permission class authority(models.Model): codename = models.CharField('权限代码', max_length=32) url = models.CharField('URL配置项名称', max_length=128) name = models.CharField('权限描述', max_length=120) # 重写数据模型的save()方法,实现了每增加一条记录,就增加一个权限 def save(self, *args, **kwargs): # 取得content_type对象,该对象与test_auth中的authority数据模型有关联 content_type_obj = ContentType.objects.get(app_label='au', model="authority") # 增加一个权限,权限代码与字段codename的值相同,权限名与字段name的值相同 permission = Permission.objects.create(codename=self.codename, name=self.name, content_type=content_type_obj) # 调用父类的save()方法将数据记录保存到数据库中 super(authority, self).save(*args, **kwargs) # 重写了数据模型的delete()方法,实现了每删除一条记录,就删除权限代码 def delete(self, *args, **kwargs): content_type_obj = ContentType.objects.get(app_label='au', models='authority') # 取出权限对象 permission = Permission.objects.get(codename=self.codename, content_type=content_type_obj) content_type = content_type_obj # 删除权限 permission.delete() # 调用父类的 delete()方法,删除这条记录 # 因为当前类重写了save与delete方法,所以为了原始操作只能调用为变更过的父类方法 super(authority, self).delete(*args, **kwargs) def __str__(self): return self.name class Meta: verbose_name = '权限表' verbose_name_plural = verbose_name 
admin.py
# /au/admin.py from django.contrib import admin from . import models # 定义默认admin页面展示字段 class AuthorityAdmin(admin.ModelAdmin): list_display = ('codename', 'url', 'name') admin.site.register(models.authority, AuthorityAdmin)