开放原子软件部flask学习教程

LTOCY 2024-10-24 23:34:18

Flask基本操作


一、引言

Flask是一个轻量级的Web应用框架,由Python语言编写。它简单易学,功能强大,非常适合初学者快速搭建Web应用。

好,相信看了上面这个简短的介绍,诸位看官应该大概了解Flask是个啥玩意儿,但是又带着点小问题,比如……Web是个啥,我学这个玩意儿做什么。

不急哈,我们一点一点讲。

Web应用可以如下这般简单而没有太大偏差的理解:
我们在互联网上提供了一个路标(链接),然后用户通过这个路标访问我们的餐厅(网站),然后我们的厨师(服务器)根据这个用户的点单(用户请求)端上来食物(反馈视频等信息)

举例来说,今天我们去B站看点好康的,我们访问这个网址,于是我们就看到了好多好多个视频呈现在我们面前,然后点击视频我们就会跳转到对应的视频界面,然后看好康的视频。

这些路标(链接)就被称作路由,我们这些网民就通过这些路由访问B站,在我们点击某个视频时,我们就向B站的服务器发送了看视频的请求,于是服务器响应,就反馈了这个视频给我们。

而在这个过程中,B站呈现的那个很多视频的界面,包括看视频的界面可以被划为前端,而点击后发送请求到服务器,服务器如何处理这个请求并返回什么数据,就被称作后端

FLask就是一种轻量级的服务器后端框架。

应该讲得很清楚了吧……

那为什么要学这个东西呢?

那当然是因为Flask太好上手,所以在早期项目实践中很适合用来积攒项目经验,相对的会有功能更为完整,结构更为庞大的应用框架,其名为Django,如果诸位觉得想整点猛的,又感兴趣,可以自行寻找相关资料,欢迎诸位的资料补充。

在一切开始之前,本文强调,本文尽可能整理在项目开发中,FLask最基本的最常用的使用操作,其根本目的在于运用它在项目开发中能够完成基本任务。因此,本文不涉及原理部分,也不涉及更高级的复杂操作及工程管理部分的内容。

因为在学生社团中的小项目的开发中,复杂操作用到的很少。就算真的要用到,要学会撬动身边一切资源帮助自己进行项目开发,现在都什么年代了,AI写好代码后你再去看去学不香吗?为什么还要费尽心思去从原理到理论操作到实际使用一步步走呢,这玩意儿考试吗?

至于以后要用?那就以后再说。如果你想卷,深入学习需要的时间成本即使是大一都负担不起。等你真的想钻研的时候,再从头到尾捋下一遍也不迟。

而当我们的目的是应用的时候,我们就应该调低标准,会用,能实现功能,效率高就行。

而本文的主要内容围绕着如何构建一个完整的从前端到后端的回路,包括前端发送GET或POST请求到服务器,而后服务器根据需要决定是否进行重定向,同时返回不同类型的数据作为后续。

到此还不够,前端后端分不开,后端和数据库更是分不开,因此还会有一篇数据库的教程,以及一篇如何通过Flask操作数据库的教程。而关于Flask还有一篇拓展的内容,若感兴趣想学可以,不做要求。

差点忘了,还有一篇通过Postman调试后端程序的简短教程,不想重复造轮子的我应该会找一篇代劳。

学成之后,就具备了做项目后端开发的基本中的基本的素养,为了检验学习效果,最后我会出两道简单的小任务,需要注意的是,这种小任务在项目开发中就是一个简单模块的开发,项目开发实际上就是这样一个个模块叠加而已,模块设计,开发,优化,无非如此。

因此不应却步,若有什么想做的项目或者idea,就应该尝试。

接下来我们说点环境配置的事。

二、环境配置

​这有经验的老登都知道,装好环境,你的项目就成功了一半。虽然有点夸张,但是正常开发一个模块最多就一周,而你配环境很有可能就配了一周……

不过FLask还是比较友好的。

首先,打开你的pycharm。如果你没有,欢迎出门左转骚扰算法组组长,让他把方向,路径以及资料给你。
最起码要了解环境在哪里看,新项目在哪里开,如何在环境里面添加新的库。

回到正题哈。
在配置环境之前,我个人建议,你开一个新的项目。

img

配一个新的环境,这样你的环境就不会很混乱,到时候你不想要了你就可以直接把这一整个项目文件夹端掉,简单省事。

你当然也可以直接在最初始,你现在用的那个环境继续往里加东西,就是会越来越臃肿,以及混乱。

虽然基本每个干开发的人都会走这一步弯路,就是说……咱也不用在这种奇妙的地方这么有仪式感对吧?

另:不想看中文就装英文插件哈(胡言乱语.jpg)

img

文件路径就不教了,文件存储在哪里而已,不懂的就自己点进去看看不就好了。
新环境的配置模式,当前选的这个叫做虚拟环境,可以简单理解为,我把原本的环境复制了一份放在这个项目文件夹里,然后你在这个项目文件夹里怎么造随你,不影响存放在原本文件夹的基本环境。

而根据环境守恒定律,你要复制一个环境你要先有一个环境。
(胡言乱语.jpg)

如果你玩过Python,你们电脑里肯定有这么个Base interpreter,自己去找,自己装的东西自己找不到就很难绷了……

如果你真的没有,那就先去Python的官网下载一个吧,3.10左右的版本都够用,没什么讲究。

开好了我们来到Setting部分,不知道在哪里的就在上面的扩展栏多翻翻。
找到你的项目,就是Project:<你取的名字>

里面有个Python interpreter的东西,点进去,你会看到一个新的界面,右边一堆有点熟悉又有点陌生的字母。这个界面就是你当前环境里面有的库,看到加减号了吧,那就是增删环境用的。

加号进去,搜索框直接搜FLask,Install就好

如果要装的东西比较多,可以一个一个装,也可以去找相关的教程,里面应该会有一个项目环境包,叫做requirements,直接pip install它环境就全部装上了。
这里不教,想了解的自己去查,去问AI,或者去摇人,就是你摇人要看别人心情,求人不如求己。

你要是会也可以直接在终端pip install flask,要是你们算法组组长没教,也一样,自己找资料去学,不难的。

装好了对吧,接下来就正式学习吧。

三、Flask基础应用

我希望你们还没忘记Flask是干什么的,如果忘了……啧。

我们在互联网上提供了一个路标(链接),然后用户通过这个路标访问我们的餐厅(网站),然后我们的厨师(服务器)根据这个用户的点单(用户请求)端上来食物(反馈视频等信息)

**这些路标(链接)就被称作路由,我们这些网民就通过这些路由访问B站,在我们点击某个视频时,我们就向B站的服务器发送了看视频的请求,于是服务器响应,就反馈了这个视频给我们。
**

而在这个过程中,B站呈现的那个很多视频的界面,包括看视频的界面可以被划为前端,而点击后发送请求到服务器,服务器如何处理这个请求并返回什么数据,就被称作后端

FLask就是一种轻量级的服务器后端框架。

根据前面前言说的那部分,我就直接上车轱辘话了。

1) 路由route的创建

  1. 路由:路由是指用户请求的URL与视图函数之间的映射关系。当用户访问某个URL时,Flask会根据路由规则调用相应的视图函数处理请求。

  2. 视图函数:视图函数是处理HTTP请求的函数,它返回响应数据。在Flask中,视图函数通常与路由绑定,用于处理特定的URL请求。

扯淡的听完了,看看这样清晰不?

img

好,让我们接着听车轱辘话吧。

以下是一个简单的示例,展示了如何创建路由:


from flask import Flask

# 创建Flask应用实例

app = Flask(__name__)

# 定义路由及对应的视图函数

@app.route('/')

def index():

    return 'Hello, Flask!'

@app.route('/hello')

def hello():

    return 'Hello, World!'

# 启动Flask应用

if __name__ == '__main__':

    app.run(debug=True)
  1. 首先,我们导入了Flask类。

  2. 创建了一个Flask应用实例,__name__是当前Python模块的名称。

  3. 使用@app.route装饰器定义了两个路由:

   - @app.route('/'):表示访问根目录(即网站首页)时,调用index视图函数。

   - @app.route('/hello'):表示访问/hello路径时,调用hello视图函数。

  1. index和hello视图函数分别返回了简单的字符串响应。

  2. 最后,通过app.run(debug=True)启动Flask应用,debug=True表示开启调试模式,方便开发过程中调试。

在Flask中,路由不仅可以指定URL规则,还可以指定允许的HTTP方法。默认情况下,路由只响应GET请求,但我们可以通过methods参数来指定视图函数可以响应的HTTP方法列表。

我觉得讲得很清晰了,至于什么叫创建了一个Flask应用实例,以及最后为什么启动Flask应用需要写这么个if,可以不用管,你就知道必须要写这么个东西就好了。若想知道,可以自己去查,然后写一份资料出来造福后世。

若你真去做了,真心感谢。

做一点简单的补充

当你自己去跑一遍上述代码的时候,你会发现输出里只有一堆莫名其妙的东西,以及一个网址。把网址扔到浏览器上,把你自己写的路由补上去,你就能看到他返回的典中典了。

什么叫把自己写的路由补上去?

网址复制好了的对不对?网址我用¥¥代替了,补好之后格式如下:
¥¥ /hello

再回去看自己写的路由(@app.route()),理解了吗?
只有一个 "/" 代表根目录,就是说你后面什么都不加访问进去就是hello,Flask

车轱辘话最大的问题有两个,一个是太正式,一个是不带承上启下的,逻辑链不清晰。

所以我多写点废话,还请别嫌我啰嗦(手动doge

当我们访问一个URL时,Flask就会启用这个路由绑定的视图函数,做出响应,于是我们看到了:

Hello,World~!

一般而言,我们向服务器发送请求,期待向服务器查询某些信息,这种被称作GET请求。上述的代码就是一个典型的处理GET请求的代码。

但是我们对服务器做出的请求可能也需要发送些东西,举例来说,我希望在服务器查到我的成绩,我需要在给它的查询请求中带上我的学号。

那GET请求可以传递参数吗?

可以,下面就会讲。但是它传递的数据量很小,而且很不安全,它会直接体现在你的URL上,容易导致信息泄露。(比如你的密码……

所以我们需要不同的请求方式来告诉服务器我们要传递的东西。
这就是HTTP方法。

HTTP方法

HTTP方法(也称为HTTP动词)是客户端和服务器之间交换请求时使用的方法。常见的HTTP方法包括:

- `GET`: 请求指定的页面信息,并返回实体主体。

- `POST`: 向指定资源提交数据进行处理请求(例如提交表单或上传文件)。

- `PUT`: 从客户端向服务器传送的数据取代指定的文档的内容。

- `DELETE`: 请求服务器删除指定的页面。

- `HEAD`: 类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头。

- `OPTIONS`: 允许客户端查看服务器的性能。

以下示例展示了如何在Flask中为同一个路由设置多个HTTP方法:

from flask import Flask, request

app = Flask(__name__)

@app.route('/example', methods=['GET', 'POST'])

def example():

    if request.method == 'GET':

        return 'This is a GET request.'

    elif request.method == 'POST':

        return 'This is a POST request.'

if __name__ == '__main__':

    app.run(debug=True)
- 代码说明

1. 在`@app.route`装饰器中,我们通过`methods`参数指定了`/example`路由可以响应`GET`和`POST`请求。

2. 在`example`视图函数中,我们使用`request.method`来判断请求的HTTP方法,并据此返回不同的响应。

 **注意**

- `methods`参数是一个列表,可以包含多个HTTP方法。

- 如果没有指定`methods`参数,默认只允许`GET`请求。

- 在视图函数中,可以通过`request.method`属性来获取当前请求的HTTP方法。

- 可以根据不同的HTTP方法在视图函数中实现不同的逻辑处理。

简单的补充

别看好像好多好多方法,实际应用中常用的只有GET和POST两个,而且由于我们一般不用GET传递参数,所以可以简单粗暴的理解为:

$GET就是向服务器要东西$
$POST就是向服务器传东西$

其他的记不住也没关系,用到再查就好。

以下就是GET请求传递参数的办法,能看懂代码就OK。

url内添加参数,关联的函数可接收参数

  • 路由参数:在Flask中,路由参数通常用尖括号<>包围,它们可以是动态的,并且会传递给视图函数。

  • 视图函数参数:在视图函数中,路由参数作为函数的参数传递,名称需要与路由中的参数名称匹配。

以下示例展示了如何在Flask路由中添加参数,并在视图函数中接收这些参数:


from flask import Flask

app = Flask(__name__)

@app.route('/greet/<name>')

def greet(name):

    return f'Hello, {name}!'

if __name__ == '__main__':

    app.run(debug=True)
  • 代码说明
  1. @app.route('/greet/<name>')中,<name>是一个路由参数。当用户访问类似/greet/John的URL时,John会被捕获并作为参数传递给greet函数。

  2. greet视图函数中,name参数就是从URL中捕获的值。

如果我们运行上面的代码,并访问http://127.0.0.1:5000/greet/John,浏览器将显示:Hello, John!

指定传参类型

  • 在路由参数中使用转换器来指定参数的类型,例如:

@app.route('/user/<int:user_id>')

def show_user_profile(user_id):

    # user_id 将被转换为整数

    return f'User profile page for user {user_id}'
  • Flask支持的转换器有:

  - string:默认的转换器,接受除了斜杠/之外的任何文本。

  - int:接受整数。

  - float:接受浮点数。

  - path:和默认的string相似,但可以包含斜杠/

接下来可以说是唯一的难点了(至少我觉得是.jpg

3) endpoint的使用

在Flask中,endpoint是一个内部的路由命名,它主要用于以下几个目的:

  1. URL反向生成:使用url_for函数可以根据endpoint的名称生成对应的URL。这在你需要在不同视图函数之间导航或在模板中生成链接时非常有用。

  2. 路由的唯一标识:URL可能会改变,但endpoint通常保持不变,因此它为视图函数提供了一个稳定的引用。

  3. 蓝图使用:在Flask蓝图中,endpoint可以帮助区分不同蓝图中的相同命名视图函数。**(选学内容)**

简单来说

endpoint就是我们自己在程序内部设定的某个视图函数的唯一标识,当我们需要从一个视图函数转到另一个视图函数时(比如注册完后跳转到登陆界面),我们就可以用url_for函数通过endpoint这一个唯一标识来redirect重定向实现。(重定向后面会讲)

URL反向生成

当使用url_for函数时,我们需要提供一个endpoint名称和可选的参数来生成对应的URL。例如:


from flask import Flask, url_for

app = Flask(__name__)

@app.route('/greet/<name>', endpoint='greet')

def greet(name):

    return f'Hello, {name}!'

# 使用endpoint生成URL

with app.test_request_context():

    print(url_for('greet', name='John'))  # 输出: /greet/John

在这个例子中,尽管我们定义了路由/greet/<name>,但我们通过设置endpoint='greet'为这个路由指定了一个endpoint名称。这样,即使URL改变了,我们仍然可以通过url_for('greet', name='John')来生成正确的URL。

路由的唯一标识

在Flask中,每个视图函数默认的endpoint名称就是函数名。如果我们有多个视图函数,并且它们有相同的名字,这就会导致冲突。可以通过显式设置endpoint避免:


@app.route('/view1', endpoint='view_1')

def view():

    return 'View 1'

@app.route('/view2', endpoint='view_2')

def view():

    return 'View 2'
  1. @app.route('/view1', endpoint='view_1'):

   - @app.route是一个装饰器,它告诉Flask当用户访问指定的URL时应该调用哪个函数。

   - 'view1' 是URL规则,它定义了用户需要访问的路径。在这个例子中,用户需要访问/view1来触发相应的视图函数。

   - endpoint='view_1' 是一个可选参数,它为这个路由设置了一个端点名称。端点名称用于构建URL(例如,使用url_for函数)或者在蓝图内部引用视图函数。如果不指定,Flask会默认使用视图函数的名称作为端点。

  1. @app.route('/view2', endpoint='view_2'):

   - 同样,这个装饰器将另一个URL规则'view2'绑定到同一个视图函数上。用户访问/view2时,也会调用这个视图函数。

   - endpoint='view_2' 为这个路由设置了另一个端点名称。

  1. 视图函数 def view()::

   - 函数返回一个字符串 'View 1''View 2',这取决于访问的是哪个URL。但是,两个装饰器都指向了同一个视图函数,这意味着不管用户访问/view1还是/view2,返回的字符串都将是最后一行定义的 'View 2'

   - 这就出现问题了:在Flask中,不能有两个具有相同名称的视图函数。当,两个装饰器都指向了名为view的函数,而第二个装饰器会覆盖第一个装饰器。前面的代码只是举例说明这种唯一标识的作用,而正常且正确的做法如下:


@app.route('/view1', endpoint='view_1')

def view_1():

    return 'View 1'

@app.route('/view2', endpoint='view_2')

def view_2():

    return 'View 2'

现在,每个路由都有自己独立的视图函数view_1view_2,它们分别返回不同的字符串。

我们可以先消化一下目前学了什么

我们现在知道了怎么设置一个让用户访问的路由,以及用户向服务器请求的各种方法,并对其进行限定。
那么好,我们要怎么拿到前端向我们传递过来的POST请求中的参数呢?
所以下面就是讲这个的。

3) request对象的使用

  1. request对象的属性

   - form:包含表单数据(POST请求)的MultiDict。

   - args:包含查询字符串参数的MultiDict(GET请求)。

   - values:结合了formargs的参数。

   - data:包含请求体的原始数据。

   - json:如果请求的MIME类型是application/json,这个属性将包含解析后的JSON数据。

   - method:当前请求的HTTP方法。

   - url:完整的请求URL。

   - base_url:不包含查询字符串的请求URL。

   - path:请求的路径部分。

   - headers:请求的HTTP头部信息。

   - cookies:请求的cookies。

   - files:包含上传文件的字典。

  1. 处理请求数据

   - 当处理表单数据或JSON数据时,通常需要验证和清理数据以防止注入攻击。(可以不管.jpg

  1. 文件上传

   - Flask处理文件上传时,确保检查文件是否存在,并且文件名不为空。(可以不管.jpg

老样子

看着挺多,常用的挺少的,后面有需要再查就是。
当前来说,会用表单和json就可以了。
代码会看,会查就OK。
次一等常用的都在下面了。

术语/概念英文描述/示例
表单formHTTP传进来就这种
字符串参数args(GET请求GET请求中URL的查询字符串部分,用于传递参数。例如:?name=John&age=30
原数据data原始数据,可以是任何类型的数据。常用于微信小程序传递数据。
JSONjsonJavaScript Object Notation,一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。常用于数据传输。格式:{"name": "John", "age": 30}
类似于python的字典,其他很多的数据都用这种,很方便。
常用于微信小程序传递数据。

1. 获取表单数据


from flask import Flask, request

app = Flask(__name__)

@app.route('/submit', methods=['POST'])

def submit():

    # 获取表单数据

    username = request.form['username']

    password = request.form['password']

    # 假设进行一些处理,比如验证用户名和密码

    # ...

    return f'Username: {username}, Password: {password}'

2. 获取查询字符串参数


@app.route('/search')

def search():

    query = request.args.get('q', ''# 获取查询参数q,如果没有则返回空字符串

    return f'Search results for: {query}'

3. 获取JSON数据


from flask import jsonify

@app.route('/api/data', methods=['POST'])

def get_json_data():

    data = request.get_json()

    if not data:

        return jsonify({'error': 'No JSON data provided'}), 400

    # 假设data是一个字典,包含一些键值对

    name = data.get('name')

    age = data.get('age')

    return jsonify({'name': name, 'age': age})

4. 访问请求的元数据


from flask import Flask, request, jsonify  
  
app = Flask(__name__)  
  
@app.route('/rawdata', methods=['POST'])  
def raw_data_example():  
    # 获取原始的请求体数据(字节串)  
    raw_data = request.data  
      
    # 假设请求体是文本数据,并且我们知道它是UTF-8编码的  
    # 我们将其解码为字符串  
    try:  
        text_data = raw_data.decode('utf-8')  
    except UnicodeDecodeError:  
        # 如果解码失败,返回错误响应  
        return jsonify({"error": "Invalid UTF-8 encoding in request body"}), 400  
      
    # 在这里,我们可以对文本数据进行任何我们想要的处理  
    # 但在这个简单的例子中,我们只是将其返回给客户端  
      
    # 为了演示,我们将文本数据包装在一个JSON响应中  
    response = {  
        "received_text": text_data  
    }  
      
    return jsonify(response)

5. 处理文件上传(选学


@app.route('/upload', methods=['POST'])

def upload_file():

    if 'file' not in request.files:

        return 'No file part'

    file = request.files['file']

    if file.filename == '':

        return 'No selected file'

    if file:

        filename = secure_filename(file.filename)

        file.save(os.path.join('/path/to/the/uploads', filename))

        return 'File successfully uploaded'

在使用上述代码示例时,请确保你已经设置了上传文件夹的路径,并且导入了secure_filename函数,它可以帮助你安全地处理文件名。


from flask import Flask, request

from werkzeug.utils import secure_filename

import os

4) redirect重定向

在Flask中,redirect 函数用于重定向客户端到另一个URL或端点。当我们想要在处理完某个请求后让用户跳转到另一个页面时,这个函数非常有用。

举例来说,用户注册完我就要给他跳转到登录界面,这就是一种重定向。
前面url_for()只是生成一个url,而重定向redirect正好就需要告诉他一个url去跳转到指定的视图函数
示例代码:


from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route('/old_route')

def old_route():

    # 返回一个重定向响应,让用户跳转到新的路由

    return redirect(url_for('new_route'))

@app.route('/new_route')

def new_route():

    return 'This is the new route!'

if __name__ == '__main__':

    app.run(debug=True)

在这个例子中,当用户访问 /old_route 时,他们会被重定向到 /new_route

以下是使用 redirect 函数时需要注意的一些点:

  • url_for 函数用于生成URL,通常与 redirect 函数一起使用。它接受视图函数名作为参数,并返回对应的URL路径。

  • redirect 函数接受一个URL或端点作为参数。如果你传递一个端点,那么通常你会先使用 url_for 函数来生成URL。

  • 重定向通常返回一个302状态码,表示临时重定向。如果你想要返回一个永久重定向,可以使用 permanent=True 参数,这将返回一个301状态码。

下面是一个使用 redirect 函数进行重定向的例子,包括永久重定向:


from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route('/old_page')

def old_page():

    # 永久重定向到新的页面

    return redirect(url_for('new_page'), code=301)

@app.route('/new_page')

def new_page():

    return 'Welcome to the new page!'

if __name__ == '__main__':

    app.run(debug=True)

在这个例子中,当用户访问 /old_page 时,他们会被永久重定向到 /new_page

5) 返回json数据给前端

在Flask中,返回JSON数据给前端是非常常见的操作。我们可以使用flask模块中的jsonify函数来将字典转换为JSON格式的响应。以下是一个简单的例子,展示如何在Flask应用中返回JSON数据:


from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/api/data')

def get_data():

    # 假设这是从数据库或其他地方获取的数据

    data = {

        'name': 'Alice',

        'age': 30,

        'city': 'New York'

    }

    # 使用 jsonify 将数据转换为 JSON 响应

    return jsonify(data)

if __name__ == '__main__':

    app.run(debug=True)

在这个例子中,当用户访问 /api/data 路由时,服务器将返回一个JSON格式的响应,包含一个简单的用户数据字典。

jsonify 函数会自动设置正确的Content-Type头部为application/json,并且会将字典转换为一个JSON格式的字符串。

(选学)

如果想要返回更复杂的JSON响应,比如包含状态码或者头部信息,可以使用make_response函数:


from flask import Flask, jsonify, make_response

app = Flask(__name__)

@app.route('/api/data')

def get_data():

    data = {

        'name': 'Alice',

        'age': 30,

        'city': 'New York'

    }

    # 创建响应对象

    response = make_response(jsonify(data))

    # 可以设置额外的响应头

    response.headers['Custom-Header'] = 'Value'

    # 设置HTTP状态码

    response.status_code = 201

    return response

if __name__ == '__main__':

    app.run(debug=True)

在这个例子中,我们使用make_response来创建一个响应对象,然后可以设置额外的头部信息和状态码。当返回response对象时,Flask会将其作为HTTP响应发送给客户端。

简单的补充

return可以返回的对象包括python支持的所有数据类型,数字,字符串,列表,字典都可以,json格式就通过上述实现就好了,实在不知道怎么搞就问AI

6) abort函数

在Flask中,abort 函数用于立即终止请求并返回一个错误响应给客户端。你可以指定一个HTTP状态码来告诉客户端发生了什么错误。

基础使用


from flask import Flask, abort

app = Flask(__name__)

@app.route('/users/<int:user_id>')

def get_user(user_id):

    user = find_user_by_id(user_id)

    if user is None:

        # 如果用户不存在,则终止请求并返回404错误

        abort(404)

    return jsonify(user)

def find_user_by_id(user_id):

    # 这里是查找用户的逻辑,为了示例,我们假设用户不存在

    return None

if __name__ == '__main__':

    app.run(debug=True)

在这个例子中,如果find_user_by_id函数没有找到对应的用户,abort(404)会被调用,这将立即终止请求并返回一个404 Not Found错误。

简单来说就是一个break,带上一个报错码

自定义错误响应

我们也可以自定义错误响应,这样当abort被调用时,可以返回一个自定义的响应而不是默认的Flask错误页面。


from flask import Flask, abort, jsonify

app = Flask(__name__)

@app.errorhandler(404)

def not_found(error):

    return jsonify({'error': 'Not found'}), 404

@app.route('/users/<int:user_id>')

def get_user(user_id):

    user = find_user_by_id(user_id)

    if user is None:

        abort(404)

    return jsonify(user)

# 其他代码保持不变...

在这个例子中,我们定义了一个错误处理器not_found,当abort(404)被调用时,这个处理器会被执行,并返回一个自定义的JSON响应。

使用自定义错误码

也可以使用Flask不预先定义的错误码:


@app.route('/forbidden')

def forbidden_action():

    abort(418# I'm a teapot

在这个例子中,我们使用了一个HTTP状态码418,它是一个HTTP扩展状态码,通常用于表明服务器拒绝泡茶。

需要注意的是,使用abort函数后,之后的代码将不会被执行,因为请求已经被终止。因此,确保abort调用之后没有重要的清理或逻辑代码。

7) url_for实现反转(选学

在Flask中,url_for 函数是一个用于生成URL的助手函数,它允许你通过视图函数的名称(endpoint)来生成对应的URL,而不需要硬编码URL。这个过程通常被称为“反转”,因为它将视图函数的名称反转回URL路径。

  1. 定义一个视图函数,并使用 @app.route 装饰器为它指定一个路由。

  2. 在模板或另一个视图函数中,使用 url_for 函数并传入视图函数的名称(endpoint)作为第一个参数。

  3. url_for 可以接受关键字参数,这些参数对应于路由中的变量部分。

示例代码:


from flask import Flask, url_for

app = Flask(__name__)

@app.route('/')

def index():

    return 'Hello, World!'

@app.route('/user/<int:user_id>')

def user_profile(user_id):

    return f'Profile page of user {user_id}'

@app.route('/posts/<int:post_id>')

def show_post(post_id):

    # 假设我们想要链接到用户 profile 页面

    user_profile_url = url_for('user_profile', user_id=123)

    return f'Post {post_id}, see also: {user_profile_url}'

if __name__ == '__main__':

    app.run(debug=True)

在这个例子中,url_for('user_profile', user_id=123) 会生成URL /user/123,这是 user_profile 视图函数对应的URL,其中 user_id 是路由中的变量部分。

如果你在模板中使用 url_for,它看起来是这样的:


<!-- 假设这是user.html模板 -->

<a href="{{ url_for('user_profile', user_id=user.id) }}">View Profile</a>

这里的 user.id 是一个变量,它将被替换为用户的实际ID,以生成正确的URL。

url_for 的好处是,如果改变了路由的路径,我们不需要去更新所有的链接,只需要更新路由装饰器即可。url_for 会自动处理这些变化,确保生成的URL始终是正确的。

但记住url_for只是用来生成url的,你要重定向还是做别的事情就根据你的需求,要注意把前面的知识结合起来,不要光学理论。

到现在,我们应该能理解前端到后端的这一整个交互的流程,以及如何处理前段传递的请求,返回特定类型的数据作为响应。自己回忆一下整个流程,哪里很模糊就回去看看,后面项目开发哪里不清楚了就问AI,AI总比我讲的详细且全面。

后续还有数据库的一篇,以及用Flask操作数据库的一篇,记得去看。

...全文
673 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

40

社区成员

发帖
与我相关
我的任务
社区描述
开放原子开源深大社团,致力于推动开源文化普及,培育和发掘开源人才,繁荣校园开源生态。
harmonyos经验分享 高校 广东省·深圳市
社区管理员
  • 趴抖
  • 辰风已久
  • num_19
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧