Python Flask - 快速构建Web应用详解-环球视讯
时间:2023-06-30 15:11:07来源:博客园

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


(相关资料图)

1. Flask简介

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

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

from flask import Flaskapp = 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/")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 requestfrom flask_wtf import FlaskFormfrom wtforms import StringFieldclass 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 SQLAlchemyapp.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 "" % 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, Apiapi = 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 Blueprintsimple_page = Blueprint("simple_page", __name__)@simple_page.route("/")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_requestdef 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应用详解-环球视讯

    本文将详细探讨PythonFlaskWeb服务。我将首先简单介绍Flask,然后将逐

  • 无房产证房子过户流程是什么?贷款房办理房产证流程是什么? 世界关注

    无房产证房子怎么贷款?无房产证房子怎么贷款没有房产证的房子,是

  • 雍正一共杀了几个兄弟?雍正叫什么名字?|热议

    雍正一共杀了几个兄弟?四个雍正杀了四个兄弟,老大,老二,老八和老九

  • 天天快播:最新通报:报告3例霍乱病例!如何预防?

    国家疾控局官方微信27日发布《2023年5月全国法定传染病疫情概况》:202

  • 小米3开箱评测(深度体验小米3怎么样)

    “小米,为发烧而生”的口号,一度炸了很多“米粉”。时至今日,小米手

  • 砚组词和拼音_砚组词有哪些

    1、砚组字:砚、砚池、端砚、砚坠、磨铁砚、书砚、纸墨笔砚、砚水。2、

  • 2023国债为什么不好卖了呀?买国债的十大坏处分别是什么?

    2023国债为什么不好卖了呀?1 利率下降:如果市场利率下降,那么较

  • 刘宏带队检查武陵源区燃气器具质量安全工作 天天头条

    红网时刻张家界6月27日讯(通讯员袁卫明龙中华屈江玲)为进一步吸取燃

  • 三阶魔方六面恢复口诀是啥?层先法还原法是怎样的?

    1、随意转出转出一个十字;2、①前右归位(上←右↑上→

  • 世界微头条丨降息提振有限 深圳二手房交易氛围平淡

    证券时报记者吴家明  作为降成本、稳需求的途径之一,房贷利率近期再

  • 高合需要撕掉“土豪”标签|热门看点

    郑州正弘城,有高合门店附近的其他车企销售告诉陆玖商业评论,有用户看

  • 央视新闻|“教育+数字化”来了 看这些学校做了哪些探索_天天快消息

    教育部日前在湖北武汉举行2023年全国教育数字化现场推进会,梳理总结国

  • 如何清理浏览器缓存?win7系统禁用wmiprvse.exe进程方法看这里

    如何清理浏览器缓存每次在别人的电脑或者其他地方或者关闭电脑前,

  • 加拿大温斯顿爵士邱吉尔中等学校是世界名校吗_加拿大温斯顿爵士邱吉尔中等学校_环球视点

    1、这个学校你可以详细咨询中科留学冯海清老师!。本文就为大家分享到这

  • 方正电机:因涉嫌信息披露违法违规,证监会决定对公司立案-精选

    金融界6月26日消息方正电机公告,因涉嫌信息披露违法违规,根据《中华

  • 长痘痘抹什么药膏(脸上长痘用什么药膏好)_今日热文

    脸上长痘用什么药膏好在选用药膏时要选择一些消炎抗菌的药膏,还可以选

  • 旅游
    • 环球百事通!特斯拉FSD入华传言不断 我们离放心松开方向盘还很远

    • 小鹰直播tv版apk下载 小鹰直播电视版下载到u盘|微资讯

    • 微软承认输掉“主机战争”:Xbox难以与竞争对手抗衡

    • 环球报道:推动品牌建设上台阶