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
- Flask-restless Quickstart (vom doc)
- Automatically create a WTForms Form from model (die bis 2011 zurückgehen)
- This SO question für den Grund Vorlage
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.
@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. –
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. –
Woher kam eigentlich 'person.post()'? Das wird die neue Instanz nicht zu deiner Datenbank hinzufügen. –