Flask练习记录

flask基本模板

1532113-20181128133419592-826305918.png

通过路由地址传递参数

1532113-20181128134334611-1346962640.png

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

1532113-20181128134637838-193116501.png

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

1532113-20181128134855574-1700533924.png

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

1532113-20181128135216320-1633475615.png

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

1532113-20181128140518996-762595948.png

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

1532113-20181128142715936-1910455362.png

渲染模板

1532113-20181128145116902-1110387722.png

渲染模板时传入一个参数

1532113-20181128145347484-629644129.png
1532113-20181128145402220-408060634.png

过滤器

1532113-20181128145745550-1431531179.png
1532113-20181128145803708-1997000444.png

路由传参案例

1532113-20181128150735246-1177852515.png
1532113-20181128150751640-1944855865.png

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

1532113-20181128151624818-1892082218.png

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

1532113-20181128152715818-704524292.png
1532113-20181128152808508-1522491930.png

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

1532113-20181128153658268-237668581.png
1532113-20181128153909437-1804440499.png

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

1532113-20181128154745546-2030218295.png

创建宏并调用macro

1532113-20181128155642160-1377149592.png

调用创建好的宏

1532113-20181128161101522-963923211.png
1532113-20181128161132954-1105004092.png

include包含其他的网页

1532113-20181128161540200-1951971171.png
1532113-20181128161659312-546239137.png

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

1532113-20181128162556984-1813845094.png

反向解析图片的路径

1532113-20181128171639969-2127344114.png
1532113-20181128171704640-33565534.png

模板继承

1532113-20181128172645033-641107918.png
1532113-20181128172811971-137516967.png

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

1532113-20181128174133577-392218292.png
1532113-20181128174224117-1633524322.png

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

1532113-20181128175756110-1064522330.png

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

1532113-20181128181614450-842951047.png

make_response响应模板

1532113-20181128181751193-2123835708.png

重定向地址

1532113-20181128182212341-2132397030.png

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

1532113-20181128182357480-1354519174.png

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

1532113-20181128183949995-528028387.png

sqlalchemy安装方法

1532113-20181128185055398-820582304.png

ORM中需要导入的FLASK模块

1532113-20181128190301409-1426150622.png

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

1532113-20181128200154152-347918830.png

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

1532113-20181128200247305-1989429166.png

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

1532113-20181128202247936-1709561901.png
1532113-20181128202313786-20120943.png
1532113-20181129091712611-2030350593.png

删除已创建表的结构

1532113-20181129085355092-649041777.png

查询table字段

1532113-20181129085826799-1172755376.png

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

1532113-20181129090020943-1788947956.png

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

1532113-20181129093547593-1371717052.png

查询第一个结果first

1532113-20181129093834357-379323717.png

查询表中一共有几条数据

1532113-20181129094003578-1435178553.png

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

1532113-20181129095051225-1080856489.png
1532113-20181129095146782-2068607578.png

filter查询过滤器查询结果

1532113-20181129095846273-215584616.png
1532113-20181129100039730-1788631047.png
1532113-20181129100422494-1675285510.png
1532113-20181129100533301-1385595373.png
1532113-20181129100832638-1633906561.png
1532113-20181129101046227-2034729653.png

聚合函数

1532113-20181129101759738-625932804.png
1532113-20181129102003070-333828677.png
1532113-20181129102133976-1132184729.png
1532113-20181129102330506-1019919278.png
1532113-20181129102556438-801202649.png

自动提交commit的设置

1532113-20181129102928958-954991046.png

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

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>

1532113-20181129110939991-2107723205.png
1532113-20181129111009892-776827027.png
1532113-20181129111026325-743584396.png
1532113-20181129111038494-1087343246.png

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

1532113-20181129112352880-837502551.png

多对多查询

1532113-20181129113200443-473105822.png

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

1532113-20181129115321420-1895604245.png

1532113-20181129115327225-1379472855.png

一对一添加查询数据

1532113-20181129115738326-1315884809.png

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

1532113-20181129141109738-66763200.png

创建cookie

1532113-20181129142647958-139351103.png

获取cookie名称和值

1532113-20181129143339973-1263971513.png

获取cookie的值

1532113-20181129143513874-1450103455.png

创建session值的配置

1532113-20181129145139247-1606129285.png

创建session

1532113-20181129145356709-267034052.png

获取session值

1532113-20181129145733086-1224143213.png

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

1532113-20181129152228394-780921376.png
1532113-20181129152246652-1973605403.png

转载于:https://www.cnblogs.com/-hjj/p/10031694.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值