Flask后端TODO应用

  • flask做web框架
  • sqlalchemy做ORM
  • 前后端分离

后端设计

  • curl -c cookies -d "name=user1&pwd=8888" http://127.0.0.1:5000/sign
{
  "status": "success", 
  "user_id": 2
}
  • curl -b cookies -d "content=Todo content 001." http://127.0.0.1:5000/todo/add
{
  "id": 1, 
  "status": "success"
}
  • curl -b cookies http://127.0.0.1:5000/todo/list
{
  "data": [
    {
      "content": "Todo content 001.", 
      "id": 1, 
      "time": "1507019112"
    }
  ], 
  "status": "success"
}

views.py

from flask import jsonify, request, session
from sqlalchemy import desc
from apps import app
from apps.database import db_session
from apps.todo_app.models import Todo

@app.route('/todo')
def todo_index():
    return jsonify(status='success', info='todo')


@app.route('/todo/list', methods=['GET', 'POST'])
def todo_list():
    user_id = session.get('user')
    if not user_id:
        return jsonify(status='failed', info='Please log in.')
    todos = Todo.query.order_by(desc(Todo.id)).filter_by(user_id=user_id).all()
    return jsonify(status='success', data=[todo.serialize() for todo in todos])


@app.route('/todo/add', methods=['POST'])
def todo_add():
    user_id = session.get('user')
    if not user_id:
        return jsonify(status='failed', info='Please log in.')
    form = request.form
    content = form.get('content')
    t = int(time.time())
    todo = Todo(user_id=user_id, content=content, time=t)
    db_session.add(todo)
    db_session.commit()
    return jsonify(status='success', id=todo.id)


@app.route('/todo/delete/', methods=['GET'])
def todo_delete(todo_id):
    user_id = session.get('user')
    if not user_id:
        return jsonify(status='failed', info='Please log in.')
    todo = Todo.query.get(todo_id)
    if not todo:
        return jsonify(status='failed')
    db_session.delete(todo)
    db_session.commit()
    return jsonify(status='success')


@app.route('/todo/get/', methods=['GET'])
def todo_get(todo_id):
    user_id = session.get('user')
    if not user_id:
        return jsonify(status='failed', info='Please log in.')
    todo = Todo.query.get(todo_id)
    return jsonify(status='success', data=todo.serialize())

database.py

# coding=utf-8
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from apps import app

engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'], convert_unicode=True)
db_session = scoped_session(sessionmaker(autocommit=False,
                                         autoflush=False,
                                         bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()


def init_db():
    # 在这里导入所有的可能与定义模型有关的模块,这样他们才会合适地
    # 在 metadata 中注册。否则,您将不得不在第一次执行 init_db() 时
    # 先导入他们。
    import todo_app.models
    import apps.models
    Base.metadata.create_all(bind=engine)

models.py

from sqlalchemy import Column, Integer, String
from apps.database import Base

class Todo(Base):
    __tablename__ = 'todo'
    id = Column(Integer, primary_key=True, autoincrement=True)
    user_id = Column(Integer)
    content = Column(String(120))
    time = Column(String(120))

    def __init__(self, user_id=None, content=None, time=None):
        self.user_id = user_id
        self.content = content
        self.time = time

    def serialize(self):
        return {
            'id': self.id,
            'content': self.content,
            'time': self.time
        }

你可能感兴趣的:(Flask后端TODO应用)