Flask项目笔记
一、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项目笔记的更多相关文章
- flask项目部署到阿里云 ubuntu16.04
title: flask项目部署到阿里云 ubuntu16.04 date: 2018.3.6 项目地址: 我的博客 部署思路参考: Flask Web开发>的个人部署版本,包含学习笔记. 开始 ...
- Python Flask学习笔记之Hello World
Python Flask学习笔记之Hello World 安装virtualenv,配置Flask开发环境 virtualenv 虚拟环境是Python解释器的一个私有副本,在这个环境中可以安装私有包 ...
- CentOS 下部署Nginx+Gunicorn+Supervisor部署Flask项目
原本之前有一部分东西是在Windows Server,但是由于Gunicorn不支持Windows部署起来颇为麻烦.最近转战CentOS,折腾一段时间,终于简单部署成功.CentOS新手,作为一个总结 ...
- 《BI项目笔记》——微软BI项目笔记连载
本系列文章主要是结合实际项目,加上自己的总结,整理出来的一系列项目笔记,涉及微软SQL Server2008中商务智能开发中的SSAS.SSIS模块: 准备工作: <BI项目笔记>基于雪 ...
- flask 项目的开发经验总结
已经开发了几个flask项目, 是时候总结一下了, 这里涉及到项目源码的组织, 常用的包, 源码示例. =========================需要的 python 包有:========= ...
- Python框架 Flask 项目实战教程
本文目的是为了完成一个项目用到的flask基本知识,例子会逐渐加深.最好对着源码,一步一步走.下载源码,运行pip install -r requirements.txt 建立环境python db_ ...
- 项目笔记---CSharp图片处理
原文:项目笔记---CSharp图片处理 项目笔记---CSharp图片处理 最近由于项目上需要对图片进行二值化处理,就学习了相关的图片处理上的知识,从开始的二值化的意义到动态阀值检测二值化等等,并用 ...
- 通过VM虚拟机安装Ubuntu server部署flask项目
1. VM安装Ubuntu server 14.04,系统安装完成后,首先安装pip工具方便之后的包安装,此处需先使用 apt-get install update,apt-get install u ...
- flask项目开发中,遇到http 413错误
在flask项目中,上传文件时后台报http 413 Request Entity Too Large 请求体太大错误! 解决的2种方法: 1.在flask配置中设置 MAX_CONTENT_LENG ...
随机推荐
- 阿里云Hadoop集群DataNode连接不上NameNode
在logs日志中可以看见DataNode多次去连NameNode,但是都失败了. 经过长时间的研究百度,终于知道了原因. 原因就是安全组限制了端口的开放,所以我们只要把相应的端口打开即可.
- 爬虫基础之requests模块
1. 爬虫简介 1.1 概述 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 1.2 爬虫的价值 在互 ...
- CentOS yum换源
1.备份系统自带yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.进入yum源配 ...
- vue动态绑定src加字符串拼接
关键点 1.img中的src的字符串动态拼接 2.style中的background属性赋值 一.img中的src的字符串动态拼接 1.问题是这样子的,瞧瞧 基本网络链接 : http://openw ...
- Pytest(一)
1.在命令行运行 2.在pytest框架中,有如下约束: 所有的单测文件名都需要满足test_*.py格式或*_test.py格式. 在单测文件中,可以包含test_开头的函数,也可以包含Test开头 ...
- echarts常用方法(一)
目前,项目中涉及到图表的,使用echarts的频率较多,因为UI设计一般不会考虑到是否能实现的问题,他们专注的只是显示的效果.所以作为前端开发,要对echarts进行不同程度的改造,组合,甚至重写等. ...
- wait和sleep的区别
wait是线程永久等待,只有调用notify才能进行唤醒 sleep是等待指定的时间,自动唤醒
- [转]java 关于httpclient 请求https (如何绕过证书验证)
原文:http://www.blogjava.net/hector/archive/2012/10/23/390073.html 第一种方法,适用于httpclient4.X 里边有get和post两 ...
- play framework 笔记
@main("Hello")调用 main.scala.hmtl,页面名称 Hello conf/routes 文件定义了映射规则 参数的传递入口在 controller 的方法中 ...
- Cognos无法解密来着内容库的用户名和密码凭证
1. 问题描述 启动Cognos失败,报错代码为QE-DEF-0368. 2. 问题分析 Frame Work和Cognos Server安装在不同的目录和/或不同的机器上. 3. 解决方案 需要把S ...