flask笔记--02

五、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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值