【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 ...
随机推荐
- BMP位图调色板说明
网上一搜,可以看到BMP位图结构的详细说明,这篇文章专门谈一下其中的调色板. 多少位位图并不是指每一个颜色该用多少位表示,对于颜色来说,它始终都是24位(RGB),或者是32位(RGBA),而是指该位 ...
- Django (学习第一部 基础操作)
django 1 django 文件相关信息 2 Python创建django 3 命令行创建django 4 Django 必会三板斧 5 静态文件配置 6 request对象方法 7 pychar ...
- SpringBoot整合原生OpenFegin的坑(非SpringCloud)
写在前面 最近,在使用SpringBoot+K8S开发微服务系统,既然使用了K8S,我就不想使用SpringCloud了.为啥,因为K8S本身的就提供了非常6的服务注册与发现.限流.熔断.负载均衡等等 ...
- 创建Sqlite数据库(一)
对这方面的掌握不牢,慢慢深入吧,先执行一个sqlite语句,只会简单的.输出"创建"证明创建成功 public class MainActivity extends AppComp ...
- Win32之创建进程
CreateProcess函数介绍 BOOL CreateProcessA( LPCSTR lpApplicationName, //可执行文件的名称完整的路径+程序名字) LPSTR lpComma ...
- Python期中考试程序设计题详解-2
一.请使用turtle库的turtle.pencolor().turtle.seth().turtle.fd()等函数,绘制一个边长为200的红色等边三角形. 题目解析: (1)本题利用turtle画 ...
- python中可迭代对象、迭代器、生成器
可迭代对象 关注公众号"轻松学编程"了解更多. 1.列表生成式 list = [result for x in range(m, n)] g1 = (i for i in rang ...
- 云服务器部署Python项目(nginx+uwsgi+mysql+项目)
python项目部署到云服务器 关注公众号"轻松学编程"了解更多. 一.硬件准备 云服务器,系统ubuntu_16_04 . 注意:要在安全组中开放Http的80端口. 二.软件准 ...
- Hadoop高可用
一.原因 - NameNode是HDFS的黑心配置HDFS有事hadoop的核心组件 NameNode 在Hadoop及群众至关重要 - NameNode的宕机导致集群的不可用 二.解决方案 其中 N ...
- 快快使用ModelArts,零基础小白也能玩转AI!
摘要: 走过路过不要错过,看Copy攻城狮如何借力华为云ModelArts玩转AI. "自2018年10月发布以来,ModelArts累计服务了众多行业十几万开发者,通过基础平台的完备性和面 ...