Skip to content

Instantly share code, notes, and snippets.

@raphox
Created November 15, 2013 18:22
Show Gist options
  • Save raphox/7489163 to your computer and use it in GitHub Desktop.
Save raphox/7489163 to your computer and use it in GitHub Desktop.
Upload with Flask, Flask-WTF, WTForms and WTForms-Alchemy
import os
from app import app
from app.database import db_session
from app.models.achievement import Achievement
from app.forms.achievement import AchievementForm
from flask import Blueprint, render_template, abort, request, redirect, flash, url_for
from werkzeug import secure_filename
achievements = Blueprint('achievements', __name__, template_folder = 'templates/achievements')
@achievements.route('/new')
def new():
form = AchievementForm()
return render_template('achievements/new.html', form=form)
@achievements.route('/create', methods = ['POST'])
def create():
model = Achievement()
form = AchievementForm()
if form.validate_on_submit():
if form.label_path.data:
image_data = request.files[form.label_path.name].read()
# after validation field data equal the secure filename
open(os.path.join(app.config['UPLOAD_PATH'], form.label_path.data), 'w').write(image_data)
form.populate_obj(model)
db_session.add(model)
db_session.commit()
flash("Achievement created")
return redirect(url_for('achievements.new'))
return render_template('achievements/new.html', form=form)
__all__ = ["user", "achievement"]
from flask.ext.wtf import Form
from wtforms_alchemy import model_form_factory
# Using WTForms-Alchemy with Flask-WTF (http://wtforms-alchemy.readthedocs.org/en/latest/advanced.html#using-wtforms-alchemy-with-flask-wtf) to include all good features of Flask-WTF https://flask-wtf.readthedocs.org/en/latest/#features
ModelForm = model_form_factory(Form)
from app.forms import ModelForm
from app.models.achievement import Achievement
from flask_wtf.file import FileField, FileAllowed, FileRequired
from werkzeug import secure_filename
class AchievementForm(ModelForm):
class Meta:
model = Achievement
exclude = ['slug']
label_path = FileField(None, [
FileRequired(),
FileAllowed(['svg'], 'SVG image only!')
])
# change value of field to name of file
def validate_label_path(form, field):
if field.data:
field.data = secure_filename(field.data.filename)
from sqlalchemy import Column, Integer, Boolean, String, Text, ForeignKey
from sqlalchemy.orm import relationship
from app.database import Base
from sqlalchemy_sluggable import Sluggable
from app.models.user import User
class Achievement(Base, Sluggable):
__tablename__ = 'achievements'
__sluggable__ = {
'populate_from': 'name',
'always_update': True
}
id = Column(Integer, primary_key = True, nullable = False)
user_id = Column(Integer, ForeignKey('users.id'))
name = Column(String(255), unique = True, nullable = False)
description = Column(Text)
label_path = Column(String(255), nullable = False)
user = relationship("User")
def __init__(self, name = None):
self.name = name
def __repr__(self):
return '<Achievement %r>' % (self.name)
{% from "helpers/_form.html" import render_field %}
<h1>New</h1>
<form method="POST" action="{{ url_for('achievements.create') }}" enctype="multipart/form-data">
<dl>
{{ form.hidden_tag() }}
{{ render_field(form.name) }}
{{ render_field(form.description) }}
{{ render_field(form.label_path) }}
{{ render_field(form.label_color) }}
{{ render_field(form.label_background) }}
</dl>
<p>
<input type="submit" value="create">
</p>
</form>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment