2016-12-05 14 views
0

cherrypyで提供される静的コンテンツをカスタマイズする方法を理解しようとしています。CherryPyを使ったカスタム静的コンテンツ

目的は、パスが通常/ pubで始まるときにファイルを提供することですが、パスが何かで始まるときは、最初にアクセスをチェックするカスタム関数を追加したいと思います。

ドキュメントで十分です。ここに私がこれまで持っていたものがあります...

import cherrypy 
from cherrypy.lib.static import serve_file 
class Root(object): 
    # Somehow turn this into a handler for all files 
    def page(self): 
     if authorized(): # Check whether authenticated user may access the requested path 
      file_location = .... # Work out file location from request 
      print("Serving file from %s" % file_location) 
      return serve_file(file_location) 
     else: 
      return "Not Authorized" 

if __name__ == '__main__': 
    serve_conf = {'/': {'tools.gzip.on': True}, 
        '/pub': { 
         'tools.staticdir.on': True, 
         'tools.staticdir.dir': "/data/public", 
         'tools.staticdir.debug': True, 
         'log.screen': True 
         }, 
        '/secure': { "PROBABLY CONFIGURE THE HANDLER HERE" } 
        } 
    cherrypy.quickstart(Root(), config=serve_conf) 

答えて

0

私は多かれ少なかれ苦しい試行錯誤をしました。あるこれが私の最初の「ツール」

from os.path import basename 

import cherrypy 
import os 

from cherrypy import Tool 
from validator.util import validate_bearer_header 

# Returns the "signing secret" file from the handler application 
def get_signing_secret(*args): 
    signing_secret = cherrypy.request.app.cdn_signing_secret 
    return signing_secret 

# A tool that can be used to "protect" resources that requires authentication 
def protect(*args): 
    subject_resource = basename(cherrypy.request.path_info) 
    supplied_auth = cherrypy.request.headers.get("Authorization", None) 
    if not supplied_auth: 
     raise cherrypy.HTTPError("401 Not Authenticated") 
    token_test_result = validate_bearer_header(supplied_auth, get_signing_secret()) 
    if not token_test_result: 
     raise cherrypy.HTTPError("401 Not Authenticated") 
    if not token_test_result.get("sub") == subject_resource: 
     raise cherrypy.HTTPError("403 Unauthorized") 


class Root(object): 

    def __init__(self): 
     try: 
      with open(cherrypy.config["cdn_signingkey.filename"], 'r') as secretfile: 
       self.cdn_signing_secret = secretfile.read().replace('\n', '') 
      print("CDN signing secret obtained") 
     except: 
      print("ERROR reading CDN signing secret file") 
      raise 
     cherrypy.tools.protect = Tool('before_handler', protect) 

    # TODO Add exposed handlers to allow automated master/slave CDN file replication 


if __name__ == '__main__': 
    conf_file = os.path.join(os.path.dirname(__file__), 'cdn_server.conf') 
    cherrypy.config.update(conf_file) 
    cherrypy.quickstart(Root(), config=conf_file) 

アプリに関連する私のconfigファイルのエントリです:

[/] 
tools.gzip.on = True 

[/pub] 
tools.staticdir.on = True 
tools.staticdir.dir = "/data/cdn/public" 
tools.staticdir.debug = True 
log.screen = True 

[/secure]: 
tools.staticdir.on = True 
tools.staticdir.dir = "/data/cdn/secure" 
tools.staticdir.debug = True 
log.screen = True 
tools.protect.on = True 

私はアプリクラスのメンバーとしてget_signing_secret定義することを好むだろうと上記の方法の代わりにself.cdn_signing_secretにアクセスしてください。しかし、私はツールに渡される "self"をどのように扱うかを理解できません。

+0

[認証ツールの例](https://github.com/GDG-Ukraine/gdg.org.ua/blob/master/src/GDGUkraine/lib/tools/authorize.py)をご覧ください。 'cherrypy.Tool'クラスを使用し、[単純な割り当てで登録されています](https://github.com/GDG-Ukraine/gdg.org.ua/blob/master/src/GDGUkraine/lib/tools/__init__)。 py#L7)。私はこれがクラスにコードをラップするのに役立つことを願っています。 – webKnjaZ

関連する問題