其他分享
首页 > 其他分享> > django的配置与权限管理与后台管理配置与bug检测工具

django的配置与权限管理与后台管理配置与bug检测工具

作者:互联网

目录

django配置文件

django其实有两个配置文件:

from 项目名 import settings
from django.conf import global_settings

如果自定义配置和默认配置有配置冲突了,则会优先使用用户自定义配置,这就是为什么我们有些功能需要去配置文件中添加,因为有些功能使用的是默认配置,修改功能就要去配置文件中添加。

自定义配置中有的配置,默认配置里肯定也有;自定义配置中没有的配置,默认配置里可能会有;

如果既要获取自定义配置中的配置,又要获取默认配置中的配置,可以这么导入配置:

from django.conf import settings

这样就不需要同时导入自定义配置和默认配置了,在获取配置时,会优先获取自定义配置中的配置。

django配置文件源码

查看为什么导入一个配置就能同时使用自定义配和默认配置:

from django.conf import settings

查看源码,它是通过LazySettings()实例化得到的。

settings = LazySettings()

查看LazySettings():

image

首先看第二个红框,这里有一个os.environ,这个可以看成是一个存项目各个信息的大字典,在manage.py文件中对os.environ添加了一个键值对:值就是自定义配置文件的路径

image

所以在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.表名, 类名)

image

其他配置

参考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