Django补充

Django补充

django配置文件相关操作

django实际上有两个配置文件

一个是提供给用户可以自定义的基本配置
    from 项目名 import settings
一个是全局的系统默认的配置
    from django.conf import global_settings
  提示:用户不指定的情况下采用全局的系统默认的配置

配置文件使用的优先级

用户如果在提供给用户的配置文件中指定了配置就使用用户指定的配置,不指定的情况下则使用系统默认的配置

django两个配置文件的关系

提供给用户的配置文件中有的配置,系统配置文件中肯定有
提供给用户的配置文件中没有的配置,系统配置文件中也有

在django中如果想要同时使用两个配置文件的导入方式

from django.conf import settings

基于django配置文件源码编写代码

os.environ

可看成是一个项目全局的大字典,任何地方都可以使用

Django补充

django的入口文件是manage.py

可看成是启动文件

os.environ.setdefault()

相当于给字典添加键值对

Django补充Django补充
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day67.settings")
print(settings.BASE_DIR)  # C:\D_disk\PythonProject\week14\day67,没有添加会报错django.core.exceptions.ImproperlyConfigured: Requested setting BASE_DIR, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

View Code

源码分析

Django补充Django补充
class LazySettings(LazyObject):
"""
    A lazy proxy for either global Django settings or a custom settings object.

    The user can manually configure settings prior to using them. Otherwise,
    Django uses the settings module pointed to by DJANGO_SETTINGS_MODULE.

"""
    def _setup(self, name=None):
"""
        Load the settings module pointed to by the environment variable. This
        is used the first time we need any settings at all, if the user has not
        previously configured the settings manually.

"""
        settings_module = os.environ.get(ENVIRONMENT_VARIABLE)  # 获取提供给用户的配置文件字符串路径 'day67.settings'
        if not settings_module:
            desc = ("setting %s" % name) if name else "settings"
            raise ImproperlyConfigured(
                "Requested %s, but settings are not configured. "
                "You must either define the environment variable %s "
                "or call settings.configure() before accessing settings."
                % (desc, ENVIRONMENT_VARIABLE))

        self._wrapped = Settings(settings_module)   # 将上述字符串路径当做参数传给Settings类实例化

class Settings(object):
    def __init__(self, settings_module):
        # update this dict from global settings (but only for ALL_CAPS settings)
        for setting in dir(global_settings):  # 获取系统配置文件中所有的变量名
            if setting.isupper():   # 校验变量名是否是纯大写
                setattr(self, setting, getattr(global_settings, setting))  # 给settings对象赋值通过反射获取到的系统配置文件中所有的大写变量名和对应的值

        # store the settings module in case someone later cares
        self.SETTINGS_MODULE = settings_module  # 存储设置模块,后面可能用到

        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)  # 给对象设置属性

View Code

基于setting源码编程

Django补充Django补充
启动文件
import sys
import os

sys.path.append(os.path.dirname(__file__))
if __name__ == '__main__':
    os.environ.setdefault('user_setting', 'conf.settings')
    from conf import settings
    print(settings.ATTRIBUTE_NAME)
    from lib.conf import global_settings
    print(global_settings.ATTRIBUTE_NAME)
    from lib.conf import setting
    print(setting.ATTRIBUTE_NAME)
用户配置文件
ATTRIBUTE_NAME = '用户设置中的属性'
全局配置文件
ATTRIBUTE_NAME = '全局设置中的属性'
init__.py
import importlib
import os
from lib.conf import global_settings

class Settings(object):
    def __init__(self):
        for setting_name in dir(global_settings):
            if setting_name.isupper():
                values = getattr(global_settings, setting_name)
                setattr(self, setting_name, values)
        user_module_path = os.environ.get('user_setting')
        settings = importlib.import_module(user_module_path)
        for name in dir(settings):
            if name.isupper():
                settings_values = getattr(settings, name)
                setattr(self, name, settings_values)

setting = Settings()

View Code

Django补充

Django补充

权限管理简介

web领域的权限

使用账号访问某个网站资源,有些用户可以访问(VIP),有些用户不能访问(普通用户)。web领域的权限关键在url,当用户登录之后获取该用户的权限,然后用户每次发送网络请求先核对该请求地址是否在用户可以访问的url列表内,如果在url列表则允许访问,不在则拒绝访问。

权限的设计

用户表

idnamepassword 1 linda qwe 2 simon qaz 3 sam wsx 4 tom edc

权限表

idpermissin 1 添加书籍 2 查看书籍 3 编辑书籍 4 删除书籍

用户与权限关系表

iduserIdpermissionId 1 1 1 2 1 2 3 1 3 4 1 4 5 2 2 6 3 2

上述的权限设计是存在缺陷的,用户数据量比较大的时候与权限的绑定关系在第三张关系表中过于臃肿

基于角色的权限管理(RBAC)

提前在角色和权限关系表中绑定好关系,之后有新用户只需在用户和角色关系表中添加一两条数据

用户表

idnamepassword 1 linda qwe 2 simon qaz 3 sam wsx 4 tom edc

角色表

idrole 1 admin 2 user

权限表

idpermissinurl 1 添加书籍 /add/book/ 2 查看书籍 /check/book/ 3 编辑书籍 /modify/book/ 4 删除书籍 /delete/book/

用户角色关系表

iduserIdroleId 1 1 1 2 1 2 3 1 2 4 1 2 5 2 2 6 3 2

角色权限关系表

idroleIdpermissionId 1 1 1 2 1 2 3 1 3 4 1 4 5 2 2

权限管理案例

Django补充Django补充
app01\permissions\mypermission.py
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
import re

class MyPermission(MiddlewareMixin):
    def process_request(self, request):

        # 定义网站白名单
        white_url_list = ['/home/', '/check_book/', '/login/', '/logout/', '/register/', '/admin/.*']
        # 获取当前用户请求的url
        target_url = request.path
        # 先校验是否在白名单中,是则直接放行
        for url in white_url_list:
            re_path = '^%s$' % url
            res = re.search(re_path, target_url)
            if res:
                return
        # 获取当前用户的权限列表
        permission_list = request.session.get('permission_list')
        for permission in permission_list:
            re_path = '^%s$' % permission
            res = re.search(re_path, target_url)
            if res:
                return
        return HttpResponse(f'没有权限'
                            '返回主页'
app01\models.py
from django.db import models

Create your models here.

图书表
class Book(models.Model):
    book_title = models.CharField(max_length=64, verbose_name='图书名')
    book_price = models.DecimalField(max_digits=6, decimal_places=2, verbose_name='图书价格')
    publish_time = models.DateField(auto_now=True, verbose_name='出版日期')
    publish = models.ForeignKey(to='Press', null=True)
    authors = models.ManyToManyField(to='Author')
    stock_amount = models.IntegerField(default=5000)
    sale_amount = models.IntegerField(default=2000)

    def __str__(self):
        return "%s-图书对象" % self.book_title

出版社表
class Press(models.Model):
    press_name = models.CharField(max_length=64, verbose_name='出版社名称')
    press_addr = models.CharField(max_length=64, verbose_name='出版社地址')

    def __str__(self):
        return "%s-出版社对象" % self.press_name

作者表
class Author(models.Model):
    author_name = models.CharField(max_length=64, verbose_name='作者姓名')
    author_age = models.IntegerField(verbose_name='作者年龄')
    author_details = models.OneToOneField(to='AuthorDetail')

    def __str__(self):
        return "%s-作者对象" % self.author_name

作者详情表
class AuthorDetail(models.Model):
    author_addr = models.CharField(max_length=64, verbose_name='作者地址')
    author_phone = models.BigIntegerField(verbose_name='作者联系方式')

    def __str__(self):
        return "%s-作者详情对象" % self.author_addr

用户表
class User(models.Model):
    uid = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    roles = models.ManyToManyField(to='Role')

    def __str__(self):
        return self.name

角色表
class Role(models.Model):
    rid = models.IntegerField(primary_key=True)
    role_name = models.CharField(max_length=32)
    permission = models.ManyToManyField(to='Permission')

    def __str__(self):
        return self.role_name

权限表
class Permission(models.Model):
    pid = models.IntegerField(primary_key=True)
    permission_name = models.CharField(max_length=32)
    url = models.CharField(max_length=64)

    def __str__(self):
        return self.permission_name

View Code

点击查看app01\views.py代码

Django补充

Django补充

Django补充

admin配置类重要参数和admin源码

Django补充Django补充
from django.contrib import admin
from app01 import models

Register your models here.

class PressInline(admin.StackedInline):  # TabularInline
    extra = 0
    model = models.Press

class Bookconfig(admin.ModelAdmin):
    list_display = [
        'book_title',
        'book_price',
        'stock_amount',
        'sale_amount',
    ]  # 控制字段展示
    # list_display_links = ['stock_amount']  # 控制修改字段
    search_fields = ['book_title', 'book_price']  # 指定搜索字段
    list_filter = ['publish', 'authors']  # 指定筛选字段(外键)
    list_editable = ['stock_amount']  # 指定可以在列表时编辑的列
    # list_select_related = ['publish']
    # inlines = ['PressInline', ]

    def patch_init(self, arg, queryset):
        from django.db.models import F
        queryset.update(stock_amount=F('stock_amount') + 100)
    patch_init.short_description = '进货100本'

    def sale_init(self, arg, queryset):
        from django.db.models import F
        queryset.update(sale_amount=F('sale_amount') - 100)
    sale_init.short_description = '销售100本'
    actions = [patch_init,
               sale_init,
               ]

admin.site.register(models.Book, Bookconfig)
admin.site.register(models.Press, PressInline)

View Code

Django补充

Django补充

Django补充

Django补充

Django补充

第三方bug检测功能

安装

pip3 install django-debug-toolbar

配置

settings.py

将debug_toolbar在INSTALL_APPS里注册

INSTALLED_APPS = [
    'debug_toolbar',
]

urls.py

from django.conf import settings
from django.conf.urls import include, url

if settings.DEBUG:
    import debug_toolbar
    urlpatterns = [
        url(r'^__debug__/', include(debug_toolbar.urls)),
    ] + urlpatterns

settings.py

在中间件中注册DebugToolbarMiddleware

MIDDLEWARE = [
    'debug_toolbar.middleware.DebugToolbarMiddleware',
]

本机调试的设置方法

需要将地址127.0.0.1加入INTERNAL_IPS

settings.py
INTERNAL_IPS = ['127.0.0.1', ]

配置jQuery的URL

在settings.py中配置
django-debug-toolbar默认使用Google的地址

JQUERY_URL = '//ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js'

国内可以修改地址

DEBUG_TOOLBAR_CONFIG = {
    "JQUERY_URL": '//cdn.bootcss.com/jquery/2.2.4/jquery.min.js',
}

Django补充

Django补充

Original: https://www.cnblogs.com/zzs0626/p/16362535.html
Author: 顺溜_7
Title: Django补充

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582426/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Nginx笔记

    实现负载均衡 这里采用的是权重 进入配置文件目录cd /usr/local/nginx/conf/ //实际根据自己的目录来 编辑vim nginx.conf 根据需要在此代码的顶…

    Linux 2023年5月27日
    0103
  • 回溯法:算法思路以及相关流程图的绘制

    参考建模原文2020国赛B题参考文章1 回溯法介绍 深度优先搜索(缩写DFS):对一个连通图进行遍历的算法。它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标…

    Linux 2023年6月14日
    093
  • NoteOfMySQL-08-视图

    视图是从一个表或多个表中导出的表,是一种虚拟存在的表,不占用存储空间。视图可以使用户的操作更方便,并且可以保障数据库系统安全性。 1. 视图概述 视图中保存的仅仅是一条select…

    Linux 2023年6月14日
    087
  • 由乐观锁延伸出的知识

    锁是网络数据库中的一个非常重要的概念,当多个用户同时对数据库并发操作时,会带来数据不一致的问题,所以,锁主要用于多用户环境下保证数据库完整性和一致性以商场的试衣间为例,每个试衣间都…

    Linux 2023年6月7日
    082
  • Redis的快照持久化-RDB与AOF

    Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边。 数据保存到硬盘的过程就称为&#822…

    Linux 2023年5月28日
    0106
  • Java 注解及其底层原理

    什么是注解? 注解的分类 Java自带的标准注解 元注解 @Retention @Documented @Target @Inherited @Repeatable 自定义注解 自…

    Linux 2023年6月6日
    0135
  • 天气干燥怎么防止被静电电到

    可以摸一下墙壁或地板,把电放掉,这样摸门把手之类的金属物品就不会被电到了。 可以摸一下墙壁或地板,把电放掉,这样摸门把手之类的金属物品就不会被电到了。亲身实践,十分有效。只是摸墙和…

    Linux 2023年6月6日
    099
  • openssh升级至7.2

    此处升级操作的原则是保留系统原有ssh服务,新安装高版本ssh服务 1、下载openssh源码包 http://www.openssh.com/portable.html 2、安装…

    Linux 2023年6月14日
    0107
  • 企业项目开发流程

    企业项目开发流程 商城 1.1 B2C 直销商城 商家与会员直接交易 ( Business To Customer ) 1.2 B2B 批发商城 商家与商家直接交易 1.3 B2B…

    Linux 2023年6月14日
    099
  • RHCSA阶段笔记

    命令终端字段含义介绍 [root@localhost ~]# 解释: root:当前登录系统用户名(root超级管理员) localhost :当前主机名 :当前用户所在目录( 为…

    Linux 2023年6月14日
    096
  • 【深度学习】PyTorch Dataset类的使用与实例分析

    Dataset类 介绍 当我们得到一个数据集时,Dataset类可以帮我们提取我们需要的数据,我们用子类继承Dataset类,我们先给每个数据一个编号(idx),在后面的神经网络中…

    Linux 2023年6月13日
    099
  • docker compose容器编排

    Docker Compose (可简称Compose)是一个定义与运行复杂应用程序的 Docker 工具,是 Docker 官方 编排&…

    Linux 2023年6月8日
    0104
  • 错误域控降级导致解析问题

    近两天在给分部安装辅助域控的时候,总是安装不成功,或者安装时成功了但是无法复制主域或者其他域控的信息,同步失败,还有就是它一直没有网。 解决方案 经过排查发现域名dns解析不对,经…

    Linux 2023年6月8日
    0120
  • VMware Workstation 16.2 Pro for Linux SLIC 2.6 & Unlocker

    macOS Unlocker,支持 macOS Monterey 请访问原文链接:VMware Workstation 16 Pro Unlocker & OEM BIOS…

    Linux 2023年5月27日
    096
  • springBoot2.*使用redis集群/单机方法

    Lettuce 和 Jedis 的定位都是Redis的client,所以他们当然可以直接连接redis server。 Jedis在实现上是直接连接的redis server,如果…

    Linux 2023年5月28日
    0119
  • 辗转相除法:(求最大公约数)

    辗转相除法:(最大公约数)又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除…

    Linux 2023年6月7日
    0119
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球