2014-11-28 10 views
5

voglio definire manualmente rotte per qualche metodo di classi, qualcosa di simile:definire manualmente utilizzando percorsi Flask

class X: 

    def route1(): 
     #do stuff here 

    def route2(): 
     #do stuff here 

e poi fare qualcosa di simile:

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

E 'possibile ?? Qual è il modo corretto per realizzare questo?

+0

Tranne per il fatto che si chiama le funzioni nel passarli a 'view_func', sono in realtà avendo un problema fare Questo? – davidism

+0

Non è molto chiaro se si hanno problemi, ma vorrei andare con l'estensione di classe pallone. Fondamentalmente sono Django Class Based Views per il pallone (beh, sono un po 'più di questo, ma comunque) – lealhugui

risposta

8

Ci sono diversi modi per farlo:

  1. Creare un'istanza globale della classe e via le regole ad esso:

    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. creare un'istanza della funzione di visualizzazione e delegato ad esso:

    # 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. Eredita dalla boccetta di View o MethodViewPluggable View classi e utilizzare il as_view classmethod per gestire questo per voi:

    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

Quale di questi metodi è più corretto dipenderà dalle circostanze. Preferisco usare quello che viene fornito, quindi se lavorassi con un nuovo codice, quasi sempre andrei con # 3. –

3

Come ho detto nei commenti, lo sai flask-classy?

Dal loro 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() 

genererebbe automaticamente percorsi per http://foobar.foo/quotes e http://foobar.foo/quotes/<id>

Problemi correlati