2017-01-12 5 views
0

配信されるファイルリソースに、どのようにねじれたサーバー変数を置き換えることができますか。pythonの変数置換twisted staticファイル

たとえば、次のコードは、私が行くと./templates/index.htmlをアップロードすることができ、Webページをアップ機能:

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が」{{変数に代入したいです}}基本的なindex.htmlページ

のように、ページはhello worldの代わりに 'my variable'をレンダリングします。

どうすればこの問題を解決できますか?

答えて

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はWebサーバとしてはあまり便利ではないので、コードは複雑に見えます。アプリケーションでHTTP(HTTPS)のみを使用する場合は、[Tornado](http://www.tornadoweb.org/en/stable/index.html)フレームワークを試してみてください。これも非同期で、テンプレートシステム(http://www.tornadoweb.org/en/stable/guide/templates.html)がjinjaに非常に似ています。しかし、それはウェブ専用に設計されています。 –