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类
  1. 从flask包中导入Flask类,实例化Flask类,得到一个实例。
  2. name : Flask类构造方法第一参数为模块或包的名称。帮助Flask找到需要的资源
from flask import Flask
app = Flask(__name__)
2.2 注册路由
  1. 用户在浏览器中输入url访问资源
  2. Flask接收到请求,并且分析url
  3. Flask为这个url找到对于的处理函数
  4. 执行这个函数,给出响应,返回给浏览器
  5. 浏览器接收解析响应,将在页面中展示信息
# 这一系列都是由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 一个视图可以绑定多个路由

  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

  1. url规则中添加变量
@app.route('/hello/<name>')
def index(name):
return 'hello %s' % name
  1. 当规则中包含变量,但是没有传入这个变量值的话(就是直接访问/hello)会报错的,所以要设置一个默认值
@app.route('/hello' , defaults={'name':'param'})
@app.route('/hello/<name>')
def index(name):
return 'hello %s' % name
  1. 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)

五、模板与静态文件

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

5.1 模板语法

  1. for if 常用控制模板输出
{% if %}..{% else %}..{% endif %}
{% for i in message %}..{% endfor %}
  1. 变量表达式
{{  }}
  1. 插入模板
{% include "index.html" %}
  1. 导入函数
{% from 'bootstrap/form.html' import render_form  %}
{{ render_form(form) }}
  1. 继承模板
{% extends 'base.html' %}
  1. 块的开始与结束,一共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 过滤器

  • 变量可以通过 过滤器 修改。过滤器与变量用管道符号( | )分割,并且也 可以用圆括号传递可选参数。多个过滤器可以链式调用,前一个过滤器的输出会被作为 后一个过滤器的输入。
  1. 将name变量标题化
{{ name|title }}
  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
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'))
  1. template/index.html
    <div>
{% for message in get_flashed_messages() %}
<div class="alert">{{ message }}</div>
{% endfor %}
</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 安装

$: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 一对多

  1. 当前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)
  1. 在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'))
  1. 定义关系属性,但是一个作者有多个文章
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】学习笔记(一)入门的更多相关文章

  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. npm的使用说明

    博主是刚开始写项目的前端小白菜,边学边整理,以供后面的小猿参考,共同进步. 首先: npm的官网地址:https://www.npmjs.com Windows 安装包(.msi) 32 位安装包下载 ...

  2. 重要,知识点:InnoDB的插入缓冲

    世界上最快的捷径,就是脚踏实地,本文已收录[架构技术专栏]关注这个喜欢分享的地方. InnoDB引擎有几个重点特性,为其带来了更好的性能和可靠性: 插入缓冲(Insert Buffer) 两次写(Do ...

  3. Redis事务使用方法

    Redis事务 Redis事务是一组命令的集合,也是Redis的最小执行单位之一.一个事务的所有命令,要么都执行,要么都不执行.Redis能保证事务执行期间不会有其他命令插入. 相关命令 命令 格式 ...

  4. re模块,判断某行/某字符是否存在

    import re ##判断行是否存在def get_need_line(): ## 获取有用信息行 with open('task.log',mode="r") as f: fo ...

  5. Java入门(4)

    阅读书目:Java入门经典(第7版) 作者:罗格斯·卡登海德 面向对象编程(OOP)将程序视为对象的集合,确定程序要完成的任务,然后将这些任务指派给最适合完成它们的对象.换言之,计算机程序是一组对象, ...

  6. NOIP 2013 P1967 货车运输

    倍增求LCA+最大生成树 题目给出的是一张图,在图上有很多算法无法实现,所以要将其转化为树 题中可以发现货车的最后的载重量是由权值最小的一条边决定的,所以我们求最大生成树 求完最大生成树后我们得到一个 ...

  7. ()C++中的赋值运算符重载函数(operator=)

    本文主要介绍C++中的重载操作符(operator)的相关知识. 概述 1.1 what operator 是C++的一个关键字,它和运算符(如=)一起使用,表示一个运算符重载函数,在理解时可将ope ...

  8. leetcode147median-of-two-sorted-arrays

    题目描述 有两个大小分别为m和n的有序数组A和B.请找出这两个数组的中位数.你需要给出时间复杂度在O(log (m+n))以内的算法. There are two sorted arrays A an ...

  9. 7 apache和nginx的区别

    7 apache和nginx的区别 nginx 相对 apache 的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,支持更多的并 ...

  10. Linux AWK工作原理

    本篇文章我们主要为大家介绍 AWK 是如何工作的. AWK 工作流程可分为三个部分:1.读输入文件之前执行的代码段(由BEGIN关键字标识).2.主循环执行输入文件的代码段.3. 读输入文件之后的代码 ...