一、jsonify 

  jsonify 是flask的函数,可以将字典转换成json数据返回给浏览器
二、 钩子函数
  @app.before_first_request:第一次请求调用,用于初始化数据
  @app.before_request:每次请求调用
  @app.after-request:每次请求后调用
  @app.teardown_request:异常发生后调用
  about(400):捕获异常,终止函数,返回状态码
  @app.errorhandler(400):捕获异常,返回相应信息

三、模板语言中的过滤器:
  用法:{{ param|capitalize }}
  capitalize:首字母大写
  upper:大写
  lower:小写
  reverse:反转
  safe:告知浏览器变量中的内容是安全的
  4.自定义过滤器:
  1.在试图模块中定义过滤器函数
  2.使用app.add_template_filter(过滤器函数名,'list_name')
  3.用法:{{ param|list_name }}

四、配置文件相关内容

 # 配置文件
class Config(object):
# debug模式配置
# DEBUG=True
LOG_LEVEL = logging.DEBUG
# mysql 配置
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:000000@127.0.0.1:3306/news'
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = True
# redis 配置信息
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
# session 配置
SESSION_TYPE = 'redis'
SESSION_USE_SIGNER = True
SESSION_REDIS = StrictRedis(host=REDIS_HOST, port=REDIS_PORT,db=1)
PERMANENT_SESSION_LIFETIME = 3600
SECRET_KEY = 'KZtgoZECnZyp/hiU49YHotf2Nv4IGYqF5I7M6K3iClzvTWYtALha9E2i7wgIK78X'

配置

五、csrf_token设置

     @app.after_request
def after_request(response):
from flask_wtf.csrf import generate_csrf
csrf_token = generate_csrf()
response.set_cookie('csrf_token', csrf_token)
return response

csrf_token

六、404页面

    @app.errorhandler(404)
@user_login_data
def page_not_found(_):
user=g.user
data={'user_info':user.to_dict() if user else None}
return render_template('news/404.html',data=data)

404

七、orm

1.orm-select

 from flask import Flask
from flask_sqlalchemy import SQLAlchemy app=Flask(__name__)
# app.cofig['SQLALCHEMY_DATABASE_URI']=''
# 设置数据库的连接选项
# 语法形式: mysql://username:password@host:port/dbname
# mysql://root:mysql@127.0.0.1:3306/db_34
app.config.setdefault('SQLALCHEMY_DATABASE_URI', 'mysql://root:mysql@127.0.0.1:3306/db') # SQLALCHEMY_TRACK_MODIFICATIONS
# 是否设置跟踪模式,这个跟踪模式是需要消耗资源的 所以我们给它设置位False
# 默认值 位None,系统会发出一个警告
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False # 让sql语句输出在控制台
app.config['SQLALCHEMY_ECHO']=False #创建SQLAlchemy的实例对象
# app 参数: 就是 flask的实例对象
db = SQLAlchemy(app=app) # 数据库中的一个表就需要对应我们的 一个模型
"""
1.模型需要继承自 db.Model
2.定义字段(属性)
字段名: 不要使用python关键字 不要用mysql关键字
字段类型: 其实是和mysql类似的
字段选项:
primary_key :默认设置主键 会自动增长
unique
nullable
default
"""
class BookInfo(db.Model): #修改表明
__tablename__='bookinfo' # 主键
id=db.Column(db.Integer,primary_key=True) name=db.Column(db.String(20),unique=True,nullable=False)
#发布日期
pub_date=db.Column(db.Date,nullable=True)
#阅读量
readcount=db.Column(db.Integer,default=0)
#评论量
commentcount=db.Column(db.Integer,default=0)
#是否删除
is_delete=db.Column(db.Boolean,default=False) class PeopleInfo(db.Model):
__tablename__ = 'peopleinfo'
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(20),unique=True)
password = db.Column(db.String(20),nullable=False)
email = db.Column(db.String(50),nullable=True) #设置外键
book_id = db.Column(db.Integer,db.ForeignKey(BookInfo.id))
# book_id = db.Column(db.Integer,db.ForeignKey('bookinfo.id')) def __repr__(self):
return '------%s------'%self.name
"""
一本书中 有多个人物
id name readcount commentcount
1 西游记 100 id name password book_id
1 孙悟空 123 1
2 白骨精 321 1 """ @app.route('/')
def index():
return 'index' if __name__ == '__main__': # 删除表,删除 继承自 db.Model的类 的表
db.drop_all() # db.create_all 就会给 继承自 db.Model的类 创建表
db.create_all() #数据插入
# 第一种方式
book1=BookInfo(name='西游记',readcount=100) #添加数据
"""
事务 -- 就是保证数据操作的一致性 """
try:
db.session.add(book1)
db.session.commit()
except Exception as e:
db.session.rollback() # 添加数据的第二种方式
book2=BookInfo()
book2.name='红楼梦'
book2.commentcount=1000 try:
#如果添加每天问题 则提交数据(类似于事务)
db.session.add(book2)
db.session.commit()
except Exception as e:
# 如果有问题 则数据回滚 不回添加成功
db.session.rollback() p1 = PeopleInfo(name='wang', email='wang@163.com', password='', book_id=book1.id)
p2 = PeopleInfo(name='zhang', email='zhang@189.com', password='', book_id=book2.id)
p3 = PeopleInfo(name='chen', email='chen@126.com', password='', book_id=book2.id)
p4 = PeopleInfo(name='zhou', email='zhou@163.com', password='', book_id=book1.id)
p5 = PeopleInfo(name='tang', email='tang@itheima.com', password='', book_id=book2.id)
p6 = PeopleInfo(name='wu', email='wu@gmail.com', password='', book_id=book2.id)
p7 = PeopleInfo(name='qian', email='qian@gmail.com', password='', book_id=book1.id)
p8 = PeopleInfo(name='liu', email='liu@itheima.com', password='', book_id=book1.id)
p9 = PeopleInfo(name='li', email='li@163.com', password='', book_id=book2.id)
p10 = PeopleInfo(name='sun', email='sun@163.com', password='', book_id=book2.id) # 添加一个列表
db.session.add_all([p1, p2, p3, p4, p5, p6, p7, p8, p9, p10])
db.session.commit() #########################查询#####################################
"""
查询的语法形式: 模型类.query.[过滤器].执行器
query: 就是 模型类的管理 过滤器(where): filter, filter_by,order_by,goup_by
过滤器 不能把结果给我们 它只能给我们地址 filter(模型类名.字段 == 值)
filter_by(字段名=值) 执行器(获取数据): get,all,first
all: 获取查询的所有数据
first: 获取查询的第一个数据
count:个数
get(pk): primayr_key (pk) 通过主键获取 记录
""" # 查询所有人物数据
PeopleInfo.query.all()
# 查询有多少个人物
PeopleInfo.query.count()
# 查询第1个人物
PeopleInfo.query.first() # 查询id为4的人物[3种方式]
# where id=4
PeopleInfo.query.get(4) # filter_by 等值过滤器 =
PeopleInfo.query.filter_by(id=4).first() # filter == 过滤器
PeopleInfo.query.filter(PeopleInfo.id==4).first() # 查询名字结尾字符为g的所有数据[开始/包含]
PeopleInfo.query.filter(PeopleInfo.name.endswith('g')).all()
PeopleInfo.query.filter(PeopleInfo.name.startswith('g')).all()
PeopleInfo.query.filter(PeopleInfo.name.contains('g')).all()
# 查询名字不等于wang的所有数据[2种方式]
PeopleInfo.query.filter(PeopleInfo.name!='wang').all()
from sqlalchemy import not_
PeopleInfo.query.filter(not_(PeopleInfo.name=='wang')).all() # 查询名字和邮箱都以 li 开头的所有数据[2种方式]
# and
from sqlalchemy import and_
PeopleInfo.query.filter(and_(PeopleInfo.name.startswith('li'),PeopleInfo.email.startswith('li'))).all() PeopleInfo.query.filter(PeopleInfo.name.startswith('li'),PeopleInfo.email.startswith('li')) # 查询password是 `123456` 或者 `email` 以 `itheima.com` 结尾的所有数据
from sqlalchemy import or_
#错误的
PeopleInfo.query.filter(or_(PeopleInfo.password==''),PeopleInfo.email.endswith('itheima.com')).all() #正确的
PeopleInfo.query.filter(or_(PeopleInfo.password=='',PeopleInfo.email.endswith('itheima.com'))).all() # 查询id为 [1, 3, 5, 7, 9] 的人物列表
# select * from peopleinfo werhe id in (1,3,5,7,9)
PeopleInfo.query.filter(PeopleInfo.id.in_([1,3,5,7,9])).all()
# 查询name为liu的人物数据
PeopleInfo.query.filter(PeopleInfo.name=='liu').all()
PeopleInfo.query.filter_by(name='liu').all()
# 查询所有人物数据,并以邮箱排序
PeopleInfo.query.order_by(PeopleInfo.email.desc()).all()
PeopleInfo.query.order_by(PeopleInfo.email.asc()).all() PeopleInfo.query.all().order_by(PeopleInfo.email.desc()) # 每页3个,查询第2页的数据
# page=None, 页数
# per_page=None 每页多少条
paginate = PeopleInfo.query.paginate(page=2,per_page=3)
#获取所有(第2页的)数据
paginate.items
# 获取有多少页
paginate.pages
#获取当前的页数
paginate.page app.run()

select

2.orm-insert

 from flask import Flask
from flask_sqlalchemy import SQLAlchemy app=Flask(__name__)
# app.cofig['SQLALCHEMY_DATABASE_URI']=''
# 设置数据库的连接选项
# 语法形式: mysql://username:password@host:port/dbname
# mysql://root:mysql@127.0.0.1:3306/db_34
app.config.setdefault('SQLALCHEMY_DATABASE_URI', 'mysql://root:mysql@127.0.0.1:3306/db') # SQLALCHEMY_TRACK_MODIFICATIONS
# 是否设置跟踪模式,这个跟踪模式是需要消耗资源的 所以我们给它设置位False
# 默认值 位None,系统会发出一个警告
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False # 让sql语句输出在控制台
app.config['SQLALCHEMY_ECHO']=True #创建SQLAlchemy的实例对象
# app 参数: 就是 flask的实例对象
db = SQLAlchemy(app=app) # 数据库中的一个表就需要对应我们的 一个模型
"""
1.模型需要继承自 db.Model
2.定义字段(属性)
字段名: 不要使用python关键字 不要用mysql关键字
字段类型: 其实是和mysql类似的
字段选项:
primary_key :默认设置主键 会自动增长
uniue
nullable
default
"""
class BookInfo(db.Model): #修改表明
__tablename__='bookinfo' # 主键
id=db.Column(db.Integer,primary_key=True) name=db.Column(db.String(20),unique=True,nullable=False)
#发布日期
pub_date=db.Column(db.Date,nullable=True)
#阅读量
readcount=db.Column(db.Integer,default=0)
#评论量
commentcount=db.Column(db.Integer,default=0)
#是否删除
is_delete=db.Column(db.Boolean,default=False) class PeopleInfo(db.Model):
__tablename__ = 'peopleinfo'
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(20),unique=True)
password = db.Column(db.String(20),nullable=False)
email = db.Column(db.String(50),nullable=True) #设置外键
book_id = db.Column(db.Integer,db.ForeignKey(BookInfo.id))
# book_id = db.Column(db.Integer,db.ForeignKey('bookinfo.id')) """
一本书中 有多个人物
id name readcount commentcount
1 西游记 100 id name password book_id
1 孙悟空 123 1
2 白骨精 321 1 """ @app.route('/')
def index():
return 'index' if __name__ == '__main__': # 删除表,删除 继承自 db.Model的类 的表
db.drop_all() # db.create_all 就会给 继承自 db.Model的类 创建表
db.create_all() #数据插入
# 第一种方式
book1=BookInfo(name='西游记',readcount=100) #添加数据
"""
事务 -- 就是保证数据操作的一致性 """
try:
db.session.add(book1)
db.session.commit()
except Exception as e:
db.session.rollback() # 添加数据的第二种方式
book2=BookInfo()
book2.name='红楼梦'
book2.commentcount=1000 try:
#如果添加每天问题 则提交数据(类似于事务)
db.session.add(book2)
db.session.commit()
except Exception as e:
# 如果有问题 则数据回滚 不回添加成功
db.session.rollback() p1 = PeopleInfo(name='wang', email='wang@163.com', password='', book_id=book1.id)
p2 = PeopleInfo(name='zhang', email='zhang@189.com', password='', book_id=book2.id)
p3 = PeopleInfo(name='chen', email='chen@126.com', password='', book_id=book2.id)
p4 = PeopleInfo(name='zhou', email='zhou@163.com', password='', book_id=book1.id)
p5 = PeopleInfo(name='tang', email='tang@itheima.com', password='', book_id=book2.id)
p6 = PeopleInfo(name='wu', email='wu@gmail.com', password='', book_id=book2.id)
p7 = PeopleInfo(name='qian', email='qian@gmail.com', password='', book_id=book1.id)
p8 = PeopleInfo(name='liu', email='liu@itheima.com', password='', book_id=book1.id)
p9 = PeopleInfo(name='li', email='li@163.com', password='', book_id=book2.id)
p10 = PeopleInfo(name='sun', email='sun@163.com', password='', book_id=book2.id) # 添加一个列表
db.session.add_all([p1, p2, p3, p4, p5, p6, p7, p8, p9, p10])
db.session.commit() app.run()

insert

八、数据库迁移

  1.python 文件 db init
  2.python 文件 db migrate -m"版本名(注释)"
  3.python 文件 db upgrade 然后观察表结构
  4.根据需求修改模型
  5.python 文件 db migrate -m"新版本名(注释)"
  6.python 文件 db upgrade 然后观察表结构
  7.若返回版本,则利用 python 文件 db history查看版本号
  8.python 文件 db downgrade(upgrade) 版本号

Flask项目笔记的更多相关文章

  1. flask项目部署到阿里云 ubuntu16.04

    title: flask项目部署到阿里云 ubuntu16.04 date: 2018.3.6 项目地址: 我的博客 部署思路参考: Flask Web开发>的个人部署版本,包含学习笔记. 开始 ...

  2. Python Flask学习笔记之Hello World

    Python Flask学习笔记之Hello World 安装virtualenv,配置Flask开发环境 virtualenv 虚拟环境是Python解释器的一个私有副本,在这个环境中可以安装私有包 ...

  3. CentOS 下部署Nginx+Gunicorn+Supervisor部署Flask项目

    原本之前有一部分东西是在Windows Server,但是由于Gunicorn不支持Windows部署起来颇为麻烦.最近转战CentOS,折腾一段时间,终于简单部署成功.CentOS新手,作为一个总结 ...

  4. 《BI项目笔记》——微软BI项目笔记连载

    本系列文章主要是结合实际项目,加上自己的总结,整理出来的一系列项目笔记,涉及微软SQL Server2008中商务智能开发中的SSAS.SSIS模块:  准备工作: <BI项目笔记>基于雪 ...

  5. flask 项目的开发经验总结

    已经开发了几个flask项目, 是时候总结一下了, 这里涉及到项目源码的组织, 常用的包, 源码示例. =========================需要的 python 包有:========= ...

  6. Python框架 Flask 项目实战教程

    本文目的是为了完成一个项目用到的flask基本知识,例子会逐渐加深.最好对着源码,一步一步走.下载源码,运行pip install -r requirements.txt 建立环境python db_ ...

  7. 项目笔记---CSharp图片处理

    原文:项目笔记---CSharp图片处理 项目笔记---CSharp图片处理 最近由于项目上需要对图片进行二值化处理,就学习了相关的图片处理上的知识,从开始的二值化的意义到动态阀值检测二值化等等,并用 ...

  8. 通过VM虚拟机安装Ubuntu server部署flask项目

    1. VM安装Ubuntu server 14.04,系统安装完成后,首先安装pip工具方便之后的包安装,此处需先使用 apt-get install update,apt-get install u ...

  9. flask项目开发中,遇到http 413错误

    在flask项目中,上传文件时后台报http 413 Request Entity Too Large 请求体太大错误! 解决的2种方法: 1.在flask配置中设置 MAX_CONTENT_LENG ...

随机推荐

  1. 1.7.4.3 Parsers

    Parsers 除了主查询解析器外,还有一些其他的查询解析器可以使用或者和主查询解析器连合使用.这部分描述了其他查询解析器的细节,并且给出了一些例子: 大多数的解析器都可以使用局部查询参数的方式来表达 ...

  2. C# 实现语音听写

    本文系原创,禁止转载. 分享如何使用c#对接科大讯飞语音听写服务,简单高效地实现语音听写. 实现语音听写主要分为录音和语音识别两部分:录音是指获取设备声卡端口的音频数据并将之保存为音频文件,语音识别就 ...

  3. MapReduce编程:数字排序

    问题描述 将乱序数字按照升序排序. 思路描述 按照mapreduce的默认排序,依次输出key值. 代码 package org.apache.hadoop.examples; import java ...

  4. CentOS7设置固定IP

    在安装完CentOS7后,当我每次启动CentOS并使用SecureCRT链接时,都发现CentOS的IP总是在变,这就很苦恼了,总不能每次链接的时候都先查一下虚拟机的IP吧,所以打算把它设置成固定I ...

  5. js 判断数组中的值是否都相等

    function isAllEqual(array) { if (array.length > 0) { return !array.some(function(value, index) { ...

  6. Python中print字体颜色的设置

    Python中print字体颜色的设置 实现过程:       终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关.       转义序列是以ESC开头,即用\033来完成 ...

  7. redis如何清除所有的key

    redis比memcache好的地方之一,如果memcache,恐怕就得关掉重启了. 1 使用cli FLUSHDB 清除一个数据库,FLUSHALL清除整个redis数据. 2 使用shell re ...

  8. Ionic后退刷新

    版本:Angular 1.5.3.Ionic1.3.2 一 禁用缓存,全页面刷新. 每次前进/ 后退时,控制器都会执行. 1 AngularJS ui-router路由禁用缓存 var app = a ...

  9. centos7开机界面出现多个选项

    第一个选项正常启动,第二个选项急救模式启动(系统出项问题不能正常启动时使用并修复系统) 在CentOS更新后,并不会自动删除旧内核.所以在启动选项中会有多个内核选项,可以手动使用以下命令删除多余的内核 ...

  10. java调用存储过程、存储函数

    需要用到的接口 接口 CallableStatement JDK文档对改接口的说明: public interface CallableStatement extends PreparedStatem ...