1

ich Flask lerne zu bauen versucht, und ich habe verschiedene Schnipsel gefunden, die zeigen, wie Modelle mit Flask-restless und Formen mit Flask-wtf mit SQLAlchemy, REST API zu definieren (Ich bin nicht sehr vertraut mit REST API). Genauer gesagt habe ich Inspiration aus:Erste Methode nicht erlaubt Fehler, wenn ein unruhige API

aber ich nicht in der Lage gewesen, um ein voll funktionsfähiges Beispiel zu erstellen. Aufbauend auf den Bits, die Sie online finden können, möchte ich ein Modell mit 2 Klassen erstellen Person und Computer (ein Person kann mit mehreren Computer s zugeordnet werden) und ein Formular zum Hinzufügen einer neuen Person. Hier ist der Code, den ich zusammengestellt habe.

Das Layout ist die folgende:

test_flask/ 
├── test_flask.py 
├── config.py 
└── templates 
      └── new_person.html 

Die Hauptdatei test_flask.py enthält:

from flask import Flask, request, flash, redirect, render_template, url_for 
import flask.ext.sqlalchemy 
from wtforms.ext.sqlalchemy.orm import model_form 
import flask.ext.restless 
from flaskext.wtf import Form 

# Create the Flask application and the Flask-SQLAlchemy object. 
app = Flask(__name__) 
app.config.from_object('config') 
db = flask.ext.sqlalchemy.SQLAlchemy(app) 

# Create the Flask-SQLALchemy models. 
class Person(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.Unicode, unique=True) 
    birth_date = db.Column(db.Date) 


class Computer(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.Unicode, unique=True) 
    vendor = db.Column(db.Unicode) 
    purchase_time = db.Column(db.DateTime) 
    owner_id = db.Column(db.Integer, db.ForeignKey('person.id')) 
    owner = db.relationship('Person', backref=db.backref('computers', 
                 lazy='dynamic')) 

# Create the database tables. 
db.create_all() 

# Create the Flask-Restless API manager. 
manager = flask.ext.restless.APIManager(app, flask_sqlalchemy_db=db) 

# Create API endpoints. 
manager.create_api(Person, methods=['GET', 'POST', 'DELETE']) 
manager.create_api(Computer, methods=['GET']) 

# Create a form class for class Person. 
PersonForm = model_form(Person, base_class=Form) 


@app.route('/') 
def hello(): 
    return 'Hello World' 


@app.route("/api/new_person") 
def new_person(): 
    # The new person 
    person = Person() 
    # Create a form 
    form = PersonForm(request.form, person) 
    if form.validate_on_submit(): 
     form.populate_obj(person) 
     person.post() 
     flash("new person %s inserted updated" % person) 
     return redirect(url_for("new_person")) 
    return render_template("new_person.html", form=form) 

if __name__ == '__main__': 
    # start the flask loop 
    app.run() 

config.py Die Datei enthält:

DEBUG = True 
WTF_CSRF_SECRET_KEY = 'a random string' 
SECRET_KEY = 'you-will-never-guess' 
WTF_CSRF_ENABLED = True 
SQLALCHEMY_DATABASE_URI = 'sqlite:////tmp/test.db' 

Die Vorlage new_person.html enthält:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" 
    "http://www.w3.org/TR/html4/strict.dtd"> 
<html lang="en"> 
    <head> 
    <meta http-equiv="content-type" content="application/json"> 
    <title>New person</title> 
    </head> 
{% block body %} 
    <form action="new_person" method=post class=add-entry> 
     <dl> 
     <dt>Name: 
     <dd>{{form.name}} 
     <dt>Birth date: 
     <dd>{{form.birth_date}} 
     <dd><input type=submit value=submit> 
     </dl> 
    </form> 
{% endblock %} 
</html> 

Ich kann das Formular sehen, um eine neue Person um http://127.0.0.1:5000/api/new_person/ hinzuzufügen, aber ich habe eine "Method Not Allowed" Fehler beim Einreichen.

+0

@Martijn Pieters Ich habe die Links zu dem Tutorial hinzugefügt, das ich befolgt habe (ich benutze nicht 'WTF-Alchemy', das etwas besser sein soll). Mein Problem ist genau, alle Schnipsel zusammen zu kleben. –

+0

Mein Bauchgefühl ist, dass die 'person.post()' Methode (von der ich glaube, dass sie diejenige ist, die die neue 'Person' einfügt) tatsächlich nie aufgerufen wird ... Ich habe versucht, die Form' action' in 'zu ändern api/person' aber ohne Erfolg. –

+0

Woher kam eigentlich 'person.post()'? Das wird die neue Instanz nicht zu deiner Datenbank hinzufügen. –

Antwort

1

Sie auf die new_person Route Mitteilung verfassen, haben aber nicht die Route zu akzeptieren eine POST Anforderung konfiguriert. Standardmäßig sind nur GET und HEAD zulässig. Stellen Sie die methods Argument der route() Dekorateur:

@app.route("/api/new_person", methods=['GET', 'POST']) 
def new_person(): 

die HTTP Methods section des Kolbens Kurz See.

Als Nächstes müssen Sie die Transaktion festschreiben, wenn Sie möchten, dass Ihre Änderungen erhalten bleiben (z. B. Hinzufügen einer neuen); fügen Sie den neuen person Objekt zu Ihrer Sitzung und begehen:

db.session.add(person) 
db.session.commit() 

Siehe Inserting Records section des Flask-SQLAlchemy Select, Einfügen, Löschen Kapitel.

Alternativ können Sie die SQLAlchemy Sitzung autocommit alle Änderungen:

db = flask.ext.sqlalchemy.SQLAlchemy(app, session_options={'autocommit': True}) 

Sie werden immer noch das neue Objekt zu einer Sitzung hinzufügen müssen, jedoch.

+0

Hum, ich muss 'methods = ['GET', 'POST']' (sonst kann ich die Form nicht sehen.) Ich sehe aber immer noch keine 'Person', wenn ich zu' http: // gehe. 127.0.0.1: 5000/api/person/'(die' GET' Methode für die Klasse 'Person' definiert durch' Flask-unruhig') –

+0

@MathieuDubois: Richtig, ich habe mir nur das Formular angeschaut, nicht das, was dem Formular diente –

+0

@Martjin Pieters Ich denke, dass noch immer keine 'Person' in der Datenbank eingefügt ist. –