django-settings配置介绍

django-settings配置文件介绍

一.settings配置文件的介绍

1.1什么是settings配置文件

那什么是settings配置文件呢?

  • settings配置文件是django自带的一个项目配置文件.该文件下放的是关系django项目的一些配置信息.

注意事项:

  • 该文件下的所有变量名都应该大写,如果你用的是小写的变量,那么不好意思,django是不会识别的.
  • 开启一个 django项目有些 需要将第58行的 代码 'DIRS': [BASE_DIR / 'templates'] 改成 'DIRS': [BASE_DIR, 'templates']
  • 如果你的项目要使用到post的请求数据,需要将第47行的 'django.middleware.csrf.CsrfViewMiddleware', 给注释掉.

但其实django项目中的配置文件不仅仅只有settings.py这个放在项目的根目录下的文件. 该文件只是一个供用户观看和可修改的 文件.

有些细心的小伙伴可以发现,我们之前在禁用路由匹配的 二次重定向匹配 加/ 时 所使用的 APPEND_SHART = Flase 这个变量名,我们明明没有定义,却可以在pycharm中

补全来! 诶,是不是有什么内置的模块已经被导入了啊.

那确实,django不仅有一个暴露给用户可以修改观看的settings文件,其实还有一个隐藏的global_settings文件

1.2 隐藏的global_settings 配置文件

那我们如何才能看到global_settings配置文件呢??

我们只需要导包即可

from django.conf import global_settings

我们就可以使用global_settings 默认的配置文件了,但我们只需要了解即可.

我们可以查看一下该文件的信息

还是老样子 查看源码信息

我们可以看到.该文件下的内容有644来行.哦,这时候我们才发现原来还有这么多变量啊!!!

但是不要慌,用到撒查资料即可,别死记.除非你是天才!

1.3 俩者的关系 和 settings模块的介绍

那现在我们知道了,奥,原来django项目下面有俩个settings配置文件啊,怪不得有那么多功能!

那你知道为什么我们在django项目启动起来后,我们的settings.py中配置的变量名为什么可以覆盖掉我们的 默认的global_settings.py中的变量呢??

即django是怎么去使用或者说加载这俩个文件的呢??

其实这就需要看看我们的 另外一个 模块了 即 settings模块

需要导入

from django.conf import settings

好了,一看不懂! 我也不懂,那我们就进入查看源码的历程中去吧!!

二.settings模块的源码剖析

2.1 剖析源码前的准备知识

知识点1: 设置pycharm前进后退功能

这里介绍一个额外的知识点,就是我们查看源码时,可以前进后退.

这里只需要在pycharm设置一下即可

第一步: 找到上方的View功能选项,点击Appearance选项再勾选上我们的Toolbar即可

这时候就可以看到我们的功能栏啦!!!

知识点二: 字典的 setdefault方法

# 字典的 setdefault方法复习
'''
源码介绍:
     def setdefault(self, *args, **kwargs): # real signature unknown
        """
        Insert key with a value of default if key is not in the dictionary.
        
        Return the value for key if key is in the dictionary, else default.
        """
        翻译一下: 如果键不在字典中,则插入值为default的键。
                如果key在dictionary中,则返回key的值,否则返回默认值。
'''


dic = {}
dic.setdefault("1")  # 只传一个值.就是key,value为None
print(dic)  # {'1': None}

dic1 = {}
dic1.setdefault("2","22")  # 传俩个值,第一个为key,第二个为value
print(dic1)  # {'2': '22'}

# dic1.setdefault("1","1","2")  # 当传入的实参大于2时,会报错  ===> TypeError: setdefault expected at most 2 arguments, got 3
# print(dic1)

知识点三: dir方法

dic1 = {"1":1}
print(dir(dic1))  # 返回的是一个大列表  ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__']

知识点四: importlib方法

import importlib
'''
源码:
def import_module(name, package=None):
    """Import a module.
    执行相对导入时需要'package'参数。它
    指定要用作定位点的包,从该定位点解析
    相对导入到绝对导入。
    """
    level = 0
    if name.startswith('.'):  
        if not package:
            msg = ("the 'package' argument is required to perform a relative "
                   "import for {!r}")
            raise TypeError(msg.format(name))
        for character in name:
            if character != '.':
                break
            level += 1
    return _bootstrap._gcd_import(name[level:], package, level)
'''
res = importlib.import_module("a.b")  # 注意了 .好表示的是文件的目录等级 最小的单位到文件 不能到文件下的变量,方法..
print(res)  # <module 'a.b' from 'G:\线下培训\10-Django框架\settings_pro\a\b.py'>

# 俩种是等价的, 但是大佬写到源码中,会频繁的使用到 importlib模块
# 之前我们的路由分发 的 include模块 也是 封装了 importlib模块的方法
from a import b
print(b)  # <module 'a.b' from 'G:\线下培训\10-Django框架\settings_pro\a\b.py'>

2.2 图解源码

好了.回来.我们点开我们的 settins模块源码信息

第一步: 点开 我们的 settins源码信息

第二步: 根据 LazySettings 查看到 ENVIRONMENT_VARIABLE 对应的值为 "DJANGO_SETTINGS_MODULE",而 "DJANGO_SETTINGS_MODULE" 对应的值在manage.py中可以看到

1-2步 如图

manage.py中的代码解析

第三步: 再看会来 LazySettings 类方法 3-4步

第四步: 点开Settings类方法 查看 6-8步

注意三个重点方法

dir方法, getattr方法,以及setattr方法

再看我们的第9-14步

2.3源码带剖析 copy

-- __init__.py
-- 1-4 步
	ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"   #
	class LazySettings(LazyObject):
    def _setup(self, name=None):
        '''
        1.下方代码剖析
        ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
        os.environ.get(ENVIRONMENT_VARIABLE)  ===> 结果: dict.get("DJANGO_SETTINGS_MODULE")
        内容: dict = {'DJANGO_SETTINGS_MODULE': 'settings_pro.settings'}
        dict.get("DJANGO_SETTINGS_MODULE")  ===> 结果: 'settings_pro.settings'
        settings_module = 'settings_pro.settings'
        '''
        settings_module = os.environ.get(ENVIRONMENT_VARIABLE)  # 2.settings_pro.settings
        # 3.不成立
        if not settings_module:
           pass
        # 4.关键方法来了 Settings(settings_module)  ==> Settings('settings_pro.settings')
        self._wrapped = Settings(settings_module)
 -- 1-2步插曲 
--manage.py文件
	if __name__ == "__main__":
    # os.environ 获取的是 一个大字典 存放的是一些环境的键值对
    # dict.setdefault(self,*args,**kwargs)
    """
    使用方法为,第一个参数为key,第二个参数为value
    即: 下方的代码可以变为
    假设 os.environ = dict
    dict = {'DJANGO_SETTINGS_MODULE': 'settings_pro.settings'}
    """
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings_pro.settings")  # 'settings_pro.settings'
    
-- 5-14步
-- __init__.py文件
	class Settings(object):
        def __init__(self, settings_module):  # 5. ====>  settings_module = 'settings_pro.settings'
            """
            6.dir(global_settings) 剖析
            dir(global_settings)  ===>  返回的是一个大列表  ['ABSOLUTE_URL_OVERRIDES', 'ADMINS', 'ALLOWED_HOSTS'...]
            可以看到该列表中的元素就我们我们 global_settings 默认配置文件中的变量名
            """
            for setting in dir(global_settings):
                # 7.过滤掉一些__开头的方法,即只要大写的变量名
                if setting.isupper():
                    """
                    8.getattr(global_settings, setting)  ==> 剖析
                    通过反射 获取到 每个变量名的值 即例如: ABSOLUTE_URL_OVERRIDES的值
                    setattr(self, setting, getattr(global_settings, setting))
                    然后通过反射给变量名附上对应的变量值 赋给 self 对象自己
                    总结: 可以看到拿到的就是一个大写的变量与值赋给了self对象
                    """
                    setattr(self, setting, getattr(global_settings, setting))

            # 9.self.SETTINGS_MODULE = 'settings_pro.settings'
            self.SETTINGS_MODULE = settings_module

            """
            10. importlib.import_module 方法的介绍
            会将字符串以.分成导模块的方式
            importlib.import_module(self.SETTINGS_MODULE)  ====> importlib.import_module('settings_pro.settings')
            就相当于 from settings_pro import settings
            """
            mod = importlib.import_module(self.SETTINGS_MODULE)

            """
            11. 该方法和6 相似 获取的是 本地用户可以更改的 settings文件的所有变量名 
            dir(mod)  ===> dir(settings)  获取的就是 settings文件的所有变量名
            """
            for setting in dir(mod):
                # 12. 将所有小写变量名和内置的__开头的元素过滤掉
                if setting.isupper():
                    # 13.获取到对应的大写变量名的值
                    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)
                    """
                     14. 将settings文件中的变量=值绑定给self对象
                     这时候我们要想到一个 效果, 之前我们将 默认的global_settings文件中的变量和值已经绑定给了self
                     这时候又来了一个 settings文件下的变量和值,所以会有一个变量名冲突的问题,所以你在settings中定义global_settings文件中的
                     变量会有一个覆盖的效果,所以才可以达到,可以加载俩个文件下的所以变量的效果
                    """
                    setattr(self, setting, setting_value)
                    self._explicit_settings.add(setting)

三.settings文件中的变量配置详细介绍

介绍一些常用的settings配置供参考

1.配置静态文件

STATIC_URL = '/static/'  # 为静态文件别名
# 静态文件地址拼接,后面'static'文件为自己建立的存放静态文件(JS,IMG,CSS)的文件名
STATICFILES_DIRS = (
	os.path.join(BASE_DIR,"static"),  # 主文件下静态文件
    os.path.join(BASE_DIR,'mysite','static')  # 项目mysite文件下的静态文件
)

2.mysql数据库配置

########在setting原来默认的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': 'test',    #你的数据库名称
        'USER': 'root',   #你的数据库用户名
        'PASSWORD': 'xxx', #你的数据库密码
        'HOST': '', #你的数据库主机,留空默认为localhost
        'PORT': 3306, #你的数据库端口
    }}

#由于mysql默认引擎为MySQLdb,在__init__.py文件中添加下面代码
#在python3中须替换为pymysql,可在主配置文件(和项目同名的文件下,不是app配置文件)中增加如下代码
import pymysql
pymysql.install_as_MySQLdb()
#如果找不到pymysql板块,则通过pip install pymysql进行安装。

3、设置打印日志到屏幕

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level': 'DEBUG',
        },
    }
}

4、语言

LANGUAGE_CODE = 'en-us'# 默认
LANGUAGE_CODE = 'zh-hans'# 改为中文,主要针对admin页面

5、配置模板路径

TEMPLATE_DIRS = (
        os.path.join(BASE_DIR,'templates'),
    )
# 然后在项目根目录下添加templates文件夹

6、注册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名称即可 例如: 'app02'
     # 新建的应用都要在这里添加
]

--------------以下还未学习,了解即可------------

7、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语句在服务端打印。

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

1)model需导入

from django.contrib.auth.models import AbstractUser

2)Settings文件里添加

AUTH_USER_MODEL = "应用名.UserInfo"

9、中间件,自己写的中间件,例如在项目中的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',
]

需要注意的是自己写的中间件,配置要写在系统中的后面

10、session存储的相关配置

1)数据库配置(默认)

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,默认修改之后才保存(默认)

2)缓存配置

配置 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,默认修改之后才保存

3)默认配置

配置 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,默认修改之后才保存

注意:
1)也可以自定义配置 但是自定义的配置都要写到配置文件最后 代码中使用时可以导入配置

from django.conf import settings
settings.配置名

2)上面所有配置都是针对特定问题需要修改的,系统默认配置不做说明
3)上面配置只是前面django入门教程所遇到的常用配置 后续所遇配置都会逐步在此教程中持续添加跟新

11、配置文件上传目录

#设置文件上传路径
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')

如果想在浏览器里访问自己上传的文件则需要在urls.py做如下设置:

from django.views.static import serve
from django.conf import settings

urlpatterns = [
    ...
    re_path('^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
]

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

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()
# 假设有个工程mysite,有两个app为blog跟bbs
# django处理static的方法是把各个app各自的static合并到一处
# 比如:
# mysite/mysite/static 放置公共静态文件
# mysite/bbs/static 放置该app自己的静态文件
# mysite/blog/static 放置该app自己的静态文件
# 可以这么设置:
# STATIC_ROOT = '/www/mysite/mysite/static '
# STATIC_URL = '/static/'
# STATICFILES_DIRS = (
# 'mysite/static',
# 'bbs/static/',
# 'blog/static/',
# )
# 使用命令
# manage.py collectstatic
# 就会自动把所有静态文件全部复制到STATIC_ROOT中
# 如果开启了admin,这一步是很必要的,不然部署到生产环境的时候会找不到样式文件
# 不要把你项目的静态文件放到这个目录。这个目录只有在运行python manage.py collectstatic时才会用到

原文地址:https://www.cnblogs.com/jkeykey/p/14555169.html