MySql

MTV:model templates view
Pymysql: 驱动包,建公路。
SQLAlchemy, 对象关系模型,可以类比Mybatis的思想,用类来对应数据表的字段。
flask-sqlalchemy,基于SQLAlchemy,做了提升,封装到内部,简化数据库的操作。
创建dao包,在init中创建sqlalchemy对象db,并在主app中加载

  1. from flask_sqlalchemy import SQLAlchemy
  2. db = SQLAlchemy()
  3. #------------------------------------------------------
  4. from flask import Flask,render_template,session,redirect,url_for,flash
  5. from settings import Config
  6. from flask_bootstrap import Bootstrap
  7. from flask_moment import Moment
  8. from datetime import datetime
  9. from flask_wtf import FlaskForm
  10. from wtforms import StringField,SubmitField
  11. from wtforms.validators import DataRequired,Email
  12. from dao import db
  13. from apps.user.user import user_bp
  14. def create_app():
  15. app = Flask(__name__,template_folder='../templates/',static_folder='../static/')
  16. app.config.from_object(Config)
  17. bootstrap = Bootstrap(app) # 将应用实例传给构造函数
  18. m = Moment(app)
  19. db.init_app(app) # 数据库
  20. app.register_blueprint(user_bp)
  21. print(app.url_map)
  22. return app

启动文件

  1. from flask_script import Manager
  2. from apps import create_app
  3. from flask_migrate import Migrate,MigrateCommand
  4. from dao import db
  5. app = create_app()
  6. manager = Manager(app) # 给app套了一个壳子,用来添加一些命令行操作,主要是数据库对应
  7. # 命令工具
  8. migrate = Migrate(app=app,db=db) # 其实可以理解为将app和db交给migrate管理
  9. manager.add_command('db',MigrateCommand) # 是不是能理解为打开migrate里面的database相关命令行开关
  10. if __name__=='__main__':
  11. manager.run()

配置类

  1. class Config(object):
  2. ENV = 'development'
  3. SECRET_KEY = "ANGYIBLOG"
  4. DEBUG = True
  5. FLASK_APP = "app.py"
  6. SQLALCHEMY_DATABASE_URL = 'mysql+pymysql://root:123456@127.0.0.1:3306/flask'
  7. SQLALCHEMY_TRACK_MODIFICATIONS=False
  8. SQLALCHEMY_ECHO=True

在每个蓝图model中构建实体类。
model.py

  1. from dao import db
  2. class User(db.Model):
  3. id = db.Column(db.Integer, primary_key=True)
  4. username = db.Column(db.String(15), nullable=False)
  5. password = db.Column(db.String(12), nullable=False)
  6. phone = db.Column(db.String(11), unique=True)

命令行:

  1. a. 注意点:在app.py中导入模型, from apps.user.models import User
  2. b. 在终端中使用命令 db python app.py db init
  3. python app.py db migration
  4. python app.py db upgrade
  5. c. 可以对数据库进行版本管理 升级 降级

注意点
mysql8以上版本,需要修改一下sqlalchemy包的权限码,将
image-20211024103617043

添加用户实例操作

user.py 蓝图

  1. from flask import Blueprint, render_template, request, redirect, url_for
  2. from flask_wtf import Form
  3. from wtforms import TextField,StringField,SubmitField, PasswordField, BooleanField
  4. from wtforms.validators import InputRequired,DataRequired, Email, EqualTo
  5. from apps.user.model import User
  6. from dao import db
  7. user_bp = Blueprint('user', __name__)
  8. class RegisterForm(Form):
  9. name = StringField("名字", validators=[DataRequired()])
  10. email = StringField("email", validators=[Email()])
  11. password = PasswordField("密码", validators=[DataRequired(), EqualTo('repassword', message='Passwords must match')])
  12. repassword = PasswordField("再次确认密码", validators=[DataRequired()])
  13. accept_tos = BooleanField("我接受隐私条约", validators=[DataRequired()])
  14. submit = SubmitField("提交")
  15. @user_bp.route('/user') # 用户主页
  16. def user_center():
  17. return render_template('user/user_index.html')
  18. @user_bp.route('/register', methods=['POST', 'GET'])
  19. def user_register():
  20. print_name = None
  21. form = RegisterForm(request.form)
  22. if request.method == 'POST' and form.validate():
  23. # 创建实体对象
  24. user = User()
  25. user.username = form.name.data
  26. user.password = form.password.data
  27. user.email = form.email.data
  28. # 添加到数据库
  29. db.session.add(user)
  30. db.session.commit()
  31. print_name = user.username
  32. # return redirect(url_for('user.user_register'))
  33. return render_template("user/register.html", form=form, name=print_name)
  34. @user_bp.route('/login')
  35. def user_login():
  36. return '登陆'

Model.py

  1. from dao import db
  2. class User(db.Model):
  3. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  4. username = db.Column(db.String(15), nullable=False)
  5. password = db.Column(db.String(25), nullable=False)
  6. email = db.Column(db.String(50), unique=True, nullable=False)
  7. def __str__(self):
  8. return "user_table:"+self.username
  9. # class UserInfo(db.Model):

Register.html

  1. {% extends "base.html" %}
  2. {% import "bootstrap/wtf.html" as wtf %}
  3. {% block title %}User{% endblock %}
  4. {% block page_content %}
  5. <div class="page-header">
  6. <h1>Hello, register page!</h1>
  7. <hr>
  8. {{wtf.quick_form(form)}}
  9. {% if name %}
  10. <h2>注册成功 {{ name }} </h2>
  11. {% endif %}
  12. </div>
  13. {% endblock %}

密码加密

  1. # md5 sha1 sha256 sha512
  2. import hashlib
  3. msg = "secret"
  4. md5 = hashlib.md5(msg.encode('utf-8'))
  5. print(md5.hexdigest())

数据库操作

  1. 查询
  2. 模型类.query.all() - select * from user;
  3. 模型类.query.filter_by(字段名=值) | .first() limit
  1. select