首页 > 其他分享 >Django静态文件系统之meida文件,Django配置文件介绍,RBAC权限系统

Django静态文件系统之meida文件,Django配置文件介绍,RBAC权限系统

时间:2024-07-12 20:19:43浏览次数:8  
标签:角色 配置文件 settings 静态 用户 Django RBAC setting 权限

Ⅰ Django静态文件系统之meida文件

【一】问题引入

  • 一般常用的静态文件:static
  • 但是,媒体文件:图片,视频,音频……
  • 会随着用户改变而改变,不应该作为静态文件来使用
  • 应该是媒体资源
  • 于是Django提供了另一种静态文件语法meida文件

【二】配置使用

  • 在Django的settings里面 DEBUG —>开发者模式:报错会展示报错信息
  • 如果要使用静态资源就需要开启debug
  • 但是生产环境中应该关闭 debug模式 —>静态资源就用不了了
  • 还想用静态资源 –> 有其他的技术手段可以帮助我们转发静态资源—> nginx

【三】STATIC语法

【1】开启DEBUG语法

# 开发者模式 按CTRL+s 会自动重启
# 如果报错就会提示完整的错误信息
# 如果变成FALSE 前端只会显示404
DEBUG = True

【2】在settings中进行配置

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.0/howto/static-files/
# 静态文件路由地址
STATIC_URL = 'static/'


# 加一个静态文件路径 用来配置我们自己定义的静态文件资源路径的
STATICFILES_DIRS = [
    # 如果不加这句话 静态资源在加载的时候只能加载 app下面的静态文件资源
    # 加了之后,就能加载到根目录下的静态文件资源了
    os.path.join(BASE_DIR, 'static')
]

【四】MEDIA文件

【1】media文件配置

# media 资源配置
MEDIA_URL = '/media/'

# 仿照上面配置media的资源路径
MEDIA_ROOT = [
    # 如果不加这句话 静态资源在加载的时候只能加载 app下面的静态文件资源
    # 加了之后,就能加载到根目录下的静态文件资源了
    os.path.join(BASE_DIR, 'media')
]

【2】配置路由映射规则

  • 固定写法 media
from django.urls import path,re_path
from django.views.static import serve

urlpatterns = [
    re_path(
        # url路径
        '^media/(?P<path>.*)', 
        
        # 使用django的服务系统
        serve, 
        
        # media 文件夹的路径
        {"document_root": settings.MEDIA_ROOT}
           ),
]
  • 使用path 也能配置
from django.urls import path,re_path
from django.views.static import serve

urlpatterns = [
    path(
        # url 路径
        "media/<path:path>",
        # 使用Django的服务系统
        serve,
        # media 文件夹的路径
        {"document_root": settings.MEDIA_ROOT}
    ),
]

【3】使用

  • models.py
  • 重点是在媒体对象
from django.db import models
from django.contrib.auth.models import AbstractUser


class User(AbstractUser):
    permission = models.ManyToManyField(
        to="Permission"
    )

    class Meta:
        db_table = "user"



class Book(models.Model):
    title = models.CharField(
        max_length=255
    )
    price = models.IntegerField(

    )

    # 以前 文件的路径是使用  CharField
    # 存的内容是当前 这张图片的静态资源路径
    # /static/avatar/default.png/
    # ImageField 使用前先安装 Pillow 模块
    # pip install pillow
    img = models.ImageField(
        # 会自动将文件上传到 /media/book/
        upload_to="book",
        verbose_name="图书封面",
        help_text="图书封面"
    )

    del_tag = models.BooleanField(default=False)

    class Meta:
        db_table = "book"


class Permission(models.Model):
    permission_name = models.CharField(max_length=255, verbose_name="权限名称")

    class Meta:
        db_table = "permission"

Ⅱ Django配置文件介绍

【一】来自于 django.conf里面的settings

  • 写每一个项目的时候肯定都要有配置文件
  • 研究 django.conf有哪些特殊的地方

【二】入口

  • from django.conf import settings
  • 进入源码中 发现 settings 其实是 LazySettings 类的对象
settings = LazySettings()
  • from django.conf import settings 从这里进去源码
  • from django.conf import global_settings
# 将 全局 的global_settings 先加载到 setting 对象中
# 然后 在将自己 定义的  settings.py 文件里面的所有参数加载进去
# 最后就将所有的配置项加载到 全局的 setting 对象中了
class Settings:
    def __init__(self, settings_module):
        # 更新全局的global settings 配置
        # update this dict from global settings (but only for ALL_CAPS settings)
        # 从global_settings 遍历每一个参数项
        # dir(global_settings) dir 查看变量的属性名

        for setting in dir(global_settings):
            # 将每一个参数键 大写
            if setting.isupper():
                # setattr设置值
                setattr(self, setting, getattr(global_settings, setting))
		...
         ...
        
        # 遍历每一个参数项 来自于你自己定义的配置项参数名
        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.py 改为自己想取的名字 如:develop.py

【1】直接启动项目会报错

ModuleNotFoundError: No module named 'DjangoProjectLast.develop'

【2】第一步修改 manage.py main 下面的第一行代码

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DjangoProjectLast.develop')

【3】原本的启动配置不生效

(1)方案一 删除原本的配置新增一个配置

(2)方案二 主动修改 settings 文件启动位置

Ⅲ RBAC权限系统

【一】什么是RBAC

【1】概念

  • RBAC 是基于角色的访问控制(Role-Based Access Control )
  • 在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。
  • 这就极大地简化了权限的管理。
  • 这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便。

【2】应用

  • RBAC - Role-Based Access Control
  • Django的 Auth组件 采用的认证规则就是RBAC

(1)内部系统

  • 专门做人员权限管理的系统(CRM系统)都是公司内部使用
    • 所以数据量都在10w一下,一般效率要求也不是很高

(2)用户分类

  • 用户量极大的常规项目,会分两种用户:
    • 前台用户(三大认证)
    • 后台用户(BRAC来管理)

(3)结论

  • 没有特殊要求的Django项目可以直接采用Auth组件的权限六表
  • 不需要自定义六个表,也不需要断开表关系,单可能需要自定义User表

【3】前后台权限控制

  • (1)后台用户对各表操作,是后台项目完成的
    • 我们可以直接借助admin后台项目(Django自带的)
  • (2)后期也可以用xadmin框架来做后台用户权限管理
  • (3)前台用户的权限管理如何处理
  • 定义了一堆数据接口的视图类
    • 不同的登录用户是否能访问这些视图类,能就代表有权限,不能就代表无权限
  • 前台用户权限用drf框架的
    • 三大认证

【二】RBAC0模型

简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。

RBAC0模型如下:

这是权限最基础也是最核心的模型,它包括用户/角色/权限,其中用户和角色是多对多的关系,角色和权限也是多对多的关系。

用户是发起操作的主体,按类型分可分为2B和2C用户,可以是后台管理系统的用户,可以是OA系统的内部员工,也可以是面向C端的用户,比如阿里云的用户。

角色起到了桥梁的作用,连接了用户和权限的关系,每个角色可以关联多个权限,同时一个用户关联多个角色,那么这个用户就有了多个角色的多个权限。有人会问了为什么用户不直接关联权限呢?

在用户基数小的系统,比如20个人的小系统,管理员可以直接把用户和权限关联,工作量并不大,选择一个用户勾选下需要的权限就完事了。

但是在实际企业系统中,用户基数比较大,其中很多人的权限都是一样的,就是个普通访问权限,如果管理员给100人甚至更多授权,工作量巨大。

这就引入了"角色(Role)"概念,一个角色可以与多个用户关联,管理员只需要把该角色赋予用户,那么用户就有了该角色下的所有权限,这样设计既提升了效率,也有很大的拓展性。

一句话概括就是:权限系统维护的是人和可进行行为的关联关系。

页面权限:即用户登录系统可以看到的页面,由菜单来控制,菜单包括一级菜单和二级菜单,只要用户有一级和二级菜单的权限,那么用户就可以访问页面

操作权限: 即页面的功能按钮,包括查看、新增、修改、删除、审核等,用户点击删除按钮时,后台会校验用户角色下的所有权限是否包含该删除权限,如果是,就可以进行下一步操作,反之提示无权限。有的系统要求"可见即可操作",意思是如果页面上能够看到操作按钮,那么用户就可以操作,要实现此需求,这里就需要前端来配合,前端开发把用户的权限信息缓存,在页面判断用户是否包含此权限,如果有,就显示该按钮,如果没有,就隐藏该按钮。某种程度上提升了用户体验,但是在实际场景可自行选择是否需要这样做。

数据权限:数据权限就是用户在同一页面看到的数据是不同的,比如财务部只能看到其部门下的用户数据,采购部只看采购部的数据,在一些大型的公司,全国有很多城市和分公司

标签:角色,配置文件,settings,静态,用户,Django,RBAC,setting,权限
From: https://www.cnblogs.com/zyb123/p/18299318

相关文章

  • 【VMware ESXi】使用PowerCLI脚本批量备份ESXi主机的配置文件。
    根据VMwareKB2042141知识库文章,SSH登录到ESXi主机,可以使用下面的命令用于备份和还原ESXi主机的配置文件。但是,这个方法需要手动登录到每个ESXi主机,并通过浏览器链接下载配置文件,显然不是很方便。备份vim-cmdhostsvc/firmware/sync_configvim-cmdhostsvc/firmwar......
  • 【Django5】视图的定义与使用
    系列文章目录第四章视图的定义与使用文章目录系列文章目录一、视图定义二、设置视图响应状态实例一:HttpResponse实例二:HttpResponseNotFound404实例三:JsonResponse响应json数据总结一、视图定义视图(Views)是Django的MTV框架模式的V部分,主要负责处理用户请求......
  • 深入解析Spring Boot的application.yml配置文件
    目录引言SpringBoot配置文件简介application.yml的优点基本结构与语法YAML语法基础SpringBoot中application.yml的基本结构常见配置项详解服务器配置数据源配置日志配置其他常见配置环境配置与Profile多环境配置激活Profile高级配置与技巧属性的占位符替换自定......
  • 使用 Django 框架进行开发的基本模板
    一、安装Djangopipinstalldjango二、创建Django项目使用命令创建一个新的Django项目,将在当前目录下创建一个名为 myproject 的目录,其中包含初始的Django项目结构。django-adminstartprojectmyproject三、创建Django应用进入项目目录后,创建一个新的应......
  • Python毕业设计(四十八)、基于Python+Django+Vue的美食推荐系统
    如需要可私信或评论区留言!!!如需要可私信或评论区留言!!!如需要可私信或评论区留言!!!一、项目介绍        美食推荐系统分为前端用户端和后台管理系统。        用户端包括注册登录、查看系统推荐菜品列表、全部菜品列表、按分类筛选菜品、查看菜品统计分析、查......
  • Django学习收尾
     启动项目命令pythonmanage.pyrunserver文件上传功能实现title="Form上传"ifrequest.method=="GET":form=UpForm()returnrender(request,'upload_form.html',{"form":form,"title":title})......
  • Django学习第五天
     启动项目命令pythonmanage.pyrunserver图像验证码生成随机字母或者数字importrandomfromPILimportImage,ImageDraw,ImageFont,ImageFilterdefcheck_code(width=120,height=40,char_length=5,font_file='ZixunHappyBold.ttf',font_size=28):code=......
  • IDEA社区版搭建Spring工程(04-加载配置文件及加解密)
    SpringMVC加载配置文件的几种方式通过context:property-placeholde实现加载配置文件在springmvc.xml配置文件里加入context相关引用<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:conte......
  • 21、Django-缓存(强缓存和协商缓存)-@cache-page()装饰器
    定义:缓存是一类可以更快的读取数据的介质的统称、也指其它可以加快数据读取的存储方式、一般用来存储临时数据、常用介质的是读取速度很快的内存意义:视图渲染有一定的成本、数据库的频繁查询过高、所以对于低频变动的页面可以考虑使用缓存技术、减少实际渲染的次数、用户拿到相......
  • 20、Django-会话-cookie和session-2
    session是在服务器上开辟一段空间用于保留和服务器交互时的重要数据实现方式:--使用session需要在浏览器客户端启动cookie、且在cookie中存储session--每个客户端都可以在服务器端有一个独立的session--注意:不同的请求者之间不会共享这个数据、与请求者一一对应......