本文将详细探讨Python Flask Web服务。我将首先简单介绍Flask,然后将逐步进入Flask中的路由、模板、表单处理以及数据库集成等高级概念,目标是能够让大家了解并掌握使用Flask来创建动态Web应用的技巧。

1. Flask简介

Flask是一个轻量级的Web服务器网关接口(WSGI)web应用框架。它被设计为易于使用,同时也提供了扩展性,用户可以自由地选择将其与哪些第三方库集成。Flask是"微"框架,这意味着其核心功能非常有限,但可以通过一系列的扩展来增强功能。

让我们来看一下如何创建一个简单的Flask应用。

from flask import Flask
app = Flask(__name__) @app.route('/')
def hello_world():
return 'Hello, World!' if __name__ == '__main__':
app.run()

在这段代码中,我们首先导入Flask模块,并创建一个Flask web服务器实例。然后,我们定义了一个路由(route),即/。这个路由映射到一个函数hello_world,当用户访问这个URL时,它会返回'Hello, World!'字符串。

2. Flask路由

Flask通过提供装饰器app.route,使得定义路由变得简单易行。但你知道我们也可以通过app.add_url_rule方法直接添加路由吗?这种方式提供了更多的灵活性,例如,可以为路由添加不同的HTTP方法。

def hello():
return "Hello, World!" app.add_url_rule('/', 'hello', hello)

在上述代码中,app.add_url_rule的第一个参数是URL规则,第二个参数是函数的别名,第三个参数是要映射的函数。

3. Flask模板

Flask使用jinja2模板库。这个库非常强大,可以让你在HTML中嵌入Python代码。下面的例子展示了如何在Flask应用中使用模板:

from flask import render_template

@app.route('/hello/<name>')
def hello(name):
return render_template('hello.html', name=name)

render_template函数用于渲染一个模板。它接收模板的名称和一些模板变量作为参数,返回生成的HTML内容。在模板中,你可以使用{{ name }}来显示变量的值。

4. Flask表单处理

Flask-WTF是Flask中用于处理Web表单的扩展库。它基于WTF Python,一个处理表单数据的Python库。Flask-WTF还具有CSRF(跨站请求伪造)保护的功能。

让我们

看一个简单的例子:

from flask import request
from flask_wtf import FlaskForm
from wtforms import StringField class MyForm(FlaskForm):
name = StringField('name') @app.route('/submit', methods=('GET', 'POST'))
def submit():
form = MyForm()
if form.validate_on_submit():
return 'Hello, %s' % form.name.data
return render_template('submit.html', form=form)

在这个例子中,我们定义了一个表单类MyForm,包含一个name字段。然后,我们在submit路由中创建了一个该类的实例,并检查表单是否通过验证。如果表单有效,我们就返回一条欢迎信息;否则,我们就渲染一个表单模板。

5. Flask数据库集成

Flask-SQLAlchemy是一个为Flask应用提供SQLAlchemy支持的扩展库。SQLAlchemy是Python中的一种ORM(对象关系映射)工具,可以将类映射到数据库表。

from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app) class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False) def __repr__(self):
return '<User %r>' % self.username

在这个例子中,我们首先配置数据库的URL,然后创建一个SQLAlchemy实例。接着,我们定义一个User类,这个类继承自db.Model,并具有两个属性:idusername。这两个属性都是数据库表的列。

6.使用Flask构建RESTful API

当构建Web API时,Flask-RESTful是一个值得了解的扩展。它为快速创建REST API提供了简单的方法。你可以通过定义Python类来实现API资源,并将HTTP方法(如GET、POST)映射到类的方法。

from flask_restful import Resource, Api

api = Api(app)

class HelloWorld(Resource):
def get(self):
return {'hello': 'world'} api.add_resource(HelloWorld, '/')

在上述代码中,我们首先创建了一个Api对象,然后定义了一个资源类HelloWorld,并在这个类中实现了一个get方法。最后,我们使用api.add_resourceHelloWorld类绑定到/ URL。

7. Flask蓝图

Flask的蓝图功能让我们能够组织更大、更复杂的应用程序。你可以将蓝图视为Flask应用程序的一个子集,它可以拥有自己的路由、模板和静态文件。

下面是一个简单的例子:

from flask import Blueprint

simple_page = Blueprint('simple_page', __name__)

@simple_page.route('/<page>')
def show(page):
return 'Page %s' % page

在这个例子中,我们首先创建了一个名为simple_page的蓝图,然后为这个蓝图定义了一个路由show

8. Flask错误处理

Flask允许我们自定义错误处理函数,当特定的HTTP错误发生时,我们可以返回自定义的响应。以下是如何为404错误定义自定义处理函数的示例:

@app.errorhandler(404)
def page_not_found(error):
return 'This page does not exist', 404

在这个例子中,我们使用app.errorhandler装饰器注册一个新的错误处理函数。当404错误发生时,它将返回一个自定义的错误消息。

9. Flask请求钩子

Flask提供了几个装饰器,我们可以使用它们来注册在处理请求的不同阶段调用的函数。这些装饰器包括before_first_requestbefore_requestafter_requestteardown_request

@app.before_request
def before_request():
print("This is executed BEFORE each request.")

在这个例子中,before_request装饰器的函数将在每个请求之前执行。

10. Flask中的Cookies和Sessions

在Web开发中,我们常常需要存储用户的信息,例如用户的偏好设置或者登录状态。Flask提供了Cookies和Sessions两种方式来完成这个任务。

下面是如何在Flask中设置和读取cookie的例子:

@app.route('/set')
def setcookie():
resp = make_response('Setting cookie!')
resp.set_cookie('username', 'the username')
return resp @app.route('/get')
def getcookie():
username = request.cookies.get('username')
return 'The username is ' + username

在上述例子中,setcookie路由设置了一个cookie,名为usernamegetcookie路由读取并返回了这个cookie的值。

One more thing

Flask的测试客户端允许我们模拟向我们的应用发送请求,并查看响应。

def test_index():
client = app.test_client()
response = client.get('/')
assert response.status_code == 200

在上述代码中,我们首先创建了一个测试客户端。然后,我们使用这个客户端发送一个GET请求到/ URL,最后,我们检查响应的状态码是否为200。

这只是Flask强大功能的冰山一角,Flask的魅力远不止于此,它还有许多丰富的扩展,比如Flask-Login用于处理用户认证,Flask-Mail用于发送邮件,Flask-Migrate用于处理数据库迁移等等。

如有帮助,请多关注

个人微信公众号:【Python全视角】

TeahLead_KrisChang,10+年的互联网和人工智能从业经验,10年+技术和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。

Python Flask - 快速构建Web应用详解的更多相关文章

  1. JAVA Eclipse使用Maven构建web项目详解(SSM框架)

    tips: 启动项目后,welcome-file的链接即为测试用例 部署maven web项目 Eclipse使用Maven构建web项目详解 pom.xml添加webapp依赖: <depen ...

  2. Spark2.1.0——内置Web框架详解

    Spark2.1.0——内置Web框架详解 任何系统都需要提供监控功能,否则在运行期间发生一些异常时,我们将会束手无策.也许有人说,可以增加日志来解决这个问题.日志只能解决你的程序逻辑在运行期的监控, ...

  3. Python爬虫之selenium库使用详解

    Python爬虫之selenium库使用详解 本章内容如下: 什么是Selenium selenium基本使用 声明浏览器对象 访问页面 查找元素 多个元素查找 元素交互操作 交互动作 执行JavaS ...

  4. kafka实战教程(python操作kafka),kafka配置文件详解

    kafka实战教程(python操作kafka),kafka配置文件详解 应用往Kafka写数据的原因有很多:用户行为分析.日志存储.异步通信等.多样化的使用场景带来了多样化的需求:消息是否能丢失?是 ...

  5. eclipse里面构建maven项目详解(转载)

    本文来源于:http://my.oschina.net/u/1540325/blog/548530 eclipse里面构建maven项目详解 1       环境安装及分配 Maven是基于项目对象模 ...

  6. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  7. python 3.x 爬虫基础---Urllib详解

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 前言 爬虫也了解了一段时间了希望在半个月的时间内 ...

  8. 个人学期总结及Python+Flask+MysqL的web建设技术过程

    一个学期即将过去,我们也迎来了2018年.这个学期,首次接触了web网站开发建设,不仅是这门课程,还有另外一门用idea的gradle框架来制作网页. 很显然,用python语言的flask框架更加简 ...

  9. python设计模式之迭代器与生成器详解(五)

    前言 迭代器是设计模式中的一种行为模式,它提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示.python提倡使用生成器,生成器也是迭代器的一种. 系列文章 python设计模 ...

  10. python+requests接口自动化测试框架实例详解

    python+requests接口自动化测试框架实例详解   转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...

随机推荐

  1. 【python基础】五大数据类型及常用方法

    1. 数据类型概述 python中的字符串,列表,元组,字典,集合这五种数据类型均是可迭代的,可以使用for循环访问,涵盖了三类数据结构分别为序列.散列.集合. 序列: 字符串 str 列表 list ...

  2. 如何优雅的申请一个属于自己的ChatGPT账号

    前言 GPT-4是一种语言模型,是基于GPT-3推出的下一代自然语言处理模型.与之前的GPT模型一样,GPT-4是一种基于深度学习技术的神经网络模型,可以自动地生成人类水平的文本.回答问题.完成翻译任 ...

  3. Redis读书笔记(三)

    单机数据库的实现 Redis数据库 Redis数据库的实现 struct redisServer { //... //保存服务器中的所有数据库, 数组 redisDB *db; //服务器的数据库数量 ...

  4. php 中文地址伪静态,.htaccess实现含中文的url伪静态跳转

    Tags伪静态 RewriteRule ^tags.html/tags.php RewriteRule ^tags/(.)(??.))*.html$ tags.php?/$1 RewriteRule ...

  5. openwrt开发使用-arping

    前言 IP冲突引起的网络异常,可以通过检查IP是否冲突,排除故障.我们可以用一些工具进行检查,例如arp-scan.arping软件进行查看. 这里使用arping进行检查设备的MAC地址,通过查查看 ...

  6. CS144 计算机网络 Lab0:Networking Warmup

    前言 本科期间修读了<计算机网络>课程,但是课上布置的作业比较简单,只是分析了一下 Wireshark 抓包的结构,没有动手实现过协议.所以最近在哔哩大学在线学习了斯坦福大学的 CS144 ...

  7. 五天学会Deep Learning

    五天学完deep learning......是时候来证明chatGPT和new bing的能力了...... DAY1 Sigmoid function Sigmoid 函数是一种常用的激活函数,它 ...

  8. Nginx的负载均衡策略

    Nginx的负载均衡策略 个人博客地址: https://note.raokun.top 拥抱ChatGPT,国内访问网站:https://www.playchat.top 共六种: 轮询.权重.ip ...

  9. 当我第一次通过Kotlin和Compose来实现一个Canvas时, 我收获了什么?

    当我第一次通过Kotlin和Compose来实现一个Canvas时, 我收获了什么? 自从2019年Google推荐Kotlin为Android开发的首选语言以来已经经历了将近四年的时间, Compo ...

  10. SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘

    SpringBoot 集成 SpringSecurity + MySQL + JWT 无太多理论,直接盘 一般用于Web管理系统 可以先看 SpringBoot SpringSecurity 基于内存 ...