• 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时才会用到
    
    
  • 相关阅读:
    wp7订餐客户端源码
    AOP技术术语
    urlpattern详解
    .net 访问IBM DB2 数据库
    入驻博客园
    hadoop视频
    阿里OneData构建数据指标体系
    大数据领域全景解析
    PyTorch中梯度为什么默认自动累加,在反向传播前要手动将梯度清零?
    Pytorch:Dataloader和Dataset以及搭建数据部分的步骤
  • 原文地址:https://www.cnblogs.com/jkeykey/p/14555169.html
Copyright © 2020-2023  润新知