2 Stimmen

Überschreiben von Flask `add_url_rule`, um eine spezifische URL zu routen

Ich verwende die Klassenbasierten Ansichten in Flask, um eine CRUD-REST-API zu erstellen und die Routen mithilfe von add_url_rule wie folgt zu registrieren...

class GenericAPI(MethodView):
    def get(self, item_group, item_id):
        ...
    def post(self, item_group, item_id):
        ...
    ...

api_view = GenericAPI.as_view('apps_api')
app.add_url_rule('/api/', defaults={'item_id': None},
                 view_func=api_view, methods=['GET',])
app.add_url_rule('/api//', 
                 view_func=api_view, methods=['GET',])
app.add_url_rule('/api//add', 
                 view_func=api_view, methods=['POST',])
app.add_url_rule('/api///edit', 
                 view_func=api_view, methods=['PUT',])
app.add_url_rule('/api///delete', 
                 view_func=api_view, methods=['DELETE',])

Es handelt sich um spezifische Datenbanktabellen basierend auf item_group und Einträge mit item_id. Wenn ich also /api/person haben, werden Einträge für die Personentabelle aufgelistet. Oder wenn ich /api/equipment/2 habe, wird die Zeile mit der ID 2 in der Ausrüstungstabelle abgerufen. Ich habe viele dieser Aufgaben und sie benötigen im Grunde genommen nur CRUD.

Aber was ist, wenn ich meine Routing überschreiben möchte, wenn ich eine andere URL wie /api/analysis/summarize habe, die theoretisch eine Funktion aufrufen würde, die die Work on-the-fly erledigt. Gibt es eine Möglichkeit, das zu tun?

Oder ist der einzige Weg, meine URLs zu erweitern zu /api/db/person und /api/db/equipment/2 für eine Reihe von Aktionen und /api/other_work_type für andere?

4voto

Markus Unterwaditzer Punkte 7719

Sie können sich /api/analysis/summarize normal registrieren. Werkzeug/Flask sortiert die Regeln nach Komplexität (Anzahl der Variablen) und nimmt zuerst die einfachsten Routen.

Zum Beispiel:

@app.route('/api/foo')
def foo():
    return "Foo ist speziell!"

@app.route('/api/')
def generic(name):
    return "Hallo %s!" % name

Unabhängig davon, in welcher Reihenfolge Sie die Routen definieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X