django的配置与权限管理与后台管理配置与bug检测工具
作者:互联网
django配置文件
django其实有两个配置文件:
- 一个是用户可以自定义的基本配置:
from 项目名 import settings
- 另一个是django全局的默认配置:
from django.conf import global_settings
如果自定义配置和默认配置有配置冲突了,则会优先使用用户自定义配置,这就是为什么我们有些功能需要去配置文件中添加,因为有些功能使用的是默认配置,修改功能就要去配置文件中添加。
自定义配置中有的配置,默认配置里肯定也有;自定义配置中没有的配置,默认配置里可能会有;
如果既要获取自定义配置中的配置,又要获取默认配置中的配置,可以这么导入配置:
from django.conf import settings
这样就不需要同时导入自定义配置和默认配置了,在获取配置时,会优先获取自定义配置中的配置。
django配置文件源码
查看为什么导入一个配置就能同时使用自定义配和默认配置:
from django.conf import settings
查看源码,它是通过LazySettings()实例化得到的。
settings = LazySettings()
查看LazySettings():
首先看第二个红框,这里有一个os.environ,这个可以看成是一个存项目各个信息的大字典,在manage.py文件中对os.environ添加了一个键值对:值就是自定义配置文件的路径
所以在LazySettings()中settings_module就是自定义配置的路径,获取路径后由Settings()实例化,查看Settings类中的__init__方法:
def __init__(self, settings_module):
# 首先获取全局默认配置中的各个配置
for setting in dir(global_settings):
# 配置文件中全大写的变量才是配置
if setting.isupper():
# 利用反射给Settings对象添加配置的键值对
setattr(self, setting, getattr(global_settings, setting))
self.SETTINGS_MODULE = settings_module
# 通过importlib把自定义配置文件的字符串形式路径导入
mod = importlib.import_module(self.SETTINGS_MODULE)
tuple_settings = (
"INSTALLED_APPS",
"TEMPLATE_DIRS",
"LOCALE_PATHS",
)
self._explicit_settings = set()
# 获取自定义配置文件中的各个配置
for setting in dir(mod):
# 配置文件中全大写的变量才是配置
if setting.isupper():
# 先获取自定义配置文件中的配置的值
setting_value = getattr(mod, setting)
# 不用看
if (setting in tuple_settings and
not isinstance(setting_value, (list, tuple))):
raise ImproperlyConfigured("The %s setting must be a list or a tuple. " % setting)
# 利用反射给Settings对象添加配置的键值对,如果已经有了就会覆盖掉
setattr(self, setting, setting_value)
self._explicit_settings.add(setting)
这就是为什么导入一个settings就可以使用到自定义配置和默认配置,简单的说就是先获取默认配置中的全部配置,然后获取自定义配置中的配置,如果配置已经有了就把他覆盖。
权限管理
在我们访问一些资源时,有些需要充会员才能观看,这个就是权限的问题。
在web领域url就是权限,权限就是url,你能访问到url就代表你有这个权限。
用户表:
id | username | password |
---|---|---|
1 | tom | 123 |
2 | tony | 123 |
3 | jack | 123 |
权限表:
id | permission | url |
---|---|---|
1 | 查看 | /select/ |
2 | 添加 | /add/ |
3 | 编辑 | /edit/ |
4 | 删除 | /delete/ |
用户与权限关系表:
id | user_id | permission_id |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 2 |
这种的权限设计是存在缺陷的,用户数据多了之后与权限的绑定关系在第三张关系表中过于繁杂。
RBAC
RBAC即基于角色的权限管理,每个角色有不同权限,比如普通用户、会员用户、管理员...
用户表:
id | username | password |
---|---|---|
1 | tom | 123 |
2 | tony | 123 |
3 | jack | 123 |
权限表:
id | permission | url |
---|---|---|
1 | 查看 | /select/ |
2 | 添加 | /add/ |
3 | 编辑 | /edit/ |
4 | 删除 | /delete/ |
角色表:
id | role |
---|---|
1 | 管理员 |
2 | 普通用户 |
3 | 会员用户 |
角色与权限关系表:
id | role_id | permission_id |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 1 | 4 |
... |
用户与角色关系表:
id | user_id | role_id |
---|---|---|
1 | 1 | 1 |
2 | 2 | 2 |
3 | 3 | 3 |
这种方式虽然多了一些表,但是后续用户绑定权限时数据不会过于繁琐,每次绑定权限只需要给用户和角色绑定关系即可。
权限管理实战
1.编写登陆功能,获取用户的权限并存储到session
url_list = 用户可以访问的url # 列表存储
request.session['permission'] = url_list
2.校验每次用户访问的url比对是否含有该权限,这里可以使用自定义中间件判断
def process_request(self, request):
# 获取当前用户请求的url
request_url = request.path
# 判断是否有权限,没权限则直接返回
if not request_url in request.session.get('permission'):
return HttpResponse('权限不足')
3.有些权限是所有用户都应该具备的,比如登录的url
def process_request(self, request):
# 获取当前用户请求的url
request_url = request.path
# 添加所有用户可以访问的url
white_url_list = ['/login/','/register/','/admin/']
# 判断用户请求的url是不是所有用户都可以访问的
if request_url in white_url_list:
# 直接返回,不需要判断是否有权限了
return
# 判断是否有权限,没权限则直接返回
if not request_url in request.session.get('permission'):
return HttpResponse('权限不足')
4.有些url是含有正则的,不能简单的使用成员运算来判断
def process_request(self, request):
# 获取当前用户请求的url
request_url = request.path
# 添加所有用户可以访问的url
white_url_list = ['/login/','/register/','/admin/']
# 判断用户请求的url是不是所有用户都可以访问的
for url in white_url_list:
# 拼接正则
re_path = '^%s$' % url
if re.search(re_path, request_url)
return
# 判断是否有权限,没权限则直接返回
for url in request.session.get('permission'):
# 拼接正则
re_path = '^%s$' % url
if re.search(re_path, request_url)
return
return HttpResponse("权限不足")
admin.py配置参数
admin.py除了注册模型层中的类后,可以后台管理外,还有一些其他参数
常用配置
控制后台管理表中显示的字段数量:list_display
class 类名(admin.ModelAdmin):
list_display = ['字段1', '字段2', ...]
admin.site.register(models.表名, 类名)
控制可以被访问的字段,指定字段后,后台数据只能从指定字段访问:list_display_links(需要先list_display指定字段)
class 类名(admin.ModelAdmin):
list_display = ['字段1', '字段2', ...]
list_display_links = ['字段1', '字段2', ...]
admin.site.register(models.表名, 类名)
添加根据字段查询数据,输入后根据指定字段的数据筛选:search_fields
class 类名(admin.ModelAdmin):
search_fields = ['字段1', '字段2', ...]
admin.site.register(models.表名, 类名)
筛选功能,在侧边出现,一般写外键字段,普通字段没有实际意义:list_filter
class 类名(admin.ModelAdmin):
list_filter = ['字段1', '字段2', ...]
admin.site.register(models.表名, 类名)
数据批量处理:actions
class 类名(admin.ModelAdmin):
def add(self,request,queryset):
# 每个数据自增1000
queryset.update(字段=F('字段') + 1000)
# 后台显示的操作名称
add.short_description = '数据批量处理'
# 指定函数
actions = [add, ]
admin.site.register(models.表名, 类名)
其他配置
参考Django-admin管理工具 - JasonJi - 博客园 (cnblogs.com)
bug检测功能django-debug-toolbar
需要安装:
pip install django-debug-toolbar
注意安装时,如果django版本不对,它会重装你的django版本。
使用:django-debug-toolbar - JasonJi - 博客园 (cnblogs.com)
标签:自定义,url,list,配置,request,django,权限,bug,检测工具 来源: https://www.cnblogs.com/yume-zbh/p/16338784.html