準備工作
開始寫todolist之前,必然需要寫一個簡單的程序流程及相關參數,這裏我使用思維導圖的方式設計了一個簡單的界面以及需要實現的內容,較爲粗糙,供各位參考,錯漏之處還望各位海涵。
這裏主要實現以下幾個功能:
- 時間顯示(主要用於顯示服務器時間,爲後期番茄鍾功能進行開發)
- todolist部分(主要由一個勾選框與文本組成,打勾後自動劃線,刷新後自動消失)
- 新建任務(用於新建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 "<Tasks %r>" % 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 "<User %r>" %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()
這裏可以看到已經成功創建新任務,至此前期的數據庫連接工作已完成,接下來進行主體程序的設計。