Python Web应用开发之Flask框架——基础

一、前言

​在即将开启的 Flask 学习之旅中,为了能够顺利掌握并运用 Flask 进行 Web 开发,您需要具备一定的基础知识,同时了解相应的运行环境。

​需要你具备的知识:Python 编程语言、HTML、CSS、HTTP协议、数据库(如:MySQL、MongoDB)

​本文所使用的环境:操作系统Windows11专业版、解释器Python-3.13、集成开发环境PyCharm、浏览器Edge

二、基础部分

2.1 Flask安装

Pycharm中创建一个项目名为web_project,在Pycharm终端使用以下命令安装 Flask:

pip install flask

或者你也可以指定版本安装

pip install Flask==

替换为您想要安装的具体版本号,例如 1.1.2

2.2 第一个 Flask 应用

创建一个名为 app.py 的文件,编写以下代码:

from flask import Flask

# 创建 Flask 应用实例
app = Flask(__name__)

# 定义路由和视图函数
@app.route('/')
def hello_world():
    return 'Hello, World!'

# 运行应用
if __name__ == '__main__':
    app.run(debug=True)

1. 运行应用:

Pycharm运行上述代码,控制台输出如下图表示正常运行。
Python Web应用开发之Flask框架——基础_第1张图片

在浏览器中访问http://127.0.0.1:5000/,将执行hello_world()函数,你将浏览器中看到 Hello, World! 字样,或者你也可以直接点击上图中的蓝色链接进行访问。

2. 代码解释:

  • from flask import Flask:导入 Flask 类。
  • app = Flask(__name__):创建一个 Flask 应用实例,__name__ 是一个 Python 内建的变量,它的值取决于代码的执行方式。如果模块是作为主程序直接运行,__name__ 的值是 __main__ ;如果模块是被导入到其他模块中,__name__ 的值是模块的名称。将__name__传递给Flask构造函数有几个重要的用途:
    • 它帮助 Flask 确定应用的根路径,以便能够正确地查找模板和静态文件等资源。
    • 使得 Flask 能够根据当前模块所在的位置来配置一些相关的设置。

​通过创建这个 app 对象,后续可以使用它来定义路由、处理请求、设置配置等,从而构建完整的 Web 应用。

  • @app.route('/'):这是一个路由的装饰器,用于定义路由。将一个函数与指定的 URL 路径(在这个例子中是 / ,即网站的根路径)关联起来。当用户访问网站的根路径时,Flask 会调用被这个装饰器修饰的函数来处理请求,并返回相应的响应内容给用户。

  • def hello_world()::定义一个函数,该函数返回一个字符串 'Hello, World!',我们称这个由@app.route()装饰器修饰的函数为视图函数。

  • app.run(debug=True):用于启动 Flask 应用,debug=True 表示开启调试模式,有以下重要作用:

    1. 自动重新加载:当您修改了代码后,Flask 应用会自动重新加载,无需手动停止和重新启动服务,方便您在开发过程中快速看到代码修改的效果。
    2. 显示详细的错误信息:如果在运行过程中出现了错误,Flask 会在浏览器中显示详细的错误追踪信息,包括错误发生的位置和相关的代码上下文,这有助于您快速定位和解决问题。

如果你不想开启调试模式可以不用配置此参数,直接使用app.run()

三、 路由和视图函数

Flask 使用装饰器来定义路由,不同的路由可以对应不同的视图函数。以下是一个示例:

from flask import Flask

app = Flask(__name__)

# 定义根路径的视图函数
@app.route('/')
def index():
    return 'This is the index page.'

# 定义/about 路径的视图函数
@app.route('/about')
def about():
    return 'This is the about page.'

if __name__ == '__main__':
    app.run(debug=True)

在这个示例中,访问 http://127.0.0.1:5000/ 会显示 This is the index page.,访问 http://127.0.0.1:5000/about 会显示 This is the about page.

3.1 动态路由

Flask 支持动态路由,允许在路由中使用变量。以下是一个示例:

from flask import Flask

app = Flask(__name__)

# 动态路由,接收一个名为 name 的参数
@app.route('/hello/')
def hello(name):
    return f'Hello, {
     name}!'

if __name__ == '__main__':
    app.run(debug=True)

在这个示例中,访问 http://127.0.0.1:5000/hello/John 会显示 Hello, John!

(1)动态路由还可以支持不同的数据类型:比如整数( )等,以满足不同的需求。常见支持的数据类型包括:

  • int :表示整数。

  • float :表示浮点数。

  • string :表示字符串(这是默认的数据类型,如果不指定,默认为字符串)。

  • path :类似于字符串,但可以包含斜杠 / (如:/file/)。请看以下示例:

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/file/')
    def show_file(file_path):
        return f'您请求的文件路径是: {
           file_path}'
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    ​ 在这个示例中,/file/ 是路由定义。当您访问类似于 /file/docs/folder1/file.txt 的 URL 时,docs/folder1/file.txt 都会被作为 file_path 的值传递给 show_file 函数。

(2)自定义转换器:除了内置的数据类型转换器,还可以创建自定义的转换器来满足特定的需求。

from flask import Flask
from werkzeug.routing import BaseConverter
# BaseConverter 类是用于创建自定义路由转换器的基类。

# 自定义转换器,只接受特定格式的手机号码(以 1 开头,后面跟 10 位数字)
class MobileConverter(BaseConverter):
    regex = r'1\d{10}'

app = Flask(__name__)

# 注册自定义转换器
app.url_map.converters['mobile'] = MobileConverter

@app.route('/user/')
def user_info(phone_number):
    return f'用户的手机号码是:{
     phone_number}'

if __name__ == '__main__':
    app.run(debug=True)

​在上述示例中,我们创建了一个名为 MobileConverter 的自定义转换器,它的正则表达式 r'1\d{10}' 用于匹配以 1 开头后面跟 10 位数字的手机号码。然后,我们将这个自定义转换器注册到 Flask 的应用中,并在路由中使用 mobile 类型的动态参数 phone_number 。当用户访问符合规则的 URL(例如 /user/13812345678)时,user_info 函数会被调用,并将匹配到的手机号码作为参数传递给 phone_number

  • app.url_map.converters['mobile'] = MobileConverter这行代码的主要目的是向 Flask 应用的 URL 映射的转换器集合中添加一个自定义的转换器,并为其指定了一个名称 'mobile'

具体来说,app.url_map.converters 是一个存储各种转换器的字典。当我们将 MobileConverter 赋值给 ['mobile'] 这个键时,就告诉 Flask :在解析路由时,如果遇到形如 的动态路由部分,就使用我们自定义的 MobileConverter 类来处理和转换这个部分的参数。

(3)多个动态参数:可以在一个路由中定义多个动态参数
示例:@app.route('/product//review/')

路由处理函数的参数顺序:当路由中有多个动态参数时,它们在处理函数中的参数顺序必须与在路由定义中的顺序一致。

from flask import Flask

app = Flask(__name__)

@app.route('/book//author//page/')
def book_info(book_name, author_name, page_number):
    return f'您正在查看书籍《{
     book_name}》,作者是 {
     author_name} ,当前页面是 {
     page_number}'

if __name__ == '__main__':
    app.run(debug=True)

在这个示例中,/book//author//page/ 定义了三个动态参数:book_name(字符串类型)、author_name(字符串类型)和 page_number(整数类型)。

​当您访问类似于 /book/The_Great_Gatsby/F.Scott_Fitzgerald/10 的 URL 时,book_info 函数会被调用,并且 book_name 的值为 'The_Great_Gatsby'author_name 的值为 'F.Scott_Fitzgerald'page_number 的值为 10

3.2 视图函数

在 Flask 中,视图函数是处理 HTTP 请求并返回响应的函数。视图函数通过 @app.route 装饰器与特定的 URL 路径关联起来。当用户访问对应的 URL 时,Flask 会调用相应的视图函数来生成响应。

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return '这是主页'

@app.route('/about')
def about():
    return '这是关于页面'

if __name__ == '__main__':
    app.run(debug = True)
  • 可以在函数的返回值中嵌入HTML标签,浏览器会自动解析标签。

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/login')
    def home():
        return '''
        	请输入用户名登录
            
    '''
    if __name__ == '__main__': app.run(debug = True)

四、请求和响应

4.1 请求处理

1. 请求方法

  • 常见的请求方法:

    • GET:用于从服务器获取资源,通常用于查询操作,不会对服务器上的数据进行修改。它将请求参数附加在 URL 中,数据量有限,且不太安全。
    • POST:向服务器提交数据,常用于创建或更新资源。数据放在请求体中,更适合发送大量数据和敏感信息。
    • PUT:用于更新服务器上的资源,要求客户端提供完整的资源数据来替换服务器上的现有数据。
    • DELETE:用于删除服务器上的指定资源。
    • PATCH:对资源进行部分更新,只需提供要更改的部分数据。
    • HEAD:请求方法与 GET 类似,它们的主要区别在于 HEAD 请求只请求资源的首部(headers),而不请求资源的内容(body)。这种方法常用于检查资源是否存在、获取资源的缓存信息,或者在下载资源前先了解其基本属性。
    • OPTIONS:请求方法用于获取关于目标资源所支持的通信选项的信息。客户端可以使用 OPTIONS 请求来查询服务器,了解针对特定资源可以使用哪些 HTTP 方法(如 GETPOSTPUT 等),以及服务器支持的其他特性,如跨域资源共享(CORS)相关的信息。
  • 在 Flask 中处理:通过 request.method 获取当前请求使用的方法,在定义路由时可通过 methods 参数限定该路由允许的请求方法。

    from flask import Flask, request
    
    app = Flask(__name__)
    
    
    @app.route('/login', methods=['GET', 'POST'])
    def login():
        method = request.method
        if method == 'GET':
            return f"这是{
           method}请求" + '''
                


    '''
    elif method == 'POST': username = request.form.get('username') return f"这是{ username}发送的{ method}请求" if __name__ == '__main__': app.run(debug = True)
    • methods=['GET', 'POST']:指定该路由支持的请求方法,可以指定一个或同时指定多个。
    • request.form.get('username'):获取 POST 请求中表单数据的name = "username" 的字段。
    • 由于浏览器原生的表单提交只支持 GETPOST,对于其他请求方法,可以使用JavaScriptfetchAPIXMLHttpRequest对象来发送请求,这里不再给出示例。

2. 请求参数

  • GET 参数

    • 位置:包含在 URL 中,以键值对形式出现,如 ?param1 = value1¶m2 = value2
    • 获取方式:使用 request.args,它类似字典结构,通过 get 方法获取参数值,可设置默认值以防参数不存在。
  • POST 参数

    • 位置:通常位于请求体中,常见于表单提交场景。
    • 获取方式:使用 request.form,同样类似字典结构,通过 get 方法获取表单参数值。
    from flask import Flask, request
    
    app = Flask(__name__)
    
    @app.route('/login', methods=['GET', 'POST'])
    def login():
        if request.method == 'GET':
            # 获取GET请求中的请求参数
            name = request.args.get("name")
            age = request.args.get("age")
            return '''
                请输入用户名登录
                
    '''
    elif request.method == 'POST': # 获取POST请求表单中的数据 username = request.form.get('username') return f'{ username}用户已登录成功!!' if __name__ == '__main__': app.run(debug = True)
    • 使用浏览器访问http://127.0.0.1:5000/login?name=jone&age=30 便可获取到GET请求的参数。

3. 获取请求中的文件信息

在 Flask 应用中,使用request.files来获取上传的文件。每个上传的文件都被表示为一个FileStorage对象,该对象提供了保存文件等方法。

from flask import Flask, request

app = Flask(__name__)


@app.route('/upload', methods=['GET', 'POST'])
def login():
    method = request.method
    if method == 'GET':
        return '''
            



'''
elif method == 'POST': # 检查请求中是否包含名为file的文件部分。如果不存在,返回错误信息和状态码400(表示错误请求)。 if 'file' not in request.files: return '没有文件部分', 400 file = request.files['file'] # 通过获取文件名称判断否选择文件 if file.filename == '': return '没有选择文件', 400 if file: # 这里可以处理文件,例如保存到服务器.可以设置存放路径,没有设置默认项目目录下 file.save(file.filename) return '文件上传成功' if __name__ == '__main__': app.run(debug = True)

4. 请求头

包含关于请求的元数据,如客户端信息(User - Agent)、语言偏好(Accept - Language)、认证信息(Authorization)等。通过 request.headers 获取,它是类似字典的结构,可通过键获取对应的值。

  1. 获取单个请求头字段

    from flask import Flask, request
    
    app = Flask(__name__)
    
    
    @app.route('/headers')
    def get_headers():
        user_agent = request.headers.get('User-Agent')
        return f'你的客户端是: {
           user_agent}'
    
    
    if __name__ == '__main__':
        app.run(debug = True)
    
  2. 获取所有请求头

    from flask import Flask, request
    
    app = Flask(__name__)
    
    
    @app.route('/all_headers')
    def get_all_headers():
        headers = ""
        for key, value in request.headers.items():
            headers += f"{
           key}: {
           value}
    "
    return headers if __name__ == '__main__': app.run(debug=True)

5. 请求体

包含请求携带的数据,格式多样,如表单数据、JSON数据、XML数据或二进制数据等。使用 request.get_data() 方法获取原始字节数据,对于特定格式数据,有专门方法,如 request.get_json() 用于JSON数据。以下是一个使用HTML发送JSON数据,然后使用request.get_json()获取请求中JSON数据,然后返回响应数据仍以JSON格式返回的示例。

  • HTML:login.html
  DOCTYPE html>
  <html lang="zh-CN">
  
  <head>
      <meta charset="UTF-8">
      
      <meta name="viewport" content="width=device-width, initial-scale = 1.0">
      <title>登录页面title>
       
      <style>
          b

你可能感兴趣的:(Python,python,前端,flask)