Django内置后端和自界说后端

打印 上一主题 下一主题

主题 537|帖子 537|积分 1611

【图书介绍】《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路径的模板标签模块。该参数能添加新库或为现有库提供备用标签。请看下面的代码示例:
  1. OPTIONS={
  2.     'libraries': {
  3.         'myapp_tags': 'path.to.myapp.tags',
  4.         'admin.urls': 'django.contrib.admin.templatetags.admin_urls',
  5.     },
  6. }
复制代码


  • builtins:一个用于模板标记模块的Python路径列表,可以添加到内置模块中。请看下面的代码示例:
  1. OPTIONS={
  2.     'builtins': ['myapp.builtins'],
  3. }
复制代码
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】
  1. 01  from django.contrib.staticfiles.storage import staticfiles_storage
  2. 02  from django.urls import reverse
  3. 03  
  4. 04  from jinja2 import Environment
  5. 05  
  6. 06  def environment(**options):
  7. 07      env = Environment(**options)
  8. 08      env.globals.update({
  9. 09          'static': staticfiles_storage.url,
  10. 10          'url': reverse,
  11. 11      })
  12. 12      return env
复制代码
然后,将“情况”选项设置为myproject.jinja2.environment,并在Jinja2模板中利用以下代码进行构造:
【代码5-8】
  1. 01  <img src="{{ static('path/to/company-logo.png') }}" alt="Company Logo">
  2. 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】
  1. 01  from django.template import TemplateDoesNotExist, TemplateSyntaxError
  2. 02  from django.template.backends.base import BaseEngine
  3. 03  from django.template.backends.utils import csrf_input_lazy, csrf_token_lazy
  4. 04  
  5. 05  import foobar
  6. 06  
  7. 07  class FooBar(BaseEngine):
  8. 08  
  9. 09      # 包含该模板引擎的模板的子目录名称
  10. 10      # 在已安装的应用程序内
  11. 11      app_dirname = 'foobar'
  12. 12  
  13. 13      def __init__(self, params):
  14. 14          params = params.copy()
  15. 15          options = params.pop('OPTIONS').copy()
  16. 16          super().__init__(params)
  17. 17  
  18. 18          self.engine = foobar.Engine(**options)
  19. 19  
  20. 20      def from_string(self, template_code):
  21. 21          try:
  22. 22            return Template(self.engine.from_string(template_code))
  23. 23          except foobar.TemplateCompilationFailed as exc:
  24. 24              raise TemplateSyntaxError(exc.args)
  25. 25  
  26. 26      def get_template(self, template_name):
  27. 27          try:
  28. 28              return Template(self.engine.get_template(template_name))
  29. 29          except foobar.TemplateNotFound as exc:
  30. 30              raise TemplateDoesNotExist(exc.args, backend=self)
  31. 31          except foobar.TemplateCompilationFailed as exc:
  32. 32              raise TemplateSyntaxError(exc.args)
  33. 33  
  34. 34  class Template:
  35. 35  
  36. 36      def __init__(self, template):
  37. 37          self.template = template
  38. 38  
  39. 39      def render(self, context=None, request=None):
  40. 40          if context is None:
  41. 41              context = {}
  42. 42          if request is not None:
  43. 43              context['request'] = request
  44. 44              context['csrf_input'] = csrf_input_lazy(request)
  45. 45              context['csrf_token'] = csrf_token_lazy(request)
  46. 46          return self.template.render(context)
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天空闲话

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表