买了flask相关的两本书,一本狼,一本狗,开始对flask进行学习。
直接翻到案例篇,大致浏览下思路,咱的目标是参照思路自己写。
留言板
实现功能:用户输入用户名和留言内容,提交后,在页面上展示出来。
项目结构
数据库
models.py
from datetime import datetime
from sayhello import db
class Message(db.Model):
id = db.Column(db.Integer,primary_key=True)
body = db.Column(db.String(200))
name = db.Column(db.String(20))
timestamp = db.Column(db.DateTime,default=datetime.now,index=True)
#创建数据库表格
#db.create_all()
直接用db.create_all()就可以创建表格了
创建app
__init.py__
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap
app = Flask('sayhello')
app.secret_key = 'ni cai cai'
#配置数据库信息
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://flask:123456@127.0.0.1:3306/flasktest?charset=utf8'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
bootstrap = Bootstrap(app)
from sayhello import views,errors
原来练习的时候都是写在同一个文件里的,一个app.py承包一个文件。但是将视图函数分开来后,必须在这里加入最后一行。
from sayhello import views,errors
不然到时候路由就找不到了。
那为什么要写在最后一行呢?书里写的很清楚避免出现互相引用出错的情况。
我这里用的python3.6,连接的是mysql,用的库是pymysql
所以在数据库地址那块要写成mysql+pymysql。
视图函数
分两个文件,一个用来定义首页,一个用来定义错误页面
views.py
from flask import flash,redirect,url_for,render_template
from sayhello.models import Message
from sayhello.forms import HelloForm
from sayhello import app,db
@app.route('/',methods=['GET','POST'])
def index():
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('留言提交成功')
return redirect(url_for('index'))
messages =Message.query.order_by(Message.timestamp.desc()).all()
return render_template('index.html',form=form,messages=messages)
errors.py
from sayhello import app
from flask import render_template
@app.errorhandler(404)
def page_not_found(e):
return render_template('errors/404.html'), 404
@app.errorhandler(500)
def internal_server_error(e):
return render_template('errors/500.html'), 500
页面表单
froms.py
这里的form就是后面在html里面展示的结构,用户名,留言内容,还有提交
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()
html
分base.html ,index.html,404.html,500.html
均以base.html为基础。
base.html
通过{% block %}{%endblock%}来预留位置。
其他页面继承基础页,需要替换内容时,直接替换block中的内容。
例如index.html里,继承的是block content
表单提交操作,注释掉的那块和{{ render_form(form,method="POST") }}的效果是一样的
通过for循环加载留言信息
运行效果:
源码地址:https://github.com/jojo201808/sayhello