【Flask】学习笔记(一)入门
Flask 入门基础
Flask是一个轻量级的后台框架,用Flask作为Web框架的公司有Netfix,Reddit等,国内豆瓣,果壳等。使用flask的公司列表。Flask 有主要的两个依赖,一个是WSGI(web server gateway Interface)web服务器网关接口,工具集-Werkzeug。另一个是Jinjia2模板引擎
一、搭建环境
1.安装pip,pipenv
python3.4以上版本pip已经自动安装好了
# 检查pip是否已经安装
$: pip --version
# 安装某个包,例如安装flask
$: pip install <包的名称>
$: pip install flask
# 安装pipenv(全局)
$: pip install pipenv
# 检查pipenv是否安装
$: pipenv --version
2.创建虚拟环境
虚拟环境通常用virtulenv来创建,为了更方便的关联虚拟环境和依赖包
$: pipenv install
3.pycharm使用省略
二、Hello Flask!
1.创建工程demo/helloflask
$: mkdir demo/helloflask
$: cd demo/helloflask
$: mkdir hello.py
$: pip install flask
$: vim hello.py
# 代码清单
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "hello flask"
if __name__ = '__main__':
app.run()
# 运行
$: python hello.py
2.步骤解析
2.1 实例化Flask类
- 从flask包中导入Flask类,实例化Flask类,得到一个实例。
- name : Flask类构造方法第一参数为模块或包的名称。帮助Flask找到需要的资源
from flask import Flask
app = Flask(__name__)
2.2 注册路由
- 用户在浏览器中输入url访问资源
- Flask接收到请求,并且分析url
- Flask为这个url找到对于的处理函数
- 执行这个函数,给出响应,返回给浏览器
- 浏览器接收解析响应,将在页面中展示信息
# 这一系列都是由Flask完成,我们只需要在函数上面添加一个装饰器app.route(),并传入url规则作为参数。可以让函数与url建立一个连接,这个过程叫做注册路由,函数称为视图函数
@app.route('/')
def hello():
return "hello flask"
2.3 启动Web服务器
if __name__ = '__main__':
app.run()
在启动的时候可以添加参数,在run()中
- debug : 是否开启调试模式,开启后修改的代码会自动重启
- threaded: 是否开启多线程
- port: 启动指定服务器的端口号,默认端口号5000
- host: 默认是127.0.0.1,指定0.0.0.0 支持远程访问
三、路由
3.1 一个视图可以绑定多个路由
- 访问127.0.0.1/index 127.0.0.1/hello 得到的response是一样的
@app.route('/index')
@app.route('/hello')
def index():
return 'hello, Flask!'
3.2 动态url
- url规则中添加变量
@app.route('/hello/<name>')
def index(name):
return 'hello %s' % name
- 当规则中包含变量,但是没有传入这个变量值的话(就是直接访问/hello)会报错的,所以要设置一个默认值
@app.route('/hello' , defaults={'name':'param'})
@app.route('/hello/<name>')
def index(name):
return 'hello %s' % name
- url参数前还可以添加转换器,转化参数类型
@app.route('/hello/<int:name_id>')
def index(name):
return 'hello %d' % name_id
四、HTTP请求以及相应
- http请求方式有get,post,put,delete,Flask路由规则设置请求方法
@app.route('/hello',methods = ['GET','POST'])
def index():
return 'hello flask'
- 重定向,例如当我们访问错误的时候,重定向到其他页面(状态码为302)
from flask import Flask, redirect
@app.route('/index')
def index():
return redirect('http://www.example.com')
- 重定向到其他视图页面
from flask import Flask, redirect, url_for
@app.route('/index')
def index():
return redirect(url_for('login'))
@app.route('/')
def login():
return "登入成功"
- 错误相应
from flask import Flask, abort
@app.route('/404')
def not_found():
abort(404)
五、模板与静态文件
- static: 存放图片,静态资源文件
- templates: 存放html文件
- 模板功能是基于Jinjia2模板引擎实现的
helloflask/
- static/
- templates/
- app.py
5.1 模板语法
- for if 常用控制模板输出
{% if %}..{% else %}..{% endif %}
{% for i in message %}..{% endfor %}
- 变量表达式
{{ }}
- 插入模板
{% include "index.html" %}
- 导入函数
{% from 'bootstrap/form.html' import render_form %}
{{ render_form(form) }}
- 继承模板
{% extends 'base.html' %}
- 块的开始与结束,一共6个块head、title、styles、content、footer和scripts
{% block content %}{% endblock %}
5.2 渲染模板
- 视图中使用render_template()
- templates/
index.html
@app.route('/')
def index():
return render_template('index.html')
5.3 过滤器
- 变量可以通过 过滤器 修改。过滤器与变量用管道符号( | )分割,并且也 可以用圆括号传递可选参数。多个过滤器可以链式调用,前一个过滤器的输出会被作为 后一个过滤器的输入。
- 将name变量标题化
{{ name|title }}
- 或者当前变量的长度
{{ movies|length }}
| 过滤器名 | 说明 |
|---|---|
| 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设置
- app.py
from flask import Flask, render_template, flash, redirect, url_for
app = Flask(__name__)
app.secret_key = 'secret'
@app.route('/flash/')
def flask():
flash("闪现")
return redirect(url_for('hello_world'))
- template/index.html
<div>
{% for message in get_flashed_messages() %}
<div class="alert">{{ message }}</div>
{% endfor %}
</div>
- 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 概念
- 对象映射关系
- 让模型与数据库产生映射关系
- 操作模型对象可以实现数据库操作
- 表 -> python 类 ; 字段 -> 类属性 ;记录 -> 类实例
7.2 安装
$:pip install flask-sqlalchemy
对app对象初始化
db = SQLAlchemy()
db.init_app(app)
7.3 定义一张表
db = SQLAlchemy()
class User(db.Model):
__tablename__ == 'user'
name = db.Column(db.String(100))
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 自定义表明
__tablename__ = ''
7.6 创建数据库
db.create_all()
7.7 删除数据库
db.drop_all()
7.8 数据库操作
# 调用add()方法将新创建的对象添加到数据库会话中
db.session.add(user)
# 提交会话
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 一对多
- 当前Author 代表作者,Article代表文章
class Author(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(70), unique=True)
phone = db.Column(db.String(20))
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(50), index=True)
body = db.Column(db.Text)
- 在Article表中建立一个外键,用来在Ariticle的表中存储Author的主键值,建立关系
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(50), index=True)
body = db.Column(db.Text)
author_id = db.Column(db.Integer, db.ForeignKey('author.id'))
- 定义关系属性,但是一个作者有多个文章
class Author(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(70), unique=True)
phone = db.Column(db.String(20))
articles = db.relationship('Article')
参数书籍:Flask开发实战
【Flask】学习笔记(一)入门的更多相关文章
- python学习笔记--Django入门四 管理站点--二
接上一节 python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...
- WebSocket学习笔记——无痛入门
WebSocket学习笔记——无痛入门 标签: websocket 2014-04-09 22:05 4987人阅读 评论(1) 收藏 举报 分类: 物联网学习笔记(37) 版权声明:本文为博主原 ...
- Python Flask学习笔记之模板
Python Flask学习笔记之模板 Jinja2模板引擎 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板.Flask提供的render_template函数把Jinja ...
- Python Flask学习笔记之Hello World
Python Flask学习笔记之Hello World 安装virtualenv,配置Flask开发环境 virtualenv 虚拟环境是Python解释器的一个私有副本,在这个环境中可以安装私有包 ...
- Java学习笔记之---入门
Java学习笔记之---入门 一. 为什么要在众多的编程语言中选择Java? java是一种纯面向对象的编程语言 java学习起来比较简单,适合初学者使用 java可以跨平台,即在Windows操作系 ...
- DBFlow框架的学习笔记之入门
什么是DBFlow? dbflow是一款android高性的ORM数据库.可以使用在进行项目中有关数据库的操作.github下载源码 1.环境配置 先导入 apt plugin库到你的classpat ...
- MongoDB学习笔记:快速入门
MongoDB学习笔记:快速入门 一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...
- 学习笔记_J2EE_SpringMVC_01_入门
1. 概述 笔者作为一个不太正经的不专业佛教信仰者,习惯了解事物的因果关系,所以概述就有点BBB...了.如果不喜欢这些的,请自行跳过概述章节,直接进入第二章的操作实践:2 入门示例. 1.1. ...
- dubbo入门学习笔记之入门demo(基于普通maven项目)
注:本笔记接dubbo入门学习笔记之环境准备继续记录; (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务 需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订 ...
- SpringBoot学习笔记<一>入门与基本配置
毕业实习项目技术学习笔记 参考文献 学习视频 2小时学会Spring Boot:https://www.imooc.com/learn/767 学习资料 SpringBoot入门:https://bl ...
随机推荐
- sentinel控制台与应用通信原理
1,应用程序配置中的port选项用于指定在应用端启动的http server的端口,默认8719 sentinel: transport: dashboard: localhost:8080 port ...
- Ubuntu下创建apt源
1. 下载所需安装文件 sudo apt-get install soft name 安装并保存安装文件 或者 sudo apt-get source soft name 只下载安装文件 ...
- 快快使用ModelArts,零基础小白也能玩转AI!
摘要: 走过路过不要错过,看Copy攻城狮如何借力华为云ModelArts玩转AI. "自2018年10月发布以来,ModelArts累计服务了众多行业十几万开发者,通过基础平台的完备性和面 ...
- 选择API管理平台之前要考虑的5个因素
API(应用程序编程接口)经济的飞速增长导致对API管理平台的需求相应增加. 这些解决方案可在整个生命周期内帮助创建,实施,监控,分析,保护和管理API. 据一些估计,全球API管理市场预计在2018 ...
- 3.2spring源码系列----循环依赖源码分析
首先,我们在3.1 spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖 中手写了循环依赖的实现. 这个实现就是模拟的spring的循环依赖. 目的是为了更容易理解spring源码 ...
- Zookeeper(4)---ZK集群部署和选举
一.集群部署 1.准备三台机器,安装好ZK.强烈建议奇数台机器,因为zookeeper 通过判断大多数节点的存活来判断整个服务是否可用.3个节点,挂掉了2个表示整个集群挂掉,而用偶数4个,挂掉了2个也 ...
- 【Java】线程的创建方式
1.继承Thread类方式 这种方式适用于执行特定任务,并且需要获取处理后的数据的场景. 举例:一个用于累加数组内数据的和的线程. public class AdditionThread extend ...
- 2. RDD(弹性分布式数据集Resilient Distributed dataset)
*以下内容由<Spark快速大数据分析>整理所得. 读书笔记的第二部分是讲RDD.RDD 其实就是分布式的元素集合.在 Spark 中,对数据的所有操作不外乎创建RDD.转化已有RDD以及 ...
- 使用配置文件方式记录Python程序日志
开发者可以通过三种方式配置日志记录: 调用配置方法的Python代码显式创建记录器.处理程序和格式化程序. 创建日志配置文件并使用fileConfig() 函数读取. 创建配置信息字典并将其传递给di ...
- martini-拓扑映射
如何为一个新的分子创建拓扑文件? 这是martini应用的关键.http://jerkwin.github.io/2016/08/31/Martini%E5%B8%B8%E8%A7%81%E9%97% ...