ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Flask Web书籍管理系统

2020-02-20 21:05:54  阅读:226  来源: 互联网

标签:session Web name author Flask 管理系统 db book id


一 项目,目录结构

[root@kolla ~]# tree Flask_books_project/
Flask_books_project/
├── Flask_books_project.py
├── static
│   └── __init__.py
└── templates
    └── books.html

2 directories, 3 files
[root@kolla ~]#
二 books.html文件内容
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post">
    {{ form.csrf_token() }}
    {{ form.author.label }}{{form.author}}<br>
    {{ form.book.label}}{{form.book}}<br>
    {{ form.submit }}<br>
    {#显示消息闪现的内容#}
    {% for message in get_flashed_messages() %}
        {{ message }}
    {% endfor %}
</form>
<hr>

{#先遍历作者,然后再坐这里遍历书籍#}

<ul>
    {% for author in authors %}
        <li>{{ author.name }}<a href="{{url_for("delete_author", author_id=author.id) }}">删除</a></li>
        <ul>
            {% for book in author.books %}
                <li>{{ book.name }}<a href="{{url_for("delete_book",book_id=book.id)}}">删除</a></li>
            {% else %}
                <li>无</li>
            {% endfor %}
        </ul>
    {% endfor %}
</ul>

</body>
</html>

 

 

 

三  Flask_books_project.py文件内容
#1.先创建数据库
# create database flask_books charset=utf8;

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

from flask import Flask, render_template, flash, request
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

#重定向会引入这些
from flask import redirect,url_for

# 解决编码问题
import sys
import importlib
importlib.reload(sys)


app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:hadoop@127.0.0.1/flask_books'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.secret_key = 'itheima'
#创建数据库对象
#数据库创建命令
# create database flask_books charset=utf8;
#
db = SQLAlchemy(app)

'''
1. 配置数据库
    a. 导入SQLAchemy扩展
    b. 创建db对象,并配置参数
    c. 终端创建数据库
    
2. 添加书和作者模型
    a.模型继承db.Model
    b.__tablename__表名
    c. db.Column:字段
    d. db.relationship:关系引用

3. 添加数据
4. 使用模板显示数据库查询的数据
    a. 查询所有的作者信息,让信息传递给模板
    b. 模板中按照格式,一次for循环作者和书籍即可(作者获取书籍,用的是关系引用)
    
5. 使用WTF显示表单
    a. 自定义表单类
    b. 模板中显示
    c. secret_key /编码 / csrf_token
6. 实现增删逻辑
    a. 增加数据
    b. 删除书籍 url_for的使用 / for else的使用/redirect的使用
'''
#定义书和作者模型
#作者模型
class Author(db.Model):
    #表明
    __tablename__= 'authors'
    #字段
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), unique = True)

    #关系引用
    #books是给自己(Author)用的,
    books = db.relationship('Book', backref = 'author')
    def __repr__(self):
        return 'Author: %s' % self.name

#书籍模型
class Book(db.Model):
    __tablename__ = 'books'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), unique=True)
    author_id = db.Column(db.Integer,db.ForeignKey('authors.id'))

    def __repr__(self):
        return 'Book: %s %s' %(self.name, self.author_id)

#自定义表单类
class AuthorForm(FlaskForm):
    author = StringField('作者', validators=[DataRequired()])
    book = StringField('书籍', validators=[DataRequired()])
    submit = SubmitField('提交')

#删除作者
@app.route('/delete_author/<author_id>')
def delete_author(author_id):
    #  查询数据库,是否有该作者,如果有就删除(先删除书籍再删除作者),没有就提示错误
    # 1.查询数据库
    author = Author.query.get(author_id)
    # 2. 如果有就删除(先删书,再删作者)
    if author:
        try:
            #查询之后直接删除
            Book.query.filter_by(author_id = author_id).delete()
            # 删除作者
            db.session.delete(author)
            db.session.commit()
        except Exception as e:
            print(e)
            flash('删除书籍出错')
            db.session.rollback()
    else:
        #3. 没有提示错误
        flash('作者找不到')
    return redirect(url_for('index'))

#b. 删除书籍--> 网页中删除-->点击需要发送书籍的ID给删除书籍的路由-->路由需要接受参数
@app.route('/delete_book/<book_id>')
def delete_book(book_id):
    #1 查询数据库,是否有该ID,如果有就删除,没有就提示错误
    book = Book.query.get(book_id)
    #2 如果有就删除
    if book:
        try:
            db.session.delete(book)
            db.session.commit()
        except Exception as e:
            print(e)
            flash('删除书籍出错')
            db.session.rollback()
    else:
        # 3.没有提示错误
        flash('书籍找不到')
    #如何返回当前网址-->重定向

    #return redirect('www.baidu.com')
    # return redirect('/')
    #redirect:重定向,需要传入一个网址/路由地址
    #url_for('index'):需要传入视图函数名,返回改视图函数对应的路由地址
    print(url_for('index'))
    return redirect(url_for('index')) #index为函数

@app.route('/',methods=['GET','POST'])
def index():
    author_form = AuthorForm()
    '''
    验证逻辑:
    1. 调用WTF的函数实现验证
    2. 验证通过获取我们的数据
    3. 判断作者是否存在
    4. 如果作者存在,查看书是否存在,没有重复书籍就添加数据,如果重复就提示错误
    5. 如果作者不存在,添加作者和书籍
    6. 验证不通过则提示错误
    '''
    #1. 调用WTF的函数实现验证
    if author_form.validate_on_submit():
        #2. 验证通过获取数据
        author_name = author_form.author.data
        book_name = author_form.book.data
        # 3. 判断作者是否存在
        author = Author.query.filter_by(name=author_name).first()

        # 4. 如果作者存在
        if author:
            #查看书是否存在,没有重复书籍就添加数据,如果重复就提示错误
            book = Book.query.filter_by(name=book_name).first()
            if book:
                flash('已存在同名书籍')
            # 没有重复书籍就添加数据
            else:
                try:
                    new_book = Book(name=book_name, author_id = author.id)
                    db.session.add(new_book)
                    db.session.commit()
                except Exception as e:
                    print(e)
                    flash('添加书籍失败')
                    db.session.rollback()

        else:
            # 5. 如果作者不存在,添加作者和书籍
            try:
                new_author = Author(name = author_name)
                db.session.add(new_author)
                db.session.commit()

                new_book = Book(name=book_name, author_id = new_author.id)
                db.session.add(new_book)
                db.session.commit()
            except Exception as e:
                print(e)
                flash('添加作者和书籍失败')
                db.session.rollback()
    else:
        # 6. 验证不通过则提示错误
        if request.method == 'POST':
            flash('参数不全')

    # 查询所有的作者信息,让信息传递给模板
    authors = Author.query.all()
    return render_template('books.html', authors=authors, form=author_form)

if __name__ == '__main__':
    db.drop_all()
    db.create_all()

    #生成数据
    au1 = Author(name='老王')
    au2 = Author(name='老惠')
    au3 = Author(name='老刘')
    #把数据提交给用户会话
    db.session.add_all([au1, au2,au3])

    #提交会话
    db.session.commit()
    bk1 = Book(name='老王回忆录',author_id = au1.id)
    bk2 = Book(name='我读书少,你别骗我',author_id=au1.id)
    bk3 = Book(name='如何才能让自己更骚', author_id=au2.id)
    bk4 = Book(name='怎样征服美丽少女', author_id=au3.id)
    bk5 = Book(name='如何征服英俊少男', author_id=au3.id)

    #把数据提交给用户会话
    db.session.add_all([bk1, bk2, bk3, bk4, bk5])
    db.session.commit()
    app.run(debug=True)

 
张金玉 发布了201 篇原创文章 · 获赞 28 · 访问量 10万+ 私信 关注

标签:session,Web,name,author,Flask,管理系统,db,book,id
来源: https://blog.csdn.net/xsjzdrxsjzdr/article/details/104417737

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有