Flask练习记录

flask基本模板

通过路由地址传递参数

通过路由地址传递多个参数

在函数路由中定义传递的参数age必须为整数,否则报错

多个路由地址都可以方位同一个函数

路由地址设置只接受GET访问方法,否则报错

反向解析地址,适合用在路由长的地方

渲染模板

渲染模板时传入一个参数


过滤器


路由传参案例


由路由的函数解析出路由的地址

函数中传递多个参数需要加上params = locals()


在模板中导入函数中的变量时,字典的导入方法


loop用于记录循环的相关信息(loop.index记录当前循环次数,从1开始,index0从0开始,first为true记录第一次循环,last为true记录最后一次)

创建宏并调用macro

调用创建好的宏


include包含其他的网页


静态文件的导入需要自行创建一个static文件夹

反向解析图片的路径


模板继承


获取请求的数据(args只获取地址栏中的参数,不分get和post)


获取表单文本框输入的内容(form只用于POST请求)

make_response响应对象创建出来的内容

make_response响应模板

重定向地址

表单上传文件的时候enctype的设置

上传文件或者图片,保存指定到某个目录下

sqlalchemy安装方法

ORM中需要导入的FLASK模块

连接数据库并创建一个表单table

如果报错没有PYMSQL,就导入这段代码

通过表单导入书库到数据库中(创建类后需要初始化对象,init



删除已创建表的结构

查询table字段

查询table字段显示username,并打印在终端(如果显示ID就把username改成id)

把查询的结果遍历打印在终端上

查询第一个结果first

查询表中一共有几条数据

利用查询结果创建一个form表格


filter查询过滤器查询结果






聚合函数





自动提交commit的设置

制作一个表单,具备修改和删除的功能

from flask import Flask, request, render_template, redirect
from flask_sqlalchemy import SQLAlchemy

import pymysql
from sqlalchemy import or_, func

pymysql.install_as_MySQLdb()

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:123456@localhost:3306/flask'
#指定执行完操作后自动提交
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True
db = SQLAlchemy(app)

#创建模型类-Models
#创建Users类,映射到数据库中叫users表
#创建字段:id,主键和自增
#创建字段:username,长度为80的字符串,不允许为空,值必须唯一
#创建字段:age,整数,允许为空
#创建字段:email,长度为120的字符串,必须唯一
class Users(db.Model):
    __tablename__ = "users"
    id=db.Column(db.Integer,primary_key=True)
    username=db.Column(db.String(80),nullable=False,unique=True)
    age=db.Column(db.Integer,nullable=True)
    email=db.Column(db.String(120),unique=True)

    def __init__(self,username,age,email):
        self.username = username
        self.age = age
        self.email = email

    def __repr__(self):
        return "<Users:%r>" % self.username

class Student(db.Model):
    __tablename__ = 'student'
    id = db.Column(db.Integer,primary_key=True)
    sname = db.Column(db.String(30))
    sage = db.Column(db.Integer)

class Teacher(db.Model):
    __tablename__ = 'teacher'
    id = db.Column(db.Integer,primary_key=True)
    tname = db.Column(db.String(30))
    tage = db.Column(db.Integer)

class Course(db.Model):
    __tablename__ = 'course'
    id = db.Column(db.Integer,primary_key=True)
    cname=db.Column(db.String(30))

#删除已创建的表结构
# db.drop_all()
#将创建好的实体类映射回数据库
db.create_all()


@app.route('/')
def hello_world():
    return 'Hello World!'

@app.route('/01-insert')
def insert_views():
    #创建Users对象并赋值
    # users = Users('王老师',32,'wangwc@163.com')
    #将对象通过db.session.add() 插入到数据库
    # db.session.add(users)
    #提交插入操作
    # db.session.commit()

    #创建Users对象并赋值
    users = Users('魏老师',40,'laowei@163.com')
    db.session.add(users)
    return "Insert Success"

@app.route('/02-register',methods=['GET','POST'])
def register_views():
    if request.method == 'GET' :
        return render_template('02-register.html')
    else:
        #接收前端传递过来的数据
        username=request.form.get('username')
        age = request.form.get('age')
        email = request.form.get('email')
        #构建Users的对象
        users = Users(username,age,email)
        #通过db.session.add将对象插入到数据库中
        db.session.add(users)
        return "Register OK"

@app.route('/03-query')
def query_views():
    # 测试query()函数
    # print(db.session.query(Users))
    # print(db.session.query(Users,Course))
    # print(db.session.query(Users.username,Users.email))

    # 查询执行函数 - all()
    # users = db.session.query(Users).all()
    # for user in users:
    #     print("姓名:%s,年龄:%d,邮箱:%s" % (user.username,user.age,user.email))

    #查询执行函数 - first() , count()
    # query = db.session.query(Users)
    # user = query.first()
    # print(user)
    # count = query.count()
    # print("共有%d条数据" % count)

    # 查询过滤器函数 - filter()
    # 查询年龄大于30的Users的信息
    # result = db.session.query(Users).filter(Users.age>30).all()

    # 查询年龄大于30并且id大于1的Users的信息
    # result = db.session.query(Users).filter(Users.age>30,Users.id>1).all()

    # 查询年龄大于30或id大于1的Users的信息
    # result=db.session.query(Users).filter(or_(Users.age>30,Users.id>1)).all()

    # 查询email中包含'w'的Users的信息 - 模糊查询like()
    # result = db.session.query(Users).filter(Users.email.like('%w%')).all()

    # 查询Users中所有的age的总和 - 聚合函数
    # result=db.session.query(func.avg(Users.age)).all()

    # 查询id在2,3之间的Users的信息
    # result = db.session.query(Users).filter(Users.id.in_([2,3])).all()

    # 使用filter_by 查询 id=2 的Users的信息
    # result = db.session.query(Users).filter_by(id=2).first()

    # 使用 limit 和 offset 查询限制行数据
    # result = db.session.query(Users).limit(2).all()
    # result = db.session.query(Users).limit(2).offset(1).all()

    # 使用 order_by 排序,先按照年龄升序排序,再按照id降序排序
    result = db.session.query(Users).order_by("age asc,id desc").all()
    print(result)
    return "Query OK"

@app.route('/03-queryall')
def queryall_views():
    users = db.session.query(Users).all()
    return render_template('03-queryall.html',users = users)

@app.route('/04-update',methods=['GET','POST'])
def update_views():
    if request.method == 'GET':
        # 接收前端传递过来的用户id
        id = request.args.get('id','')
        # 根据id将对应的用户的信息读取出来
        # user = db.session.query(Users).filter(Users.id==id).first()
        user = db.session.query(Users).filter_by(id=id).first()
        # 将读取出来的实体对象发送到04-update.html上显示
        return render_template('04-update.html',user=user)
    else:
        # 接收前端传递过来的四个值(id,username,age,email)
        id = request.form.get('id')
        username = request.form.get('username')
        age = request.form.get('age')
        email = request.form.get('email')
        # 根据id查询出对应的user的信息
        user=Users.query.filter_by(id=id).first()
        # 将username,age,email的值分别再赋值给user对应的属性
        user.username = username
        user.age = age
        user.email = email
        # 将user的信息保存回数据库
        db.session.add(user)
        # 响应:重定向回/03-queryall
        return redirect('/03-queryall')

@app.route('/05-query')
def query05_views():
    #使用 Models 查询数据
    # user=Users.query.filter(Users.id==1).first()
    user = Users.query.filter_by(id=3).first()
    print(user)
    return "Query OK"

@app.route('/06-delete')
def delete_views():
    id = request.args.get('id')
    user=Users.query.filter_by(id=id).first()
    db.session.delete(user)
    return redirect('/03-queryall')


if __name__ == '__main__':
    app.run(debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/04-update" method="post">
    <p>
        姓名: <input type="text" name="username" value="{{ user.username }}">
        <!-- 需要提交给服务器,但不能给用户显示 -->
        <input type="hidden" name="id" value="{{ user.id }}">
    </p>
    <p>
        年龄: <input type="number" name="age" value="{{ user.age }}">
    </p>
    <p>
        邮箱: <input type="email" name="email" value="{{ user.email }}">
    </p>
    <p>
        <input type="submit">
    </p>
</form>
</body>
</html>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <table border="1">
        <tr>
            <th>姓名</th>
            <th>年龄</th>
            <th>邮箱</th>
            <th>操作</th>
        </tr>
        {% for user in users %}
            <tr>
                <td>{{ user.username }}</td>
                <td>{{ user.age }}</td>
                <td>{{ user.email }}</td>
                <td>
                    <a href="/04-update?id={{ user.id }}">修改</a>
                    <a href="javascript:deleteUser({{ user.id }})">删除</a>
                </td>
            </tr>
        {% endfor %}
    </table>
    <script>
        /**
         * 删除指定用的方法
         * 参数 id : 表示的是要删除的用户的id
         * */
        function deleteUser(id){
            //1.弹出提示是否要删除
            if(window.confirm('确定要删除?')){
                //2.如果真的要删除则发送请求到后台
                location.href="/06-delete?id="+id;
            }
        }
    </script>
</body>
</html>




设置外键和主键实现一对多的效果

多对多查询

一对一teacher里面有个wife wife里面有个teacher

一对一添加查询数据

学生和课程关联查询的案例

创建cookie

获取cookie名称和值

获取cookie的值

创建session值的配置

创建session

获取session值

模仿登录窗口判断session和cookie值


posted @ 2018-11-28 13:49  IndustriousHe  阅读(452)  评论(0编辑  收藏  举报