2014-11-21 4 views
1

작업중인 사용자 정의 템플릿 태그가 있습니다. 내 장고 관리 인터페이스 사용자가 해당 템플릿 태그를 플랫 페이지에 넣고 올바르게 렌더링되도록하고 싶습니다. 그러나 렌더링 된 플랫 페이지에 액세스하려고하면 500 개의 서버 오류가 발생합니다. 디버그 콘솔은 TemplateSyntaxError: Invalid block tag: 'requesturl'을 인쇄합니다. 내가 인식하지 못하는 일종의 사용자 정의 템플릿 태그 로딩 우선 순위가 있습니까? 여기 사용자 정의 템플릿 태그 내에서 Django 사용자 정의 템플릿 태그 구문 분석

내 사용자 정의 템플릿 태그입니다 :

from django import template 
import requests 

register = template.Library() 

def getrequest(url): 
    """ 
    Simple request object 
    to GET another file 
    """ 
    try: 
     r = requests.get(url) 
    except requests.exceptions.RequestException as e: 
     raise IOError(e) 
    except requests.exceptions.HTTPError as e: 
     raise IOError(e) 

    if r.status_code != 200: 
     raise IOError('Non 200 response returned') 
    else: 
     return r.content 

@register.tag(name="requesturl") 
def do_requesturl(parser, token): 
    """ 
    tag usage {% requesturl object.textfield %} 
    """ 
    try: 
     tag_name, uri = token.split_contents(); 
    except ValueError: 
     raise template.TemplateSyntaxError, "%r tag requires a single URI string argument" % token.contents.split()[0] 
    if not (uri[0] == uri[-1] and uri[0] in ('"', "'")): 
     raise template.TemplateSyntaxError("%r tag's URI should be in quotes" % tag_name) 
    return RequestUrlNode(uri[1:-1]) 

class RequestUrlNode(template.Node): 
    def __init__(self, uri): 
     self.uri = uri 

    def render(self, context): 
     try: 
      pagecontent = getrequest(self.uri) 
      return pagecontent 
     except template.VariableDoesNotExist, template.TemplateSyntaxError: 
      return 'Error rendering', self.uri 

내가 (템플릿 자체) URL을 정의 내 장고 템플릿의이 점을 드롭 할 수 있으며이 내용을 얻을 수있는 requests 모듈을 사용 지정된 웹 페이지를 템플릿에 렌더링 :

{% extends "site_layout.html" %} 
{% load requesturl %} 
{% requesturl "http://textfiles.com/100/914bbs.txt" %} 

위대한. 이제 다음 단계는 내 사용자가 장고 아래의 스크린 샷처럼 flatpages.content 필드에 템플릿 태그를 추가하여 응용 프로그램을 flapages 기본에서이 작업을 수행 할 수 있도록하려는 것입니다 :

screenshot of flat page entry

참고 I 내 특정 플랫 페이지 템플릿을 사용하고 있으며 기본값이 아닌지 확인했습니다.

태그를 평가하려면 this SO answer의 단계를 따르십시오. 내 자신의 커스텀 템플리트 태그를 평가하기 전에 내장 된 장고 템플릿 태그와 필터로 테스트 한 결과, 매력처럼 작동했습니다. 다음은 모두의 예는 장고 내장 템플릿 필터 (lower)와 태그 (now)입니다 :

Adding built-in template tags and filters to the flatpages content textarea

그리고 렌더링하는 방법 :

The flatpage template tags rendered

그러나, 나는하려고 할 때 그리고 내 자신의 사용자 정의 템플릿 태그를 입력, 나는 두려워 TemplateSyntaxError: Invalid block tag: 'requesturl' 얻을. 다음은 내 flatpage 구문 분석 템플릿 태그입니다 :

from django import template 

register = template.Library() 

@register.tag(name="evaluate") 
def do_evaluate(parser, token): 
    """ 
    tag usage {% evaluate object.textfield %} 
    """ 
    try: 
     tag_name, variable = token.split_contents() 
    except ValueError: 
     raise template.TemplateSyntaxError, "%r tag requires a single argument" % token.contents.split()[0] 
    return EvaluateNode(variable) 

class EvaluateNode(template.Node): 
    def __init__(self, variable): 
     self.variable = template.Variable(variable) 

    def render(self, context): 
     try: 
      content = self.variable.resolve(context) 
      t = template.Template(content) 
      return t.render(context) 
     except template.VariableDoesNotExist, template.TemplateSyntaxError: 
      return 'Error rendering', self.variable 

내가 별도로이 두 부분을 할 수있는 이유 손실에 있어요,하지만 난 시도하고 그들을 결합 할 때 나는 오류 얻을 :

File "/path/to/virtualenv/lib/python2.7/site-packages/django/template/base.py", line 332, in invalid_block_tag 
raise self.error(token, "Invalid block tag: '%s'" % command) 
TemplateSyntaxError: Invalid block tag: 'requesturl' 

을 내가 생각할 수있는 유일한 것은 내 사용자 정의 템플릿 태그가 장고에 등록되어 있지 않다는 것입니다. 그러나 이것이 플랫 페이지 템플릿에 직접 포함되어 있다면 왜 작동할까요? 기본 템플릿 태그 레지스트리가 있습니까 아니면 내 EvaluateNode 클래스는 내가 뭘하고 있다고 생각하지 않는거야?

미리 감사드립니다.

답변

0

이것은 내 눈에는 적절한 해결책은 아니지만 지금 배포 한 해결 방법입니다. 나는 기존의 Django Server Side Includes 템플릿 태그 {% ssi %}을 사용하고 파일 시스템의 파일들을 포함하여 끝내었다. 내 사용자가 시스템 외부에 파일을 포함 할 수 있기를 바랬지 만, 사용 사례로는 장고 설치에 로컬 파일 만 포함시켜 살 수 있습니다.

내가하려는 것은 어쨌든 본질적으로 안전하지 못하며 내 사용자가 장고 시스템의 로컬 파일 만 포함하도록 강요하는 것이 훨씬 안전하다고 주장 할 수 있습니다.그것은 여전히 ​​실제적인 실제 사용 사례보다는 커스텀 템플리트 태그 등록 및 사용에 관한 나의 원래 질문에 대답하지 않습니다.

관련 문제