Flask (四) 模型进阶
模型进阶
多对多关联
用户收藏电影,一个用户可以收藏多部电影, 一部电影可以被不同的用户收藏, 是一个多对多关系.
# 中间表(不是模型)
collects = db.Table('collects',
# user_id为表字段名称, user.id为外键表的id
db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
db.Column('movie_id', db.Integer, db.ForeignKey('movie.id'), primary_key=True)
)
class Movie(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(200))
class User(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(16))
age = db.Column(db.Integer, default=1)
# 多对多 关联的学生表格的模型, 中间表的名称, 反向查找
movies = db.relationship('Movie', backref='users', secondary=collects, lazy='dynamic')
lazy属性:
懒加载,可以延迟在使用关联属性的时候才建立关联
lazy='dynamic': 会返回一个query对象(查询集),可以继续使用其他查询方法,如all().
lazy='select': 首次访问到属性的时候,就会全部加载该属性的数据.
lazy='joined': 在对关联的两个表进行join操作,从而获取到所有相关的对象
lazy=True: 返回一个可用的列表对象,同select
查:
# 查询用户收藏的所有电影
user = User.query.get(id)
movies = user.movies
# 查询电影被哪些用户收藏
movie = Movie.query.get(id)
users = movie.users
删:
# 中间表的数据会被级联删除
movie = Movie.query.get(id)
db.session.delete(movie)
db.session.commit()
增:
# 用户收藏电影
user = User.query.get(id)
movie = Movie.query.get(id)
user.movies.append(movie)
db.session.commit()
图书馆项目练习
创建一个项目, 用来说明出版社, 书籍和作者的关系。
假定关系:作者:书籍 => 1:n (一本书由一个作者完成, 一个作者可以创作多本书)
出版社:书籍 => n:n (一个出版社可以出版多本书, 一本书可以由多个出版社出版)
要求:
1. 在书籍的book_index.html中有一个"查看所有书籍"的超链接按钮,点击进入书籍列表book_list.html页面.
2. 在书籍的book_list.html中显示所有书名,点击书名可以进入书籍详情book_detail.html
3. 在书籍book_detail.html中可以点击该书的作者和出版社,进入作者详情的author_detail.html和出版社详情的publisher_detail.html页面
# 作者
class Author(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(20), unique=True)
age = db.Column(db.Integer, default=1)
sex = db.Column(db.Boolean, default=True)
email = db.Column(db.String(200))
# 关系
books = db.relationship('Book', backref='my_auther', lazy='dynamic')
# 书籍
class Book(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(100), unique=True)
date = db.Column(db.DateTime)
# 1对多,外键
author = db.Column(db.Integer, db.ForeignKey(Author.id))
# 中间表(书籍-出版社)
book_publisher = db.Table('book_publisher',
db.Column('book_id', db.Integer, db.ForeignKey('book.id'), primary_key=True),
db.Column('publisher_id', db.Integer, db.ForeignKey('publisher.id'), primary_key=True)
)
# 出版社
class Publisher(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(20), unique=True)
address = db.Column(db.String(200))
city = db.Column(db.String(100))
province = db.Column(db.String(100))
country = db.Column(db.String(100))
website = db.Column(db.String(100))
# 多对多, 关联book表
books = db.relationship('Book', backref='publishers', secondary=book_publisher, lazy='dynamic')
常用插件
flask-bootstrap
安装
pip install flask-bootstrap
初始化
from flask_bootstrap import Bootstrap
Bootstrap(app)
使用
在模板继承bootstrap中的父类模板
如在index.html中使用bootstrap的base.html模板
{% extends 'bootstrap/base.html' %}
{% block navbar %}
...
{% endblock %}
{% block content %}
...
{% endblock %}
flask-debugtoolbar
安装
pip install flask-debugtoolbar
初始化
from flask_debugtoolbar import DebugToolbarExtension
debugtoolbar = DebugToolbarExtension()
debugtoolbar.init_app(app)
使用
启动服务器, 访问浏览器网页会出现DebugToolbar工具
flask-cache
安装
pip install flask-cache
初始化
from flask_cache import Cache
cache = Cache(config={
'CACHE_TYPE': 'simple',
})
cache.init_app(app=app)
使用
在视图函数上添加缓存
@blue.route('/')
@cache.cached(timeout=30)
def home():
print('加载数据')
return 'home'
flask最新版本需要修改源码: python3.5/site-packages/flask_cache/jinja2ext.py文件
# from flask.ext.cache import make_template_fragment_key
from flask_cache import make_template_fragment_key
钩子
什么是钩子
钩子或叫钩子函数, 是指在执行函数和目标函数之间挂载的函数, 框架开发者给调用方提供一个point-挂载点, 是一种AOP切面编程思想.
常用的钩子函数
before_first_request: 处理第一次请求之前执行.
before_request: 在每次请求之前执行. 通常使用这个钩子函数预处理一些变量, 实现反爬等.
after_request:注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行.
teardown_appcontext: 当APP上下文被移除之后执行的函数,可以进行数据库的提交或者回滚.
AOP反爬策略
# 利用缓存反爬,相同ip地址1秒内不允许重复访问
key = request.remote_addr + "before"
value = cache.get(key)
if value:
return '小伙子,别爬了'
else:
cache.set(key, 'aa', timeout=1)
# 反爬,防止非浏览器访问
ua = request.user_agent # 用户代理
if not ua:
return "hello"
# abort(400) # 可以抛出错误给用户
Flask内置对象
g:
global全局对象
g对象是专门用来保存用户的数据的
g对象在一次请求中的所有的代码的地方,都是可以使用的
突破变量存储位置限制, 为数据传递添加了新的方式, 比如我们在before_request产生一个数据在后面需要使用,可以保存在g对象中,在其他视图函数中就可以使用这个数据.
request:
请求对象, 可以获取客户端提交过来的所有请求信息
session:
会话技术,服务端会话技术的接口
config:
app的配置信息, app对象获取, current_app
使用获取当前app需要注意,一定要在程序初始化完成之后
配置templates和static
如果想要额外添加templates模板目录或static静态目录,也可以自己配置
在settings.py文件中添加BASE_DIR:
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
在__init__.py文件中添加static路径和templates路径:
static_path = os.path.join(settings.BASE_DIR, 'static')
template_path = os.path.join(settings.BASE_DIR, 'templates')
app = Flask(__name__, static_folder=static_path, template_folder=template_path)
在views.py文件中访问模板:
@blue.route('/hello/')
def hello():
return render_template('hello.html')
在模板中使用静态资源:
<link rel="stylesheet" href="{{ url_for('static', filename='css/hello.css') }}">
json
json数据
可以前后端数据交互时使用
jsonify():
将字典转换成json
@blue.route('/json/')
def json():
data = {
'status': 1,
'msg': 'ok',
}
return jsonify(data)
Flask (四) 模型进阶的更多相关文章
- Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素
Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...
- Django:学习笔记(7)——模型进阶
Django:学习笔记(7)——模型进阶 模型的继承 我们在面向对象的编程中,一个很重要的的版块,就是类的继承.父类保存了所有子类共有的内容,子类通过继承它来减少冗余代码并进行灵活扩展. 在Djang ...
- Alink漫谈(四) : 模型的来龙去脉
Alink漫谈(四) : 模型的来龙去脉 目录 Alink漫谈(四) : 模型的来龙去脉 0x00 摘要 0x01 模型 1.1 模型包含内容 1.2 Alink的模型文件 0x02 流程图 0x03 ...
- Flask 四剑客
Flask 四剑客 返回字符串,返回 html , 跳转路由,返回 json from flask import Flask, render_template, redirect, jsonify a ...
- JavaSE-基础语法(四)-javaSE进阶
javaSE进阶 三.异常 四.多线程 五.Lambda表达式 六.IO流 七.网络编程 八.新特性 13.异常体系14.异常分类15.声明抛出捕获异常16.自定义异常17.线程概念18.线程同步19 ...
- sass的用法小结(四)进阶篇
Sass 的数据类型 Sass 既然有了类似编程语言的功能,自然也就有了简单的数据类型.这里简单的介绍一些 Sass 中的数据类型,因为在后面的讨论中要用到有关的内容. Sass 中主要有六种数据类型 ...
- Flask - 四剑客 | templates | 配置文件 | 路由系统 | CBV
Flask框架简介 说明:flask是一个轻量级的web框架,被称为微型框架.只提供了一个高效稳定的核心,其它全部通过扩展来实现.意思就是你可以根据项目需要进行量身定制,也意味着你需要不断学习相关的扩 ...
- Pytorch 分割模型构建和训练【直播】2019 年县域农业大脑AI挑战赛---(四)模型构建和网络训练
对于分割网络,如果当成一个黑箱就是:输入一个3x1024x1024 输出4x1024x1024. 我没有使用二分类,直接使用了四分类. 分类网络使用了SegNet,没有加载预训练模型,参数也是默认初始 ...
- 如何使用flask将模型部署为服务
在某些场景下,我们需要将机器学习或者深度学习模型部署为服务给其它地方调用,本文接下来就讲解使用python的flask部署服务的基本过程. 1. 加载保存好的模型 为了方便起见,这里我们就使用简单的分 ...
随机推荐
- Linux下配置Objective-C编译环境
Ubuntu环境下Objective-C编译环境配置参考这里. CentOS环境下Objective-C编译环境配置参考这里. 还在继续探索中.
- [NOIP2011提高组day1]-3-mayan游戏
3.Mayan 游戏 (mayan.cpp/c/pas) [问题描述] Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个 7行 5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即 ...
- 千锋很火的SpringBoot实战开发教程视频
springboot是什么? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员 ...
- CentOS系统文件和目录管理相关的一些重要命令
我们都知道,在Linux系统中,基本上任何我们需要做的事都可以通过输入命令来完成,所以在Linux系统中命令非常的多,我们不可能也没必要记住所有的这些命令,但是对于一些常用的命令我们还是必须要对其了如 ...
- poj图论解题报告索引
最短路径: poj1125 - Stockbroker Grapevine(多源最短路径,floyd) poj1502 - MPI Maelstrom(单源最短路径,dijkstra,bellman- ...
- [原创]Java开发在线打开编辑保存Word文件(支持多浏览器)
Java调用PageOffice实现在线编辑保存Word文件(以jsp调用为例,支持SSM.SSH.SpringMVC等流行框架) 1. 下载PageOffice开发包:http://www.zhuo ...
- 001-将Python源码转换为不需要环境的可执行文件
1 安装pyinstaller pip install pyinstaller #或者 pip3 install pyinstaller 2 生成打包文件 在命令行中输入 pyinstaller -F ...
- BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量
BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人 ...
- Subset Sums
链接 分析:dp[i][j]表示前i个数能够组成j的对数,可得dp[i][j]=dp[i-1][j]+dp[i-1][j-i],所以最后dp[n][sum/2]既是所求 /* PROB:subset ...
- php获取YouTube视频信息的方法
YouTube的视频地址格式https://www.youtube.com/watch?v=[VIDEO_ID]例子:https://www.youtube.com/watch?v=psvkyf3Pz ...