2014-11-28 6 views
5

Ich möchte einige Methode der Klassen Routen manuell definieren, das so etwas wie:manuell definieren Routen Flask mit

class X: 

    def route1(): 
     #do stuff here 

    def route2(): 
     #do stuff here 

und dann so etwas wie dies machen:

app.add_url_rule('/x/', view_func=X.route1()) 
app.add_url_rule('/y/', view_func=X.route2()) 

Es ist möglich ?? Was ist der richtige Weg, dies zu erreichen?

+0

Außer der Tatsache, dass Sie die Funktionen aufrufen, wenn sie 'view_func' vorbei, haben Sie tatsächlich ein Problem zu tun Dies? – davidism

+0

Es ist nicht sehr klar, wenn Sie Probleme haben, aber ich würde mit der Flasche-classy Erweiterung gehen. Grundsätzlich sind Django Class Based Views für flask (naja, sie sind ein bisschen mehr als nur das, aber trotzdem) – lealhugui

Antwort

8

Es gibt mehrere Möglichkeiten, dies zu tun:

  1. Erstellen Sie eine globale Instanz der Klasse und Route Ihre Regeln es:

    class X(object): 
        # Your code here 
    
    INSTANCE_X = X() 
    
    # Note that we are not *calling* the methods 
    app.add_url_rule('/x/', view_func=INSTANCE_X.route1) 
    app.add_url_rule('/y/', view_func=INSTANCE_X.route2) 
    
  2. Erstellen Sie eine Instanz in der View-Funktion und delegieren es:

    # Using both methods of registering URLs here 
    # just to show that both work 
    
    @app.route('/x/') 
    def handle_route1(): 
        return X().route1() 
    
    def handle_route2(): 
        return X().route2() 
    
    app.add_url_rule('/y/', view_func=handle_route2) 
    
  3. Vererben von Flask desverwenden 210 oder MethodViewPluggable View Klassen und die as_view classmethod dies für Sie zu handhaben:

    class X(View): 
        methods = ['GET'] 
    
        def dispatch_request(self): 
         if request.path == '/x/': 
          return route1() 
         elsif request.path == '/y/': 
          return route2() 
         else: 
          abort(404) 
    
    app.add_url_rule('/x/', view_func=X.as_view('X.route1')) 
    app.add_url_rule('/y/', view_func=X.as_view('X.route2')) 
    
+1

Welche dieser Methoden am richtigsten ist hängt von Ihren Umständen ab. Ich verwende lieber, was zur Verfügung gestellt wird, also wenn ich mit neuem Code arbeite, würde ich fast immer mit # 3 gehen. –

3

Wie ich in den Kommentaren gesagt, wissen Sie flask-classy?

Von ihrem exemple:

from flask import Flask 
from flask.ext.classy import FlaskView 

# we'll make a list to hold some quotes for our app 
quotes = [ 
    "A noble spirit embiggens the smallest man! ~ Jebediah Springfield", 
    "If there is a way to do it better... find it. ~ Thomas Edison", 
    "No one knows what he can do till he tries. ~ Publilius Syrus" 
] 

app = Flask(__name__) 

class QuotesView(FlaskView): 

    def index(self): 
     return "<br>".join(quotes) 

    def get(self, id): 
     id = int(id) 
     if id < len(quotes) - 1: 
      return quotes[id] 
     else: 
      return "Not Found", 404  

QuotesView.register(app) 

if __name__ == '__main__': 
    app.run() 

erzeugen würde automatisch Routen für http://foobar.foo/quotes und http://foobar.foo/quotes/<id>