Django源码查看 配置文件操作 权限管理

Django配置文件相关操作

1.django其实有两个配置文件
  一个是暴露给用户可以自定义的基本配置
      from 项目名 import settings
  一个是全局的系统默认的配置(用户不指定的情况 采用的配置)
      from django.conf import global_settings
2.用户如果在暴露给用户的配置文件中指定了配置则使用用户的 不指定则又会使用系统默认的
    # 思考:如何实现上述操作(两个配置文件相互兼容)  一会儿需要看源码
    """测试配置文件的兼容性
      其实django系统默认支持很多国家的语言 只需要修改配置即可
        LANGUAGE_CODE = 'en-us'
      系统配置文件中还提供了很多其他语言配置
    """
3.暴露给用户的配置文件中有的配置 系统配置文件中肯定有
    暴露给用户的配置文件中没有的配置 系统配置文件中也有
4.我们在django中如果想要使用配置文件 那么最正确的导入方式
    from django.conf import settings
  # 思考:上述的settings既可以导入暴露给用户配置文件中的所有配置也可以导入系统默认的配置

Django配置文件源码

"""
看源码不要想着所有的代码都看懂 看核心即可
"""
1.os.environ  可以看成是一个项目全局的大字典 任何地方都可以使用
2.django      的入口文件是manage.py(也可以看成是启动文件)
3.os.environ.setdefault()  相当于给字典添加键值对

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day62_BBS.settings")

from django.conf import settings
class Settings(object):
    def __init__(self, settings_module):  
          # 获取系统配置文件中所有的变量名
        for setting in dir(global_settings):  
            if setting.isupper():  # 校验变量名是否是纯大写(这就是为什么配置文件中的配置必须大写才能生效的原因)
                setattr(self, setting, getattr(global_settings, setting))
                '''通过反射获取系统配置文件中所有的大写变量名和对应的值 赋值给settings对象'''
                self.SETTINGS_MODULE = settings_module  
        mod = importlib.import_module(self.SETTINGS_MODULE)
        """rom day62_BBS import settings """
        # 循环获取暴露给用户的配置文件中所有的变量名
        for setting in dir(mod):  
            if setting.isupper():  # 判断是否是纯大写
                setting_value = getattr(mod, setting)
                setattr(self, setting, setting_value)  # 给对象设置属性
                
class LazySettings(LazyObject):
    def _setup(self, name=None):
      # 获取暴露给用户的配置文件字符串路径 'day62_BBS.settings'
            settings_module =         os.environ.get(ENVIRONMENT_VARIABLE)  
      # 将上述字符串路径当做参数传给Settings类实例化
      self._wrapped = Settings(settings_module)  
      
settings = LazySettings()

# 给对象设置属性 你可以简单的理解是字典添加键值对
class MyClass(object):
    pass

obj = MyClass()
setattr(obj, 'name', 'jason')  # {'name': 'jason'}
"""
先加载全局配置
    {'name': 'jason', 'pwd': 123, 'hobby': 'red'}
"""
setattr(obj, 'name', 'jasonNB')  # 键存在则替换 {'name': 'jasonNB'}
"""
再加载局部配置
    {'name': 'jasonNB', 'pwd': 123, 'hobby': 'red'}
"""
'''
先加载全局配置文件 后加载局部配置文件 就可以实现
再暴露给用户的配置文件中配置了则用配置的(局部) 没有配置则使用系统默认的(全局)
'''

基于setting源码编程

"""在自己的项目中实现与django配置文件一样的功能"""
模拟一个暴露给用户的配置文件
conf
    --settings.py
模拟一个系统内部默认配置文件
lib
    --conf
      ----global_settings.py
NAME = '我是自定义配置文件的name'

模拟一个系统内部默认的配置文件
lib
  conf
     global_settings.py
# conf class Settings(object): 
    def __init__(self): 
      for name in dir(global_settings): 
        # 判断是否纯大写 
        if name.isupper(): 
        # 根据大写的名字获取值 
        value = getattr(global_settings, name) 
        setattr(self, name, value) 
      # 获取给用户自定义的配置文件字符串路径 
      module_path = os.environ.get('lll') 
      # 根据字符串导入模块 
      module_path = importlib.import_module((module_path)) 
      # 循环获取嘿用户自定义配置文件中的所有名字 
      for name in dir(module_path): 
        if name.isupper(): 
          value = getattr(module_path, name) 
          setattr(self, name, value)
settings = Settings()

# global_settings.py 
NAME = '系统内部默认的配置
NAME' AGE = '系统内部默认的配置
AGE' pwd = '系统默认的配置pwd'

权限管理简介

# web领域的权限
    eg:
    使用账号访问某个资源 有些人可以访问(VIP) 有些人不能访问(普通用户)
  ps:在web领域url其实就是权限 权限就是url
  """本质其实就是当用户登录之后 获取该用户的权限 之后每次用户发送网络请求先核对该请求地址是否在用户可以访问的url列表内 如果在则访问不在拒绝"""

# 权限的设计
  用户表
   id         name           pwd
    1         jason          123
    2         tony           321
    3         kevin          222
  权限表
   id        permission    
    1          添加书籍
    2          查看书籍
    3          编辑书籍
    4          删除书籍
  用户与权限的关系表
   id        user_id            permission_id
    1           1                     1
    2           1                     2    
    3           1                     3
  """上述的权限设计是存在缺陷的 用户数据多了之后与权限的绑定关系在第三张关系表中过于繁杂"""

RBAC

# 基于角色的权限管理
  用户表
       id         name            pwd
        1         jason           123
        2         tony            321
        3         kevin           222
  角色表
       id         role            
        1         CEO
        2         保安
        3         扫地僧
  权限表    
       id        permission          url
        1          添加书籍         /add/book/
        2          查看书籍         /check/book/
        3          编辑书籍         /edit/book/
        4          删除书籍         /delete/book/
  用户角色关系表
       id        user_id            role_id
        1           1                   1
        2           2                   2
  角色权限关系表
       id        role_id         permission_id
        1           1                  1
        2           1                  2    
        3           1                  3
        4           1                  4
  """
  提前在角色和权限关系表中绑定好关系 之后又新用户 
  只有在用户和角色关系表中添加一两条数据即可!!!
  """

权限管理实战

# url权限也不是固定写死的 可能会含有正则表达式
    eg:  
        /edit/book/1/                            /edit/book/(\d+)/
      /edit/book/?edit_id=1            /edit/book/.*
1.编写登陆功能 获取用户的权限并存储
2.校验每次用户访问的url比对是否含有该权限
    自定义中间件
3.有些权限是所有用户都应该具备的
    白名单:里面的东西所有人都可以访问
4.有些url是含有正则的 不能简单的使用成员运算来判断

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
import re


class MyPermission(MiddlewareMixin):
    def process_request(self, request):
        # 定义网站白名单
        white_url_list = ['/login/', '/register/', '/admin/.*']
        # 1.获取当前用户请求的url
        target_url = request.path
        # 1.1.先校验是否在白名单中 是则直接放行
        for url in white_url_list:
            re_path = '^%s$' % url  # 将白名单里面的url变成正则表达式 去校验用户访问的url
            res = re.search(re_path, target_url)
            if res:
                return
        # 2.获取当前用户的权限列表
        permission_list = request.session.get('permission_list')
        # 3.判断当前请求url在不在用户可以访问的url列表中
        '''也需要改成正则校验的方式'''
        # if target_url not in permission_list:
        #     return HttpResponse("不好意思 你没有权限访问")
        for permission in permission_list:
            re_path = '^%s$' % permission  
            res = re.search(re_path, target_url)
            if res:
                return
        return HttpResponse("你没有权限 滚蛋吧!!!")
"""
扩展延伸
    1.黑名单
    2.用户的访问频率
        获取用户的ip地址 然后设置固定的时间内访问次数不能超过多少次
    ...
其实上述的功能我们可以自己写 也有一些有现成的组件帮我们完成
        drf相关功能
"""

admin配置参数

class BookConfig(admin.ModelAdmin):
    list_display = ['title', 'price', 'publish_time']  # 控制展示的字段数量
    list_display_links = ['price']  # 指定调整的字段数据
    search_fields = ['title', 'price']  # 包含+或 查找
    # 回想之前讲解的Q查询进阶用法
    list_filter = ['publish','authors']  # 筛选功能  一般填写外键字段 普通字段没有实际意义
    def patch_init(self,request,queryset):
        queryset.update(price = F('price') + 1000)
    patch_init.short_description = '价格批量处理'
    actions = [patch_init, ]  # 自定义queryset的操作函数


admin.site.register(models.Book, BookConfig)

# admin还有很多其他的功能配置 可以简单参考
https://www.cnblogs.com/Dominic-Ji/p/10444379.html

第三方BUG检测功能

pip3 install django-debug-toolbar
# 参考博客:https://www.cnblogs.com/Dominic-Ji/p/9260182.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
# 图书管理系统说明V2.0 ### 项目介绍及再版说明(2016-01-24) 其实一开始做这个小项目在2014年的9到11月,当时是作为加入Pureweber开发组的大作业完成的。虽然用了两个月的时间,但是做出的东西还是有很多的缺陷。前些日子在整理GitHub时又想起来了这个项目,记得曾经还在Django中国社区里安利初学者来读代码什么的。但是想想里面还有很多不规范的代码和一些很糟糕的写法就感觉很蛋疼。本来想直接删除了好了,但是后来想想,何不花点时间把这个小项目重构一下,就可以给以后学习Django的同学一个完整的项目参考,就可以代替了一般培训课程或者老师上课PPT里那种陈旧或者不完整的例子。 于是一共花费了大约两天时间对项目进行了重构,主要做了以下方面的工作: * 将Django的版本更新到了最新的1.9.1。 * 修改了原先项目中不规范的格式、变量名等。 * 更改了项目的目录结构,换成了Django官方推荐的目录结构模式。 * 将原来缺失的文件上传保存部分补充完整了。 * 更改了用户部分的代码,将原来手动设置session的方式去掉了,替换为Django用户模块默认的登录态保存方式. * 修复了注册用户时用户提交空密码可能造成的安全漏洞。 * 做了对python3的支持。改动不多。 ### 项目所涉及的和Django相关的功能 项目的目的是为了给Django的初学者一个完整项目的参考案例,所以尽可能多的选择了初学者常用的方法处理一些问题,比如在视图的处理上选择了视图处理函数,而不是更好用的视图处理类。在参数传递上只使用了标准的POST和GET的方式传参,而没有使用url地址中提取参数的办法。该项目中主要涉及到的Django框架相关的内容有: * Models模型字段用法,外键关系用法。 [文档](https://docs.djangoproject.com/en/1.9/topics/db/models/) * 使用ORM进行数据库查询。 [文档](https://docs.djangoproject.com/en/1.9/topics/db/queries/) * Urls配置文件的写法,Urls命名与反向查询。 [文档](https://docs.djangoproject.com/en/1.9/topics/http/urls/) * Views视图处理函数。 [文档](https://docs.djangoproject.com/en/1.9/topics/http/views/) * Templates模板。 [文档](https://docs.djangoproject.com/en/1.9/ref/templates/language/) * 在admin站点中注册模型。 [文档](https://docs.djangoproject.com/en/1.9/ref/contrib/admin/) * Django自带用户模块的注册和登录。 [文档](https://docs.djangoproject.com/en/1.9/topics/auth/default/) * 对Django自带的用户模块进行拓展。 [文档](https://docs.djangoproject.com/en/1.9/topics/auth/customizing/) * 静态文件处理。 [文档](https://docs.djangoproject.com/en/1.9/ref/contrib/staticfiles/) * 还有一大堆其他的…… ### 系统说明 * 本系统使用PythonDjango框架搭建。 * 前端部分使用bootstrap。 ### 运行说明 * 请参考Django官方文档[下载](https://www.djangoproject.com/download/)Django1.711.9.1版。 * 请按照Django官方文档[安装](https://docs.djangoproject.com/en/1.9/intro/install/)Django。 * 如果是水果电脑。。。请额外安装[PIL](http://www.pythonware.com/products/pil/)库。 * 通过终端进入项目文件夹。 * 在终端中执行`python manage.py runserver`命令即可运行本地开发服务器。 * 在浏览器里访问`http://127.0.0.1:8000`即可查看该网站。 ### 功能实现 * 实现了用户权限相关的基本操作(注册、登陆、修改密码、注销) * 实现了用户分级(普通用户与管理员用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lamb!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值