新看的书:Flask Web 开发实战:入门、进阶与原理解析(李辉)
一个非常简单的留言板程序。给的示范的github地址是:https://github.com/greyli/sayhello
web程序开发流程:
1.分析需求,列出功能清单
2.设计程序功能,写程序规格书和技术规格书
3.开发调试
4.调试测试
5.部署上线
6.运行维护。
使用到的python包有Bootstrap-Flask、Flask-Moment、Faker、Flask-DebugToolbar。
linux环境可以新建一个文件夹,进入然后将示例程序复制到本地。
git clone https://github.com/greyli/sayhello.git
进入文件夹,使用pipenv创建虚拟环境,安装所有依赖
cd sayhello
pip install --dev
pipenv shell
flask forge//创建虚拟数据
flask run//运行
假如安装依赖出错,太慢的话可以使用国内的镜像源。
pipenv install --dev --pypi-mirror https://mirrors.aliyun.com/pypi/simple
程序功能设计
留言板。输入要留的信息和姓名提交,将消息加到页面的消息列表中。只有一页,含有表单以及消息。对消息和姓名进行长度限制。消息列表要显示所有消息的数量、消息、发布时间、消息编号、发布者姓名。消息根据时间顺序排序排布,最底部有一个返回页面顶部的按钮。
本人使用的是pycharm,安装的包如下图
如果出现安装失败的情况,尝试给pip更新一下再安装。
这里使用包package创建一个包,包里面含有一个__init__.py文件,直接创建目录没有。创建一个文件夹后创建__init__.py也可以。
示范文件目录。我的这个留言板也是类似的。我的这个的github地址:https://github.com/Golden0monkey/messageB
由于书上的是linux环境下的,我自己的是windows的,有些不同的地方,错误页面什么的就没有制作了。第一次是直接按着书上的敲了代码,然后不能运行。又重新敲(逐个功能增加测试成功后再添加下一个功能),原来跟着一起写的文章就不合适了,只能删掉那部分,重新写,因为这个留言板已经写完了,要进行下一个,这个就不一步一步的写了,直接贴上代码。
__init__.py
from flask import Flask
from flask_bootstrap import Bootstrap
from flask_moment import Moment
from flask_sqlalchemy import SQLAlchemy
app = Flask('message')
bootstrap = Bootstrap(app)
moment = Moment(app)
app.config.from_pyfile('nconfig.py')#载入配置文件
db = SQLAlchemy(app)
forms.py
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, TextAreaField
from wtforms.validators import DataRequired, Length
class HelloForm(FlaskForm):
name = StringField('Name', validators=[DataRequired(), Length(1, 20)])
body = TextAreaField('Message', validators=[DataRequired(), Length(1, 200)])
submit = SubmitField()
models.py
from datetime import datetime
from message import db
class Message(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20))
body = db.Column(db.String(200))
timestamp = db.Column(db.DateTime, default=datetime.utcnow, index=True)
def initdb():
db.create_all()
nconfig.py
import os,sys
from message import app
SECRET_KEY = os.getenv('SECRET_KEY', 'secret string')
WIN = sys.platform.startswith('win')
if WIN:
prefix = 'sqlite:///'
else:
prefix = 'sqlite:////'
dev_db = prefix + os.path.join(os.path.dirname(app.root_path), 'data.db')
print(dev_db)
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URI', dev_db)
view.py
from flask import flash,render_template,redirect,url_for
from message import app,db
from message.forms import HelloForm
from message.models import Message,initdb
@app.route('/',methods=['GET','POST'])
def index():
initdb();
messages = Message.query.order_by(Message.timestamp.desc()).all()
form = HelloForm()
if form.validate_on_submit():
name = form.name.data
body = form.body.data
message = Message(body=body, name=name)
db.session.add(message)
db.session.commit()
flash('Your message have been sent to the world!')
return redirect(url_for('index'))
return render_template('index.html', form=form, messages=messages)
if __name__ == '__main__':
app.run(debug=True)