Flask 入门基础

Flask是一个轻量级的后台框架,用Flask作为Web框架的公司有Netfix,Reddit等,国内豆瓣,果壳等。使用flask的公司列表。Flask 有主要的两个依赖,一个是WSGI(web server gateway Interface)web服务器网关接口,工具集-Werkzeug。另一个是Jinjia2模板引擎

一、搭建环境

1.安装pip,pipenv

python3.4以上版本pip已经自动安装好了

  1. # 检查pip是否已经安装
  2. $: pip --version
  3. # 安装某个包,例如安装flask
  4. $: pip install <包的名称>
  5. $: pip install flask
  6. # 安装pipenv(全局)
  7. $: pip install pipenv
  8. # 检查pipenv是否安装
  9. $: pipenv --version

2.创建虚拟环境

虚拟环境通常用virtulenv来创建,为了更方便的关联虚拟环境和依赖包

  1. $: pipenv install

3.pycharm使用省略

二、Hello Flask!

1.创建工程demo/helloflask

  1. $: mkdir demo/helloflask
  2. $: cd demo/helloflask
  3. $: mkdir hello.py
  4. $: pip install flask
  5. $: vim hello.py
  6. # 代码清单
  7. from flask import Flask
  8. app = Flask(__name__)
  9. @app.route('/')
  10. def hello():
  11. return "hello flask"
  12. if __name__ = '__main__':
  13. app.run()
  14. # 运行
  15. $: python hello.py

2.步骤解析

2.1 实例化Flask类
  1. 从flask包中导入Flask类,实例化Flask类,得到一个实例。
  2. name : Flask类构造方法第一参数为模块或包的名称。帮助Flask找到需要的资源
  1. from flask import Flask
  2. app = Flask(__name__)
2.2 注册路由
  1. 用户在浏览器中输入url访问资源
  2. Flask接收到请求,并且分析url
  3. Flask为这个url找到对于的处理函数
  4. 执行这个函数,给出响应,返回给浏览器
  5. 浏览器接收解析响应,将在页面中展示信息
  1. # 这一系列都是由Flask完成,我们只需要在函数上面添加一个装饰器app.route(),并传入url规则作为参数。可以让函数与url建立一个连接,这个过程叫做注册路由,函数称为视图函数
  2. @app.route('/')
  3. def hello():
  4. return "hello flask"
2.3 启动Web服务器
  1. if __name__ = '__main__':
  2. app.run()

在启动的时候可以添加参数,在run()中

  • debug : 是否开启调试模式,开启后修改的代码会自动重启
  • threaded: 是否开启多线程
  • port: 启动指定服务器的端口号,默认端口号5000
  • host: 默认是127.0.0.1,指定0.0.0.0 支持远程访问

三、路由

3.1 一个视图可以绑定多个路由

  1. 访问127.0.0.1/index 127.0.0.1/hello 得到的response是一样的
  1. @app.route('/index')
  2. @app.route('/hello')
  3. def index():
  4. return 'hello, Flask!'

3.2 动态url

  1. url规则中添加变量
  1. @app.route('/hello/<name>')
  2. def index(name):
  3. return 'hello %s' % name
  1. 当规则中包含变量,但是没有传入这个变量值的话(就是直接访问/hello)会报错的,所以要设置一个默认值
  1. @app.route('/hello' , defaults={'name':'param'})
  2. @app.route('/hello/<name>')
  3. def index(name):
  4. return 'hello %s' % name
  1. url参数前还可以添加转换器,转化参数类型
  1. @app.route('/hello/<int:name_id>')
  2. def index(name):
  3. return 'hello %d' % name_id

四、HTTP请求以及相应

  • http请求方式有get,post,put,delete,Flask路由规则设置请求方法
  1. @app.route('/hello',methods = ['GET','POST'])
  2. def index():
  3. return 'hello flask'
  • 重定向,例如当我们访问错误的时候,重定向到其他页面(状态码为302)
  1. from flask import Flask, redirect
  2. @app.route('/index')
  3. def index():
  4. return redirect('http://www.example.com')
  • 重定向到其他视图页面
  1. from flask import Flask, redirect url_for
  2. @app.route('/index')
  3. def index():
  4. return redirect(url_for('login'))
  5. @app.route('/')
  6. def login():
  7. return "登入成功"
  • 错误相应
  1. from flask import Flask, abort
  2. @app.route('/404')
  3. def not_found():
  4. abort(404)

五、模板与静态文件

  1. static: 存放图片,静态资源文件
  2. templates: 存放html文件
  3. 模板功能是基于Jinjia2模板引擎实现的
  1. helloflask/
  2. - static/
  3. - templates/
  4. - app.py

5.1 模板语法

  1. for if 常用控制模板输出
  1. {% if %}..{% else %}..{% endif %}
  2. {% for i in message %}..{% endfor %}
  1. 变量表达式
  1. {{ }}
  1. 插入模板
  1. {% include "index.html" %}
  1. 导入函数
  1. {% from 'bootstrap/form.html' import render_form %}
  2. {{ render_form(form) }}
  1. 继承模板
  1. {% extends 'base.html' %}
  1. 块的开始与结束,一共6个块head、title、styles、content、footer和scripts
  1. {% block content %}{% endblock %}

5.2 渲染模板

  • 视图中使用render_template()
  1. - templates/
  2. index.html
  3. @app.route('/')
  4. def index():
  5. return render_template('index.html')

5.3 过滤器

  • 变量可以通过 过滤器 修改。过滤器与变量用管道符号( | )分割,并且也 可以用圆括号传递可选参数。多个过滤器可以链式调用,前一个过滤器的输出会被作为 后一个过滤器的输入。
  1. 将name变量标题化
  1. {{ name|title }}
  1. 或者当前变量的长度
  1. {{ movies|length }}
  1. 常用过滤器:http://jinja.pocoo.org/docs/templates/#builtin-filters
过滤器名 说明
upper 字母大写
lower 字母小写
capitalize 首字母大写
truncate(6,True) 当前字符长度超过6显示...,默认是第二个参数是false
default() 默认字符串名
trim 去除前后空格
safe 关闭自动转义
round 四舍五入取整
abs 绝对值
first 取第一个元素
last 取最后一个元素
sum 求和
sort 排序默认升序
join 合并为字符串

六、消息闪现

  • Flask 提供了有用的flash() 函数,闪现需要给用户的消息,比如登入成功后会提示个消息,登入失败后也会提示个消息,需要在模板中使用全局函数get_flash_messages() 获取消息并将其显示
  • 通过flash()函数发送的消息会存储在session对象中,所以我们需要为程序设置密钥。可以通过app.secret_key属性或配置变量SECRET_KEY设置
  1. app.py
  1. from flask import Flask, render_template, flash, redirect, url_for
  2. app = Flask(__name__)
  3. app.secret_key = 'secret'
  4. @app.route('/flash/')
  5. def flask():
  6. flash("闪现")
  7. return redirect(url_for('hello_world'))
  1. template/index.html
  1. <div>
  2. {% for message in get_flashed_messages() %}
  3. <div class="alert">{{ message }}</div>
  4. {% endfor %}
  5. </div>
  1. flash() 方法第二个参数似乎消息类型,可选择的有”message”, “info”, “warning”, “error”。只需设置get_flashed_messages()方法的with_categories和category_filter

    参考:https://flask.palletsprojects.com/en/1.1.x/patterns/flashing/

七、数据库集成

7.1 ORM 概念

  1. 对象映射关系
  2. 让模型与数据库产生映射关系
  3. 操作模型对象可以实现数据库操作
  4. 表 -> python 类 ; 字段 -> 类属性 ;记录 -> 类实例

7.2 安装

  1. $pip install flask-sqlalchemy
  2. app对象初始化
  3. db = SQLAlchemy()
  4. db.init_app(app)

7.3 定义一张表

  1. db = SQLAlchemy()
  2. class User(db.Model):
  3. __tablename__ == 'user'
  4. name = db.Column(db.String(100))
  5. no = db.Column(db.Integer(20))
字段 说明
String 字符串
Integer 整型
Text 文本
Date 日期对象 Datetime.date
Time 时间对象 Datetime.time
DateTime 时间日期
Interval 时间间隔
Float 浮点数
Boolean 布尔值

7.4 常用SQLAlchemy 字段参数

参数名 说明
primary_key 如果为True 该字段为主键
unique 如果为True 该字段不允许重复
index 如果为True 该字段创建索引
nullable 该字段可否为空
default 字段设置默认值

7.5 自定义表明

  1. __tablename__ = ''

7.6 创建数据库

  1. db.create_all()

7.7 删除数据库

  1. db.drop_all()

7.8 数据库操作

  1. # 调用add()方法将新创建的对象添加到数据库会话中
  2. db.session.add(user)
  3. # 提交会话
  4. db.session.commit()

7.9 数据库读取

<模型类>.query.<过滤方法>.<查询方法>

https://docs.sqlalchemy.org/en/13/orm/query.html

查询方法 说明
all() 查询包含所有的记录列表
first() 查询第一条数据,如果没有返回None
get(ident) 传入主键值为参数,返回猪圈记录
count() 返回查询的数量
first_or_404() 查询第一条记录,未找到返回404错误
with_paernt() 传入模型作为参数,返回和这个实例相关联的对象
paginate() 返回Pagination对象,对记录进行分页操作

https://docs.sqlalchemy.org/en/13/orm/query.html

过滤方法 说明
filter() 使用指定的规则过滤,返回新产生的对象
filter_by() 使用指定的规则过滤(以关键字为对象),返回新产生的对象
order_by 排序
group_by() 根据查询的记录进行分组
offset() 偏移查询结果

7.10 ORM 一对多

  1. 当前Author 代表作者,Article代表文章
  1. class Author(db.Model):
  2. id = db.Column(db.Integer, primary_key=True)
  3. name = db.Column(db.String(70), unique=True)
  4. phone = db.Column(db.String(20))
  5. class Article(db.Model):
  6. id = db.Column(db.Integer, primary_key=True)
  7. title = db.Column(db.String(50), index=True)
  8. body = db.Column(db.Text)
  1. 在Article表中建立一个外键,用来在Ariticle的表中存储Author的主键值,建立关系
  1. class Article(db.Model):
  2. id = db.Column(db.Integer, primary_key=True)
  3. title = db.Column(db.String(50), index=True)
  4. body = db.Column(db.Text)
  5. author_id = db.Column(db.Integer, db.ForeignKey('author.id'))
  1. 定义关系属性,但是一个作者有多个文章
  1. class Author(db.Model):
  2. id = db.Column(db.Integer, primary_key=True)
  3. name = db.Column(db.String(70), unique=True)
  4. phone = db.Column(db.String(20))
  5. articles = db.relationship('Article')

参数书籍:Flask开发实战

【Flask】学习笔记(一)入门的更多相关文章

  1. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  2. WebSocket学习笔记——无痛入门

    WebSocket学习笔记——无痛入门 标签: websocket 2014-04-09 22:05 4987人阅读 评论(1) 收藏 举报  分类: 物联网学习笔记(37)  版权声明:本文为博主原 ...

  3. Python Flask学习笔记之模板

    Python Flask学习笔记之模板 Jinja2模板引擎 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板.Flask提供的render_template函数把Jinja ...

  4. Python Flask学习笔记之Hello World

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

  5. Java学习笔记之---入门

    Java学习笔记之---入门 一. 为什么要在众多的编程语言中选择Java? java是一种纯面向对象的编程语言 java学习起来比较简单,适合初学者使用 java可以跨平台,即在Windows操作系 ...

  6. DBFlow框架的学习笔记之入门

    什么是DBFlow? dbflow是一款android高性的ORM数据库.可以使用在进行项目中有关数据库的操作.github下载源码 1.环境配置 先导入 apt plugin库到你的classpat ...

  7. MongoDB学习笔记:快速入门

    MongoDB学习笔记:快速入门   一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...

  8. 学习笔记_J2EE_SpringMVC_01_入门

    1.    概述 笔者作为一个不太正经的不专业佛教信仰者,习惯了解事物的因果关系,所以概述就有点BBB...了.如果不喜欢这些的,请自行跳过概述章节,直接进入第二章的操作实践:2 入门示例. 1.1. ...

  9. dubbo入门学习笔记之入门demo(基于普通maven项目)

    注:本笔记接dubbo入门学习笔记之环境准备继续记录; (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务 需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订 ...

  10. SpringBoot学习笔记<一>入门与基本配置

    毕业实习项目技术学习笔记 参考文献 学习视频 2小时学会Spring Boot:https://www.imooc.com/learn/767 学习资料 SpringBoot入门:https://bl ...

随机推荐

  1. 一分钟了解"秒杀"系统

    关于秒杀,第一反应都是实现起来比较复杂.难点在于:并发读+并发写+设计兜底方案的实现. 比如QQ,虽然数据量很大,但是多数的数据都是细粒度的数据查询,锁冲突比较少:但12306涉及到大量的读写操作,对 ...

  2. angular页面

    <!DOCTYPE html><!--[if lt IE 9]> <html lang="zh" xmlns:ng="http://angu ...

  3. spring强行注入和引用的例子

    前提: public class DataProviderManagerImpl implements ApplicationContextAware @Override public void se ...

  4. 想用Nginx代理一切?行!

    Nginx能代理一切吗? 是的,Nginx可以作为一个优秀的http网关,但nginx能代理SSH2,MySQL,Oracle的连接吗?也算行吧,nginx有stream-module,专门处理TCP ...

  5. 专题五:redis的数据类型之set

    一.基本简介 现在出现了新的查询需求:存储大量数据的同时,还需要在查询方面提供更高的效率.虽然list满足存储大量的数据,也可以通过索引来进行访问,但是list底层是双向链表的结构,在查询上的效率并没 ...

  6. 4G DTU数据传输终端的功能介绍

    4G DTU是基于4G网络的自动化数据传输终端,是一种物联网无线数据传输设备,使用公用运营商的4G网络为用户提供无线远距离数据传输功能,使用工业级32位的高性能通信处理器和工业级无线模块,以嵌入式实时 ...

  7. Java学习的第三十四天

    1.今天复习完了第十二章 2.有很多的方法不知道什么意思,也记不清该用什么方法. 3.明天写例题.

  8. python使用matplotlib画图,jieba分词、词云、selenuium、图片、音频、视频、文字识别、人脸识别

    一.使用matplotlib画图 关注公众号"轻松学编程"了解更多. 使用matplotlib画柱形图 import matplotlib from matplotlib impo ...

  9. SpringCloud gateway 过滤

    如果需要获取一张图片但服务器没有过滤图片请求地址时,每次请求图片都需要携带token等安全验证密钥,可到nacos配置网关(gateway)的security配置,可过滤掉你配置的url(可理解为白名 ...

  10. 深入web workers (上)

    前段时间,为了优化某个有点复杂的功能,我采用了shared workers + indexDB,构建了一个高性能的多页面共享的服务.由于是第一次真正意义上的运用workers,比以前单纯的学习有更多体 ...