2017-08-12 13 views
0

twistedを使用してサイトのすべてのページを生成したいとします。それはgenerating a page dynamicallyと似ている必要があります。Twistedを使用して動的にサイトを生成

私はこの思い付いた:つまり、私はURL localhost:8080/fooでページを生成することができるよ、しかし、どのように私はそれに多くのスラッシュを追加することができます

class Home(Resource): 
    isLeaf = False 

    def __init__(self, pathname): 
     Resource.__init__(self) 
     self.pathname = pathname 

    def getChild(self, name, request): 
     if name == '': 
      return self 
     return Resource.getChild(self, name, request) 

    def render_GET(self, request): 
     path = "/var/www/html/books.toscrape.com/catalogue/" 
     fname = path + self.pathname 
     if ".html" in self.pathname: 
      f = open(fname) 
      s=f.read() 
      return s 
     else: 
      fname = fname + "/index.html" 
      f = open(fname) 
      s=f.read() 
      return s 

class ElseSite(Resource): 
    def getChild(self,name,request): 
     return Home(name) 

resource = ElseSite() 
factory = Site(resource) 

localhost:8080/foo/barのようなものを?

+0

あなたは質問をするつもりでしたか? –

+0

@ Jean-PaulCalderone申し訳ありませんが、私の疑問を追加しました。 –

答えて

1

子どもたち自身が子供を持つことができます。

from twisted.web.resource import Resource 

class Foo(Resource): 
    def getChild(self, name, request): 
     return Bar(name) 

class Bar(Resource): 
    def getChild(self, name, request): 
     return Data(name) 

site = Site(Foo())  
... 

あなたはまた、あなたの階層を定義するさまざまなスタイルを提供Kleinを見てみたいことがあります。クラインのドキュメントから:

from klein import Klein 
app = Klein() 

@app.route('/') 
def pg_root(request): 
    return 'I am the root page!' 

@app.route('/about') 
def pg_about(request): 
    return 'I am a Klein application!' 

app.run("localhost", 8080) 

ネイティブツイストウェブスタイルは非常に動的リソース階層のための素晴らしいです。 Kleinスタイルは比較的固定された階層に適しています。

+0

あなたの答えをありがとう。この回答は私に役立った:https://stackoverflow.com/a/37689813/217088。 –

-1

この回答は役に立ちました:https://stackoverflow.com/a/37689813/217088

isLeaf = Trueという単一のリソースを定義した後、request.postpathを使用して​​の後にクエリを取得しました。

私のコードは次のようになります。

class Home(Resource): 
    isLeaf = True 

    def __init__(self): 
     Resource.__init__(self) 

    def render_GET(self, request): 
     path = "/var/www/html/books.toscrape.com/" 
     filepath = '/'.join(request.postpath) 
     fname = path + filepath 
     f = open(fname) 
     s=f.read() 
     return s 

resource = Home() 
factory = Site(resource) 
+0

これは 'render_GET'の非常に問題のある実装です。 '../../../../ etc/passwd'のようなパスのリクエストを考えてみてください。これは、リソースを実装する良い方法ではありません。 –

+0

私はここでの不具合を理解しています。ありがとう! –

関連する問題