Flask mysql 模版传参_Flask web模板四–添加数据库模块

通过flask-sqlalchemy来实现flask操作数据库,这里创建一个user模型来实现将用户信息保存到mysql

1、安装flask_sqlalchemy

pip install flask-sqlalchemy

2、创建一个模型的基类

在app/models目录下创建base.py,内容如下

# -*- coding:utf-8 -*-

# 使用flask封装的sqlalchemy需要从flask_sqlalchemy导入

from flask_sqlalchemy import SQLAlchemy as _SQLAlchemy

from sqlalchemy import Column, Integer, SmallInteger, String

from contextlib import contextmanager

from datetime import datetime

# 定义一个SQLAlchemy子类,添加try 代码,后面调用数据库提交函数时可以使用with语句

class SQLAlchemy(_SQLAlchemy):

@contextmanager

def auto_commit(self):

try:

yield

self.session.commit()

except Exception as e:

db.session.rollback()

raise e

db = SQLAlchemy()

# 创建一个基类模型,让其他模型都继承这个基类模型

# 基类型模型是所有模型都共有的一些属性

class Base(db.Model):

__abstract__ = True # Base是一个基类,这样就不会去创建这个表

add_time = Column('add_time', Integer)

status = Column(SmallInteger, default=1)

# 为create_time 自动生成默认值

def __init__(self):

self.add_time = int(datetime.now().timestamp())

# 如果传入的参数是模型中包含的对象,则进行赋值

def set_attrs(self, attrs_dict):

for key, value in attrs_dict.items():

# 判断当前这个对象是否包含名字叫key 的属性

if hasattr(self, key) and key != 'id':

setattr(self, key, value)

def delete(self):

self.status = 0

# 创建一个属性方法,如果模型包含create_time属性则被时间戳格式时间转换为字符串

@property

def add_datetime(self):

if self.add_time:

return datetime.fromtimestamp(self.add_time)

else:

return None

# 为所有模型添加一个状态删除的方法,状态0表示删除

def delete(self):

self.status = 0

3、创建一个User模型继承Base模型

在models目录下创建user.py,内容如下

# -*- coding:utf-8 -*-

# 导入sqlalchemy的基本类型可以从sqlalchemy基础包中导入

from sqlalchemy import Column, Integer, String, Boolean, Float

from app.models.base import Base, db

from werkzeug.security import generate_password_hash, check_password_hash

from flask_login import UserMixin

# from app import login_manager

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer

from flask import current_app

from math import floor

# from app.libs.enums import PendingStatus

# 用户模型,让用户继承flask_login中的UserMixin 可以使用cookie的相关功能

class User(UserMixin, Base):

id = Column(Integer, primary_key=True)

nickname = Column(String(24), nullable=False)

phone_number = Column(String(18), unique=True)

# 这里的_passowrd 是模型中的名字,而在数据库中的字段是password

# 目的是为了在使用基类中的set_attr 方法写入密码的值时不自动写入明文

_password = Column('password', String(128))

email = Column(String(50), unique=True, nullable=False)

confirmed = Column(Boolean, default=False)

# 获取密码

@property

def password(self):

return self._password

# 修改密码,在密码入库时进行加密,raw 表示一个明文的密码

@password.setter

def password(self, raw):

self._password = generate_password_hash(raw)

# 验证密码,传入明文密码

def check_password(self, raw):

# 使用check_password_hash函数对明文密码加密后再与数据库中的密文进行比较

return check_password_hash(self._password, raw)

@staticmethod

def reset_password(token, new_password):

s = Serializer(current_app.config['SECRET_KEY'])

# 读取token中的用户id

try:

data = s.loads(token.encode('utf-8'))

except:

return False

uid = data.get('id')

with db.auto_commit():

user = User.query.get(uid)

user.password = new_password

return True

# 用户登录后修改密码

def change_password(self, new_password):

self._password = generate_password_hash(new_password)

def generate_token(self, expiration=600):

# 传入一个随机加密串

s = Serializer(current_app.config['SECRET_KEY'], expiration)

# 传入一个包含用户IDE字典

return s.dumps({'id': self.id}).decode('utf-8')

# 定义一个函数获取当前用户的一个简历

@property

def summary(self):

return dict(

nickname=self.nickname,

email=self.email

)

# # 这个函数是独立的模块函数,不是User模型的方法

# # 加上装饰器是让login_manager这个插件加载这个函数,在其他视图函数中可以调用这个函数

# @login_manager.user_loader

# def get_user(uid):

# # 通过用户的id 来查询用户的模型,uid是主键查询可以不用filer_by可用get

# return User.query.get(int(uid))

4、在app/__init__.py中初始化sqlalchemy插件,并初始化数据库

# -*- coding:utf-8 -*-

# 初始化flask核心对象

from flask import Flask

from app.models.base import db

from app.models.user import User

# 定义一个函数用来创建app核心对象

def create_app():

app = Flask(__name__)

# app.config.from_object('config')

app.config.from_object('app.secure')

app.config.from_object('app.setting')

# 调用注册蓝图

register_blueprint(app)

# 初始化数据库

db.init_app(app)

with app.app_context():

# 调用生成mysql表的函数

db.create_all()

return app

# 创建注册蓝图的方法

def register_blueprint(app):

# 导入蓝图对象

from app.web.blueprint import web

app.register_blueprint(web)

5、在app/secure.py中添加数据库连接配置

# -*- coding:utf-8 -*-

# 定义项目机密信息配置文件,开发环境和生产环境不同,不能上传git

DEBUG = True

# flask连接数据库

SQLALCHEMY_DATABASE_URI = 'mysql+cymysql://server:server@localhost:3306/server'

SQLALCHEMY_TRACK_MODIFICATIONS = True

# 密码

SECRET_KEY = 'password'

6、在mysql数据库中创建server数据库,并授予权限,通过pycharm运行run.py启动项目可以创建user表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值