flask web开发中关于flask-SQLAlchemy的使用解释和完整代码 - Gavin_Hall的博客 - CSDN博客

>>>前言

在自学《flask web开发》一书时遇到的问题,由于书讲的不太清楚,而在网上搜索到的基本都是和书一样的代码片段,不是很懂其中的整个流程,始终没有找到合适的解决办法。于是又返回前面看了一下那些基本的知识点,又琢磨了一下,终于把它给解决了,这个博文的 主要目的 是给出一个完整的解决方案,在这里分享一下我的解决方法。

>>>大概流程:

1.设置 SQLite数据库 基本参数、创建渲染类 Myform
2. 建立两个基本关系型数据表 ,本例中其实一个表就够了,但是还是 按照书本 的来,因为后面的知识点和现在承接的;
3. 创建数据表并添加一些原始值;
4. 添加路由函数;
5. 封装运行。

>>>要求:

其实能找到这里的,应该也是学习了那本书的基本知识了,并且也是掌握了一定的python基础了的,但在这里还是提醒一下要求

  1. python3 环境
  2. SQLite数据库
  3. 下载了所有需要的库(参照代码的 import部分)

>>>所有解释都在代码中

w55_flask_sqlalchemy.py(避免起 flask_sqlalchemy.py 或者 sqlalchemy.py 这两个特殊的文件名!否则出错!)

import os
from flask_wtf import Form
from flask_script import Manager
from wtforms import StringField, SubmitField
from wtforms.validators import Required
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
from flask import Flask, session, redirect, url_for, render_template

basedir = os.path.abspath(os.path.dirname(__file__))

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.sqlite')
# SQLALCHEMY_COMMIT_ON_TEARDOWN 键,将其设为 True时,每次请求结束后都会自动提交数据库中的变动。
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.debug = True
app.secret_key = 'the secretest key'
Bootstrap(app)
db = SQLAlchemy(app)

class MyForm(Form):
    name = StringField('What is your name?', validators=[Required()])
    submit = SubmitField('Submit')

class Role(db.Model):
    # 数据表名字
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    # 第一个参数表明这个关系的另一端是哪个模型。
    # backref 参数向 User 模型中添加一个 role 属性,从而定义反向关系
    # 这一属性可替代 role_id 访问 Role 模型,此时获取的是模型对象,而不是外键的值
    users = db.relationship('User', backref='role')

    def __repr__(self):
        return '<Role %r>' % self.name

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    # 传给 db.ForeignKey() 的参数 'roles.id' 表明,这列的值是 roles 表中行的 id 值
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

    def __repr__(self):
        return '<User %r>' % self.username

# 创建数据表并添加若干原始值
db.drop_all()
db.create_all()
admin_role = Role(name='Admin')
mod_role = Role(name='Moderator')
user_role = Role(name='User')
user_john = User(username='john', role=admin_role)
user_susan = User(username='susan', role=user_role)
user_david = User(username='david', role=user_role)
db.session.add_all([admin_role, mod_role, user_role,user_john, user_susan, user_david])
db.session.commit()

@app.route('/', methods=['GET', 'POST'])
def index():
    form = MyForm()
    if form.validate_on_submit():
        # session['known']用于标识user是否是新值,
        # 查找数据库中是否有表单中的值,没有则创建新值,并标识为新,否则标识为已认识
        user = User.query.filter_by(username=form.name.data).first()
        if user is None:
            user = User(username=form.name.data)
            db.session.add(user)
            session['known'] = False
        else:
            session['known'] = True
        session['name'] = form.name.data
        form.name.data = ''
        return redirect(url_for('index'))
    # 第1次运行时执行此return
    return render_template('index.html', form=form, name=session.get('name'), known=session.get('known', False))

app.debug = True
manager = Manager(app)

if __name__ == '__main__':
    manager.run()

>>>上面对应的index.html

注意: index.html是放在flask-sqlalchemy.py的同级文件夹templates中,即:
/w55_flask_sqlalchemy.py
/templates/index.html

{% extends "bootstrap/base.html" %}
{% import "bootstrap/wtf.html" as wtf %}

{% block title %}Form{% endblock %}

{% block content %}
<div class="container">
    <h1>Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}.</h1>
    {% if not known %}
    <p>Good to see you!</p>
    {% else %}
    <p>Good to have you back!</p>
    {% endif%}
    
    <!-- 此函数能快速渲染form成HTML文本 -->
    {{ wtf.quick_form(form) }}  
</div>
{% endblock %}

运行python flask_sqlalchemy.py runserver 看效果,如下:

图1:第一次输入路由时
图2:输入刚刚已在数据库添加的用户 john
图3:输入新用户 gavin
图1
图2
图3

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值