一、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. 论文笔记:Towards Diverse and Natural Image Descriptions via a Conditional GAN

    论文笔记:Towards Diverse and Natural Image Descriptions via a Conditional GAN ICCV 2017 Paper: http://op ...

  2. Lintcode489-Convert Array List to Linked List-Easy

    489. Convert Array List to Linked List Convert an array list to a linked list. Example Example 1: In ...

  3. poj1151 Atlantis (线段树+扫描线+离散化)

    有点难,扫描线易懂,离散化然后线段树处理有点不太好理解. 因为这里是一个区间,所有在线段树中更新时,必须是一个长度大于1的区间才是有效的,比如[l,l]这是一根线段,而不是区间了. AC代码 #inc ...

  4. Xilinx Vivado的使用详细介绍(1):创建工程、编写代码、行为仿真

    Xilinx Vivado的使用详细介绍(1):创建工程.编写代码.行为仿真 Author:zhangxianhe 新建工程 打开Vivado软件,直接在欢迎界面点击Create New Projec ...

  5. clojure开发环境配置git, vscode+Calva插件配置

    万事开头难,全是犄角旮旯的细节. 1 安装lein 参见 https://www.cnblogs.com/xuanmanstein/p/10504401.html 2 创建工程 lein 参考http ...

  6. String、StringBuilder和StringBuffer的区别

    1         String.StringBuilder和StringBuffer的区别 String.StringBuilder.StringBuffer都可以用来保存字符串.如果是使用次数比较 ...

  7. Vuex状态管理模式

    Store:类似容器,包含应用的大部分状态,一个页面只能有一个store,状态存储是响应式的 State : 包含所有应用级别状态的对象 Getters : 在组件内部获取store中状态的函数 Mu ...

  8. EM公式推导

    纯手写,字很丑,人也很丑.. E步公式是怎么来的呢?推导步骤如下, EM算法核心思想是先给定初始θ,求样本X,和隐变量z的期望(实际上是个函数),可以画一个曲线,M步:然后不断滑动θ,找到使得期望最大 ...

  9. 对XML里的属性或元素进行模糊搜索的方法

    最近发现几个贴子都是问关于对XML的属性或元素进行模糊搜索的方法,在此发出代码片段示例,希望能够对你有所帮助:) 示例XML private var xml:XML=<employees> ...

  10. Matlab -- Portfolio

    1.创建空 p = Portfolio; 2.需要了解 均值,方差,协方差实现 X为矩阵 均值 = mean(X): 中位数 = median(X): 方差 = var(X): 标准差 = std(X ...