2013-06-16 4 views
6

Mój główny plik aplikacji jest obecnie serią definicji metod, z których każda jest dołączona do trasy. Mam 3 różne części do mojej aplikacji (główne, admin, api). Próbuję podzielić metody na pliki zewnętrzne w celu lepszej konserwacji, ale lubię prostotę Flask w używaniu dekoratorów tras dla adresów URL mojej aplikacji.Czy mogę używać zewnętrznych metod jako dekoratorów tras w Python/Flask?

Jeden z moich tras aktualnie wygląda tak:

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

Ale chciałbym, aby wyodrębnić metodę get_galleries do pliku zawierającego metody moim API:

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

Problem polega na tym, że kiedy to zrobię, pojawia się błąd. Czy to możliwe, a jeśli tak, to jak to zrobić?

Odpowiedz

9

Jak stwierdzono w innych uwag, można zadzwonić app.route('/')(api.view_home()) lub użyć kodu kolby za app.add_url_rule()http://flask.pocoo.org/docs/api/#flask.Flask.add_url_rule

kolby za @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 

można wykonać następujące czynności:

## 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) 

A następnie:

## 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) 

Jest to metoda, której używam do niszczenia rzeczy. Zdefiniuj wszystkie swoje urls w jego własnym pliku, a następnie import urls w twojej __init__.py który biegnie app.run()

W twoim przypadku:

|-- 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

Dekorator to tylko specjalna funkcja.

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

I w rzeczywistości, w zależności od tego, co robi dekorator, może nie być konieczne utrzymywanie wyniku w ogóle.

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

Nie sądzę, że można udekorować metoda w ten sposób. Ale przypuszczam, że zamiast używać dekoratora w normalny sposób, można utworzyć wywołanie zwrotne, aby ozdobić je ręcznie.

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

Wtedy można go używać tak:

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

To jest dość dużo robi to samo, co 'kolba .add_url_rule() 'ma. http://flask.pocoo.org/docs/api/#flask.Flask.add_url_rule – bnlucas

+0

Masz rację.Z pewnością najlepiej wykorzystać API w tym przypadku (moim zdaniem). – kuujo

1

Dekoratorzy są tylko funkcje, więc można po prostu zrobić:

import api 
api.get_galleries = application.route(api.get_galleries, '/api/galleries') 
Powiązane problemy