Django配置管理settings文件配置

Posted 我辈李想

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django配置管理settings文件配置相关的知识,希望对你有一定的参考价值。

文章目录


前言

Django框架是python的一个web框架,可以使用丰富的python的库。settings.py文件无论是本地开发还是环境部署都是经常使用的文件,如果settings没有配置好,开发将困难重重。很多时候环境代码正常,一个参数就能决定了你的成败。


一、settings基础配置

作为python语言,我们默认遵循PEP8编码规范,settings文件配置也是一样。

参数描述
BASE_DIR项目目录,django版本不同使用不同的获取方式
SECRET_KEY项目密钥,项目创建时随机生成,应为唯一的、不可预测的值,用于sessions 、messages 、密码生成和验证,加密规则等
DEBUG调试模式,涉及到django很多默认设置,影响具体参数的使用
ALLOWED_HOSTS可以服务的主机/域名的字符串列表,DEBUG = False时,需要设置参数
INSTALLED_APPS启用的所有应用程序的字符串列表,遵循引用顺序,与Django框架整体功能相匹配
MIDDLEWARE中间件列表,涉及程序的入站reuqest和出站response,以及自定中间件(访问记录、全局异常处理)
ROOT_URLCONFdjango项目所有url开始的位置,urlconf
AUTH_USER_MODEL项目用户的模型,用户models继承AbstractUser时需要修改
TEMPLATES模板引擎的设置的列表,views中render等相关html引用的基础
WSGI_APPLICATIONdjango内置服务,runserver的启动参数
DATABASES数据库的设置,默认为sqlite3,其他数据库需要自己配置
AUTH_PASSWORD_VALIDATORS检查用户密码强度的验证程序列表
LANGUAGE_CODE语言,默认英语
TIME_ZONE时区,将作用于数据库的时间字段
USE_I18NDjango的翻译系统
USE_L10N数据的本地化格式,作用于datetime和time
USE_TZ时区感知,将作用于数据库的时间字段
STATIC_URL静态请求url中的路径,http://www.example.com/static/
STATICFILES_DIRS项目中静态文件的位置,可以是相对位置,亦可以是绝对位置,在 collectstatic时将这些静态文件收集到STATIC_ROOT
STATIC_ROOT静态文件的绝对路径,其中 collectstatic 将收集静态文件到STATIC_ROOT以进行部署
MEDIA_URL媒体请求url中的路径,http://www.example.com/media/
MEDIA_ROOT媒体文件的绝对路径
DEFAULT_AUTO_FIELD用于没有字段的模型的默认主键字段,类型 primary_key=True ,models的默认自增的id
LOGGING日志配置,常用字典结构

二、django默认配置

如果Django设置文件不需要定义任何设置。每个设置都有一个合理的默认值。这些默认值位于模块中 django/conf/global_settings.py。

三、django标准配置

django的全部配置可参考链接:django文档
常用的标准配置包括邮箱配置、缓存配置、日志配置、session配置等

四、django第三方配置

1.使用三方配置

在实际开发过程中,我们会使用很多第三方配置,比如前后端分离项目,后端使用django+drf,drf的配置是一个常用的配置

django项目的settings文件
# drf配置  
REST_FRAMEWORK = 
    # 认证:微信认证
    "DEFAULT_AUTHENTICATION_CLASSES": [
        'utils.jwt_auth.JWTAuthentication',  # 自定义JWT认证
        # 'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        # 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ]

# jwt配置
JWT_AUTH = 
    # 过期时间
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
    'JWT_AUTH_HEADER_PREFIX': 'JWT',  # 设置在请求头中的前缀,之前是通过请求体来做的,这里有所区别,默认为JWT
    # 'JWT_RESPONSE_PAYLOAD_HANDLER': 'user.utils.my_payload_response.jwt_response_payload_handler', # 重写返回字段

# oracle数据库:服务端位置
Oracle_path = os.path.join(BASE_DIR, 'utils', 'instantclient_21_6')

2.自建django三方库,如何使用配置


如果有需要写自己的django第三方库,我们希望使用我们的同学在django项目的settings中设置参数,同时三方库可以使用这个配置。上述图片是我写的一个第三方django库,实现了抖音飞书应用的对外api的封装,在飞书官网文档和示例以及其他库的基础上做的,起初把这个项目是要在django项目中应用。django封装飞书api接口

2.1自建settings文件

这个主要是在自己的三方库中建了一个setting文件,主要是from django.conf import settings和APISettings。DEFAULTS 是默认参数,如果django项目setting中没有设置FEISHU_V2_SDK_CONFIGS,建使用DEFAULTS 中的默认值。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
from enum import Enum
from django.conf import settings

logger = logging.getLogger("feishu")

# 环境变量名
DEFAULTS = 
    'FEISHU_TOKEN_EXPIRE_TIME': 7200,  # token时效, https://open.feishu.cn/document/ukTMukTMukTM/uIjNz4iM2MjLyYzM
    'FEISHU_TOKEN_UPDATE_TIME': 600,  # token提前更新的时间
    'FEISHU_BATCH_SEND_SIZE': 200,  # 批量发送消息列表的大小限制
    'FEISHU_APP_ID': None,
    'FEISHU_APP_SECRET': None,
    'FEISHU_VERIFY_TOKEN': None,
    'FEISHU_ENCRYPT_KEY': None



class APISettings:
    def __init__(self, defaults=None):
        self.defaults = defaults or DEFAULTS
        self.user_settings = getattr(settings, 'FEISHU_V2_SDK_CONFIGS', None)  # CKEditor 5 configuration in settings

    def __getattr__(self, attr):
        if attr not in self.defaults:
            raise AttributeError("Invalid API setting: '%s'" % attr)

        try:
            # Check if present in user settings
            val = self.user_settings[attr]
        except KeyError:
            # Fall back to defaults
            val = self.defaults[attr]
        # Cache the result
        setattr(self, attr, val)
        return val


api_settings = APISettings(DEFAULTS)


# try:
#     if settings.FEISHU_APP_ID:
#         FEISHU_APP_ID = settings.FEISHU_APP_ID
#     if settings.FEISHU_APP_SECRET:
#         FEISHU_APP_SECRET = settings.FEISHU_APP_SECRET
#     if settings.FEISHU_ENCRYPT_KEY:
#         FEISHU_ENCRYPT_KEY = settings.FEISHU_ENCRYPT_KEY
#     if settings.FEISHU_VERIFY_TOKEN:
#         FEISHU_VERIFY_TOKEN = settings.FEISHU_VERIFY_TOKEN
#     if settings.FEISHU_TOKEN_EXPIRE_TIME:
#         FEISHU_TOKEN_EXPIRE_TIME = settings.FEISHU_TOKEN_EXPIRE_TIME
#     if settings.FEISHU_TOKEN_UPDATE_TIME:
#         FEISHU_TOKEN_UPDATE_TIME = settings.FEISHU_TOKEN_UPDATE_TIME
#     if settings.FEISHU_BATCH_SEND_SIZE:
#         FEISHU_BATCH_SEND_SIZE = settings.FEISHU_BATCH_SEND_SIZE
# except Exception as e:
#     logger.debug(f"导入飞书应用和事件的配置出现报错(%s),请查看settings配置" % e)


class AppType(str, Enum):
    TENANT = "tenant"  # 企业自建应用
    USER = "user"  # 第三方应用

2.2三方库中其他文件调用django项目settings


2.3三方库使用

这个可以参考上边的接口md文档。

五、参数详情

1.DEBUG管理

DEBUG配置虽然是一个布尔参数,但是在django配置起到至关重要的作用,很多参数都是跟DEBUG挂钩的。很多时候我们的参数未生效都是跟这个参数有关。比如ALLOWED_HOSTS、runserver命令、不同系统环境文件位置等。
一般的本地开发和测试环境DEBUG=True,线上环境DEBUG=False

2.静态配置

我这里主要举例常用的2中方式:本地开发、线上部署。
我们的静态文件通常都是在项目manage.py的同级目录下建立的static文件夹,或者项目app下的static文件夹。
在本地开发时,我们可能不需要使用命令收集静态文件。

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
    os.path.join(BASE_DIR, 'app','static'),
]

在部署线上时,通常静态文件和项目文件时分离的,就是静态文件和项目文件的权限不同,服务器的存储位置不同。静态文件通常用于nginx静态转发,django后端时端口转发。STATICFILES_DIRS记录所有静态文件的位置,collectstatic命令将STATICFILES_DIRS记录的静态文件收集到STATIC_ROOT文件下,用于nginx静态转发,linux系统部署时通常是/var/www/static/。

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
    os.path.join(BASE_DIR, 'app','static'),
]
STATIC_ROOT = '/var/www/static/'

注意:如果是在windows部署的前后端不分离项目,并且没有使用iis而是使用python manage.py runsever,通常会出现静态文件不显示的问题(收集静态文件也不起作用)

3.本地化国际化(翻译)

django开发中,常用的是本地化配置,主要是LANGUAGE_CODE 、TIME_ZONE、USE_L10N 和USE_TZ

LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
USE_L10N = True
USE_TZ = False

在需要实现双语翻译的系统时,还需要在上述参数的基础上配置USE_I18N、LOCALE_PATHS 、LANGUAGES ,并且需要将要翻译的字符串添加标记(_(‘要翻译的内容’)),还需执行命令python manage.py makemessages -l en生成.po文件(交给翻译人员双语翻译),执行python manage.py compilemessages将.po文件转成.mo文件。

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'language'),
)
LANGUAGES = (
    ('en', 'English'),
    ('zh', '中文简体'),
)

LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

4.如有其他可在评论区回复

六、问题处理

1.项目部署不显示静态文件

如果是在windows部署的前后端不分离项目,并且没有使用iis而是使用python manage.py runsever,通常会出现静态文件不显示的问题(收集静态文件也不起作用)

静态文件可以通过2中方式显示:一是将DEBUG设为True(一般线上部署都改成了False,不建议使用这种);二是启动命令增加参数,正确的启动命令是python manage.py runsever --insecure。详见django文档

django配置超级管理员

Admin站点管理:
    概述:
        内容发布:负责添加,修改,删除内容的
        公告访问
    配置Admin应用:
        在settings.py文件中的INSTALLED_APPS中添加‘django.contrib.admin‘,
        这条默认是添加好的。
    创建管理员用户:
        在项目目录下执行 python manage.py createsuperuser
        依次输入账号名,邮箱,密码即可完成用户创建
    登陆:
        http://127.0.0.1:8000/admin/
    汉化:
        把projectsettings.py
        中作如下设定:LANGUAGE_CODE = ‘zh-Hans‘
                     TIME_ZONE = ‘Asia/Shanghai‘
管理数据表:
    修改 myAPPadmin.py 如下:
        from django.contrib import admin
        # Register your models here.
        from .models import Grades, Students
        # 注册
        admin.site.register(Grades)
        admin.site.register(Students)
    自定义管理页面:
        属性说明
            # 列表页属性
            list_display = [] # 显示字段设置
            list_filter = [] # 过滤字段设置
            search_fields = [] # 搜索字段设置
            list_per_page = [] # 分页设置
            # 添加,修改页属性
            fields = [] # 规定属性的先后顺序
            fieldsets = [] # 给属性分组 注意:fields与fieldsets不能同时使用
        属性示例:
            # 列表页属性
            list_display = [‘pk‘, ‘gname‘, ‘gdate‘, ‘ggirlnum‘, ‘gboynum‘, ‘isDelete‘]
            list_filter = [‘gname‘]
            search_fields = [‘gname‘]
            list_per_page = 5
            # 添加,修改页属性
            # fields = [‘ggirlnum‘, ‘gboynum‘, ‘gname‘, ‘gdate‘, ‘isDelete‘]
            fieldsets = [
                ("num",{"fields":[‘ggirlnum‘, ‘gboynum‘]}),
                ("base", {"fields":["gname", "gdate", "isDelete"]}),
            ]
        关联对象:需求:在创建一个班级时可以直接添加几个学生
            class StudentsInfo(admin.TabularInline):# 可选参数admin.StackedInline
                model = Students
                extra = 2
            class GradesAdmin(admin.ModelAdmin):
                inlines = [StudentsInfo]
        布尔值显示问题示例:
            class StudentsAdmin(admin.ModelAdmin):
                def gender(self):
                    if self.sgender:
                        return "男"
                    else:
                        return "女"
                # 设置页面列的名称
                gender.short_description = "性别"
                list_display = [‘pk‘, ‘sname‘, ‘sage‘, gender,
                                ‘scontend‘, ‘sgrade‘, ‘isDelete‘]
                list_per_page = 10
            admin.site.register(Students, StudentsAdmin)
        执行按钮位置:
            class StudentsAdmin(admin.ModelAdmin):
                ...snip...
                actions_on_top = False
                actions_on_bottom = True
            admin.site.register(Students, StudentsAdmin)
        使用装饰器完成注册:
            @admin.register(Students)
                class StudentsAdmin(admin.ModelAdmin):
                    def gender(self):
                    ...snip...
                    actions_on_top = False
                    actions_on_bottom = True

以上是关于Django配置管理settings文件配置的主要内容,如果未能解决你的问题,请参考以下文章

django 框架学习:十六.django 后台管理系统

Django简介

Django模板简介

不允许在/空静态前缀处配置不当 - Django

Django项目配置settings.py详解

Django 之管理界面