2017-01-12 18 views
0

제공된 파일 리소스 대신 트위스트 된 서버 변수를 어떻게 대체 할 수 있습니까?파이썬 트위스트 정적 파일의 변수 대체

if __name__ == '__main__': 
    var = 'my variable' 
    from twisted.web.static import File 
    webdir = File("{0}/templates/".format(os.path.dirname(os.path.realpath(__file__)))) 
    web = Site(webdir) 
    reactor.listenTCP(int(os.environ.get('SR_LISTEN_PORT')), web) 
    reactor.run() 

내가 {{변수를 대체 할 수있는 변수 'var에'를 원하는 : 내가 가서 ./templates/index.html을로드 할 수있는

예를 들어

, 다음 코드는 웹 페이지를 제공합니다 }} 기본 index.html 페이지

에서 페이지가 hello world 대신 '내 변수'를 렌더링합니다.

어떻게하면됩니까?

답변

0

파일 제공을 위해 템플릿 엔진이 필요한 것 같습니다. jinja2을 사용할 수 있습니다. 귀하의 경우에는 static.File는 템플릿 디렉토리와 resource.Resource을 렌더링하는 데 사용되어야한다 - 파일을 제공하는 것이 jinja2를 통해 렌더링에 : jinja2 렌더링이있다

<html> 
    <head><title>Test</title></head> 
    <body>{{ var }}</body> 
</html> 

하는 것으로 :

import os 

import jinja2 

from twisted.internet import reactor 
from twisted.web.resource import Resource 
from twisted.web.static import File 
from twisted.web.server import Site 

template_dir = '{}/templates/'.format(os.path.dirname(os.path.realpath(__file__))) 

def render(template_file, context): 
    env = jinja2.Environment(loader=jinja2.FileSystemLoader(template_dir)) 
    return env.get_template(template_file).render(context).encode('utf-8') 

class RDirectory(File): 
    def getChild(self, name, request): 
     if name == '': 
      return super(RDirectory, self).getChild(name, request) 
     return RFile() 

class RFile(Resource): 
    isLeaf = True 

    def render_GET(self, request): 
     data = {'var': 'my variable'} 
     return render(request.uri, data) 

if __name__ == '__main__': 
    web = Site(RDirectory(template_dir)) 
    reactor.listenTCP(int(os.environ.get('SR_LISTEN_PORT')), web) 
    reactor.run() 

파일이 같은 수 있습니다 꼬인 원자로를 차단할 것이다. 이를 피하려면 launch rendering in a thread을 사용하거나 내장형 트위스트 templates을 사용해보십시오. 그러나 많은 가능성을 제공하지는 않습니다.

+0

이 코드는 필자가 필요로하는 것처럼 보이지만 Jinja2에 대해 들어 본 적이 없으므로 실제로 코드를 이해하기 위해 테스트를해야 할 것입니다. 감사합니다! – user1601716

+0

@ user1601716 Twisted는 웹 서버로 사용하기가 쉽지 않으므로 코드가 복잡해 보입니다. 응용 프로그램에서 HTTP (HTTPS) 만 사용하는 경우 [Tornado] (http://www.tornadoweb.org/en/stable/index.html) 프레임 워크를 사용해보십시오. 그것은 비동기 적이며, 진자와 매우 유사한 [템플릿 시스템] (http://www.tornadoweb.org/en/stable/guide/templates.html)이 내장되어 있습니다. 그러나 그것은 웹 전용으로 설계되었습니다. –