【Flask Web】开发实战——第一章学习笔记
概念
Flask是最流行的Python Web框架之一。
第 1 章:Flask基本知识
HTML、CSS、JavaScript分别作为一个Web页面的结构层、表现层和行为层
CSS框架:Bootstrap
JavaScript库:jQuery
入门网站:
命令提示符为 >>>
的表示Python Shell中输入的代码;>
表示Windows中的命令提示符,$
表示Linux 或 macOS。
Flask是Python编写的Web微框架。Flask核心简单且易于扩展,因此被叫做微框架。他有两个主要依赖,WSGI (Web Server Gateway Interface) 工具集——Werkzeug(http://werkzeug.pocoo.org/),另一个是Jinja2模版引擎(http://jinja.pocoo.org/)。
1.1 搭建开发环境
1.1.1 Pipenv 工作流
Pipenv是基于pip的Python包管理工具,实现pip+pipfile+virtualenv结合,让包安装、包依赖管理、虚拟环境管理更加方便。
$ pip install pipenv # 安装
$ pipenv --version # 检查是否安装
$ pipenv install # 创建虚拟环境
# Windows 环境下虚拟环境保存在 `C:\Users\<user_name>\.virtualenvs\`目录下
# Linux 或 MacOS 会保存在 `~/.local/share/virtualenvs/` 目录下
# 可以通过设置环境变量 PIPENV_VENV_IN_PROJECT,此时名为.venv的虚拟环境文件夹将在项目根目录被创建
# 虚拟环境文件夹的目录名称形式为 “当前项目目录名 + 一串随机字符”
# 可以通过 `--three`,`--two` 来声明虚拟环境中所用的Python版本
$ pipenv shell # 激活虚拟环境
$ pipenv run python xxx.py # 允许不显式激活虚拟环境
# pipenv install 会创建 Pipfile,Pipfile.lock 文件,前者记录依赖包猎豹,后者记录固定版本的详细依赖包列表
# Pipenv 安装、删除、更新依赖时,会更新这两个文件
$ pipenv graph # 查看当前环境下的依赖情况
$ pipenv install # 在新环境下运行程序时,运行该指令会创建一个新的虚拟环境与之前环境保持一致
1.1.2 安装 Flask
$ pipenv install flask # install
$ pipenv update flask # update
1.2 Hello, Flask!
1.2.1 创建程序实例
from flask import Flask
app = Flask(__name__)
从flask
包中导入Flask
类,这个类表示一个Flask
程序,实例化后就是我们大的程序实例app。
传入Flask类构造方法的第一个参数是模块或包的名称,应该使用特殊变量 __name__
。Python会根据所处的模块来赋予 __name__
变量相应的值。
1.2.2 注册路由
CS架构下Flask程序的交互主要是以下几个步骤:
- C根据url进行访问资源
- S接受请求,分析url
- 找到该url对应的处理函数
- 函数响应,并返回给C
- C进行接受并解析渲染
我们主要做的是定义路由信息,实现url与函数的对应关系。只需要为函数附加 app.route()
装饰器,并传入url规则作为参数,之后就让url与函数建立关联。
这个环节我们称为注册路由 route,路由负责管理url和函数之间的映射,这个函数被称为视图函数 view function
@app.route('/')
def index():
return '<h1>hello flask!</h1>'
以这个为例,就是将 根地址 /
与 index函数绑定起来,访用户访问时会触发函数,视图函数返回的值将作为响应的主题。
同时路径必须以 斜杠 /
开始
''' 为视图绑定多个URL '''
@app.route('/hi')
@app.route('/hello')
def index():
return '<h1>hello flask!</h1>'
''' 动态URL '''
@app.route('/hi/<name>')
def index(name):
return '<h1>hello %s!</h1>' % name
# 如果访问url后没有添加变量会匹配失败,返回404错误,常用操作是加上一个默认值
@app.route('/hi/', default={'name': 'Programmer'})
# 或者
@app.route('hi')
@app.route('/hi/<name>')
def index(name='Programmer'):
return '<h1>hello %s!</h1>' % name
1.3 启动开发服务器
1.3.1 Run, Flask, Run!
$ flask run
-
自动发现程序实例
- Flask会自动探测程序实例,规则有二:
- 从当前目录寻找app.py, wsgi.py模块,并从中寻找名为
app
或application
的程序实例 - 从环境变量
FLASK_APP
对应的值寻找名为app
或application
的程序实例
-
管理环境变量
- 如果安装了
python-dotenv
,在使用flask run
或其他命令时会在.flaskenv
文件和.env
文件中加载环境变量 .flaskenv
存储和Flask相关的公开环境变量.env
存储包含敏感信息的环境变量
$ pipenv install python-dotenv
- 如果安装了
1.3.2 更多启动选项
$ flask run --host=0.0.0.0 # 使服务器外部可见
$ flask run --port=8000 # 设置开启端口为8000
1.3.3 设置运行环境
开发环境 development environment
生产环境 production environment
在 .flaskenv
中写入环境变量 FLASK_DEBUG
FLASK_DEBUG=True
开发环境下,调试模式 Debug Mode 将被开启,flask run会激活Werkzeug内置的调试器 debugger 和重载器 reloader
-
debugger
- 允许在错误页面上运行python代码。
-
reloader
- 检测到文件变动,则重启开发服务器
- 默认使用stat重载器,为了更好地天眼,使用Python库的Watchdong
$ pipenv install watchdog --dev
1.4 Python Shell
使用 flask shell
命令打开 Python Shell
,将会自动包含程序上下文,并且已经导入了app实例
上下文 context
:为了正常运行程序,系统会临时保存一些操作相关的状态和数据,这些统称为上下文。在Flask中,上下文分为两类,程序上下文和请求上下文。
1.5 Flask扩展
1.6 项目配置
需要设置程序的某些行为,这是就需要使用配置变量。Flask中,配置变量就是一些大写形式的Python变量。使用统一大的配置变量可以避免在程序中以硬编码的形式设置程序。
硬编码就是将某些数值或字符串直接写入代码中。
在一个项目中会使用达到许多配置,这些配置是通过Flask对象的app.config属性作为统一的接口来设置和获取,其指向的Config类实际上是字典的子类,可以想其他字典一样操作。
app.config['ADMIN_name'] = 'Peter'
app.config.update(
TESTING=True,
SECRET_KEY='development key'
)
1.7 URL与端点
使用url_for()
来获取URL,当路由中定义的URL规则被修改是,这个函数也会返回正确的URL
调用 url_for()
函数时,第一个参数为端点 endpoint 值,默认值为视图函数额名称。
如果URL有动态部分,则要加上对应的键值,补全使用:
@app.route('/hello/<name>')
def greet(name):
return 'hello %s!' % name
url_for('greet', name='Jack')
此时使用的都是相对URL,如果要生成供外部使用的绝对URL,可以在使用 url_for()
函数时,将 _external
参数设为True
1.8 Flask命令
自定义cli指令
@app.cli.command()
def hello(): # 注册的命令名为hello
click.echo('Hello, Human!') # 借助click函数来实现
1.9 模版与静态文件
需要模版 template和静态文件 static file来生成更加丰富的网页。
模版文件存放在项目根目录中的templates
文件夹中,静态文件夹放在static
中,二者与程序实例模块处于同一个目录下。
1.10 Flask与MVC架构
MVC架构
Model-View-Controller, 模型-视图-控制器
数据处理-用户界面-交互逻辑
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?