• flask图书练习


    #_*_ encoding: utf-8 _*_   @author: ty  hery   2019/12/20
    from  flask import Flask, render_template, request, url_for, redirect
    from flask_sqlalchemy import SQLAlchemy
    from flask_wtf import FlaskForm
    from wtforms import StringField, SubmitField
    from wtforms.validators import DataRequired
    
    
    app = Flask(__name__)
    
    #设置连接数据库的URL
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:666@10.0.0.105:3306/flask_test'
    
    # 设置每次请求结束后会自动提交数据库中的改动
    app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
    
    # 查询时会显示原始SQL语句
    app.config['SQLCHEMY_ECHO'] = True
    
    
    class  Config(object):
        # 设置连接数据库的参数
        SQLALCHEMY_DATABASE_URI = "mysql://root:666@10.0.0.105:3306/flask_test"
    
        # 设置sqlalchemy自动跟踪数据库
        SQLALCHEMY_TRACK_MODIFICATIONS = True
    
        # 设置每次请求结束后会自动提交数据库中的改动
        # SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    
        # 查询时会显示初始SQL语句
        # SQLALCHEMY_ECHO = True
    
        SECRET_KEY = 'doios87fsdaf7asdf6asfjljoewg'
    
    app.config.from_object(Config)
    
    db = SQLAlchemy(app)
    
    class Author(db.Model):
        #  定义表名
        __tablename__='tbl_authors'
    
        id = db.Column(db.SmallInteger, primary_key=True)
        name = db.Column(db.String(8),unique=True)
        books = db.relationship('Book',backref='author')
    
    class Book(db.Model):
        '''用户表'''
        __tablename__ = 'tbl_books' # 指明数据库的表名
    
        id = db.Column(db.SmallInteger, primary_key=True)
        name = db.Column(db.String(8),unique=True)
        author_id = db.Column(db.SmallInteger, db.ForeignKey('tbl_authors.id'))  # 外键的类型必须和他所关联的属性一致
    
    # 创建表单模型类
    class AuthorBookForm(FlaskForm):
        author_name = StringField(label=u'作者', validators=[DataRequired('作者必填')])
        book_name = StringField(label=u'书籍', validators=[DataRequired('书籍必填')])
        submit = SubmitField(label=u'保存')
    
    print('当前的__name__ :',__name__ )
    
    
    @app.route('/', methods=['GET', 'POST'])
    def index():
        # 创建表单对象
        form = AuthorBookForm()
        if form.validate_on_submit():
            # 验证表单成功
            # 提取表单数据
            author_name = form.author_name.data
            book_name = form.book_name.data
            print('作者,书名: ',author_name,book_name,'------------')
            # 保存到数据库
            author_01 = Author(name=author_name)
            db.session.add(author_01)
            db.session.commit()
    
            book = Book(name = book_name, author_id = author_01.id)
            # book = Book(name = book_name, author = author_01) # 此处的author是反向引用的author
            db.session.add(book)
            db.session.commit()
    
        # 查询数据库form
        author_li = Author.query.all()
        return render_template('author_book.html', authors = author_li, form = form)
    
    
    @app.route('/delete_book',methods=['POST'])
    def delete_book():
        '''删除数据'''
        # 如果前端发送是请求体数据是json格式, get_json会解析成字典
        req_dict = request.get_json()
        book_id = req_dict.get('book_id')
    
        # 删除数据
        book = Book.query.get(book_id)
        db.session.delete(book)
        db.session.commit()
    
        return redirect(url_for('index'))
    
    
    if __name__ == '__main__':
        # 清除数据库里的所有数据
        # db.drop_all()
        #
        # # 创建所有的表
        # db.create_all()
        #
        # # 创建对象
        # au_xi = Author(name='我吃西红柿')
        # au_qian = Author(name='萧潜')
        # au_san = Author(name='唐家三少')
        # # session记录对象任务
        # db.session.add_all([au_xi, au_qian, au_san])
        # db.session.commit()
        #
        # bk_xi = Book(name='吞噬星空',author_id=au_xi.id)
        # bk_xi2 = Book(name='寸芒',author_id=au_qian.id)
        # bk_qian = Book(name='缥缈之旅',author_id=au_qian.id)
        # bk_san = Book(name='冰火魔厨',author_id=au_san.id)
        # db.session.add_all([bk_xi, bk_xi2, bk_qian, bk_san])
        # # 提交任务到数据库中
        # db.session.commit()
        app.run(debug = True)
    
    

    author_book.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form method="post">
        {{ form.csrf_token }}
    
            {{ form.author_name.label }}
            <p>{{ form.author_name }}</p>
            {% for  msg in form.author_name.errors %}
                <p>{{ msg }}</p>
            {% endfor %}
    
        {{ form.book_name.label }}
            <p>{{ form.book_name }}</p>
            {% for msg in form.book_name.errors %}
                <p>{{ msg }}</p>
            {% endfor %}
    
        {{ form.submit }}
        </form>
        <hr/>
    
        <ul>
            {% for author in authors %}
            <li>作者:{{ author.name }}</li>
    
            <ul>
                {% for book in author.books %}
                <li>书籍:{{ book.name }}</li>
                    <a href="javascript:;" onclick="deleteBook({{ book.id }})">删除</a>
                {% endfor %}
            </ul>
        {% endfor %}
    
        </ul>
        <script type="text/javascript" src="/staticsjsjquery-3.3.1.min.js"></script>
    
    </body>
    </html>
    
    写入自己的博客中才能记得长久
  • 相关阅读:
    hdu 4622 Reincarnation 字符串hash 模板题
    NYOJ 994 海盗分金 逆向递推
    hdu 4679 Terrorist’s destroy 树形DP
    Educational Codeforces Round 12 E. Beautiful Subarrays 预处理+二叉树优化
    hdu 5535 Cake 构造+记忆化搜索
    poj 3415 Common Substrings 后缀数组+单调栈
    poj 3518 Corporate Identity 后缀数组->多字符串最长相同连续子串
    poj 2774 Long Long Message 后缀数组LCP理解
    hdu 3518 Boring counting 后缀数组LCP
    poj 3641 Pseudoprime numbers Miller_Rabin测素裸题
  • 原文地址:https://www.cnblogs.com/heris/p/14651125.html
Copyright © 2020-2023  润新知