前言

上一篇文章中,我们快速地创建出一个django的demo后,然后可观察到demo项目的目录结构。

myproject
├── manage.py                     #django管理主程序
├── myapp                         #app目录
│   ├── __init__.py                 
│   ├── admin.py                  #注册后台管理文件
│   ├── apps.py                   #应用配置文件
│   ├── migrations                #数据迁移目录
│   │   └── __init__.py
│   ├── models.py                 #应用模型文件,对应MTV架构中的M
│   ├── tests.py                  #测试文件
│   └── views.py                  #视图文件,对应MTV架构中的V
└── myproject                     #项目配置目录
    ├── __init__.py
    ├── settings.py               #项目主配置文件
    ├── urls.py                   #url路由系统文件
    └── wsgi.py                   #网络通信接口文件

本篇文章主要针对目录结构中项目管理主程序manage.py进行说明

加载

在上一篇文章中,我们对django的一些基本命令进行了说明。使用python manage.py help可查看到django的全部命令。

当我们创建完一个项目后,一般可通过python manage.py runserver来启动项目。让我们首先来看看manage.py这个入口文件.

  1 #!/usr/bin/env python
  2 import os
  3 import sys
  4
  5 if __name__ == "__main__":
  6     # 将settings模块设置到环境变量中
  7     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
  8     try:
  9         from django.core.management import execute_from_command_line
 10     except ImportError as exc:
 11         raise ImportError(
 12             "Couldn't import Django. Are you sure it's installed and "
 13             "available on your PYTHONPATH environment variable? Did you "
 14             "forget to activate a virtual environment?"
 15         ) from exc
 16     execute_from_command_line(sys.argv)

可以看到,在第7行,主程序将我们的项目主配置文件设置到了环境变量中。因为配置文件可能会用到其他模块,那么就可能导致循环引用。所以,Django的配置采用了懒加载机制,或者说是延时加载。当后续需要用到配置文件时,再从环境变量中加载出配置文件。具体可参见Django源码分析-配置文件加载。 当我们创建项目或者拿到别人一个django项目,如果需要自定义配置文件(一般的项目可能会区分开发配置和生产配置),此时可能会修改这里的配置文件名,选择将不同环境的配置文件设置到环境变量中。

默认项目配置

在自定义项目配置前,我们先来看看默认的项目配置,打开setting.py

  1 """
  2 Django settings for myproject project.
  3
  4 Generated by 'django-admin startproject' using Django 2.0.2.
  5
  6 For more information on this file, see
  7 https://docs.djangoproject.com/en/2.0/topics/settings/
  8
  9 For the full list of settings and their values, see
 10 https://docs.djangoproject.com/en/2.0/ref/settings/
 11 """
 12
 13 import os
 14
 15 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
 16 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 17
 18
 19 # Quick-start development settings - unsuitable for production
 20 # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
 21
 22 # SECURITY WARNING: keep the secret key used in production secret!
 23 SECRET_KEY = 'wd0c+^c4f9k_oramxnk7wt8r)!e)44!4$g_)ke6xo5qc@itkna'
 24
 25 # SECURITY WARNING: don't run with debug turned on in production!
 26 DEBUG = True
 27
 28 ALLOWED_HOSTS = []
 29
 30
 31 # Application definition
 32
 33 INSTALLED_APPS = [
 34     'django.contrib.admin',
 35     'django.contrib.auth',
 36     'django.contrib.contenttypes',
 37     'django.contrib.sessions',
 38     'django.contrib.messages',
 39     'django.contrib.staticfiles',
 40 ]
 41
 42 MIDDLEWARE = [
 43     'django.middleware.security.SecurityMiddleware',
 44     'django.contrib.sessions.middleware.SessionMiddleware',
 45     'django.middleware.common.CommonMiddleware',
 46     'django.middleware.csrf.CsrfViewMiddleware',
 47     'django.contrib.auth.middleware.AuthenticationMiddleware',
 48     'django.contrib.messages.middleware.MessageMiddleware',
 49     'django.middleware.clickjacking.XFrameOptionsMiddleware',
 50 ]
 51
 52 ROOT_URLCONF = 'myproject.urls'
 53
 54 TEMPLATES = [
 55     {
 56         'BACKEND': 'django.template.backends.django.DjangoTemplates',
 57         'DIRS': [],
 58         'APP_DIRS': True,
 59         'OPTIONS': {
 60             'context_processors': [
 61                 'django.template.context_processors.debug',
 62                 'django.template.context_processors.request',
 63                 'django.contrib.auth.context_processors.auth',
 64                 'django.contrib.messages.context_processors.messages',
 65             ],
 66         },
 67     },
 68 ]
 69
 70 WSGI_APPLICATION = 'myproject.wsgi.application'
 71
 72
 73 # Database
 74 # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
 75
 76 DATABASES = {
 77     'default': {
 78         'ENGINE': 'django.db.backends.sqlite3',
 79         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
 80     }
 81 }
 82
 83
 84 # Password validation
 85 # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
 86
 87 AUTH_PASSWORD_VALIDATORS = [
 88     {
 89         'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
 90     },
 91     {
 92         'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
 93     },
 94     {
 95         'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
 96     },
 97     {
 98         'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
 99     },
100 ]
101
102
103 # Internationalization
104 # https://docs.djangoproject.com/en/2.0/topics/i18n/
105
106 LANGUAGE_CODE = 'en-us'
107
108 TIME_ZONE = 'UTC'
109
110 USE_I18N = True
111
112 USE_L10N = True
113
114 USE_TZ = True
115
116
117 # Static files (CSS, JavaScript, Images)
118 # https://docs.djangoproject.com/en/2.0/howto/static-files/
119
120 STATIC_URL = '/static/'

SECRET_KEY

SECRET_KEY是在startproject时候生成的,主要用于签名、加密认证。

DEBUG

DEBUG = True代表将调试模式打开。

  • 当处于开发环境时,我们希望页面出错时,能够将出错信息显示到界面上。此时将DEBUG置为True,
  • 当处于生产环境时,我们并不希望用户能够看到出错信息。此时将DEBUG置为False。

请注意:当Django关闭调试模式,进入生产环境后,它的静态文件访问接口就不应该从Django框架中走了,应该有独立的web环境(首推nginx) 。可详见Django项目部署。

ALLOWED_HOSTS

ALLOWED_HOSTS 允许你设置哪些域名可以访问,即使在 Apache 或 Nginx 等中绑定了,这里不允许的话,也是不能访问的。

DEBUG=False 时,这个为必填项,如果不想输入,可以用 ALLOW_HOSTS = ['*'] 来允许所有的。

INSTALLED_APPS

应用列表。列表中已经默认添加了许多Django自带的应用。当我们创建了一个新的应用时,需要把应用名称加入到此列表中。比如我们上一篇文章中利用django-admin startapp myapp创建的新应用,如果未将myapp加入到列表中,是不能使用该应用的。

MIDDLEWARE

中间件列表。列表中每一个元素都是中间件。关于中间件,后续会进行详细介绍。

ROOT_URLCONF

根路由地址。ROOT_URLCONF = 'myproject.urls',相对应的文件是myproject/urls.py。Django 根据 ROOT_URLCONF 的设置装载 URLconf。详见Django路由系统。

TEMPLATES

模板配置。

WSGI_APPLICATION

指明WSGI应用路径。

DATABASES

django内置的database如下:

设置 数据库 适配器
postgresql PostgreSQL psycopg 版本 1.x
postgresql_psycopg2 PostgreSQL psycopg 版本 2.x
mysql MySQL MySQLdb
sqlite3 SQLite Python 2.5+ 内建
oracle Oracle cx_Oracle

Django中默认的数据库为sqlite3,要注意的是无论选择使用哪个数据库服务器,都必须下载和安装对应的数据库适配器

AUTH_PASSWORD_VALIDATORS

密码验证。 比如当你运行mange.py createsuperuser 时,输入的密码必须满足以上的条件。

LANGUAGE_CODE

语言设置

TIME_ZONE

时区

USE_I18N

支持国际化

USE_L10N

支持本地化

USE_TZ

开启时区。 建议:为了统一时间,在django开发时,尽量使用UTC时间,即设置USE_TZ=True,TIME_ZONE = 'Asia/Shanghai',并且在获取时间的时候使用django.util.timezone.now()。因为后台程序使用时间时UTC时间就能满足,也能保证证模板时间的正确显示。

STATIC_URL

静态文件配置。可详见Django静态文件设置

自定义项目配置

因为项目在开发环境与生产环境中一些项目配置有所区别,例如开发环境中DEBUG=True,生产环境中DEBUG=False,又或者本地开发环境使用的是SQLite,而在远程上的数据库用的却是Mysql。所以针对不同的环境应该使用不同的配置。

这里介绍一下第三方库django-configurations ,通过使用这个库来实现Django加载不同的环境配置。

  • 首先在requirement中加入django-configurations,然后使用pip install 进行安装。
  • 新建目录及文件如下:

      settings
      ├── __init__.py
      ├── common.py
      ├── development.py
      └── production.py
    

    __init__.py

      from .development import Dev
      from .production import Pro
      import pymysql   #请注意,导入数据库客户端应与项目配置文件在同一级目录下,否则可能或报错
      pymysql.install_as_MySQLdb()
    

    common.py

      """
      通用配置
      """
      from configurations import Configuration
      class Common(Configuration):
          BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
          INSTALLED_APPS = [
              ...
          ]
          ...
    

    development.py

      """
      开发环境配置
      """
      from .common import Common
      class Dev(Common):
          DEBUG = True
          ...
    

    production.py

      """
      生产环境配置
      """
      from .common import Common
      class Pro(Common):
          DEBUG = False
          ...
    
  • 删掉原settings.py文件

  • 修改manage.py文件

      #!/usr/bin/env python
      import os
      import sys
    
      if __name__ == "__main__":
          os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
          os.environ.setdefault("DJANGO_CONFIGURATION", "Dev")  #新增
          try:
              from configurations.management import execute_from_command_line #新增
              #from django.core.management import execute_from_command_line #注释掉原先的
          except ImportError:
              # The above import may fail for some other reason. Ensure that the
              # issue is really that Django is missing to avoid masking other
              # exceptions on Python 2.
              try:
                  import django
              except ImportError:
                  raise ImportError(
                      "Couldn't import Django. Are you sure it's installed and "
                      "available on your PYTHONPATH environment variable? Did you "
                      "forget to activate a virtual environment?"
                  )
              raise
          execute_from_command_line(sys.argv)
    
  • 完成如上步骤后,基本就已经配置成功了。运行python manage.py runserver即可进入开发环境模式(因为默认是Dev开发配置)。如需进入生成环境模式,只需运行python manage.py runserver --configuration Pro即可。
  • 代码详见 https://github.com/TiannV/DjangoBlog.git 仓库,目录为 DjangoBlog/DjangoBlog/settings
Copyright © itrunner.cn 2020 all right reserved,powered by Gitbook该文章修订时间: 2022-08-28 07:44:16

results matching ""

    No results matching ""