37

私はBottleでいくつかのコーディングを行いました。それは本当にシンプルで、私のニーズに合っています。ただし、アプリケーションをクラスにラップしようとすると、固執しました。

import bottle
app = bottle

class App():
    def __init__(self,param):
        self.param   = param

    # Doesn't work
    @app.route("/1")
    def index1(self):
        return("I'm 1 | self.param = %s" % self.param)

    # Doesn't work
    @app.route("/2")
    def index2(self):
        return("I'm 2")

    # Works fine
    @app.route("/3")
    def index3():
        return("I'm 3")

Bottleの関数の代わりにメソッドを使用することは可能ですか?

4

5 に答える 5

41

バインドされていないメソッドにルーティングしようとしているため、コードは機能しません。非バインドメソッドにはへの参照がありませんが、のselfインスタンスが作成されていない場合、どのようにそれらを参照できAppますか?

クラスメソッドにルーティングする場合は、最初にクラスを初期化し、次に次bottle.route()のようにそのオブジェクトのメソッドにルーティングする必要があります。

import bottle        

class App(object):
    def __init__(self,param):
        self.param   = param

    def index1(self):
        return("I'm 1 | self.param = %s" % self.param)

myapp = App(param='some param')
bottle.route("/1")(myapp.index1)

ルート定義をハンドラーの近くに固定したい場合は、次のようにすることができます。

def routeapp(obj):
    for kw in dir(app):
        attr = getattr(app, kw)
        if hasattr(attr, 'route'):
            bottle.route(attr.route)(attr)

class App(object):
    def __init__(self, config):
        self.config = config

    def index(self):
        pass
    index.route = '/index/'

app = App({'config':1})
routeapp(app)

クラスの2つのインスタンスを作成することはできないため、のbottle.route()部分は実行しないでください。App.__init__()App

属性を設定するよりもデコレータの構文が好きな場合はindex.route=、簡単なデコレータを作成できます。

def methodroute(route):
    def decorator(f):
        f.route = route
        return f
    return decorator

class App(object):
    @methodroute('/index/')
    def index(self):
        pass
于 2012-01-04T11:38:22.683 に答える
28

以下は私にとってうまく機能します:)かなりのオブジェクト指向でわかりやすいです。

from bottle import Bottle, template

class Server:
    def __init__(self, host, port):
        self._host = host
        self._port = port
        self._app = Bottle()
        self._route()

    def _route(self):
        self._app.route('/', method="GET", callback=self._index)
        self._app.route('/hello/<name>', callback=self._hello)

    def start(self):
        self._app.run(host=self._host, port=self._port)

    def _index(self):
        return 'Welcome'

    def _hello(self, name="Guest"):
        return template('Hello {{name}}, how are you?', name=name)

server = Server(host='localhost', port=8090)
server.start()
于 2013-04-17T11:51:11.610 に答える
28

Bottleクラスを拡張する必要があります。インスタンスはWSGIWebアプリケーションです。

from bottle import Bottle

class MyApp(Bottle):
    def __init__(self, name):
        super(MyApp, self).__init__()
        self.name = name
        self.route('/', callback=self.index)

    def index(self):
        return "Hello, my name is " + self.name

app = MyApp('OOBottle')
app.run(host='localhost', port=8080)

この質問に対する以前の回答を含め、そこにあるほとんどの例は、すべて「デフォルトアプリ」を再利用し、独自のアプリを作成せず、オブジェクト指向と継承の利便性を使用していません。

于 2014-12-18T20:25:18.450 に答える
3

@Skirmantasの回答を取得し、メソッド、スキップなどのデコレータでキーワード引数を使用できるように少し変更しました。

def routemethod(route, **kwargs):
    def decorator(f):
        f.route = route
        for arg in kwargs:
            setattr(f, arg, kwargs[arg])
        return f
    return decorator

def routeapp(obj):
    for kw in dir(obj):
        attr = getattr(obj, kw)
        if hasattr(attr, "route"):
            if hasattr(attr, "method"):
                method = getattr(attr, "method")
            else:
                method = "GET"
            if hasattr(attr, "callback"):
                callback = getattr(attr, "callback")
            else:
                callback = None
            if hasattr(attr, "name"):
                name = getattr(attr, "name")
            else:
                name = None
            if hasattr(attr, "apply"):
                aply = getattr(attr, "apply")
            else:
                aply = None
            if hasattr(attr, "skip"):
                skip = getattr(attr, "skip")
            else:
                skip = None

            bottle.route(attr.route, method, callback, name, aply, skip)(attr)
于 2014-01-14T11:10:44.107 に答える
3

これを試してみてください、私のために働きました、ドキュメントも始めるのにかなりまともです...

https://github.com/techchunks/bottleCBV
于 2014-07-20T07:52:25.870 に答える