前言
上一篇文章中,我们快速地创建出一个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