- 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
}