zoukankan      html  css  js  c++  java
  • 五 .Django settings详解配置

    一. settings详解配置

    https://www.django.cn/course/show-10.html       Django2.0入门教程:全局配置settings详解

    https://blog.csdn.net/Odyssues_lee/article/details/80834438

    https://www.cnblogs.com/yehewudi/p/9540548.html        Django settings详解

    https://www.jb51.net/article/128678.htm

    https://docs.djangoproject.com/en/1.10/topics/settings/     官网配置

    1 .settings详解

    基础

    DJANGO_SETTING_MODULE环境变量:让settings模块被包含到python可以找到的目录下,开发情况下不需要,我们通常会在当前文件夹运行,python可以搜索到。
    如果需要运行在其他服务器上,就必须指定DJANGO_SETTINGS_MODULE变量。

     默认设定

    一个django的settings文件不需要我们手动去设置所有项目,因为系统已经默认设置好了。我们只需要修改我们使用的设
    
    定就好了。默认的设置在django/conf/global_settings.py文件中。django在编译时,先载入global_settings.py中的配置,然后加载指定的settings文件,
    重写改变的设定。 好了,步入正文。 前面的随笔中我们经常会改setting配置也经常将一些配置混淆今天主要是将一些常见的配置做一个汇总。

    setting配置汇总

    1、app路径
    
    INSTALLED_APPS = [
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'app1.apps.App1Config', 
     # 默认已有 如果没有只要添加app名称即可 例如: 'app1'
     # 新建的应用都要在这里添加
    ]

    数据库配置

    如果使用django的默认sqlite3数据库则不需要改
    DATABASES = {
     'default': {
     'ENGINE': 'django.db.backends.sqlite3',
     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
     }
    }
    如果使用mysql数据库需要将上述数据库注掉修改如下
    
    DATABASES = {
     'default': {  
     'ENGINE': 'django.db.backends.mysql',
     'NAME': 'blog', #你的数据库名称 数据库需要自己提前建好
     'USER': 'root', #你的数据库用户名
     'PASSWORD': '', #你的数据库密码
     'HOST': '', #你的数据库主机,留空默认为localhost
     'PORT': '3306', #你的数据库端口
     }
    }
    并且需要在应用的__init__.py文件添加
    
    import pymysql
    pymysql.install_as_MySQLdb()
    sql语句
    
    LOGGING = {
     'version': 1,
     'disable_existing_loggers': False,
     'handlers': {
     'console':{
      'level':'DEBUG',
      'class':'logging.StreamHandler',
     },
     },
     'loggers': {
     'django.db.backends': {
      'handlers': ['console'],
      'propagate': True,
      'level':'DEBUG',
     },
     }
    } 
    当你的操作与数据库相关时 会将我们的写的语句翻译成sql语句在服务端打印。

    静态文件目录

    STATIC_URL = '/static/' #调用时目录
    STATICFILES_DIRS=[
     os.path.join(BASE_DIR,"static"), #具体路径
    ]

    如果数据库中的UserInfo(用户表)继承django内置AbstractUser

    model需导入
    
    from django.contrib.auth.models import AbstractUser
    配置文件
    
    AUTH_USER_MODEL = "应用名.UserInfo"

    中间件

    自己写的中间件,例如在项目中的md文件夹下md.py文件中的M1与M2两个中间件
    
    MIDDLEWARE = [
     'django.middleware.security.SecurityMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.common.CommonMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
     'md.md.M1',
     'md.md.M2',
    ]
    注意自己写的中间件,配置要写在系统中的后面

    session存储的相关配置

    数据库配置(默认)
    
    Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
    配置 settings.py
     SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
     SESSION_COOKIE_NAME = "sessionid"   # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
     SESSION_COOKIE_PATH = "/"    # Session的cookie保存的路径(默认)
     SESSION_COOKIE_DOMAIN = None    # Session的cookie保存的域名(默认)
     SESSION_COOKIE_SECURE = False    # 是否Https传输cookie(默认)
     SESSION_COOKIE_HTTPONLY = True    # 是否Session的cookie只支持http传输(默认)
     SESSION_COOKIE_AGE = 1209600    # Session的cookie失效日期(2周)(默认)
     SESSION_EXPIRE_AT_BROWSER_CLOSE = False   # 是否关闭浏览器使得Session过期(默认)
     SESSION_SAVE_EVERY_REQUEST = False   # 是否每次请求都保存Session,默认修改之后才保存(默认)

    缓存配置

    配置 settings.py
     SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
     SESSION_CACHE_ALIAS = 'default'    # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
     SESSION_COOKIE_NAME = "sessionid"   # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
     SESSION_COOKIE_PATH = "/"    # Session的cookie保存的路径
     SESSION_COOKIE_DOMAIN = None    # Session的cookie保存的域名
     SESSION_COOKIE_SECURE = False    # 是否Https传输cookie
     SESSION_COOKIE_HTTPONLY = True    # 是否Session的cookie只支持http传输
     SESSION_COOKIE_AGE = 1209600    # Session的cookie失效日期(2周)
     SESSION_EXPIRE_AT_BROWSER_CLOSE = False   # 是否关闭浏览器使得Session过期
     SESSION_SAVE_EVERY_REQUEST = False   # 是否每次请求都保存Session,默认修改之后才保存


    缓存: https://blog.csdn.net/qq_18863573/article/details/83780589
    Django中提供了6种缓存方式
           https://www.cnblogs.com/littlesky1124/p/9246721.html         django的缓存实例应用
    https://blog.csdn.net/weixin_42134789/article/details/81283167

    默认配置

    配置 settings.py
     SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
     SESSION_FILE_PATH = None     # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 
     SESSION_COOKIE_NAME = "sessionid"    # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
     SESSION_COOKIE_PATH = "/"     # Session的cookie保存的路径
     SESSION_COOKIE_DOMAIN = None    # Session的cookie保存的域名
     SESSION_COOKIE_SECURE = False    # 是否Https传输cookie
     SESSION_COOKIE_HTTPONLY = True    # 是否Session的cookie只支持http传输
     SESSION_COOKIE_AGE = 1209600    # Session的cookie失效日期(2周)
     SESSION_EXPIRE_AT_BROWSER_CLOSE = False   # 是否关闭浏览器使得Session过期
     SESSION_SAVE_EVERY_REQUEST = False    # 是否每次请求都保存Session,默认修改之后才保存

    注意

    也可以自定义配置 但是自定义的配置都要写到配置文件最后 代码中使用时可以导入配置
    
    from django.conf import settings
    
    settings.配置名
    
    上面所有配置都是针对特定问题需要修改的 系统默认配置不做说明
    
    上面配置只是前面django系列随笔所遇到的常用配置 后续所遇配置都会逐步在此随笔中持续添加跟新

    Django APPEND_SLASH 参数自动给网址结尾加'/'

    https://www.cnblogs.com/zhuchunyu/p/11062044.html

    Django seetings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 作用就是自动在网址结尾加'/'。
    如下URL视图:
    
    urls.py:
    --------
    from django.conf.urls.defaults import *
    from mysite.views import hello
     
    urlpatterns = patterns('',
    ('^hello/$', hello),
    )
    因定义了hello/结尾:
    
    http://example.com/hello
     
    自动转到
     
    http://example.com/hello/
    默认地,任何不匹配或尾部没有斜杠(/)的申请URL,将被重定向至尾部包含斜杠的相同字眼的URL。
    当 seetings.py 设置为 APPEND_SLASH = False 时,访问 http://example.com/hello 将会返回 404
    所以我觉得还是按照官方默认开启这个参数方便些,如果不想要后面的 / ,可以在 urls.py 定义成 '^hello$' 这样的形式。


    2. 下面看段django settings最佳配置实例代码,具体代码如下所示:

    # encoding=utf-8
    import os
    import socket
    SITE_ID = 1
    # 项目的根目录
    # 简化后面的操作
    PROJECT_ROOT = os.path.dirname(os.path.dirname(__file__))
    # 加载应用
    # 把应用添加到INSTALLED_APPS中
    from apps.kuser.mysetting import myapp as kuser_app
    from apps.blog.mysetting import myapp as blog_app
    MY_APPS = blog_app + kuser_app
    # 加载静态文件
    from apps.blog.mysetting import my_staticfiles as blog_staticfiles
    from apps.kuser.mysetting import my_staticfiles as kuser_staticfiles
    MY_STATIC_DIRS = blog_staticfiles + kuser_staticfiles
    # 加载模板文件
    from apps.blog.mysetting import my_templates as blog_templates
    from apps.kuser.mysetting import my_templates as kuser_templates
    MY_TEMPLATE_DIRS = blog_templates + kuser_templates
    # 密钥配置
    # 适用于开发环境和部署环境
    # 可以从系统环境中,配置文件中,和硬编码的配置中得到密钥
    try:
     SECRET_KEY = os.environ['SECRET_KEY']
    except:
     try:
     with open(os.path.join(PROJECT_ROOT, 'db/secret_key').replace('\', '/')) as f:
      SECRET_KEY = f.read().strip()
     except:
     SECRET_KEY = '*lk^6@0l0(iulgar$j)faff&^(^u+qk3j73d18@&+ur^xuTxY'
    # 得到主机名
    def hostname():
     sys = os.name
     if sys == 'nt':
     hostname = os.getenv('computername')
     return hostname
     elif sys == 'posix':
     host = os.popen('echo $HOSTNAME')
     try:
      hostname = host.read()
      return hostname
     finally:
      host.close()
     else:
     raise RuntimeError('Unkwon hostname')
    #调试和模板调试配置
    #主机名相同则为开发环境,不同则为部署环境
    #ALLOWED_HOSTS只在调试环境中才能为空
    if socket.gethostname().lower() == hostname().lower():
     DEBUG = TEMPLATE_DEBUG = True
     ALLOWED_HOSTS = []
    else:
     ALLOWED_HOSTS = [
     'baidu.com',
     '0.0.0.0',
     ]
     DEBUG = TEMPLATE_DEBUG = False
    #数据库配置
    MYDB = {
     'mysql': {
     'ENGINE': 'django.db.backends.mysql',
     'NAME': 'books', #你的数据库名称
     'USER': 'root', #你的数据库用户名
     'PASSWORD': '', #你的数据库密码
     'HOST': '', #你的数据库主机,留空默认为localhost
     'PORT': '3306', #你的数据库端口
     },
     'sqlite': {
     'ENGINE': 'django.db.backends.sqlite3',
     'NAME': os.path.join(PROJECT_ROOT, 'db/db.sqlite3').replace('\', '/'),
     }
    }
    # 给静态文件url一个后缀,在templates里用到的。
    # 映射到静态文件的url
    # STATIC_URL的含义与MEDIA_URL类似
    STATIC_URL = '/static/'
    # 总的static目录
    # 可以使用命令 manage.py collectstatic 自动收集static文件
    # STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static').replace('\', '/')
    #放各个app的static目录及公共的static目录
    #STATICFILES_DIRS:和TEMPLATE_DIRS的含义差不多,就是除了各个app的static目录以外还需要管理的静态文件设置,
    #比如项目的公共文件差不多。然后给静态文件变量赋值,告诉Django,静态文件在哪里
    #另外,Django提供了一个findstatic命令来查找指定的静态文件所在的目录,例如:D:TestDjango>python manage.py findstatic Chrome.jpg
    # 默认情况下(如果没有修改STATICFILES_FINDERS的话),Django首先会在STATICFILES_DIRS配置的文件夹中寻找静态文件,然后再从每个app的static子目录下查找,
    # 并且返回找到的第一个文件。所以我们可以将全局的静态文件放在STATICFILES_DIRS配置的目录中,将app独有的静态文件放在app的static子目录中。
    # 存放的时候按类别存放在static目录的子目录下,如图片都放在images文件夹中,所有的CSS都放在css文件夹中,所有的js文件都放在js文件夹中。
    STATICFILES_DIRS = (
     ("downloads", os.path.join(PROJECT_ROOT, 'static/downloads').replace('\', '/')),
     ("uploads", os.path.join(PROJECT_ROOT, 'static/uploads').replace('\', '/')),
    )
    # 将app中的静态文件添加到静态文件配置列表中
    STATICFILES_DIRS += MY_STATIC_DIRS
    # 最后关键的部分是STATICFILES_DIRS以下配置
    # 简要说一下,static文件夹在项目里,有css js images 三个文件夹(看项目结构),他们的路径分别是:
    # os.path.join(STATIC_ROOT,'css'),os.path.join(STATIC_ROOT,'js'),os.path.join(STATIC_ROOT,'images');
    # 我们分别给他们起三个别名css,js,images(你可以随意给,不过为了易记,我们原名称指定别名了)
    TEMPLATE_DIRS = (
     os.path.join(PROJECT_ROOT, 'templates').replace('\', '/'),
    )
    # 配置应用的模板文件路径
    TEMPLATE_DIRS += MY_TEMPLATE_DIRS
    # 配置缓存
     CACHES = {
     'default': {
      'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
      'LOCATION': 'unix:/tmp/memcached.sock',
      'KEY_PREFIX': 'lcfcn',
      'TIMEOUT': None
     }
     }
    LOGIN_REDIRECT_URL = '/'
    LOGIN_URL = '/auth/login/'
    LOGOUT_URL = '/auth/logout/'
    # 指用户上传的文件,比如在Model里面的FileFIeld,ImageField上传的文件。如果你定义
    # MEDIA_ROOT=c:	empmedia,那么File=models.FileField(upload_to="abc/"),上传的文件就会被保存到c:	empmediaabc。MEDIA_ROOT必须是本地路径的绝对路径。
    MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'static/uploads')
    # MEDIA_URL是指从浏览器访问时的地址前缀。
    MEDIA_URL = '/uploads/'
    # 应用注册列表
    INSTALLED_APPS = (
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'django.contrib.sites',
     'django.contrib.sitemaps',
    )
    #为了不和系统应用混合,自己开发的应用放在这里
    # 将自己写的app添加到应用列表中去
    INSTALLED_APPS += MY_APPS
    # django 中间件
    # django处理一个Request的过程是首先通过django 中间件,然后再通过默认的URL方式进行的。
    # 所以说我们要做的就是在django 中间件这个地方把所有Request拦截住,
    # 用我们自己的方式完成处理以后直接返回Response,那么我们可以简化原来的设计思路,
    # 把中间件不能处理的 Request统统不管,丢给Django去处理。
    MIDDLEWARE_CLASSES = (
     'django.middleware.cache.UpdateCacheMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.common.CommonMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     # 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
     'django.middleware.cache.FetchFromCacheMiddleware',
    )
    ROOT_URLCONF = 'lcforum.urls'
    WSGI_APPLICATION = 'lcforum.wsgi.application'
    #数据库配置
    DATABASES = {
     'default': MYDB.get('sqlite'),
    }
    # 语言
    LANGUAGE_CODE = 'zh-cn'
    # 时区
    TIME_ZONE = 'Asia/Shanghai'
    USE_TZ = True
    # 在template中使用静态文件
    # 采用这种方式需要有一些额外配置,打开settings.py,确认TEMPLATE_CONTEXT_PROCESSORS中包含有'django.core.context_processors.static'
    # TEMPLATE_CONTEXT_PROCESSORS = (
    # 'django.core.context_processors.debug',
    # 'django.core.context_processors.i18n',
    # 'django.core.context_processors.media',
    # 'django.core.context_processors.static',
    # 'django.contrib.auth.context_processors.auth',
    # 'django.contrib.messages.context_processors.messages',
    #
    # 'django.core.context_processors.tz',
    # 'django.contrib.messages.context_processors.messages',
    # # 'blog.context_processors.custom_proc',自定义函数
    # )
    #from django.conf import settings
    #gettext = lambda s: s
    #getattr()
    # 假设有个工程djangodemo,有两个app为demo1跟demo2
    # django处理static的方法是把各个app各自的static合并到一处
    # 比如:
    # djangodemo/djangodemo/static 放置公共静态文件
    # djangodemo/demo1/static 放置该app自己的静态文件
    # djangodemo/demo2/static 放置该app自己的静态文件
    # 可以这么设置:
    # STATIC_ROOT = '/www/djangodemo/djangodemo/static '
    # STATIC_URL = '/static/'
    # STATICFILES_DIRS = (
    # 'djangodemo/static',
    # 'demo1/static/',
    # 'demo2/static/',
    # )
    # 使用命令
    # manage.py collectstatic
    # 就会自动把所有静态文件全部复制到STATIC_ROOT中
    # 如果开启了admin,这一步是很必要的,不然部署到生产环境的时候会找不到样式文件
    # 不要把你项目的静态文件放到这个目录。这个目录只有在运行manage.py collectstatic时才会用到
    """
    Django settings for webpy project.
    
    Generated by 'django-admin startproject' using Django 2.2.4.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/2.2/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/2.2/ref/settings/
    """
    
    import os
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = '^iu$_ug#e@1ju15vx+3bbru!zf^xtvo4=x3v2_h*x8nggpy$1%'
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = False
    
    ALLOWED_HOSTS = ["*"]
    
    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01',
        'app02',
        'app03',
    ]
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        # 'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    ROOT_URLCONF = 'webpy.urls'
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')]
            ,
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    WSGI_APPLICATION = 'webpy.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/2.2/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': "db4",    #create DATABASE Dear1;
            'USER': "root",
            'PASSWORD':'root',
            'HOST':'localhost',
            'PORT':'3306',
        }
    }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    
    # 汉化时间
    # Internationalization
    # https://docs.djangoproject.com/en/1.11/topics/i18n/
    LANGUAGE_CODE = 'zh-Hans'
    TIME_ZONE = 'Asia/Shanghai'
    USE_I18N = True
    USE_L10N = True
    USE_TZ = True
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/1.11/howto/static-files/
    # 静态文件 例如 css js img 等配置
    STATIC_URL = '/static/'
    
    STATICFILES_DIRS=[
        os.path.join(BASE_DIR,'app01/static'), # 意思在myapp项目下的static
        os.path.join(BASE_DIR, 'app02/static'),  # 意思在myapp项目下的static
        os.path.join(BASE_DIR, 'app03/static'),  # 意思在myapp项目下的static
    ]
    # https://cloud.tencent.com/info/5baf18f587c0b9f5630aebe8121ef38c.html
    # 运行python manage.py collectstatic收集所有已安装的APP的静态文件到根目录的collectedstatic【即STATIC_ROOT】中
    # 上传目录配置文件
    MDEIA_ROOT=os.path.join (BASE_DIR, r'staticupfile')
  • 相关阅读:
    复旦大学2016--2017学年第二学期(16级)高等代数II期末考试第八大题解答
    复旦大学2016--2017学年第二学期高等代数II期末考试情况分析
    16 级高代 II 思考题十的多种证明
    16 级高代 II 思考题九的七种解法
    Jordan 块的几何
    实对称阵可对角化的几种证明及其推广
    复旦大学高等代数在线课程2017--2018学年记录
    复旦高等代数II(16级)每周一题
    复旦大学2016--2017学年第一学期(16级)高等代数I期末考试第六大题解答
    复旦大学2016--2017学年第一学期(16级)高等代数I期末考试第七大题解答
  • 原文地址:https://www.cnblogs.com/lovershowtime/p/11366950.html
Copyright © 2011-2022 走看看