MySql
MTV:model templates view
Pymysql: 驱动包,建公路。
SQLAlchemy, 对象关系模型,可以类比Mybatis的思想,用类来对应数据表的字段。
flask-sqlalchemy,基于SQLAlchemy,做了提升,封装到内部,简化数据库的操作。
创建dao包,在init中创建sqlalchemy对象db,并在主app中加载
from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()#------------------------------------------------------from flask import Flask,render_template,session,redirect,url_for,flashfrom settings import Configfrom flask_bootstrap import Bootstrapfrom flask_moment import Momentfrom datetime import datetimefrom flask_wtf import FlaskFormfrom wtforms import StringField,SubmitFieldfrom wtforms.validators import DataRequired,Emailfrom dao import dbfrom apps.user.user import user_bpdef 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 Managerfrom apps import create_appfrom flask_migrate import Migrate,MigrateCommandfrom dao import dbapp = 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 = TrueFLASK_APP = "app.py"SQLALCHEMY_DATABASE_URL = 'mysql+pymysql://root:123456@127.0.0.1:3306/flask'SQLALCHEMY_TRACK_MODIFICATIONS=FalseSQLALCHEMY_ECHO=True
在每个蓝图model中构建实体类。
model.py
from dao import dbclass 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 Userb. 在终端中使用命令 db: python app.py db initpython app.py db migrationpython app.py db upgradec. 可以对数据库进行版本管理 升级 降级
注意点
mysql8以上版本,需要修改一下sqlalchemy包的权限码,将
添加用户实例操作
user.py 蓝图
from flask import Blueprint, render_template, request, redirect, url_forfrom flask_wtf import Formfrom wtforms import TextField,StringField,SubmitField, PasswordField, BooleanFieldfrom wtforms.validators import InputRequired,DataRequired, Email, EqualTofrom apps.user.model import Userfrom dao import dbuser_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 = Noneform = RegisterForm(request.form)if request.method == 'POST' and form.validate():# 创建实体对象user = User()user.username = form.name.datauser.password = form.password.datauser.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 dbclass 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 sha512import hashlibmsg = "secret"md5 = hashlib.md5(msg.encode('utf-8'))print(md5.hexdigest())
数据库操作
- 查询
- 模型类.query.all() - select * from user;
- 模型类.query.filter_by(字段名=值) | .first() limit
- select
