开始写todolist之前,必然需要写一个简单的程序流程及相关参数,这里我使用思维导图的方式设计了一个简单的界面以及需要实现的内容,较为粗糙,供各位参考,错漏之处还望各位海涵。
这里主要实现以下几个功能:
这几个功能是我个人认为前期比较重要的功能,这里再解释一下任务表字段:
用户字段由用户名、密码、注册日期组成,密码使用salt加密,表内不明文保存用户密码
第一步,新建用户名为 todolist 密码为 todolist,本地开发环境为 Windows10,使用 Python3 作为开发语言。首先先新建用户,这里使用Mysql数据库,版本为 5.7.20
#新建用户
create user 'todolist'@'localhost' identified by 'todolist';
#新建 todolist 专用数据库
create database todolist;
第二步,使用 flask 插件 sqlalchemy 进行数据库连接与读写操作
from flask_sqlalchemy import SQLAlchemy
from .extensions import bcrypt
db = SQLAlchemy()
class Tasks(db.Model):
__tablename__ = 'tasks'
id = db.Column(db.String(45), primary_key=True)
setdate = db.Column(db.DateTime)
overdate = db.Column(db.DateTime)
username = db.Column(db.String(255), unique=True)
task = db.Column(db.String(255))
def __init__(self,id, username, setdate, task):
self.id = id
self.username = username
self.setdate = setdate
self.task = task
def get_task(self):
return str(self.task)
def set_overdate(self, overdate):
self.overdate = overdate
def __repr__(self):
return "" % self.task
class Users(db.Model):
__tablename__ = 'users'
id = db.Column(db.String(45), primary_key=True)
username = db.Column(db.String(255))
password = db.Column(db.String(255))
def __init__(self, id, username, password):
self.id = id
self.username = username
self.password = self.set_password(password)
def set_password(self, password):
"""Conver the password """
return bcrypt.generate_password_hash(password)
def check_password(self, password):
"""Check the user's password"""
return bcrypt.check_password_hash(self.password, password)
def get_id(self):
""" Return the user's id"""
return str(self.id)
def __repr__(self):
return "" %self.username
model文件用于以对象形式表现数据库数据,在 manager 中进行设置,用于初始化数据库
from app import create_app
from flask_script import Manager, Server
from app import models
import os
#设置开发环境变量
env = os.environ.get('TODOLIST_ENV', 'dev')
#创建app对象
app = create_app('app.config.%sConfig'%env.capitalize())
#初始化manger对象用于控制app
manager = Manager(app)
manager.add_command('server', Server())
@manager.shell
def make_shell_context():
"""Create a python CLI"""
return dict(app=app,
db=models.db,
Users=models.Users,
Tasks=models.Tasks,
Server=Server)
if __name__ == '__main__':
manager.run()
这里贴出配置文件config.py,使用环境变量对程序的配置进行控制,实现开发环境与生产环境的切换
class Config():
SECRET_KEY='its a secret'
class ProdConfig():
pass
class DevConfig():
SECRET_KEY='its a secret'
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'mysql+mysqlconnector://todolist:todolist@localhost/todolist'
SQLALCHEMY_TRACK_MODIFICATIONS = False
第三步,启动 shell 进行数据库初始化与简单数据入库测试
python manage.py shell
input: db
output: <SQLAlchemy engine=mysql+mysqlconnector://todolist:***@localhost/todolist?charset=utf8>
input: db.create_all()
这里可以看到已经成功创建了 tasks 表与 users 表,接下来我们插入一些测试数据
>>> admin=Users(id=str(uuid4()), username='admin', password='admin')
>>> db.session.add(admin)
>>> db.session.commit()
这里可以看到我们成功创建了一个 admin 用户,密码已被 hash 加密,有安全需求的可自行加盐。接下来再创建一个任务进行测试。
>>> task1=Tasks(id=str(uuid4()), username='admin', setdate=datetime.datetime.now(),task='设置的第一个任务')
>>> db.session.add(task1)
>>> db.session.commit()