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)
相关文章:

Django内置后端和自定义后端
【图书介绍】《Django 5企业级Web应用开发实战(视频教学版)》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战(视频教学版)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 5.2.3 内置…...

嵌入式人工智能(OpenCV-基于树莓派的人脸识别与入侵检测)
1、人脸识别 人脸识别是一种技术,通过检测、跟踪和识别人脸上的关键特征,以确认人脸的身份。它通常用于安保系统、身份验证、社交媒体和人机交互等领域。 人脸识别技术的基本原理是先通过图像处理和计算机视觉算法,提取人脸的特征点和特征描…...

如何选择适合的香港云服务器提供商?
稳定性和可靠性 确保提供商有高水平的服务器正常运行时间,并提供可靠的数据备份和恢复选项。 网络速度和延迟 选择能够提供快速和低延迟网络连接的服务商,尤其是对于目标用户位于中国大陆的企业而言。 客户支持 查看提供商是否提供24/7的客户支持&#x…...

安卓Android JAVA校招/实习面试合集:多线程、强软弱虚引用、进程、内存管理、Activity、Fragment......
本人今年(2023年)参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料。 整理成了面试系列,由于时间有限,每天整理一点,后续会陆续分享出来&a…...

Jeecgboot 字典值自动转化:DictAspect类方法改造,支持IPage、List、Object、Map类自动转化,附有源码
改造的是DictAspect类: 原来使用的 parseDictText(Object result)方法,针对返回对象为Result 的IPage的分页列表数据进行动态字典注入,当单个对象查询,列表查询,或者多个数据放到Map中时,就不会自动转化&am…...

DVWA DOM Based Cross Site Scripting (DOM型 XSS)
DVWA DOM Based Cross Site Scripting (DOM型 XSS) 文章目录 DVWA DOM Based Cross Site Scripting (DOM型 XSS)XSS跨站原理DOM型 LowMediumHighImpossible XSS跨站原理 当应用程序发送给浏览器的页面中包含用户提交的数据,但没有经过适当验证或转义时,就…...

LinkedList集合及迭代器的源码分析
一.介绍: 二.LinkedList集合特有的API: 三.迭代器的源码分析: package com.itheima.a03myarraylist;import java.util.ArrayList; import java.util.Iterator;public class A01_ArrayListDemo1 {public static void main(String[] args) {ArrayList<String> listnew Arr…...

Go调度器
线程数过多,意味着操作系统会不断地切换线程,频繁的上下文切换就成了性能瓶颈.Go提供一种机制 可以在线程中自己实现调度,上下文切换更轻量,从而达到线程数少,而并发数并不少的效果,而线程中调度的就是Goroutine 调度器主要概念: 1.G:即Go协程,每个go关键字都会创建一个协程…...

当node节点kubectl 命令无法连接到 Kubernetes API 服务器
1.问题 当node节点当node节点kubectl 命令无法连接到 Kubernetes API 服务器 [rootnode1 ~]# kubectl get nodes The connection to the server localhost:8080 was refused - did you specify the right host or port?2. 确认 kubeconfig 文件 确保节点上有有效的 kubeco…...

直接通过类CURL方式,与GRPC方法交互的命令行工具
大家好,今天给大家分享的是一个命令行工具grpcurl,它能够直接与 gRPC 服务进行交互。 项目介绍 您可以把grpcurl想象成是 curl 的 gRPC 版本,但是功能更加强大。 由于 gRPC 服务之间的通信使用的是 Protocol Buffers (Protobuf) 格式的二进…...

Hive3:数据的加载与导出
一、加载数据 在创建表之后,表中没有数据,我们不可能insert存入数据。 而是,通过数据加载,将HDFS中的数据关联到Hive表中。 建表 CREATE TABLE myhive.test_load(dt string comment 时间(时分秒), user_…...

React事件绑定的方式有哪些?区别?
React 中事件绑定的方式主要有以下几种: 直接在 JSX 中绑定事件: <button onClick{handleClick}>Click me</button> 这是最常见和推荐的方式。事件名(如 onClick)作为 JSX 的属性,值为一个函数,…...

ibis:极具潜力的Python数据分析新框架
今天要给大家介绍的Python框架叫做ibis,没错,跟著名连锁酒店宜必思同名,其作者是创造了pandas、Arrow等著名框架的Wes McKinney。 ibis的核心理念是用同一套数据框操作API,统一操纵各种主流的数据运算框架,使得用户可以…...

SQL Zoo 8+.NSS Tutorial
以下数据来自SQL Zoo 1.at Edinburgh Napier University,studying (8) Computer Science,Show the the percentage who STRONGLY AGREE.(在爱丁堡纳皮尔大学,学习“计算机科学”,显示STRONGLY AGREE的百分比࿰…...

conda pack迁移环境
文章目录 下载conda pack打包已有环境还原环境 因为有的服务器没有网络,如果想要安装自己的虚拟环境,就需要在有网络的服务器安装好环境后迁移到没有网络的服务器。conda-pack是一个命令行工具,用于打包 conda 环境,pip inatall和…...

UML建模案例分析-活动图商业建模
概述 活动图主要用来描述如何完成工作以及做什么工作。可以用活动图来描述操作、类或 用例,但是它们只能显示工作流。可以用活动图来进行商业建模,在模型中,工作、工 人、组织、对象被显示。 案例 在商业建模时,下列方面是模型要…...

C++标准模板(STL)- 低层内存管理 - 解分配函数 (operator delete, operator delete[])
低层内存管理 new 表达式是创建拥有动态存储期对象或对象数组的仅有方式,即它们拥有不受制于创建所它们在的作用域的生存期。 new 表达式通过调用分配函数获得存储。 delete 表达式销毁最终导出对象或通过 new 表达式创造的数组,然后调用解分配函数。默认…...

LeetCode 热题 HOT 100 (025/100)【宇宙最简单版】
【二叉树】No. 0124 二叉树中的最大路径和 【困难】👉力扣对应题目指路 希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【力扣详解】谢谢你…...

【mysql 第三篇章】一条 update语句是怎么持久化到磁盘上的?
首先看一下这个 SQL 语句你会不会写? 下面是说明执行这个 SQL 语句,数据库底层做了什么操作。 update users set namexxx where id10;在引擎要执行更新语句的时候,比如更新 id10 这行数据时,他会先查看数据在缓冲池中是否存在,如…...

深入探索大模型:从基础到实践,开启AI之旅
摘要: 在人工智能领域,大模型技术正成为推动创新和进步的关键力量。对于初学者而言,掌握大模型的基本概念、理论和技术是至关重要的。 本文将为你提供一个全面的学习路线,帮助你从基础知识出发,逐步深入到大模型的实践…...

题解:力扣1567 - 返回乘积为正数的最长子数组
问题描述 给定一个整数数组 nums,找出乘积为正数的最长子数组的长度。这里的子数组定义为连续元素的序列,乘积为正数指子数组中正数的个数必须大于负数的个数。 解题思路 为了解决这个问题,我们可以使用两个数组 f 和 g 分别表示以当前位置…...

009 | 上证50ETF基金数据分析及预测
项目背景 中国股市的发展历程坎坷,从最初的茫然到现在的逐步成熟,股市已经成为中国经济发展的重要标志之一。然而,当前中国股市仍存在投机行为过度和定价机制不完善等问题。为更好地理解和预测股市走势,本项目聚焦于上证50ETF基金的历史数据分析和未来走势预测。 项目目标…...

Wakanda: 1靶场复现【附代码】(权限提升)
靶机下载地址: wakanda: 1 ~ VulnHubwakanda: 1, made by xMagass. Download & walkthrough links are available.https://www.vulnhub.com/entry/wakanda-1,251/#download 1. 主机发现端口扫描目录扫描敏感信息获取 1.1. 主机发现 nmap -sn 192.168.7.0/24…...

内核函数调试
要进入 bind 函数的内部进行调试,实际上是不能直接在用户空间代码中进入内核内部的 bind 实现,因为 bind 是一个系统调用,它由内核处理。尽管如此,你可以通过以下几种方法来间接调试 bind 函数并理解它的行为: 1. 使用…...

Spring IOC使用DButil实现对数据库的操作
一、DButil、lombok、junit的简单介绍 1.dbutil dbutil是由阿帕奇提供操作数据库的插件,其核心类为QueryRunner,存在方法 .query() 查询,.update() 增删改; <!-- dbutil --> <dependency><groupId>commons-d…...

Android14音频进阶调试之命令播放mp3/aac非裸流音频(八十)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更…...

vue中怎么自定义组件
目录 一:功能描述 二:实现过程 一:功能描述 在开发过程中我们经常需要自定义组件完成特定的功能,比如用户详情页,我增加一个调整余额的按钮,点击以后需要打开一个调整余额对话框,输入调整的金…...

BM1反转链表[栈+头插法]
题目要求如下: 问题比较简单,就是将链表中的值进行反转即可。 一种比较简单的方式是使用栈链表的方式来实现,下面是相应的代码: #include <stdio.h> #include <stdlib.h> int arr[10001] {0}; struct ListNode* ReverseList(struct ListNode* head ) {if (head …...

VisionPro二次开发学习笔记10-使用 PMAlign和Fixture固定Blob工具检测孔
使用 PMAlign和Fixture固定Blob工具检测孔 这个示例演示了如何使用 PMAlign 工具和 Fixture 工具来夹持一个 Blob 工具。示例代码将检测支架右上角孔的存在。当点击运行按钮时,将读取新图像。PMAlign 工具运行并生成一个 POSE 作为输出。POSE 是一个六自由度的变换…...

学单片机怎么在3-5个月内找到工作?
每个初学者,都如履薄冰,10几年前,我自学单片机时,也一样。 想通过学习,找一份体面点的工作,又害怕辛辛苦苦学出来,找不到工作。 好在,当初执行力,还算可以,自…...