python3+flask 开发web(十)——Flask中jinjia2模板的继承和sqlite3数据的增删改查和sqlalchemy框架使用

SQLite3使用非常广,我们的android系统和ios系统都是使用的这个数据库

1、项目的目录结构如下:

python3+flask 开发web(十)——Flask中jinjia2模板的继承和sqlite3数据的增删改查和sqlalchemy框架使用_第1张图片

实现一个注册成功跳转到登录页面,并且把注册的用户名和邮箱地址插入数据库,在list路径下执行删除操作,同时删除对应的数据库记录

2、models.py文件中主要实现sqlite3数据库的增删改查函数/方法,初始化数据库(init_db())也就是创建数据库表的操作只有第一次没有表的时候需要执行,表创建成功后就不需要再执行初始化数据库的代码了,models代码如下

#models.py
import sqlite3

DB_FILES='db/database.sqlite3'   #需要在当前项目的根目录下新建一个db空文件夹

#初始化数据库函数
def init_db():
    #创建数据库连接
    conn=sqlite3.connect(DB_FILES)

    try:
        sql="""
        create table if not exists users(
        username text primary key,
        password text,
        email text)
        
        """
        conn.execute(sql)
        print("数据库初始化成功")
    except:
        print("数据库初始化失败")
    finally:
        conn.close()

#查询所有数据函数
def find_all():
    list=[]

    conn = sqlite3.connect(DB_FILES)

    try:
        #创建游标
        cursor=conn.cursor()
        sql = """
        select username,password,email from users
        """
        cursor.execute(sql)
        #提取结果集
        result_set=cursor.fetchall()
        for row in result_set:
            dict={}
            dict['username']=row[0]
            dict['password'] = row[1]
            dict['email'] = row[2]
            list.append(dict)
        print("数据查询成功")
    except:
        print("数据查询失败")
    finally:
        conn.close()
        return list

#插入数据函数
def create(user):
    #
    conn = sqlite3.connect(DB_FILES)
    try:
        cursor=conn.cursor()
        sql = """
        insert into users(username,password,email) values(?,?,?)
        """
        afcount=cursor.execute(sql,[user['username'],user['password'],user['email']])
        #提交结果集
        conn.commit()

        print("数据插入成功")
    except:
        print("数据插入失败")
        #回滚事物,保证插入的原子性
        conn.rollback()
    finally:
        conn.close()

#删除数据
def remove(username):
    #
    conn = sqlite3.connect(DB_FILES)
    try:
        cursor = conn.cursor()
        sql = "DELETE FROM users WHERE username = ?"
        afcount = cursor.execute(sql,[username])
        # 提交结果集
        conn.commit()

    except:
        print("数据删除失败")
        # 回滚事物,保证插入的原子性
        conn.rollback()
    finally:
        conn.close()

3、form.py文件中定义一个注册的类

#forms.py
from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,validators


class RegistrationForm(FlaskForm):
    username=StringField('用户名:',[validators.DataRequired('请输入用户名')])  #FlaskForm表单中的StirngField等可以渲染成HTML中的input标签
    password = PasswordField('密码:', [validators.DataRequired('请输入密码')])
    password2 = PasswordField('再次输入密码:', [validators.EqualTo('password',message='两次输入的密码不匹配')])
    email = StringField('邮箱:', [validators.DataRequired('请输入邮箱'),validators.Email('请输入有效的邮箱名')])

4、Hello.py文件:

#Hello.py
from flask import Flask,render_template,request,redirect,url_for
import models
from forms import RegistrationForm




app=Flask(__name__)
app.secret_key="12ewsddfd34frdfchfg"   #必要的

@app.route('/login')
def login():
    return render_template('login.html')

#初始化数据库
models.init_db()

@app.route('/register',methods=['GET','POST'])
def register():
    form=RegistrationForm()
    if request.method=='POST':
        if form.validate():
            user={}
            user['username']=request.form['username']  #request.form['username']中的usernamne是我们在页面中输入的username赋值给数据库表user中的username字段
            user['password'] = request.form['password']
            user['email'] = request.form['email']
            # 调用models.py中的create()函数插入数据库
            models.create(user)
            return redirect(url_for('login'))
        else:
            return render_template('registration.html',form=form)
    return render_template('registration.html',form=form)

@app.route('/list')
def show_list():
    #调用models.py中的find_all()函数查询
    list=models.find_all()
    return render_template('user_list.html', list=list)

@app.route('/del')
def remove_user():
    username=request.args['username']
    #调用models.py中的remove函数删除数据
    models.remove(username)
    #查询所有数据
    list=models.find_all()
    return render_template('user_list.html', list=list)



if __name__=='__main__':
    app.run(debug=True)

5、模板文件,这里面用到了jinjia2模板的继承,把每个html页面都有的部分定义成base.html模板,不同的部分在各自的模板中自己定义,下面的login.html\registration.html\user_list.html都继承了base.html页面

(1)base.html




    
    {% block title%}{% endblock %}


智捷网上电脑商城

{% block body%}{% endblock %}

(2)login.html

{% extends "base.html"%}
{% block title %}用户登录{% endblock %}
{% block body %}

你已经注册成功,进入登录页面了,登录页面具体实现一会儿写吧!

{% endblock%}

(3)user_list.html

{% extends "base.html"%}
{% block title %}用户列表{% endblock %}
{% block body %}

    {% for row in list %}
    
    {% endfor %}
用户名 邮箱 操作
{{row['username']}} {{row['email']}} 修改 删除
{% endblock%}

(4) registration.html

{% extends "base.html"%}
{% block title %}用户注册{% endblock %}
{% block body %}
    {% for errors in form.errors.items()%} {% for message in errors%}
  • {{message}}
  • {% endfor %} {% endfor %}
{{ form.hidden_tag()}}
{{form.username.label}} {{form.username}}
{{form.password.label}} {{form.password}}
{{form.password2.label}} {{form.password2}}
{{form.email.label}} {{form.email}}
{% endblock%}

执行Hellol.py代码,在控制台看见”数据库初始化成功“的字样,在db文件夹下生成一个database.sqlite3数据,此时这个库是空的,执行init_db()函数后会创建一个user空表,接着对应代码,对数据库进行插入、查询、删除等操作

register页面

python3+flask 开发web(十)——Flask中jinjia2模板的继承和sqlite3数据的增删改查和sqlalchemy框架使用_第2张图片

 注册成功后,跳转到登录页面,同时数据中多出一条数据:

python3+flask 开发web(十)——Flask中jinjia2模板的继承和sqlite3数据的增删改查和sqlalchemy框架使用_第3张图片

 

list页面:

python3+flask 开发web(十)——Flask中jinjia2模板的继承和sqlite3数据的增删改查和sqlalchemy框架使用_第4张图片 点击上图删除按钮:

python3+flask 开发web(十)——Flask中jinjia2模板的继承和sqlite3数据的增删改查和sqlalchemy框架使用_第5张图片

SQLALchemy框架:

ORM(Object ralation map):每个一数据库的表对应一个类,表中的每个字段对应类中的变量,表中的一条记录对应类的一个实例。

SQLALchemy是一种ORM技术:

将上面的sqlite3改成sqlalchemy框架,models.py的代码如下:

#models.py
from sqlalchemy import Column,String,Integer,Float
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

DB_FILES='db/database.sqlite3'   #需要在当前项目的根目录下新建一个db空文件夹
engine=create_engine('sqlite:///'+DB_FILES,echo=True)
#创建模型基类
Base=declarative_base()

#定义User模型
class User(Base):
    __tablename__='users'      #users数据库中表的表名
    name=Column('username',String(100),primary_key=True) #name是我们User模型中的字段名,username是users表的表名
    password=Column('password',String(100))
    email=Column('email',String(50))

if __name__=='__main__':
    #创建数据库中的表
    Base.metadata.create_all(engine)   #第一次需要运行这句代码创建数据库中的表,后面就不需要再运行改代码了


#查询所有数据函数
def find_all():
    #创建Session对象
    Session=sessionmaker(bind=engine)
    session=Session()
    #查询返回列表
    list=session.query(User).all()

    list2=[] #返回视图的数据类型

    for user in list:
            dict={}
            dict['username']=user.name
            dict['password'] =user.password
            dict['email'] = user.email
            list2.append(dict)

    #关闭session
    session.close()
    return list2

#插入数据函数
def create(user):

    # 创建Session对象
    Session = sessionmaker(bind=engine)
    session = Session()

    new_user=User(name=user['username'],
                  password=user['password'],
                  email=user['email'])

    #插入数据库
    session.add(new_user)

    #提交数据库事物
    session.commit()
    #关闭session
    session.close()


#删除数据
def remove(username):

    # 创建Session对象
    Session = sessionmaker(bind=engine)
    session = Session()

    #查询要删除的用户
    user=session.query(User).filter_by(name=username).one()

    #删除用户
    session.delete(user)

    # 提交数据库事物
    session.commit()
    # 关闭session
    session.close()

Hello.py文件中去掉初始化数据库的代码:models.init_db()其他的代码和html文件都不需要变化,运行hello.py文件,效果和上面一样!

 

你可能感兴趣的:(python学习)