Coding with Flask and SQLAlchemy

On my previous post, I’ve been working with Flask,SQLAlchemy, and Gnunicorn for some REST API.

Setting up virtualenv with the following pip requirements.

Flask==0.6.1
Flask-SQLAlchemy==0.11
Jinja2==2.5.5
LEPL==5.0.0
MySQL-python==1.2.3
SQLAlchemy==0.6.6
Werkzeug==0.6.2
distribute==0.6.10
gevent==0.13.4
greenlet==0.3.1
gunicorn==0.12.1
lockfile==0.9.1
wsgiref==0.1.2
yolk==0.4.1

The model.py:

from flask import Flask
from flaskext.sqlalchemy import SQLAlchemy
from sqlalchemy import Table, Column, Integer, String, Date, Float 
import config  

# DB class 
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] =  config.DB_URI
db = SQLAlchemy(app)

# DB classess 
class Player(db.Model):
    __tablename__ = 'player'

    playerid = db.Column('playerid', Integer, primary_key=True)
    username = db.Column('username', String(30), unique=True)
    email = db.Column('email', String(50), unique=True)
    password = db.Column('password', String(100), unique=False)
    avatarid = db.Column('avatarid', Integer,default=1)
    language = db.Column('language', Integer,default=1)
    regdate = db.Column('regdate', Date)
    activation_key = db.Column('activation_key', String(60))
    active = db.Column('active', Integer, default=0)

    def __init__(self, username=None, email=None,password=None):
	    self.username = username
	    self.email = email
	    self.password = password 

    def __repr__(self):
	    return '<Player %s %s>' % (self.username, self.email)


Contents of config.py:

dbhost = 'localhost'
dbuser = 'root'
dbpass = 'mysql'
dbname = 'mp'

DB_URI = 'mysql://' + dbuser + ':' + dbpass + '@' + dbhost + '/' +dbname

Contents of mp.py:

# Filename: mp.py 

import datetime
import hashlib
import string,random  

# config file
import config

from flask import Flask, jsonify, request

## app and db is defined on model.py 
from model import db, app, Player

# other misc functions
def get_user_id(username): 
    p  = Player.query.filter_by(username=username).first()
    if p  is not None: 
       return p
    return None

def get_userid_by_email(email): 
    p  = Player.query.filter_by(email=email).first()
    if p  is not None: 
       return p
    return None

def get_user_key(key): 
    p  = Player.query.filter_by(activation_key=key).first()
    if p  is not None: 
       return p
    return None


# url  routing
@app.errorhandler(404)
def page_not_found(error):
    return 'This page does not exist', 404

@app.after_request
def shutdown_session(response):
    db.session.remove()
    return response

@app.route('/')
def hello_world():
    return "Hello World!"

@app.route('/users/')
def list_players():
    players = Player.query.all()
    app.logger.debug(&quot;Player length %s &quot;, len(players))
    a = &quot;&quot;
    d = {} 
    for p in players: 
       app.logger.debug(p.username)
       a = a + " " + p.username 
    return "Hello Players: %s "  % (a)

 
if __name__ == '__main__':
    app.debug = True
    app.run(host='0.0.0.0')

The MySQL, with MP database and Player table:

CREATE TABLE player (
         playerid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	 email VARCHAR(50) NOT NULL,
         username VARCHAR(30) NOT NULL,
         password VARCHAR(100) NOT NULL,
         avatarid INT(4) unsigned not null default '1',
         language INT(2) unsigned not null default '1',
	 regdate timestamp(9),
	 activation_key varchar(60),
         active  int(1) unsigned not null default '0'
)

To simply run:

  python mp.py
   * Running on http://0.0.0.0:5000/
   * Restarting with reloader...

If you want to use the Gunicorn, then refer to my old post using Running Flask with Gunicorn.

Leave a Reply

Your email address will not be published. Required fields are marked *