自定义模板加载器 Django [英] custom template loader Django
问题描述
我正在尝试在 django 中编写一个自定义模板加载器,它为 s3 存储桶中的 index.html 提供服务.以下是我的加载程序文件
i am trying to write a custom template loader in django which serves index.html which is present in a s3 bucket. Following is my loader file
from django.conf import settings
from django.template import Origin, Engine
from django.template.loader import TemplateDoesNotExist
from django.template.loaders.base import Loader
from boto3.session import Session
ACCESS_KEY_NAME = getattr(settings, 'AWS_TEMPLATE_LOADING_ACCESS_KEY_ID', getattr(settings, 'AWS_TEMPLATE_LOADING_ACCESS_KEY_ID', None))
SECRET_KEY_NAME = getattr(settings, 'AWS_TEMPLATE_LOADING_SECRET_ACCESS_KEY', getattr(settings, 'AWS_TEMPLATE_LOADING_SECRET_ACCESS_KEY', None))
TEMPLATE_BUCKET = getattr(settings, 'AWS_TEMPLATE_BUCKET_NAME')
class Loader(Loader):
is_usable = True
def __init__(self, *args, **kwargs):
params = args[0]
options = params.pop('OPTIONS').copy()
options.setdefault('autoescape', True)
options.setdefault('debug', settings.DEBUG)
options.setdefault('file_charset', settings.FILE_CHARSET)
libraries = options.get('libraries', {})
session = Session(aws_access_key_id=ACCESS_KEY_NAME,
aws_secret_access_key=SECRET_KEY_NAME)
s3 = session.resource('s3')
self.bucket = s3.Bucket(TEMPLATE_BUCKET)
super(Loader, self).__init__(*args, **kwargs)
self.engine = Engine(dirs=params['DIRS'], context_processors=options, loaders=Loader)
def getKeys(self):
keys_objects = []
for obj in self.bucket.objects.all():
key = obj.key
keys_objects.append({
'key': key,
'object': obj
})
return keys_objects
def get_contents(self, origin):
try:
keys_objects = self.getKeys()
for key_object in keys_objects:
if key_object['key'] == origin:
return key_object['object'].get()['Body'].read()
except FileNotFoundError:
raise TemplateDoesNotExist(origin)
def get_template_sources(self, template_name, template_dirs=None):
tried = []
yield Origin(
name=template_name,
template_name=template_name,
loader=self,
)
tried.append('/index.html')
if tried:
error_msg = "Tried Keys %s" % tried
else:
error_msg = "Your TEMPLATE_DIRS setting is empty. Change it to point to at least one template directory."
raise TemplateDoesNotExist(error_msg)
get_template_sources.is_usable = True
在我的设置中,我已按以下方式设置模板设置.
and in my settings i have set the template settings in following way.
TEMPLATES = [
{
'BACKEND': 'app.s3template_loader.Loader',
'DIRS': [
'index.html'
],
'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',
],
},
}
]
以下是我的看法
from django.shortcuts import render
from django.views.generic import TemplateView
# Create your views here.
class AngularAppView(TemplateView):
template_name = 'index.html'
但是当我试图访问我的终点时,我得到了
but when i am trying to acces my end point i am getting
内部服务器错误:/回溯(最近一次调用最后一次):文件"/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py",第 41 行,在内部response = get_response(request) 文件 "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py",第 217 行,在 _get_response 中response = self.process_exception_by_middleware(e, request) 文件/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py",第 215 行,在 _get_response 中response = response.render() 文件/usr/local/lib/python3.6/site-packages/django/template/response.py",第 107 行,在渲染中self.content = self.rendered_content 文件/usr/local/lib/python3.6/site-packages/django/template/response.py",第 84 行,在 render_content 中content = template.render(context, self._request) TypeError: render() 需要 2 个位置参数,但给出了 3 个
Internal Server Error: / Traceback (most recent call last): File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner response = get_response(request) File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 217, in _get_response response = self.process_exception_by_middleware(e, request) File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 215, in _get_response response = response.render() File "/usr/local/lib/python3.6/site-packages/django/template/response.py", line 107, in render self.content = self.rendered_content File "/usr/local/lib/python3.6/site-packages/django/template/response.py", line 84, in rendered_content content = template.render(context, self._request) TypeError: render() takes 2 positional arguments but 3 were given
我找不到我做错了什么.任何帮助表示赞赏.
i am not able to find what i am doing wrong. any help is appreciated.
推荐答案
您构建了一个加载器,但您将其用作后端/引擎.试试这个配置:
You built a loader, but you are using it as backend/engine. Try this config:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
'index.html'
],
'APP_DIRS': True,
'OPTIONS': {
'loaders': ['app.s3template_loader.Loader'],
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
}
]
请注意,设置 OPTIONS['loaders']
将禁用缓存.请参阅 cached 上的文档.Loader
.
Note that setting OPTIONS['loaders']
will disable caching. See docs on cached.Loader
.
这篇关于自定义模板加载器 Django的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!