網站少不了要和數據庫打交道,歸根到底都是一些增刪改查操作,這里做一個簡單的用戶登錄功能來學習一下Flask如何操作MySQL。
用到的一些知識點:Flask-SQLAlchemy、Flask-Login、Flask-WTF、PyMySQL
這里通過一個完整的登錄實例來介紹,程序已經成功運行,在未登錄時攔截了success.html頁面跳轉到登錄頁面,登錄成功后才能訪問success。
以下是項目的整體結構圖:

首先是配置信息,配置了數據庫連接等基本的信息,config.py
DEBUG = True SQLALCHEMY_ECHO = False SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:1011@localhost/rl_project?charset=utf8' SECRET_KEY = '*/xff/x93/xc8w/x13/x0e@3/xd6/x82/x0f/x84/x18/xe7/xd9//|/x04e/xb9(/xfd/xc3'
common/_init_.py
# config=utf-8 from flask_sqlalchemy import SQLAlchemy __all__ = ['db'] db = SQLAlchemy()
數據庫配置類,common/data.py
# config=utf-8 from sqlalchemy import create_engine from sqlalchemy.sql import text from config import SQLALCHEMY_DATABASE_URI, SQLALCHEMY_ECHO def db_query(sql, settings=None, echo=None): if settings is None: settings = SQLALCHEMY_DATABASE_URI if echo is None: echo = SQLALCHEMY_ECHO return create_engine(settings, echo=echo).connect().execute(text(sql)).fetchall() def db_execute(sql, settings=None, echo=None): if settings is None: settings = SQLALCHEMY_DATABASE_URI if echo is None: echo = SQLALCHEMY_ECHO return create_engine(settings, echo=echo).connect().execute(text(sql)).rowcount
SQLALCHEMY_DATABASE_URI用于連接數據的數據庫。
SQLALCHEMY_ECHO如果設置成 True,SQLAlchemy 將會記錄所有 發到標準輸出(stderr)的語句,這對調試很有幫助。
當然,我們在setting中設置了基本的連接數據庫信息,啟動時加載app = create_app('../config.py'),所以這個類刪掉也不會報錯。
form/login_form.py
# config=utf-8 from flask_wtf import FlaskForm as Form from wtforms import StringField, PasswordField from wtforms.validators import DataRequired class LoginForm(Form): accountNumber = StringField('accountNumber', validators=[DataRequired('accountNumber is null')]) password = PasswordField('password', validators=[DataRequired('password is null')]) 使用Flask-WTF做登錄的表單驗證,這里簡單做了賬號密碼不為空如,當我們不填寫密碼時,點擊登錄:

model/_init_.py
# config=utf-8 from flask import Flask from flask_login import LoginManager from common import db login_manager = LoginManager() login_manager.login_view = "user.login" def create_app(config_filename=None): app = Flask(__name__) login_manager.init_app(app) if config_filename is not None: app.config.from_pyfile(config_filename) configure_database(app) return app def configure_database(app): db.init_app(app)
新聞熱點
疑難解答