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
查询表中一共有几条数据
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值