zoukankan      html  css  js  c++  java
  • flask登录

    from flask import Flask, render_template, flash, request, url_for, redirect
    # 导入数据库工具
    from flask_sqlalchemy import SQLAlchemy
    from flask_wtf import FlaskForm

    # 提交
    from wtforms import StringField, SubmitField
    from wtforms.validators import DataRequired, EqualTo

    # 编码
    # import sys
    # sys.setdefaultencoding("utf-8")

    '''
    1、配置数据库
    a.导入SQLAlchemy扩展
    b.创建db对象, 并设置参数
    c.终端创建数据库

    2、添加书和作者模型
    a.模型继承 db.Model
    b.__tablename__ :表明
    c. db.Column :字段
    3、添加数据
    4、使用模板显示数据库查询的数据
    a.查询所有的作者的信息,让信息传递给模板
    b.模板中按照格式,依次for循环作者的书籍即可,(作者获取书籍, 用的是关系引用)
    5、使用WTF显示表单
    a.自定义表单类
    b.模板中的显示
    c.secret_key /编码 /csrf_token

    6、实现相关的增删逻辑
    a.增加数据
    b.删除书籍 url_for的使用 、 for else的使用 、redirect(重定向)的使用
    '''
    app = Flask(__name__)

    # 配置数据库的地址 数据库
    app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:123456@localhost:3306/flask_books"

    # 跟踪数据库的修改 -->不建议开启、 开启以后会性能会有影响、未来的版本会移除
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

    app.secret_key = "itheima"

    # 创建数据库对象
    db = SQLAlchemy(app)

    #登录
    class Login(db.Model):
    # 表名字
    __tablename__ = "login"

    # 字段
    id = db.Column(db.Integer, primary_key=True)

    #账号 unique 独特的,稀罕的 varchar(50)
    username = db.Column(db.String(50), unique=True)

    #密码
    password = db.Column(db.String(50))

    def __repr__(self):
    return "Login: %s %s" % (self.username, self.password)





    # 定义书和作者模型
    class Author(db.Model):
    # 表名字
    __tablename__ = "authors"

    # 字段
    id = db.Column(db.Integer, primary_key=True)

    #独特的,稀罕的;
    name = db.Column(db.String(16), unique=True)

    # 关系引用
    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)

    #unique 独特的,稀罕的
    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):
    # validators=[DataRequired()] 验证函数
    author = StringField("作者", validators=[DataRequired()])
    book = StringField("书籍", validators=[DataRequired()])
    submit = SubmitField("提交")


    @app.route("/delete_author/<author_id>")
    def delete_author(author_id):
    # 查询数据库,查看id的作者是否存在, 存在就删除
    author = Author.query.get(author_id)

    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:
    flash("作者找不到")

    return redirect(url_for("index"))


    @app.route("/delete_book/<book_id>")
    def delete_book(book_id):
    # 查询数据库、是否有改id的书籍
    book = Book.query.get(book_id)

    # 如果存在就删除、如果不存在就提示错误
    if book:
    try:
    db.session.delete(book)
    db.session.commit()

    except Exception as e:
    print(e)
    flash("删除书籍错误")
    db.session.rollback()
    else:
    flash("书籍找不到")

    print(url_for("index"))
    return redirect(url_for("index"))


    # 验证就会出现GET/POST请求
    @app.route('/', methods=["GET", "POST"])
    def index():
    #生成表单的实例化
    author_form = AuthorForm()

    #如果提交的数据存在
    if author_form.validate_on_submit():

    # 拿到提交的数据
    author_username = author_form.author.data
    author_password = author_form.book.data

    print("查看拿到的数据",author_username,author_password)

    #把表单里面的数据和登录库的username字段进行匹配
    r = Login.query.filter_by(username=author_username).first()
    print("r{},他的类型{}".format(r,type(r)))

    if r:
    r2 = Login.query.filter_by(password=author_password).first()
    if r2:
    flash("登录成功")
    else:
    flash("密码不正确")
    else:
    flash("请输入账号密码")


    return render_template("login_1.html",form=author_form)

    '''
    # 验证就会出现GET/POST请求
    @app.route('/', methods=["GET", "POST"])
    def index():
    # 创建自定义的表单类
    author_form = AuthorForm()


    #6、 WTF可以一句话实现验证数据:

    #1、调用WTF的函数实现验证
    #2、验证通过获取数据
    #3、判断作者是否存在
    #4、判断书籍是否存在, 如果没有重复书籍就添加数据,如果重复就提示错误

    #5、如果作者不存在, 添加作者和书籍
    #6、验证不通过就提示错误

    # 1、调用WTF的函数实现验证, 提交的时候验证 验证是否有数据
    if author_form.validate_on_submit():

    # 2、验证通过获取数据

    # 拿到作者input信息
    author_name = author_form.author.data

    # 书籍input信心
    book_name = author_form.book.data

    # 3、判断作者是否存在 (涉及到数据库查询操作、query.filter_by)
    author = Author.query.filter_by(name=author_name).first()

    # 如果作者存在
    if author:
    # 4、判断书籍是否存在, 如果没有重复书籍就添加数据,如果重复就提示错误
    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:
    # 如果作者不存在, 添加作者和书籍
    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:
    # flash("这个无论如何都会提示、因为没有做启动方式验证、启动方式是get或者post")

    # 6、如果是post请求, 才会提示有问题 验证不通过就提示错误 加上from flask import Flask,render_template, flash, request
    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()

    # 添加测试数据库
    # 生成数据

    user1 = Login(username = "厚溥",password = "123456")
    user2 = Login(username = "hp1901",password = "234567")
    user3 = Login(username="hp1902",password = "345678")

    db.session.add_all([user1, user2, user3])

    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)

    '''


    desc class
    desc stu

    create table stu(
    cid int PRIMARY key,
    name VARCHAR(20),
    age int,
    sex VARCHAR(2),
    id_class int references class(id_class)
    )

    references

    drop table stu


    select * from class
    select * from stu

    select * from class,stu where class.id_class = stu.id_class




    insert into

    INSERT INTO class VALUES (1, "大数据1")
    INSERT INTO class VALUES (2, "大数据2")
    INSERT INTO class VALUES (3, "大数据3")

    INSERT INTO stu VALUES (1,"张三",18,"男",1)
    go
    INSERT INTO stu VALUES (2,"李四",18,"男",2)
    go
    INSERT INTO stu VALUES (3,"王二",18,"男",2)
    go
    INSERT INTO stu VALUES (4,"大王",18,"男",3)


    '''

  • 相关阅读:
    exchange 2010 数据库管理
    windows Sql server performance monitor
    windows powershell
    开始Dev之路
    配置adb环境
    android当中安装androidstudio时问题
    进阶之旅(一)
    ubuntu 下配置Android环境
    Android开发中的设计模式
    android anr之后如何导出traces.txt
  • 原文地址:https://www.cnblogs.com/yuanjia8888/p/12179611.html
Copyright © 2011-2022 走看看