当前位置: 首页 > news >正文

Django内置后端和自定义后端

【图书介绍】《Django 5企业级Web应用开发实战(视频教学版)》_django 5企业级web应用开发实战(视频教学版)-CSDN博客

《Django 5企业级Web应用开发实战(视频教学版)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com)

5.2.3  内置后端(Built-in backends)

在Django框架中,默认设置了两个模板引擎的内置后端,分别定义为DjangoTemplates和Jinja2。

1. DjangoTemplates

DjangoTemplates通过将BACKEND属性定义为django.template.backends.django.DjangoTemplates来配置Django模板引擎。

当APP_DIRS属性为True时,DjangoTemplates引擎会在已安装的应用程序的templates子目录中查找模板。注意,保留“templates”这个通用名称,是为了向后进行兼容。

DjangoTemplates引擎接收下面的OPTIONS参数:

  • autoescape:一个布尔值,用于控制是否启用HTML自动转义。其默认值为True。
  • context_processors:一个指向可调用对象的Python路径列表,这些模板用于在使用请求展现模板时填充上下文。这些可调用对象以请求对象为参数,并返回要合并到上下文中的字典。其默认值为一个空的列表。
  • debug:一个布尔值,用于开启/关闭模板调试模式。如果其值为True,则错误页面将显示有关模板渲染期间引发的任何异常的详细报告。此报告包含模板的相关摘要,并突出显示了相应的行。其默认值为DEBUG设置的值。
  • loaders:一个模板加载器类的Python路径列表。每个Loader类都知道如何从特定来源导入模板。还可以使用元组代替字符串。元组中的第一项应该是Loader类的名称,随后的项将在初始化期间传递给Loader类。其默认值取决于DIRS和APP_DIRS属性的值。
  • string_if_invalid:一个字符串输出,模板系统应将其以字符串形式用于无效(例如拼写错误)变量。其默认值为一个空的字符串。
  • file_charset:用于读取磁盘上的模板文件的字符集。其默认值为FILE_CHARSET。
  • libraries:一个字典类型,用于向模板引擎注册模板标签模块和Python路径的模板标签模块。该参数能添加新库或为现有库提供备用标签。请看下面的代码示例:
OPTIONS={'libraries': {'myapp_tags': 'path.to.myapp.tags','admin.urls': 'django.contrib.admin.templatetags.admin_urls',},
}
  • builtins:一个用于模板标记模块的Python路径列表,可以添加到内置模块中。请看下面的代码示例:
OPTIONS={'builtins': ['myapp.builtins'],
}

2. Jinja2

Jinja2通过将BACKEND属性定义为django.template.backends.jinja2.Jinja2来配置Django模板引擎。

当APP_DIRS属性为True时,Jinja2引擎在已安装应用程序的jinja2子目录中查找模板。

在OPTIONS中,最重要的入口是“环境”,这是返回Jinja2环境的可调用对象的Python路径,其默认值为“jinja2.Environment”。Django框架调用该可调用对象并将其他选项作为关键字参数传递。此外,Django框架在一些选项中添加了如下与Jinja2不同的默认值:

  • autoescape:True。
  • loader:一个为DIRS和APP_DIRS属性配置的加载程序。
  • auto_reload:settings.DEBUG。
  • undefined:DebugUndefined if settings.DEBUG else Undefined。

另外,Jinja2引擎还接收以下OPTIONS参数:

  • context_processors:一个指向可调用对象的Python路径列表,这些模板用于在使用请求展现模板时填充上下文。这些可调用对象以请求对象为参数,并返回要合并到上下文中的字典。其默认值为一个空的列表。

默认配置被有意地保持为最小配置,如果模板是通过请求展现的(例如使用render()函数时),则Jinja2后端会将全局请求csrf_input和csrf_token添加到上下文中。除此之外,此后端不会创建Django风格的环境,且不了解Django过滤器和标签。为了使用特定于Django框架的API,必须将其配置到环境中。

请看下面的例子,首先使用以下内容创建myproject/jinja2.py文件。

【代码5-7】

01  from django.contrib.staticfiles.storage import staticfiles_storage
02  from django.urls import reverse
03  
04  from jinja2 import Environment
05  
06  def environment(**options):
07      env = Environment(**options)
08      env.globals.update({
09          'static': staticfiles_storage.url,
10          'url': reverse,
11      })
12      return env

然后,将“环境”选项设置为myproject.jinja2.environment,并在Jinja2模板中使用以下代码进行构造:

【代码5-8】

01  <img src="{{ static('path/to/company-logo.png') }}" alt="Company Logo">
02  <a href="{{ url('admin:index') }}">Administration</a>

在Django框架中,标签和过滤器的概念在Django模板语言和Jinja2中都存在,但是用法不同。由于Jinja2支持将参数传递给模板中的可调用对象,因此只需在Jinja2模板中调用一个函数,即可实现许多需要Django模板中的模板标签或过滤器的功能(如上例所示)。另外,Django模板语言没有等效的Jinja2测试。

5.2.4  自定义后端(Custom backends)

在Django框架中,还设置了一种自定义后端。一个自定义后端是一个继承自django.template. backends.base.BaseEngine的类,必须实现get_template()函数方法和可选的from_string()函数方法。

下面,请看一个自定义的foobar模板库的示例。

【代码5-9】

01  from django.template import TemplateDoesNotExist, TemplateSyntaxError
02  from django.template.backends.base import BaseEngine
03  from django.template.backends.utils import csrf_input_lazy, csrf_token_lazy
04  
05  import foobar
06  
07  class FooBar(BaseEngine):
08  
09      # 包含该模板引擎的模板的子目录名称
10      # 在已安装的应用程序内
11      app_dirname = 'foobar'
12  
13      def __init__(self, params):
14          params = params.copy()
15          options = params.pop('OPTIONS').copy()
16          super().__init__(params)
17  
18          self.engine = foobar.Engine(**options)
19  
20      def from_string(self, template_code):
21          try:
22            return Template(self.engine.from_string(template_code))
23          except foobar.TemplateCompilationFailed as exc:
24              raise TemplateSyntaxError(exc.args)
25  
26      def get_template(self, template_name):
27          try:
28              return Template(self.engine.get_template(template_name))
29          except foobar.TemplateNotFound as exc:
30              raise TemplateDoesNotExist(exc.args, backend=self)
31          except foobar.TemplateCompilationFailed as exc:
32              raise TemplateSyntaxError(exc.args)
33  
34  class Template:
35  
36      def __init__(self, template):
37          self.template = template
38  
39      def render(self, context=None, request=None):
40          if context is None:
41              context = {}
42          if request is not None:
43              context['request'] = request
44              context['csrf_input'] = csrf_input_lazy(request)
45              context['csrf_token'] = csrf_token_lazy(request)
46          return self.template.render(context)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • HCIP学习 | OSPF---LSA限制、不规则区域、附录E、选路
  • 【QML】Qt.rgba()的正确使用方法
  • Linux知识复习第2期
  • x86_64、AArch64、ARM32、LoongArch64、RISC-V
  • 【NLP】文本处理的基本方法【jieba分词、命名实体、词性标注】
  • java之如何爬取本地数据(利用正则表达式)
  • C语言 ——— 学习并使用memcmp函数
  • Docker-容器修改
  • 【机器学习】神经网络通过梯度下降学习的步骤以及前向传播的详细步骤
  • Mac终端 shell脚本打包iOS,发现没有生成DSYM文件
  • L1 - OpenCompass 评测 InternLM-1.8B 实践
  • 编程-设计模式 13:责任链模式
  • Conda的自动化魔法:一探auto_activate_base的奥秘
  • Redis 为什么读写性能高?
  • 【Android Git】Git版本回退方式
  • .pyc 想到的一些问题
  • CSS 提示工具(Tooltip)
  • Django 博客开发教程 8 - 博客文章详情页
  • JS笔记四:作用域、变量(函数)提升
  • JS专题之继承
  • mysql常用命令汇总
  • SwizzleMethod 黑魔法
  • 关于使用markdown的方法(引自CSDN教程)
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 如何利用MongoDB打造TOP榜小程序
  • 小程序button引导用户授权
  • 智能合约Solidity教程-事件和日志(一)
  • 追踪解析 FutureTask 源码
  • NLPIR智能语义技术让大数据挖掘更简单
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 如何在招聘中考核.NET架构师
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #ubuntu# #git# repository git config --global --add safe.directory
  • ${factoryList }后面有空格不影响
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (1)(1.13) SiK无线电高级配置(五)
  • (6)设计一个TimeMap
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (备份) esp32 GPIO
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET C# 配置 Options
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .net反编译工具
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • /etc/shadow字段详解
  • /etc/sudoer文件配置简析
  • @AutoConfigurationPackage的使用
  • @html.ActionLink的几种参数格式
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [14]内置对象
  • [2023-年度总结]凡是过往,皆为序章