主要内容:
1 权限: 不用的用户对应不同的功能, (web开发中 url约等于权限)
2 表结构的设计:
a : 权限表
class Permission(models.Model): title = models.CharField(max_length=32, verbose_name='标题') url = models.CharField(max_length=32, verbose_name='权限') def __str__(self): return self.title
b : 角色表:
class Role(models.Model):
name = models.CharField(max_length=32, verbose_name='角色名')
permissions = models.ManyToManyField(to='Permission', verbose_name='角色所拥有当权限', blank=True)
def __str__(self):
return self.name
class Meta:
verbose_name = '角色表'
verbose_name_plural = '角色表'
c : 用户表
class User(models.Model): username = models.CharField(max_length=32, verbose_name='用户名') password = models.CharField(max_length=32, verbose_name='密码') roles = models.ManyToManyField(to='Role', verbose_name='用户所拥有的角色', blank=True) def __str__(self): return self.username
3 : 注意事项:
代码的主要流程:
1 先获取post提交过来的数据
2 从数据库中找到该对象, 如果没有该对象, 直接跳转到登录页面
3 如果有该对象, 获取该用户所拥有的权限, 记录在session中,
4 由于每次访问都需要校验, 是否是该用户所拥有的权限, 所以把次校验的内容写入中间件中,
5 中间件里的内容: 如果是白名单, 例如登录, 注销, 注册, admin, 则不需要校验, 直接结束,
6 如果不是白名单, 先获取当前的url, 然后for循环session里的数据, 看url在不在session里, 如果在, 结束,进入后面的流程, 如果不在返回一个httpresponse响应(该用户没有权限).
7 由于编辑的时候后面带有动态的数据, 所以用到正则匹配.
8 可以在setting里动的设置一些东西, 例如把session里的key写入setting里, 还有就是把白名单写入setting里
PERMISSION_SESSION_KEY = 'permissions' WHITE_URL_LIST = [ r'^/login/$', r'^/logout/$', r'^/reg/$', r'^/admin/.*', ]
在取的时候的用法:
from django.conf import settings
request.session[settings.PERMISSION_SESSION_KEY] = permission_list
8 跨字段的查询:
从用户表中查出用户所拥有的权限
角色对象 角色表中的字段跨权限中的字段
permission_qs = user.roles.all().filter(permissions__url__isnull=False).values_list( 'permissions__url' )
4 往数据库写数据的两种方式:
1 直接从数据库中填数据
2 可以使用admin管理权限, 首先注册一个超级用户, 然后再admin中写下一下代码:
from django.contrib import admin from crm_app import models admin.site.register(models.Customer) admin.site.register(models.ClassList) admin.site.register(models.Campuses)
5 为什么使用session存放数据:
因为session存放的数据可以存放在内存中
取数据的效率高.