一、本文中使用了flask
框架中的flask_script
、flask_migrate
、flask_sqlalchemy
及flask_wtf
表单校验
二、项目目录结构:
|--app.py [项目入口文件的简称]
|--config.py 存放配置文件
|--exts.py 对app.py项目文件的扩展
|--models.py 存放所有的ORM数据模型
|--manage.py 存放数据库迁移文件
三、具体步骤
- 创建一个
flask
项目 - 创建配置文件
config.py
代码如下
#!/usr/bin/env python
# encoding: utf-8
DB_URI = "mysql+mysqldb://root:root@127.0.0.1:3306/python4?charset=utf8"
SQLALCHEMY_DATABASE_URI = DB_URI
- 创建
app.py
文件的扩展文件exts.py
,代码如下:
#!/usr/bin/env python
# encoding: utf-8
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
- 创建数据模型文件
models.py
代码如下:(简单的创建一个用户表模型)
#!/usr/bin/env python
# encoding: utf-8
from exts import db
import datetime
#创建一个数据模型
class User(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
name = db.Column(db.String(100),nullable=False)
password = db.Column(db.String(100))
create_time = db.Column(db.DateTime,default=datetime.datetime.now())
- 创建一个数据迁移文件
manage.py
代码如下:
在manage.py文件中要注意点:虽然数据模型文件
models.py
不使用,但是也要导入,不然不能建立数据迁移
#!/usr/bin/env python
# encoding: utf-8
from exts import db
from flask13_demo import app
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
#导入数据模型
import models
migrate = Migrate(app,db)
manager = Manager(app)
manager.add_command("db",MigrateCommand)
if __name__ == "__main__":
manager.run()
- 最后我们在
app.py
文件中
# coding:utf-8
from flask import Flask
import flask
import config
#导入db
from exts import db
#导入数据模型
from models import User
app = Flask(__name__)
app.debug = True
app.config.from_object(config)
#创建db与app的关系
db.init_app(app)
@app.route('/')
def hello_world():
return "hello word"
if __name__ == '__main__':
app.run()
- 说明:本人不建议直接写
app.py
文件项目中下面的获取数据,写下面的代码 - 在项目文件中运行shift + 鼠标右键弹出黑窗口中输入
python manage.py db init
生成脚本迁移仓库 - 继续在黑窗口中运行
python manage.py db migrate
创建脚本迁移文件 - 继续在黑窗口中运行
python manage.py db upgrade
创建映射到数据库 - 补充说明,如果你
models.py
数据模型中数据结构变动了要重复操作python manage.py db migrate
和python manage.py db upgrade
- 测试项目是否搭建成功在
app.py
文件中补充
@app.route('/')
def hello_world():
user = User(name='admin',password='123')
db.session.add(user)
db.session.commit()
return 'Hello World!'
- 查看数据库,数据库添加成功后继续操作,创建一个用户注册的
html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<div style="width: 400px;">
<form action="" method="post">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
<fieldset>
<legend>用户注册表</legend>
<table>
<tr>
<td><label>用户名:</label></td>
<td>
<input type="text" name="username" placeholder="请输入用户名"/>
</td>
</tr>
<tr>
<td>
<label>密码:</label>
</td>
<td>
<input type="password" name="password" placeholder="请输入密码"/>
</td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" value="提交"/>
</td>
</tr>
</table>
</fieldset>
</form>
</div>
</body>
</html>
- 继续补充
app.py
文件获取表单中数据,提交到数据库
@app.route('/',methods=["GET","POST"])
def hello_world():
if flask.request.method == "GET":
return flask.render_template("index.html")
else:
name = flask.request.form.get("username")
password = flask.request.form.get("password")
print name, password
# 先查询数据库是否有该用户
user = db.session.query(User).filter(User.name == name).first()
if user:
return u'该用户名已经存在,不能重复创建'
else:
user = User(name=name, password=password)
db.session.add(user)
db.session.commit()
return u'创建成功'
- 扩展利用
flask_wtf
做表单的校验,在app.py
文件中引入相对应的包
#引入form表单的校验
from flask_wtf import FlaskForm,CsrfProtect
from wtforms import StringField
from wtforms.validators import Length
添加CsrfProtect
与app
的关系
CsrfProtect(app)
创建一个表单校验的类
#创建一个form表单验证的类
class LoginForm(FlaskForm):
username = StringField(validators=[Length(min=3,max=6,message=u'用户名长度错误')])
password = StringField(validators=[Length(min=3,max=6,message=u'密码长度错误')])
可以改写函数视图的路由
@app.route('/',methods=["GET","POST"])
def hello_world():
if flask.request.method == "GET":
return flask.render_template("index.html")
else:
form = LoginForm(flask.request.form)
if form.validate():
# name = flask.request.form.get("username")
# password = flask.request.form.get("password")
name = form.username.data
password = form.password.data
print name, password
# 先查询数据库是否有该用户
user = db.session.query(User).filter(User.name == name).first()
if user:
return u'该用户名已经存在,不能重复创建'
else:
user = User(name=name, password=password)
db.session.add(user)
db.session.commit()
return u'创建成功'
else:
print form.errors
return u'输入信息有错误'
注意要在配置文件中添加一个随机数的token
import os
SECRET_KEY = os.urandom(24)
在index.html
页面中添加添加一个scrf_token
(要在form表单里面)
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>