NO IMAGE

一、本文中使用了flask框架中的flask_scriptflask_migrateflask_sqlalchemyflask_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檔案專案中下面的獲取資料,寫下面的程式碼
  • 在專案檔案中執行shift 滑鼠右鍵彈出黑視窗中輸入python manage.py db init生成指令碼遷移倉庫
  • 繼續在黑視窗中執行python manage.py db migrate建立指令碼遷移檔案
  • 繼續在黑視窗中執行python manage.py db upgrade建立對映到資料庫
  • 補充說明,如果你models.py資料模型中資料結構變動了要重複操作python manage.py db migratepython 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

新增CsrfProtectapp的關係

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() }}"/>