五、cookie与session的设置
5.1 cookie
#1.导入make_response模块
from flask import Flask,make_response,request
app = Flask(__name__)
@app.route('/set_cookie/')
def set_cookie():
response = make_response('set_cookie success')
#创建cookie
response.set_cookie('name','aaa')
response.set_cookie('age','18')
#设置过期时间,单位:s
response.set_cookie('height','178',max_age=60)
return response
#2.获取cookie
@app.route('/get_cookie/')
def get_cookie():
name = request.cookies.get('name')
age = request.cookies.get('age')
height = request.cookies.get('height')
return 'name:{},age:{},height:{}'.format(name,age,height)
#3.删除cookie
@app.route('/delete_cookie/')
def delete_cookie():
response = make_response('delete_cookie success')
response.delete_cookie('age')
return response
# 重定向不能删除cookie,因为返回了一个新的响应,
# 删除cookie的本质是设置过期时间,在响应时不再携带
# @app.route('/delete_cookie/')
# def delete_cookie():
# response = make_response('delete_cookie success')
# response.delete_cookie('age')
# return redirec('/delete_cookie/')
if __name__ == '__main__':
app.run()
5.2 session
1).与Django中的session不同,在flask中,session从服务端生成,保存到cookie中,传递到浏览器中保存下来,因此不太安全。
2).对session中的内容进行加密 SECRET_KEY = ‘AFEFE’
3).设置session
(1)导入session 模块 from flask import session
(2)设置session :session[key] = value
4).获取session
(1)value =session[key]
(2)value = session.get(key)
5).删除session
(1)session.pop(key)
案例:
from flask import Flask
app = Flask(__name__)
# 关于session
"""与Django中的session不同,在flask中,session从服务端生成,
保存到cookie中,传递到浏览器中保存下来,因此不太安全"""
# 1.导入session
from flask import session
#2.加密
app.config['SECRET_KEY']='asad'#盐,设置加密方式
#3.创建session
@app.route('/set_session/')
def set_session():
session['aaa']='ccc'
session['ccc']='qqq'
return 'success'
# 4.获取session
@app.route('/get_session/')
def get_session():
name = session.get('aaa')
name2 = session.get('ccc')
return '{},{}'.format(name,name2)
# 5.删除session
@app.route('/del_session/')
def del_session():
session.pop('aaa')
if __name__ == '__main__':
app.run()
六、几个零碎的知识点
6.1 关于flask的启动方式
一直用的是pycharm客户端启动,还可以使用终端进行启动,但是要在脚本的帮助下进行。
1)导入Manager类: from flask_script import Manager
2)创建manager对象: manager = Manager(app)
3)启动(在命令行下): python 模块名(脚本) runserver
注意python解释器的位置以及py文件所在的位置与当前位置的关系
from flask import Flask
app = Flask(__name__)
# 导入Manage类
from flask_script import Manager
manger = Manager(app)
@app.route('/index/')
def index():
return 'kkk'
if __name__ == '__main__':
manger.run()
6.2 flask中模板的使用
1)Flask框架没有自己的模板,需要使用第三方jinja2模板。Jinja2模板和django中的模板用法几乎相同。解析变量使用{{}},标签使用{%%}
2)后台传递数据的格式使用的是关键字传参,也可以使用字典与列表的解包进行传值
3)前端解析普通变量格式: {{name}}
4)前端解析字典格式的变量:{{变量名.key}} 或者 {{变量名[‘key’]}}
5)前端解析列表格式的变量:{{变量名.索引}} 或者 {{变量名[index]}}
6.3 过滤器的使用
1.字符串过滤器
(1)lower: 将内容变成小写 {{‘HELLO WORLD’|lower}}
(2)upper: 将内容变成大写 {{‘hello’|upper}}
(3)title: 将单词的首字母变成大写 {{‘my name’|title}}
(4)trim: 去除首尾空格 x{{’ hello world ‘|trim}}x
(5)reverse: 内容翻转 {{‘love’|reverse}}
2.链式使用过滤器
链式使用过滤器:{{’ hello world '|trim|upper}}
3.列表过滤器
(1)first: 获取第一个元素{{[1,2,3,4,5]|first}}
(2)last:获取最后一个元素 {{[1,2,3,4,5]|last}}
(3)length: 获取列表长度{{[1,2,3,4,5]|length}}
(4)sum: 列表求和 {{[1,2,3,4,5]|sum}}
(5)sort:排序 {{[43,21,4,6,2]|sort}}
6.4 表单组件的使用
6.4.1 定义模型类
首先导入模块,即组件模型类要继承的FlaskForm类:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
即输入框中的输入类型
定义模型类:
class RegisterForm(FlaskForm):
user_name = StringField(
label='用户名',
validators=[DataRequired('用户名不能为空')]
)
password = PasswordField(
label='密码',
validators=[DataRequired('密码不能为空')]
)
password2 = PasswordField(
label='确认密码',
validators=[DataRequired('确认密码不能为空'),
EqualTo('password', '两次密码输入不一致')]
)
submit = SubmitField(label='注册')
6.4.2 路由与视图函数
(1)首先让路由能接受post请求:
(2)设置csrf_token
i)后台需要设置 SECRETY_KEY = ‘xxx’
ii)前端需要传递 {{form.csrf_token}}
3)信息校验
6.4.3 前端页面需要接受form对象
<body>
<form action="/register/" method="post">
{{form.csrf_token}}
<p>{{form.username.label}}:{{form.username}}<span >{{form.username.errors.0}}</span></p>
<p>{{form.password.label}}:{{form.password}}<span>{{form.password.errors.0}}</span></p>
<p>{{form.password2.label}}:{{form.password2}}<span>{{form.password2.errors.0}}</span></p>
<p>{{form.submit}}</p>
</form>
</body>
6.4 flask中后台向前端传递数据的方式
七、flask与数据库
7.1.导入SQLAlchemy类:
from flask_sqlalchemy import SQLAlchemy
7.2.配置连接数据库信息
class Config(object):
# 连接数据库
# root为用户名,admin为用户密码
SQLALCHEMY_DATABASE_URI = 'mysql://root:admin@127.0.0.1:3306/fk'
# 设置sqlalchemy 自动更新
SQLALCHEMY_TRACK_MODIFICATIONS = True
app.config.from_object(Config)
7.3.创建SQLAlchemy对象:
db = SQLAlchemy(app)
7.4.定义数据模型类,以sqllite为例
完整版
# 与数据库连接
from flask_sqlalchemy import SQLAlchemy
import os
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
class Config(object):
# 连接数据库
SQLALCHEMY_DATABASE_URI = 'sqlite:///'+os.path.join(BASE_DIR,'fk.sqlite')
# 设置sqlalchemy 自动更新
SQLALCHEMY_TRACK_MODIFICATIONS = True
# 加载数据库连接
app.config.from_object(Config)
# 创建sqlalchemy对象
db = SQLAlchemy(app)
# 创建数据模型,一对多
# 学科类
class Subject(db.Model):
__tablename__ = 'tb_subject'#设置表格名称
id = db.Column(db.Integer,primary_key=True)#设置id,必须设置,为主键
name = db.Column(db.String, nullable=False) # 设置名称
# 创建关联属性字段,方便查询,不会在表格中真实存在
student = db.relationship('Student', backref='Subject')
def __repr__(self):
return '<object name:{}>'.format(self.name)
# 学生
class Student(db.Model):
__tablename__ = 'tb_student' # 设置表格名称
id = db.Column(db.Integer, primary_key=True) # 设置id,必须设置,为主键
name = db.Column(db.String, nullable=False) # 设置名称
subject_id = db.Column(db.Integer, db.ForeignKey('tb_subject.id')) # 设置外键
def __repr__(self):
return '<object name:{}>'.format(self.name)
db.drop_all()
db.create_all()
注:
(1)数据模型类需要继承 db.Model类
(2)关系字段:只是为了方便python中查询,不会在表格中真实生成一个字段。
7.5 添加数据
# 添加学科对象
# 1.创建学科对象
subject = Subject(name='python')
subject1 = Subject(name='java')
subject2 = Subject(name='web')
# 2.写入数据库
db.session.add(subject)
db.session.add(subject1)
db.session.add(subject2)
# 3.提交事务,否则不予添加
db.session.commit()
# 添加学生对象
# 1.创建学生对象
stu1 = Student(name='zaa', subject_id=subject1.id)
stu2 = Student(name='qq', subject_id=subject.id)
stu3 = Student(name='zada', subject_id=subject2.id)
stu4 = Student(name='ads', subject_id=subject.id)
stu5 = Student(name='tyy', subject_id=subject2.id)
# 2.写入数据库,可一次写入多个,但需为列表形式
db.session.add_all([stu1, stu2, stu3, stu4, stu5])
# 3.提交事务
db.session.commit()
7.6 数据库的查询
# 查询
# 1.查询所有的学科
ret = Subject.query.all()
print('ret:%s'%ret)#ret:[<object name:python>, <object name:java>, <object name:web>]
# 2.查询第一条记录
ret1 = Subject.query.first()
print('ret1:%s'%ret1)#ret1:<object name:python>
# 3.get()方法的使用
# 默认查询id,必须是唯一标识
ret2 = Subject.query.get(2)
print('ret2:%s'%ret2)#ret2:<object name:java>
# 4.filter_by()方法的使用
ret3 = Student.query.filter_by(subject_id=1).all()
print('ret3:%s'%ret3)#ret3:[<object name:qq>, <object name:ads>]
# 多个条件也可连接
ret4 = Student.query.filter_by(subject_id=1, name='qq').all()
print('ret4:%s'%ret4)#ret4:[<object name:qq>]
# 5.filter()的使用:参数必须是类名.属性名 == 'xxx'的形式
ret5 = Student.query.filter(Student.subject_id == 1).all()
print('ret5:%s'%ret5)#ret5:[<object name:qq>, <object name:ads>]
# 6.or连接
from sqlalchemy import or_
ret6 = Student.query.filter(or_(Student.subject_id == 1, Student.name == 'qq')).all()
print('ret6:%s'%ret6)#ret6:[<object name:qq>, <object name:ads>]
# 7.offse()偏移
ret7 = Student.query.offset(2).all()
print('ret7:%s'%ret7)#ret7:[<object name:zada>, <object name:ads>, <object name:tyy>]
# 8.limit()
ret8 = Student.query.offset(2).limit(2).all()
print('ret8:%s'%ret8)#ret8:[<object name:zada>, <object name:ads>]
# 9.关联查询
# 查询python学科对应的学生
ret9 = Subject.query.filter_by(name='python').first()
print('ret9:%s'%ret9)#ret9:<object name:python>
7.7 删除数据
ret10 = Subject.query.get(3)
#删除的是对象
db.session.delete(ret10)
#删除之后也要进行提交
db.session.commit()
7.8 修改数据
# 将 id=3 改成 www
Student.query.filter_by(id=3).update({'name': 'www'})
db.session.commit()
# 或者使用get()
student_obj = Student.query.get(3)
student_obj.name = 'ww'
db.session.add(student_obj)
db.session.commit()