2013-06-16 13 views
6

Il mio file di applicazione principale è al momento una serie di definizioni di metodo, ciascuna associata a una rotta. Ho 3 parti distinte nella mia app (main, admin, api). Sto cercando di suddividere i metodi in file esterni per una manutenzione migliore, ma mi piace la semplicità di Flask nell'utilizzare i route decorator per gli URL della mia applicazione.Posso usare metodi esterni come route decorator in Python/Flask?

Uno dei miei percorsi attualmente si presenta così:

# index.py 
@application.route('/api/galleries') 
def get_galleries(): 
    galleries = { 
     "galleries": # get gallery objects here 
    } 
    return json.dumps(galleries) 

Ma vorrei estrarre il metodo get_galleries in un file che contiene i metodi per la mia API:

import api 
@application.route('/api/galleries') 
api.get_galleries(): 

Il problema è che quando lo faccio ho un errore. È possibile, e se sì, come faccio?

risposta

9

Come dichiarato in un altro commento, è possibile chiamare app.route('/')(api.view_home()) o utilizzare il codice di Flask app.add_url_rule()http://flask.pocoo.org/docs/api/#flask.Flask.add_url_rule

di Flask @app.route():

def route(self, rule, **options): 
    def decorator(f): 
     endpoint = options.pop('endpoint', None) 
     self.add_url_rule(rule, endpoint, f, **options) 
     return f 
    return decorator 

È possibile effettuare le seguenti operazioni:

## urls.py 

from application import app, views 

app.add_url_rule('/', 'home', view_func=views.home) 
app.add_url_rule('/user/<username>', 'user', view_func=views.user) 

E quindi:

## views.py 

from flask import request, render_template, flash, url_for, redirect 

def home(): 
    render_template('home.html') 

def user(username): 
    return render_template('user.html', username=username) 

È il metodo che uso per rompere le cose. Definire tutte le urls in un suo file e poi import urls nel vostro __init__.py che corre app.run()

Nel tuo caso:

|-- app/ 
|-- __init__.py (where app/application is created and ran) 
|-- api/ 
| |-- urls.py 
| `-- views.py 

api/urls.py

from application import app 

import api.views 

app.add_url_rule('/call/<call>', 'call', view_func=api.views.call) 

api/views.py

from flask import render_template 

def call(call): 
    # do api call code. 
0

Un decoratore è solo una funzione speciale.

routed_galleries = application.route('/api/galleries')(api.get_galleries) 

E infatti, a seconda di ciò il decoratore non si può non essere necessario mantenere il risultato intorno a tutti.

application.route('/api/galleries')(api.get_galleries) 
0

Non penso che si possa decorare un metodo in questo modo. Ma suppongo che invece di usare il decoratore nel modo normale, potresti creare un callback per decorarlo manualmente.

def wrap_api(cls, rt): 
    return application.route(rt)(cls) 

quindi è possibile utilizzare in questo modo:

import api 
galleries = wrap_api(api.get_galleries(), '/api/galleries') 
+0

questo è praticamente facendo la stessa cosa che 'pallone .add_url_rule() 'fa. http://flask.pocoo.org/docs/api/#flask.Flask.add_url_rule – bnlucas

+0

Hai ragione.Sicuramente meglio usare l'API in questo caso (secondo me). – kuujo

1

decoratori sono solo le funzioni, in modo da poter semplicemente fare:

import api 
api.get_galleries = application.route(api.get_galleries, '/api/galleries')