Also, django and Flask are extremely powerful. Django gives you an automatic admin interface and ORM, and Flask makes it easy to create a simple API to your data.
from django.conf import settings as django_settings
from myapp import settings
myapp_settings = return dict([(s, getattr(settings, s)) for s in dir(settings) if s==s.upper()])
django_settings.configure(**myapp_settings)
from myapp.models import User
app = Flask(__name__)
api = restful.Api(app)
class UserResource(restful.Resource):
def get(self):
return {"result": User.objects.all()}, 200
api.add_resource(UserResource, '/')
if __name__ == '__main__':
app.run(debug=myapp_settings['DEBUG'])
There's just a little trick to get your API to convert django models to Json: from flask.json import JSONEncoder as FlaskJSONEncoder
from django.db.models import Model
from django.db.models.base import ModelBase
from django.db.models.query import QuerySet, ValuesQuerySet
from django.db.models.fields.related import ManyToManyField
from datetime import datetime
def model_to_dict(instance):
"""Same as django.forms.models.model_to_dict, but returns
everything, including non-editable fields"""
opts, data = instance._meta, {}
for f in opts.concrete_fields + opts.many_to_many:
if isinstance(f, ManyToManyField):
data[f.name] = []
if instance.pk is not None:
data[f.name] = list(f.value_from_object(instance).values_list('pk', flat=True))
else: data[f.name] = f.value_from_object(instance)
return data
class ApiJSONEncoder(FlaskJSONEncoder):
def default(self, obj):
if isinstance(obj, (Model, ModelBase)):
return model_to_dict(obj)
if isinstance(obj, (QuerySet, ValuesQuerySet)):
return [model_to_dict(m) for m in obj]
elif isinstance(obj, datetime):
return obj.isoformat("T")
return FlaskJSONEncoder.default(self, obj)