模型进阶

多对多关联

用户收藏电影,一个用户可以收藏多部电影, 一部电影可以被不同的用户收藏, 是一个多对多关系.
​
# 中间表(不是模型)
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 (四) 模型进阶的更多相关文章

  1. Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  2. Django:学习笔记(7)——模型进阶

    Django:学习笔记(7)——模型进阶 模型的继承 我们在面向对象的编程中,一个很重要的的版块,就是类的继承.父类保存了所有子类共有的内容,子类通过继承它来减少冗余代码并进行灵活扩展. 在Djang ...

  3. Alink漫谈(四) : 模型的来龙去脉

    Alink漫谈(四) : 模型的来龙去脉 目录 Alink漫谈(四) : 模型的来龙去脉 0x00 摘要 0x01 模型 1.1 模型包含内容 1.2 Alink的模型文件 0x02 流程图 0x03 ...

  4. Flask 四剑客

    Flask 四剑客 返回字符串,返回 html , 跳转路由,返回 json from flask import Flask, render_template, redirect, jsonify a ...

  5. JavaSE-基础语法(四)-javaSE进阶

    javaSE进阶 三.异常 四.多线程 五.Lambda表达式 六.IO流 七.网络编程 八.新特性 13.异常体系14.异常分类15.声明抛出捕获异常16.自定义异常17.线程概念18.线程同步19 ...

  6. sass的用法小结(四)进阶篇

    Sass 的数据类型 Sass 既然有了类似编程语言的功能,自然也就有了简单的数据类型.这里简单的介绍一些 Sass 中的数据类型,因为在后面的讨论中要用到有关的内容. Sass 中主要有六种数据类型 ...

  7. Flask - 四剑客 | templates | 配置文件 | 路由系统 | CBV

    Flask框架简介 说明:flask是一个轻量级的web框架,被称为微型框架.只提供了一个高效稳定的核心,其它全部通过扩展来实现.意思就是你可以根据项目需要进行量身定制,也意味着你需要不断学习相关的扩 ...

  8. Pytorch 分割模型构建和训练【直播】2019 年县域农业大脑AI挑战赛---(四)模型构建和网络训练

    对于分割网络,如果当成一个黑箱就是:输入一个3x1024x1024 输出4x1024x1024. 我没有使用二分类,直接使用了四分类. 分类网络使用了SegNet,没有加载预训练模型,参数也是默认初始 ...

  9. 如何使用flask将模型部署为服务

    在某些场景下,我们需要将机器学习或者深度学习模型部署为服务给其它地方调用,本文接下来就讲解使用python的flask部署服务的基本过程. 1. 加载保存好的模型 为了方便起见,这里我们就使用简单的分 ...

随机推荐

  1. Python pip源,解决安装慢的问题

    经常在使用Python的时候需要安装各种模块,而pip是很强大的模块安装工具,但是由于国外官方pypi经常被墙,导致不可用,所以我们最好是将自己使用的pip源更换一下,这样就能解决被墙导致的装不上库的 ...

  2. Android如何配置init.rc中的开机启动进程(service)【转】

    本文转载自:http://blog.csdn.net/qq_28899635/article/details/56289063 开篇:为什么写这篇文章 先说下我自己的情况,我是个普通的大四学生,之前在 ...

  3. SCAU 1138 代码等式 并查集

    1138 代码等式[附加题] 该题有题解 时间限制:500MS  内存限制:65536K 提交次数:59 通过次数:21 题型: 编程题   语言: G++;GCC Description 一个代码等 ...

  4. Linux系统中10个常用的ps命令总结

    Linux作为Unix的衍生操作系统,Linux内建有查看当前进程的工具ps.这个工具能在命令行中使用PS 命令是什么 查看它的man手册可以看到,ps命令能够给出当前系统中进程的快照.它能捕获系统在 ...

  5. centos 7 / 6 smokeping安装

    官网 值得拥有:http://oss.oetiker.ch/smokeping/doc/reading.en.html 安装依赖包 1 2 yum -y install perl perl-Net-T ...

  6. CISCO-端口安全

    1.MAC地址与端口绑定,当发现主机的MAC地址与交换机上指定的MAC地址不同时 ,交换机相应的端口将down掉.当给端口指定MAC地址时,端口模式必须为access或者Trunk状况. 3550-1 ...

  7. TortoiseGit创建本地库并提交到远程服务器

    前半部分参考网上的例子:http://www.showerlee.com/archives/1300,但会出现“Git did not exit cleanly (exit code 128)”错误 ...

  8. bzoj2117

    动态电分治+二分 肯定要枚举所有点对,那么我们建出点分树降低树高,然后每个点存下点分树中所有子树到这个点的距离,然后二分+lower_bound就行了. #include<bits/stdc++ ...

  9. storyBoard学习教程一(页面跳转)

    今天为了给伙伴作一篇storyBoard快速编程的教程,所以才写下了这篇博客. 有过storyBoard 编程经验的伙伴还是不要阅读本篇博客了,我自己认为,太基础太简单了,为了方便别人学习使用,我还是 ...

  10. SSIS 增量更新

    本文转自 http://sqlblog.com/blogs/andy_leonard/archive/2007/07/09/ssis-design-pattern-incremental-loads. ...