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. Maven2 ---- 安装及配置

    Maven详解(二)------ Maven的安装配置   目录 1.下载 Maven 2.配置 Maven 环境变量 3.查看 Maven 环境变量是否配置成功 4.在 eclipse 中集成 Ma ...

  2. MAP;MLE

    判别学习算法:直接对问题进行求解,比如二分类问题,都是在空间中寻找一条直线从而把类别的样例分开,对于新的样例只要判断在直线的那一侧就可. ==>这种直接求解的方法称为判别学习方法 生成学习算法: ...

  3. 对PatchGAN的感知域(receptive_field)理解

    for basic discriminator of GANs 判别器用于感知生成器产生的合成图片和ground-truth的差异,并旨在实现区分出fake or real: 同时,判别器的输出也是经 ...

  4. 博客主题——cnbook

    主题预览 主题下载 gshang.cnbook.rar version:2020-05-29 gshang.cnbook@2.0.rar version:2020-08-25 .source-down ...

  5. java数据结构-05双向链表

    一.双向链式存储: ①简述:要是节点中包含两个指针部分,一个指向前驱元,一个指向后继元,Java中LinkedList集合类的实现就是双向链表 (以下图片为网络收集,侵删) ②特点:数据是非连续的,链 ...

  6. ResultSet 处理方法

    结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等. 结果集读取数据 ...

  7. Spring 5的最后一个特性版本5.3发布,4.3将于12月终止维护

    10月27日,Spring Framework团队宣布了5.3版本正式GA,Spring用户可以在repo.spring.io和Maven Central上获取到最新版本的依赖包. JDK的版本支持 ...

  8. 20201103_notepad++修改文件保存的默认格式

    修改notepad++文件保存的默认格式 点开 设置 ==> 首选项 1.  修改默认语言为要默认保存的文件格式 2. 将默认目录下的使用新样式对话框取消勾选  

  9. 一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试

    一:背景 1. 讲故事 每次项目预交付的时候,总会遇到各种奇葩的坑,我觉得有必要梳理一下以及如何快速解决的,让后来人避避坑,这篇就聊聊自己的所闻所遇: 我去,本地环境代码跑的哧溜,上了测试环境出问题 ...

  10. 《Clojure编程》笔记 第16章 Clojure与web

    目录 背景简述 第16章 Clojure与web 16.1 术语 16.2 Clojure栈 16.3 基石:Ring 16.3.1 请求与应答 16.3.2 适配函数 16.3.3 处理函数 16. ...