【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 ...
随机推荐
- centos7 添加环境变量
修改/etc/profile文件使其永久性生效,并对所有系统用户生效 PATH=$PATH:/usr/local/php/bin export PATH source /etc/profile
- 一文快速入门分库分表中间件 Sharding-JDBC (必修课)
书接上文 <一文快速入门分库分表(必修课)>,这篇拖了好长的时间,本来计划在一周前就该写完的,结果家庭内部突然人事调整,领导层进行权利交接,随之宣布我正式当爹,紧接着家庭地位滑落至第三名, ...
- 布隆过滤器 Bloom Filter 2
date: 2020-04-01 17:00:00 updated: 2020-04-01 17:00:00 Bloom Filter 布隆过滤器 之前的一版笔记 点此跳转 1. 什么是布隆过滤器 本 ...
- bash xshell 特性
1.tab键补全 2.命令行常用快捷键: ctrl键+ c #取消当前操作 ctrl键+ d #退出当前用户登录 ctrl键+ a #光标移动到光标所在行的行首 ctrl键+ e ...
- Spring学习-Bean的基本概念知识
4月份开始复习一遍spring相关知识.让自己巩固一下spring大法的深奥益处,所以就看了大佬的博客,转载留下来日后继续研读.认为重点的标记为红色 转载自:http://www.cnblogs.co ...
- 常用数据结构-集合(set)
集合(set)是python中最容易被忽视的.使用集合的主要好处在于速度快. 集合的一些特性: 集合元素不能重复 不支持索引访问集合中的元素 集合使用散列之后,可以在O(1)时间内访问元素 支持一些常 ...
- Win10 Terminal + WSL 2 安装配置指南,精致开发体验
自从 Windows Terminal 正式发布后就再没有用过 Windows 系统自带的终端了.主要是 Terminal 简洁且灵活,更重要的是支持特殊字体,通过一些简单的配置可以使得终端看起来更舒 ...
- [Luogu P1006]传纸条 (网格DP)
题面 传送门:https://www.luogu.org/problemnew/show/P1006 Solution 挺显然但需要一定理解的网络(应该是那么叫吧)DP 首先有一个显然但重要的结论要发 ...
- IOCP 模型2 AcceptEx
// IOCP2.cpp : Defines the entry point for the console application. // #include "stdafx.h" ...
- MIT 6.S081 Lab5 Copy-On-Write Fork
前言 最近绝大多数的空闲时间都拿来锤15-445了,很久没动6.S081.前几天回头看了一下一个月前锤完的Lazy Allocation,自己写的代码几乎都不认识了.......看来总结之类的东西最好 ...