Skip to content

Instantly share code, notes, and snippets.

@nickretallack
Created January 13, 2014 20:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nickretallack/8407729 to your computer and use it in GitHub Desktop.
Save nickretallack/8407729 to your computer and use it in GitHub Desktop.
An attempt at re-using a wtform for both creation and updating of a record via an API that is allowed to omit fields from requests.
from flask.ext.wtf import Form
import wtforms as w
import wtforms.validators as wv
from flask import Flask, request, jsonify
app = Flask(__name__)
class MyForm(Form):
name = w.StringField(validators=[wv.DataRequired()])
email = w.StringField()
class MyObject(object):
def __init__(self, name, email):
self.name = name
self.email = email
def to_json(self):
return {
"name":self.name,
"email":self.email,
}
def update(self, name=None, email=None):
if name is not None:
self.name = name
if email is not None:
self.email = email
existing_object = MyObject(name="Bob", email="stuff@stuff.com")
def filter_by_request(data):
real_data = {}
for key,value in data.iteritems():
if key in request.form:
real_data[key] = value
return real_data
def make_all_fields_optional(form):
for field in form:
field.validators.insert(0, wv.Optional())
@app.route("/create", methods=['POST'])
def create():
form = MyForm(csrf_enabled=False)
if form.validate_on_submit():
new_object = MyObject(**form.data)
return jsonify(new_object.to_json())
else:
return jsonify(form.errors)
@app.route("/update", methods=['POST'])
def update():
form = MyForm(obj=existing_object, csrf_enabled=False)
make_all_fields_optional(form)
if form.validate_on_submit():
existing_object.update(**filter_by_request(form.data))
return jsonify(existing_object.to_json())
else:
return jsonify(form.errors)
if __name__ == "__main__":
app.debug = True
app.run(port=5050)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment