🍉 静态资源集合STATICFILES_DIRS
在配置文件settings.py中设置STATICFILES_DIRS配置项,我们可以通过该配置项告诉django本项目的静态资源的存放路径。该配置项的值为列表。
在STATICFILES_DIRS配置项中配置上述两个静态资源文件夹为项目静态资源的存放路径:
# Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/4.1/howto/static-files/ STATIC_URL = 'static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), os.path.join(BASE_DIR, 'test_app/static1') ]
注意,访问静态资源时使用的url格式如下:http://ip地址:端口号/STATIC_URL取值/静态资源路径
在配置了STATICFILES_DIRS配置项之后,STATIC_URL配置项的取值可以任意取值,且也不用保证静态资源文件夹的文件夹名与STATIC_URL配置项的取值一致,只要STATICFILES_DIRS配置项中路径配置正确即可使用STATIC_URL配置项配置的路由访问静态资源,STATIC_URL设置的为浏览器访问静态资源时的路由。
# Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/4.1/howto/static-files/ STATIC_URL = 'hahaha/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), os.path.join(BASE_DIR, 'test_app/static1') ]
🍉 资源部署STATIC_ROOT
静态资源配置还有STATIC_ROOT,其作用是在服务器上部署项目,实现服务器和项目之间的映射。STATIC_ROOT主要是收集整个项目的静态资源并存放在一个新的文件夹,然后由该文件夹与服务器之间构建映射关系。
当项目的配置属性DEBUG设为True的时候,Django会自动提供静态文件代理服务,此时整个项目处于开发阶段,因此无须使用STATIC_ROOT。当配置属性DEBUG设为False的时候,意味着项目进入生产环境,Django不再提供静态文件代理服务,此时需要在项目的配置文件中设置STATIC_ROOT。
STATIC_ROOT配置如下:
# Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/4.1/howto/static-files/ STATIC_URL = 'static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), os.path.join(BASE_DIR, 'test_app/static1') ] STATIC_ROOT = os.path.join(BASE_DIR, 'myStatic')
设置STATIC_ROOT需要使用Django操作指令collectstatic来收集所有静态资源,这些静态资源都会保存在STATIC_ROOT所设置的文件夹里。
python .\manage.py collectstatic
DEBUG配置项修改为False:
# SECURITY WARNING: don't run with debug turned on in production! # DEBUG = True DEBUG = False # ALLOWED_HOSTS = [ # '10.1.109.25' # ] ALLOWED_HOSTS = ['*']
后序补充
🍉 媒体资源MEDIA
对于一些经常变动的资源,通常将其存放在媒体资源文件夹,如用户头像、歌曲文件等。媒体资源和静态资源是可以同时存在的,而且两者可以独立运行,互不影响。
🍈 媒体资源路由MEDIA_URL
媒体资源的访问路由配置通过MEDIA_URL配置项进行配置。
在项目的根目录下创建media文件夹用于存放媒体资源,并放置图片:
在配置文件settings.py里设置MEDIA_URL配置项:
MEDIA_URL = 'media/'
🍈 媒体资源路径MEDIA_ROOT
MEDIA_ROOT配置项用于配置媒体资源文件夹media的路径信息。
在配置文件settings.py里设置MEDIA_ROOT配置项:
MEDIA_URL = 'media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
媒体资源配置完成后,还需要将media文件夹注册到Django里,让Django知道如何找到媒体文件,否则无法在浏览器上访问该文件夹的文件信息。
在项目的路由配置文件urls.py文件中,为媒体文件夹media添加相应的路由:
from django.contrib import admin from django.urls import path, re_path from test_app import views # 导入用于配置媒体文件夹media的模块和方法 from django.views.static import serve from django.conf import settings urlpatterns = [ path('admin/', admin.site.urls), path('test/', views.text), # 配置媒体文件夹media添加相应的路由 re_path('media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}, name='media'), ]
访问媒体资源进行测试:
🍉 配置模板文件夹templates
在Web开发中,模板是一种较为特殊的HTML文档。这个HTML文档嵌入了一些能够让Django识别的变量和指令,然后由Django的模板引擎解析这些变量和指令,生成完整的HTML网页并返回给用户浏览。
模板是Django里面的MTV框架模式的T部分,配置模板路径是告诉Django在解析模板时,如何找到模板所在的位置。
🍈 项目模板文件夹
在项目的根目录下新建用于存放模板文件的文件夹templates:
在项目配置文件settings.py文件中添加代码,查看BASE_DIR的指向:
# Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent # Path(__file__).resolve().parent.parent:settings.py文件所在文件的上两级父级目录 print(BASE_DIR)
在项目配置文件setting.py中找到TEMPLATES配置项,修改TEMPLATES配置项中的DIRS,进行模板文件夹的配置:
记得导入os模块
TEMPLATES = [ # Django 默认模板引擎 { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # templates文件夹在项目的根目录下 # BASE_DIR指向项目根目录 # 所以模板文件夹的目录为BASE_DIR / templates 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, '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', ], }, }, ]
模板配置是以列表格式呈现的,每个元素的含义说明:
● BACKEND:定义模板引擎,用于识别模板里面的变量和指令。内置的模板引擎有Django Templates和jinja2.Jinja2,每个模板引擎都有自己的变量和指令语法。
● DIRS:设置模板所在路径,告诉Django在哪个地方查找模板的位置,默认为空列表。模板配置通常配置DIRS的属性值即可。
● APP_DIRS:是否在App里查找模板文件。默认为True。
● OPTIONS:用于填充在RequestContext的上下文(模板里面的变量和指令),一般情况下不做任何修改。
将模板文件夹templates进行标记:
🍈 子应用模板文件夹
创建子应用编写视图函数和路由以及模板文件进行测试:
templates/test.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>hello world</h1> </body> </html>
test_app/views.py
from django.shortcuts import render # Create your views here. def text(request): return render(request, 'test.html')
django_pro/urls.py
from django.contrib import admin from django.urls import path from test_app import views urlpatterns = [ path('admin/', admin.site.urls), path('test/', views.text) ]
一般情况下,项目根目录下的templates文件夹通常用于存放共用的模板文件,而对于每个子应用的模板文件夹,可以在项目的配置文件中的模板文件夹配置项中DIRS追加子应用模板文件夹的配置。
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [ os.path.join(BASE_DIR, 'templates'), os.path.join(BASE_DIR, 'test_app/templates') # 子应用模板文件夹路径 ], 'APP_DIRS': True, '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', ], }, }, ]
修改子应用的视图函数,新建子应用模板文件进行测试:
test_app/templates/testapp.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>testapp</h1> </body> </html>
test_app/views.py
from django.shortcuts import render # Create your views here. def text(request): print(request) return render(request, 'testapp.html')
🍉 Django项目配置jinja2模板引擎
🍈 安装 Jinja2
pip install jinjia2 -i https://pypi.tuna.tsinghua.edu.cn/simple
🍈 配置jinja2模板引擎
在 settings.py 文件中找到项目默认的模板引擎配置项:
将原先的默认模板引擎配置修改为如下配置:
记得导入os模块,用于路径的拼接,
import os
TEMPLATES = [ # Jinja2模板引擎配置 { 'BACKEND': 'django.template.backends.jinja2.Jinja2', # 配置Jinja2模板引擎 # BASE_DIR 指向项目根目录 'DIRS': [os.path.join(BASE_DIR, 'templates')], # 配置模板文件夹路径 'APP_DIRS': True, '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', ], }, }, # Django 默认模板引擎 { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, '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', ], }, }, ]
由于在模板引擎的配置项中配置模板文件的加载目录为:
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 配置模板文件夹路径
且 BASE_DIR 指向项目根目录:
在项目根目录下新建用于存放模板文件的目录 templates(只能使用这个目录名):
设置项目的模板语言:
将用于存放模板文件的目录 templates 标记为模板文件夹:
运行项目:
🍈 Django项目补充 Jinja2 模板引擎环境
由于在Jinja2模板引擎中,读取静态文件和进行重定向较为麻烦,所以需要进行Jinja2 模板引擎环境的补充。通过补充Jinja2 模板引擎环境实现Jinja2自动查找静态文件的路径,我们只需写相对路径即可;实现url()能够解析路由的命名空间实现重定向。
在项目根目录下新建用于管理项目工具文件的包文件夹:
新建Jinja2模板引擎环境的补充文件 jinja2_env.py:
在新创建的 jinja2_env.py 文件中补充 Jinja2 模板引擎的环境配置:
from jinja2 import Environment from django.contrib.staticfiles.storage import staticfiles_storage from django.urls import reverse def jinja2_environment(**options): """jinja2 环境""" # 创建环境对象 env = Environment(**options) # 自定义语法:{{ static('静态文件相对路径')}} {{ url('路由的命名空间')}} # 对全局的环境配置中 static url 对应的配置进行更新 # update中接收的参数为字典 env.globals.update({ 'static': staticfiles_storage.url, # 获取静态文件路径的前缀 'url': reverse, # 模板中能够使用url()识别路由的命名空间实现重定向(反向解析) }) # 返回环境对象 return env
在项目配置文件中模板引擎配置项的OPTIONS配置中引入Jinja2模板引擎环境配置的补充文件:
TEMPLATES = [ # Jinja2模板引擎配置 { 'BACKEND': 'django.template.backends.jinja2.Jinja2', # 配置Jinja2模板引擎 # BASE_DIR 指向项目目录 'DIRS': [os.path.join(BASE_DIR, 'templates')], # 配置模板文件加载目录 'APP_DIRS': True, '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 模板引擎环境 # 'environment': 'utils.jinja2_env.jinja2_environment', 'environment': 'utils.jinja2_env.jinja2_environment', }, }, # Django 默认模板引擎 { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, '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', ], }, }, ]
运行项目: