系列文章目录
文章目录
前言
接上一篇的settings,本文来看一看其中涉及到的几类常用配置。
主要涉及:
1)static静态资源;
2)媒体资源配置;
3)模板;
4)数据库配置;
5)中间件。
一、静态资源配置
1.1 STATIC_URL
settings.py中关于静态资源的默认配置如下:
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/
STATIC_URL = '/static/'
STATIC_URL
表示资源路由,具体理解就是静态资源需通过路由x.x.x.x:8000/static/
去访问获取。URL中的路由地址就是此处STATIC_URL的配置内容。
静态资源默认(调试模式DEBUG=True)是只能访问到应用内的static目录(见下文示例1)中的资源。
示例:
1)新建index应用,在其中创建static目录,存放pic1.jpeg图片。
此时运行项目后可通过URLhttp://127.0.0.1:8000/static/pic1.jpeg
访问到该图片资源。
2)项目根目录下同样也创建static目录,存放不同内容、但与pic1.jpeg同名的图片。
运行项目后依旧是访问http://127.0.0.1:8000/static/pic1.jpeg
,其结果显示是访问到应用index/static/中的图片资源。
1.2 STATICFILES_DIRS
若要访问到项目根目录下的static
目录,此时需要在settings中配置STATICFILES_DIRS
。
STATICFILES_DIRS
表示资源集合,其以列表形式展示。
将项目根目录下的static和应用中的static目录(此时可命名为其他,如Mystatic)同时写入到STATICFILES_DIRS
中,之后的访问依旧是以STATIC_URL
为路由(STATIC_URL配置保持不变)。
import os # 需要导入os模块,用于拼接路径
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
os.path.join(BASE_DIR, 'index/Mystatic'),
]
此时,不管是根目录下的static目录,还是应用中的Mystatic目录,它们包含的图片等资源均可通过x.x.x.x:8000/static/
访问到。
1.3 STATIC_ROOT
STATIC_ROOT
主要用于项目在服务器上部署时,进行相关的资源部署,以实现服务器和项目之间的映射(收集整个项目的静态资源并存放在一个新的文件夹,由该文件夹与服务器之间构建映射关系)。
当项目的配置属性DEBUG=True(调试模式)时,Django会自动提供静态文件代理服务,此时无需使用STATIC_ROOT
。
当DEBUG=False时,即项目进入生产环境中,此时Django不再提供静态文件代理服务,那么就需要在配置文件settings中设置STATIC_ROOT
。
STATIC_ROOT = os.path.join(BASE_DIR, 'ALLStatic') # 项目根目录下ALLStatic文件夹
设置STATIC_ROOT
后需要使用Django操作指令collectstatic
(python manage.py collectstatic
)来收集所有的静态资源,这些静态资源将全部保存在STATIC_ROOT
所设置的文件夹里(也就是ALLStatic
)。
二、媒体资源
媒体资源和静态资源可以同时存在,独立运行,互不影响。
媒体资源的配置属性为:MEDIA_URL
和MEDIA_ROOT
。
MEDIA_URL = '/media/'
设置媒体路由地址信息,其作用与静态资源的STATIC_URL
相同。
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
获取media文件夹的完整路径信息。
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
配置属性完成后,需将media文件夹注册到Django中,若不进行注册,则在项目运行后无法通过/media/
访问到资源。
在项目同名目录中的urls.py路由文件里,注册添加媒体资源路由信息:
from django.views.static import serve
from django.conf import settings
from django.urls import re_path
urlpatterns = [
...
re_path('media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}, name='media'),
]
三、模板配置
模板配置的话主要是配置模板的Backend(引擎)和DIRS(目录)。
这里只放了DTL(Django Templates Language)的配置(项目初建时的默认引擎),此时只需配置下DIRS目录即可,将项目根目录下的templates
文件夹(没有该文件夹可自己创建)加进来(列表形式)。
APP_DIRS: True
表示在应用里查找模板文件,即项目会深入到应用中查找应用内部的模板文件。
OPTIONS
表示模板的一些配置选项,此处先不做变动。
TEMPLATES = [
{
# 模板引擎,有DjangoTemplates和jinja2.Jinja2
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "templates")],
'APP_DIRS': True, # 是否在APP里查找模板文件
'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',
],
},
},
]
关于Jinja2模板引擎,准备在后面的博文中介绍。
四、数据库
关于数据库的配置,上一文在介绍settings时写到过,这里再做进一步的介绍。
4.1 sqlite3
Django连接数据库,默认是连接sqlite3,在项目运行后会自动生成db.sqlite3
数据库文件。
关于sqlite3,可自行百度,这里不做过多的阐述。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
4.2 连接mysql配置
此时若想将数据库改成MySQL,则需要做一些配置上的变动。
1)激活虚拟环境,安装mysqlclient模块
pip install mysqlclient
2)MySQL数据库中创建项目对应的数据库django_db
3)settings中配置对应属性
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_db',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
4)数据迁移
python manage.py makemigrations
python manage.py migrate
上面两个关于数据迁移的命令,前面博文中也有提到过,其实就是对项目中定义的models模型文件进行读取并生成迁移文件(里面包含作用到数据库的操作指令),然后将该文件中的操作在数据库中进行执行,最终在对应数据库中生成相应数据表。
4.3 多数据库连接
此外,还可以同时连接到多个数据库上。
具体配置如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_db',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306',
},
'MyDjango': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'MyDjango',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '192.168.11.1',
'PORT': '3306',
}
}
在项目应用的模型中,若模型没有指定相应的数据库,则默认在key=default的数据库中生成;
可通过db_table属性来指定到目标数据库(对应的key):
class UserInfo(models.Model):
...
class Meta:
db_table = "MyDjango"
五、中间件
中间件部分,我就做些简单介绍,一般情况下不做改动。
中间件是浏览器请求和服务器响应之间的一道道“门”,当请求发来时,需依次经过这一个个中间件,最后到达程序的视图处理部分,然后返回响应;响应在返回给浏览器时,也会依次经过这些中间件(顺序和前面请求经过时相反),最终到达浏览器端。
后续我们可以自定义中间件,来对一些请求或响应进行拦截或过滤,这部分后面慢慢学习。
下文中是做了个添加LocaleMiddleware操作,以支持内置功能显示中文。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', # 内置安全机制,保护用户与网站的通信安全
'django.contrib.sessions.middleware.SessionMiddleware', # 会话Session功能
# 添加中间件LocaleMiddleware,使得Django内置功能支持中文显示
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware', # 处理请求信息,规范化请求内容
'django.middleware.csrf.CsrfViewMiddleware', # 开启CSRF防护功能
'django.contrib.auth.middleware.AuthenticationMiddleware', # 开启内置的用户认证系统
'django.contrib.messages.middleware.MessageMiddleware', # 信息提供功能
'django.middleware.clickjacking.XFrameOptionsMiddleware', # 防止恶意程序单击劫持
]
总结
本文是对settings文件的进一步理解,涉及到静态资源、媒体资源、模板配置、数据库和中间件。
基本上Django项目在创建时,都需要先对以上配置做改动,所以需做到熟记于心。