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:[email protected]: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
文件项目中下面的获取数据,写下面的代码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页面
<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() }}"/>