MySql
MTV:model templates view
Pymysql: 驱动包,建公路。
SQLAlchemy, 对象关系模型,可以类比Mybatis的思想,用类来对应数据表的字段。
flask-sqlalchemy,基于SQLAlchemy,做了提升,封装到内部,简化数据库的操作。
创建dao包,在init中创建sqlalchemy对象db,并在主app中加载
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
#------------------------------------------------------
from flask import Flask,render_template,session,redirect,url_for,flash
from settings import Config
from flask_bootstrap import Bootstrap
from flask_moment import Moment
from datetime import datetime
from flask_wtf import FlaskForm
from wtforms import StringField,SubmitField
from wtforms.validators import DataRequired,Email
from dao import db
from apps.user.user import user_bp
def create_app():
app = Flask(__name__,template_folder='../templates/',static_folder='../static/')
app.config.from_object(Config)
bootstrap = Bootstrap(app) # 将应用实例传给构造函数
m = Moment(app)
db.init_app(app) # 数据库
app.register_blueprint(user_bp)
print(app.url_map)
return app
启动文件
from flask_script import Manager
from apps import create_app
from flask_migrate import Migrate,MigrateCommand
from dao import db
app = create_app()
manager = Manager(app) # 给app套了一个壳子,用来添加一些命令行操作,主要是数据库对应
# 命令工具
migrate = Migrate(app=app,db=db) # 其实可以理解为将app和db交给migrate管理
manager.add_command('db',MigrateCommand) # 是不是能理解为打开migrate里面的database相关命令行开关
if __name__=='__main__':
manager.run()
配置类
class Config(object):
ENV = 'development'
SECRET_KEY = "ANGYIBLOG"
DEBUG = True
FLASK_APP = "app.py"
SQLALCHEMY_DATABASE_URL = 'mysql+pymysql://root:123456@127.0.0.1:3306/flask'
SQLALCHEMY_TRACK_MODIFICATIONS=False
SQLALCHEMY_ECHO=True
在每个蓝图model中构建实体类。
model.py
from dao import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(15), nullable=False)
password = db.Column(db.String(12), nullable=False)
phone = db.Column(db.String(11), unique=True)
命令行:
a. 注意点:在app.py中导入模型, from apps.user.models import User
b. 在终端中使用命令 db: python app.py db init
python app.py db migration
python app.py db upgrade
c. 可以对数据库进行版本管理 升级 降级
注意点
mysql8以上版本,需要修改一下sqlalchemy包的权限码,将
添加用户实例操作
user.py 蓝图
from flask import Blueprint, render_template, request, redirect, url_for
from flask_wtf import Form
from wtforms import TextField,StringField,SubmitField, PasswordField, BooleanField
from wtforms.validators import InputRequired,DataRequired, Email, EqualTo
from apps.user.model import User
from dao import db
user_bp = Blueprint('user', __name__)
class RegisterForm(Form):
name = StringField("名字", validators=[DataRequired()])
email = StringField("email", validators=[Email()])
password = PasswordField("密码", validators=[DataRequired(), EqualTo('repassword', message='Passwords must match')])
repassword = PasswordField("再次确认密码", validators=[DataRequired()])
accept_tos = BooleanField("我接受隐私条约", validators=[DataRequired()])
submit = SubmitField("提交")
@user_bp.route('/user') # 用户主页
def user_center():
return render_template('user/user_index.html')
@user_bp.route('/register', methods=['POST', 'GET'])
def user_register():
print_name = None
form = RegisterForm(request.form)
if request.method == 'POST' and form.validate():
# 创建实体对象
user = User()
user.username = form.name.data
user.password = form.password.data
user.email = form.email.data
# 添加到数据库
db.session.add(user)
db.session.commit()
print_name = user.username
# return redirect(url_for('user.user_register'))
return render_template("user/register.html", form=form, name=print_name)
@user_bp.route('/login')
def user_login():
return '登陆'
Model.py
from dao import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(15), nullable=False)
password = db.Column(db.String(25), nullable=False)
email = db.Column(db.String(50), unique=True, nullable=False)
def __str__(self):
return "user_table:"+self.username
# class UserInfo(db.Model):
Register.html
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}User{% endblock %}
{% block page_content %}
<div class="page-header">
<h1>Hello, register page!</h1>
<hr>
{{wtf.quick_form(form)}}
{% if name %}
<h2>注册成功 {{ name }} </h2>
{% endif %}
</div>
{% endblock %}
密码加密
# md5 sha1 sha256 sha512
import hashlib
msg = "secret"
md5 = hashlib.md5(msg.encode('utf-8'))
print(md5.hexdigest())
数据库操作
- 查询
- 模型类.query.all() - select * from user;
- 模型类.query.filter_by(字段名=值) | .first() limit
- select