当前位置: 首页 > news >正文

Python Web 开发 Flask 介绍

WEB开发是现在程序必会的技能,因为大部分软件都以Web形式提供,及时制作后台开发,或者只做前台开发,也需要了解Web开发的概念和特点。由于Python是解释性脚本语言,用来做Web开发非常适合,而且Python有上百种Web开发框架,以及成熟的模板技术,使得Web开发如虎添翼。今天借用Flask框架,快速学习一下Python的Web开发知识。

Flask框架

Flask的设计易于使用和扩展。它的初衷是为各种复杂的Web应用程序构建坚实的基础。可以自由地插入任何扩展。也可以自由构建自己的模块。Flask适合各种项目。它对原型设计特别有用。Flask依赖于两个外部库:Jinja2模板引擎和Werkzeug WSGI工具包。Flask是最精致,功能最丰富的微框架之一。Flask还很年轻,拥有蓬勃发展的社区,一流的扩展和漂亮的API。Flask具有快速模板,强大的WSGI功能,在Web应用程序和库级别的完整单元可测性,以及大量文档等优点。选用Flask框架也是因为它方便入手,结构简单,零配置,是个学习Python Web开发的好工具。

安装Flask

像其他模块一样,Flask的安装很简单,下面通过pip包管理器来安装

pip install flask

检查一下是否安装正确 在命令行下输入 python 进入命令行模式 引入flask模块 回车

>>> import flask>>>

如果没有错误提醒,就说明安装成功了

Hello world

下面写个最简单的Web应用 hello.py​​​​​​​

from flask import Flask  # 引入Flask模块app = Flask(__name__) # 创建一个应用@app.route('/')def index():    # 定义根目录处理器    return '<h1>Hello World!</h1>'    if __name__ == '__main__':    app.run() # 启动服务

打开终端,跳转到hello.py文件所在的文件夹,进入python命令行模式,启动服务

>>> python hello.py

如果一起正常的话会有类似下面的反馈​​​​​​​

 * Serving Flask app "hello" (lazy loading) * Environment: production   WARNING: This is a development server. Do not use it in a production deployment.   Use a production WSGI server instead. * Debug mode: off * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

因为是通过app.run()启动的服务,所以会有个错误提示,提醒不能将此Web应用部署在生产环境中,可以暂时忽略

此时,打开浏览器,输入 127.0.0.1:5000/ 或者 localhost:5000/, 就可以看到 Hello World!欢迎字样。

路由

路由是Web开发中一个很重要的概念,用来将不同的请求,映射到响应的处理方法上,这个方法被称为视图函数。比如刚才的Hello应用,将根请求,映射到index处理方法上,下面简单了解下Flask对路由的支持 Flask通过修饰器(和Java的注解类似)来建立路由映射关系的,已经看到修饰器是app.rotue()

简单路由

如 访问 /hello​​​​​​​

@app.route('/hello')def hello():    return 'Hello!'
动态路由

如访问 /user/bob 或者 /user/lily 都会映射到同一视图函数上​​​​​​​

@app.route('/user/<name>')def user(name):    return '<h1>Hello, %s! </h1>' % name

动态域名中动态的部分可以作为视图函数的参数,也支持多个动态参数,如访问 /user/bob/23​​​​​​​

@app.route('/user/<name>/<age>')def user(name, age):    return "<h1> Hello, %s, you're %s years old" % (name, age)

还可以指定动态部分的数据类型,如​​​​​​​

@app.route('/post/<int:post_id>')def show_post(post_id):    # show the post with the given id, the id is an integer    return 'Post %d' % post_id
@app.route('/path/<path:subpath>')def show_subpath(subpath):    # show the subpath after /path/    return 'Subpath %s' % escape(subpath)

支持的数据类型

类型说明
string(默认值) 任何不包含斜杠的文本
int正整数
float正浮点数
path类似 string ,但可以包含斜杠
uuid接受 UUID 字符串
指定HTTP 方法

HTTP协议,支持多种HTTP 方法,例如HEADOPTIONS,以及常用的GETPOST等,Flask自动处理了HEADOPTIONS,路由默认接受的方法是GET,如果要匹配其他请求方法,可以在路由方法的methods参数来指定​​​​​​​

@app.route('/login', methods=['GET', 'POST'])def login():    if request.method == 'POST':        return do_the_login()    else:        return show_the_login_form()
复合路由

也可以将多个路由规则,用于一个视图函数, 如访问/job/ 和访问 /work/效果是一样的​​​​​​​

@app.route('/job/')@app.route('/work/')def show_works():    return 'This is works page'

再复杂一点的例子​​​​​​​

@app.route('/users/', defaults={'page': 1})@app.route('/users/page/<int:page>')def show_users(page):    pass

上面的代码表示,当访问/user/或者 /user/page/<pageindex> 时,都会有show_users视图函数来处理, 而且还为/user/提供了默认值,即访问/user/相当于访问 /user/page/1

请求和响应

Web应用,最重要的事情就是处理接收到的请求,并返回响应。Flask框架也一样,它提供了请求对象request和响应对象response,可以方便的在视图函数中使用。

请求

Flask将客户端发送的HTTP请求封装成了request请求对象,并且使用上下文(context)临时将request变为全局可访问的,于是在视图还是中,就可以直接使用了。

注意request并非真正的全局变量!试想,在多线程服务器中,多个线程同时处理不同客户端发送的不同请求时,每个线程看到的request对象必然不同。Falsk使用上下文让特定的变量在一个线程中全局可访问,与此同时却不会干扰其他线程。

Flask有两种上下文,分别为程序上下文和请求上下文,各自对应的全局变量如下表:

变量名上下文类型备注
current_app程序上下文表示当前运行的程序实例
g程序上下文处理请求时用作临时存储对象,每次请求都会重新设值
request请求上下文客户端发来的request请求对象
session请求上下文请求携带的会话信息

使用request对象前,需要先引入

from flash import request

request对象提供了丰富的属性和方法,这里举个例子:通过使用 method 属性可以操作当前请求方法,通过使用 form 属性处理表单数据(在 POST 或者 PUT 请求 中传输的数据)。以下是使用上述两个属性的例子:​​​​​​​

@app.route('/login', methods=['POST', 'GET'])def login():    error = None    if request.method == 'POST':        if valid_login(request.form['username'],                       request.form['password']):            return log_the_user_in(request.form['username'])        else:            error = 'Invalid username/password'    # the code below is executed if the request method    # was GET or the credentials were invalid    return render_template('login.html', error=error)

注意:当 form 属性中不存在这个键时会发生什么?会引发一个 KeyError 。如果不处理这个错误 ,就会显示一个 HTTP 400 Bad Request 错误页面。

如果要操作 URL (如 ?key=value )中提交的参数可以使用 args 属性,如 : searchword = request.args.get('key', '')

请求钩子

有时在处理请求之前或之后执行代码会很有用。例如,在请求开始时,可能需要创建数据库连接或者认证发起请求的用户。为了避免在每个视图函数中都使用重复的代码,Flask提供了注册通用函数的功能,注册的函数可在请求被分发到视图函数之前或之后调用。请求钩子使用修饰器实现。Flask支持以下4种钩子:

  1. before_first_request:注册一个函数,在处理第一个请求之前运行。

  2. before_request:注册一个函数,在每次请求之前运行。

  3. after_request:注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。

  4. teardown_request:注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。

示例: 在接受到第一个请求是,打印一句话:​​​​​​​

@app.before_first_requestdef first_quest():    print("run before first request")

在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量g。例如,before_request处理程序可以从数据库中加载已登录用户,并将其保存到g.user中。随后调用视图函数时,视图函数再使用g.user获取用户。

响应

响应是Web服务器对请求的一个回应,在Flask中,有多种形式的响应。视图函数的返回值会自动转换为一个响应对象。如果返回值是一个字符串,那么会被 转换为一个包含作为响应体的字符串、一个 200 OK 出错代码 和一个 text/html 类型的响应对象。如果返回值是一个字典,那么会调用 jsonify() 来产生一个响应。以下是转换的规则:

  1. 如果视图返回的是一个响应对象,那么就直接返回它。

  2. 如果返回的是一个字符串,那么根据这个字符串和缺省参数生成一个用于返回的 响应对象。

  3. 如果返回的是一个字典,那么调用 jsonify 创建一个响应对象。

  4. 如果返回的是一个元组,那么元组中的项目可以提供额外的信息。元组中必须至少 包含一个项目,且项目应当由 (response, status) 、 (response, headers) 或者 (response, status, headers) 组成。 status 的值会重载状态代码, headers 是一个由额外头部值组成的列表 或字典。

  5. 如果以上都不是,那么 Flask 会假定返回值是一个有效的 WSGI 应用并把它转换为 一个响应对象。

除此之外,还可以通过 make_response()函数,创建可以响应对象,做更个性的事情。

使用make_response()前,需要先引入

from flask import make_response

示例:

  1. 响应有元组构成

@app.errorhandler(404)def not_found(error):    return render_template('error.html'), 404

@app.errorhandler 修饰符,会将一个响应代码映射到一个视图函数上,这里是将404(找不到页面)码,处理成一个个性的错误页面 另外,render_template 是Flask的模板函数,简单理解就是格式化一个动态的html字符串,关于模板的详细用法,会在模板章节描述

  1. 使用 make_response() 包裹返回表达式,获得响应对象,并对该对象 进行修改,然后再返回:

@app.errorhandler(404)def not_found(error):    resp = make_response(render_template('error.html'), 404)    resp.headers['X-Something'] = 'A value'    return resp

总结

本文借助Flask框架,简要介绍了下Python Web开发的基本知识和技术,希望能帮助您快速入门,在Python学习的道路上走的更顺畅。后续还会将就Web开发的话题,对模板数据库 以及扩展功能等进行讲解,敬请期待!

相关文章:

Python Web 开发 Flask 介绍

WEB开发是现在程序必会的技能&#xff0c;因为大部分软件都以Web形式提供&#xff0c;及时制作后台开发&#xff0c;或者只做前台开发&#xff0c;也需要了解Web开发的概念和特点。由于Python是解释性脚本语言&#xff0c;用来做Web开发非常适合&#xff0c;而且Python有上百种…...

本地mvn仓库清理无用jar包

背景 开发java时间久了&#xff0c;本地的m2仓库就会产生很多过期的jar包&#xff0c;不清理的话比较占空间。 原理 是通过比较同一目录下&#xff0c;对应jar包的版本号的大小&#xff0c;保留最大版本号那个&#xff0c;删除其他的。 脚本 执行脚本见文章顶部 执行方式 …...

MySQL的常用函数大全

一、字符串函数 常用函数&#xff1a; 函数功能CONCAT(s1, s2, …, sn)字符串拼接&#xff0c;将s1, s2, …, sn拼接成一个字符串LOWER(str)将字符串全部转为小写UPPER(str)将字符串全部转为大写LPAD(str, n, pad)左填充&#xff0c;用字符串pad对str的左边进行填充&#xff0…...

一百四十三、Linux——Linux的CentOS 7系统语言由中文改成英文

一、目的 之前安装CentOS 7系统的时候把语言设置成中文&#xff0c;结果Linux文件夹命名出现中文乱码的问题&#xff0c;于是决定把Linux系统语言由中文改成英文 二、实施步骤 &#xff08;一&#xff09;到etc目录下&#xff0c;找到配置文件locale.conf # cd /etc/ # ls…...

一 关于idea如何在svn进行项目下载并运行成功

安装svn客户端 如图 安装时请选择该选项&#xff08;Will be installed on local hard drive&#xff09;并选择自己想要安装的目录路径 如图 svn安装成功 如图 注意 安装完成后&#xff0c;使用svn进行一次checkout的项目导出完成以上五步时&…...

python使用selenium 打开谷歌浏览器闪退, 怎么解决

问题描述&#xff1a; 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 使用 Selenium 操作 Chrome 浏览器&#xff0c; Chrome 浏览器闪退 问题解决&#xff1a; 可能是以下几个方面出现了问题&#xff1a; 1. Chromedriver 版本与 Chrome 浏览器版本不匹配 你需要确保你正在…...

.net 6 efcore一个model映射到多张表(非使用IEntityTypeConfiguration)

现在有两张表&#xff0c;结构一模一样&#xff0c;我又不想创建两个一模一样的model&#xff0c;就想一个model映射到两张表 废话不多说直接上代码 安装依赖包 创建model namespace oneModelMultiTable.Model {public class Test{public int id { get; set; }public string…...

CISCO MDS 9148 SAN Switch 交换机命令配置方法:

前言 CISCO MDS 9148 SAN 交换机已经停产&#xff0c;但还是要掌握一下配置的方法&#xff1a; 升级款后面 9148S 或者 9100系列&#xff0c;但配置方式基本都差不多&#xff0c;掌握一个就好&#xff1a; 高性能和极具吸引力的价值 Cisco MDS 9148S 16G 多层光纤交换机是下…...

图的深度、广度优先探索(数据结构)

深度&#xff1a; #include <stdio.h> #include <stdlib.h> #define MAX 20typedef struct ANode {int adjver,len;struct ANode*next; } ArcNode;typedef struct VNode {int data;ArcNode*firstarc; } VertexNode;typedef struct {VertexNode vers[MAX1];int ver…...

c语言小知识点

文章目录 int main()与int main(void)符号常量常变量无符号赋值将占字节多的赋值给字节少的类型赋初值 表达式预处理格式符e格式符 循环for 输入长度相关输出文件管理 int main()与int main(void) int main(void) 指的是此函数的参数为空&#xff0c;不能传入参数&#xff0c;…...

C++ - 模板分离编译

模板分离编译 我们先来看一个问题&#xff0c;我们用 stack 容器的声明定义分离的例子来引出这个问题&#xff1a; // stack.h // stack.h #pragma once #include<deque>namespace My_stack {template<class T, class Container std::deque<T>>class stack…...

如何把非1024的采样数放入aac编码器

一. aac对数据规格要求 二、代码实现 1.初始化 2.填入数据 3.取数据 三.图解 一. aac对放入的采样数要求 我们知道aac每次接受的字节数是固定的&#xff0c;在之前的文章里有介绍libfdk_aac音频采样数和编码字节数注意 它支持的采样数和编码字节数分别是&#xff1a; fdk_aac …...

linux安装nodejs和vue

下载nodejs 打开 下载地址页面中下载**Linux Binaries (x64)**的二进制包设置安装目录 sudo mkdir -p /usr/local/lib/nodejs # 解压 如下载的 node-v18.17.0-linux-x64.tar.xz sudo tar -xJvf node-v18.17.0-linux-x64.tar.xz -C /usr/local/lib/nodejs 加入到PATH #######…...

spring整合mybatis

所需配置&#xff1a; <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>m…...

Spring指定bean在哪个应用加载

1.背景 某项目,spring架构,有2个不同的WebAppApplication入口,大部分service类共用,小部分类有区别,只需要在一个应用中加载,不需要在另一个应用中加载. 2.实现代码 自定义限制注解 package mis.shared.annotation;import java.lang.annotation.ElementType; import java.lan…...

二维网格划分 LRU缓存设计

背景 有大量的二维矩形需要存储查看点在哪些矩形中给定一个矩形 查看与哪些矩阵相交项目背景与图形图像基本无关&#xff0c;只涉及大文件分块读取&#xff0c;所以不用实现游戏行业中的物理引擎 设计思路 使用空间划分算法&#xff1a;二维栅格将整个空间划分为多个小区域。…...

C++中使用 sizeof 确定变量的长度

C中使用 sizeof 确定变量的长度 变量长度指的是程序员声明变量时&#xff0c;编译器将预留多少内存&#xff0c;用于存储赋给该变量的数据。变量的长度随类型而异&#xff0c; C 提供了一个方便的运算符——sizeof&#xff0c;可用于确定变量的长度&#xff08;单位为字节&…...

我们的衣物收纳商品政策

本政策涵盖的衣物收纳商品 衣物收纳商品是指带有抽屉或铰链门的家具商品&#xff0c;用于存放衣物。此政策适用于独立式衣物收纳商品&#xff0c;包括但不限于高度为 27 英寸&#xff08;69 厘米或 686 毫米&#xff09;或更高&#xff08;从地面到商品顶部测量&#xff09;的…...

代码随想录算法训练营第25天| 第七章 回溯算法part02: leetcode 216、leetcode 17

Part I : 回溯算法基础 对回溯算法不清楚的可以参看前一篇&#xff1a;代码随想录算法训练营第24天| 第七章 回溯算法part01 理论基础、leetcode 77 Part II: 相关题目 Leetcode 216.组合总和III 解决问题&#xff1a;在数字1~9之间&#xff0c;找出k个数且它们的和为n从而…...

WebAPI文档与自动化测试

目录 1、控制器&#xff0c;项目属性里需要勾选输出Xml文档选项&#xff1a; 2、下载文档的网页数据 3、运行访问网址 4、接口测试&#xff1a; 5、批量测试&#xff1a; 6、微服务文档 总结&#xff1a; 本篇介绍框架的WebAPI文档与自动化测试 1、控制器&#xff0c;项…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...