8分钟

任务 4 后端代码展示及功能说明

任务目的

这一步会介绍实验中后端视图函数代码的构建,以及每一部分代码的具体功能。熟悉这一步后,学员可以熟悉腾讯云API的调用,熟悉Flask项目中前端数据的接收与处理,能够基于Flask独立完成Web项目的设计与开发。

任务步骤

1.后端代码展示

(1)后端功能文件说明

本实验中主要涉及到三个后端文件,它们共同组成了图像质量分析的后端操作环境。各文件的主要功能如下:

文件名

文件功能

app.py

项目主程序。用于运行Web服务器、实现主页展示和图像分析的功能。

image_tools.py

图像处理模块。用于将上传的图片转换成Base64编码,同时也负责调用图像质量评估的API。

config.py

项目相关的配置信息。此实验中仅包含腾讯云的个人密钥,也是学员需要手动配置的部分。

注:下方的代码已经包含在配置好的项目目录中,此处仅用于功能说明,学员无需再粘贴项目代码。

(2)文件内部代码展示。

app.py文件代码展示:

# flask模块用于实现简单的web服务项目
from flask import Flask, render_template, request
import image_tools
# 创建一个程序实例
app = Flask(__name__)


# ---实现主页展示功能---
@app.route('/')
def index():
    # 展示渲染后的主页模板文件
    return render_template('index.html')
# ---实现主页展示功能---


# ---实现图像分析功能---
@app.route('/get_assess_quality', methods=["POST"])
def image_handle():
    # 获取传递的url地址
    handle_type = request.values.get("type")
    if handle_type == "img_url":
        # 处理URL链接
        img_url_path = request.values.get("img_url_path")
        data = image_tools.get_assess_quality(image_url=img_url_path)
    elif request.files.get("img_file"):
        # 处理上传的图片文件
        img_file_data = request.files.get("img_file").read()
        base64_data = image_tools.image_to_base64(img_file_data)
        data = image_tools.get_assess_quality(image_base64=base64_data)
    return data
# ---实现图像分析功能---


if __name__ == "__main__":
    # 定义监听host为0.0.0.0,表示此服务可以被外部网络访问
    # 默认监听端口为5000
    app.run(host="0.0.0.0")

image_tools.py文件代码展示:

# 导入相关模块
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.tiia.v20190529 import tiia_client, models
import base64
# 导入配置文件
from config import *


# ---实现图片文件的Base64转码---
def image_to_base64(file):
    """将图像转码为Base64编码"""
    base64_data = base64.b64encode(file).decode(encoding="utf-8")
    return base64_data
# ---实现图片文件的Base64转码---


# ---调用图像质量评估API---
def get_assess_quality(image_url="", image_base64=""):
    """调用图像质量评估API"""
    img_params = '{"ImageUrl":"%s"}'% image_url if image_url != "" else '{"ImageBase64":"%s"}' % image_base64
    try:
        cred = credential.Credential(secret_id, secret_key)  # 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
                                                             # 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
        httpProfile = HttpProfile()
        httpProfile.endpoint = "tiia.tencentcloudapi.com"
        clientProfile = ClientProfile()
        # 手动指定签名方法为——TC3-HMAC-SHA256
        # 否则将会报错:
        # code:AuthFailure.SignatureFailure message:由于请求包大小超过限制,请求签名验证失败,请使用新的签名方法 `TC3-HMAC-SHA256`。
        clientProfile.signMethod = "TC3-HMAC-SHA256"
        clientProfile.httpProfile = httpProfile
        client = tiia_client.TiiaClient(cred, region, clientProfile)
        req = models.AssessQualityRequest()
        params = img_params
        req.from_json_string(params)
        resp = client.AssessQuality(req)
        return resp.to_json_string()
    except TencentCloudSDKException as err:
        print(err)
# ---调用图像质量评估API---

config.py文件代码展示:

# 请将下方信息替换为腾讯云的个人密钥
secret_id = "此处替换为腾讯云SecretId"    # 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
secret_key = "此处替换为腾讯云SecretKey"  # 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
# 如有需要,可以手动替换下方的所属地域
region = "ap-guangzhou"

不同于另外两个文件,config.py文件主要用于存储项目中的配置参数。

接下来会具体介绍后端各部分的代码功能。

2.后端代码功能说明

在这一部分中,会以文件为单位,但文件中包含的功能代码与函数进行介绍。

注:config.py文件的介绍于配置信息的获取,会单独在 3.完善应用配置 这一部分单独介绍。

(1)app.py代码说明。

文件中首先进行了项目的准备工作:

# flask模块用于实现简单的web服务项目
from flask import Flask, render_template, request
import image_tools
# 创建一个程序实例
app = Flask(__name__)

这一步导入了程序中需要用到的模块,同时通过代码app = Flask(__name__)创建了一个程序实例,其中的参数__name__表示本程序的主模块为本文件的文件名。

接下来通过index函数实现了主页的展示功能:

@app.route('/')
def index():
    # 展示渲染后的主页模板文件
    return render_template('index.html')

其中@app.route('/')是一个路由装饰器,将地址/与函数index绑定在一起,即当用户访问程序的根目录时,会自动执行index函数。

index函数中只包含一行代码return render_template('index.html'),其作用是返回index.html模板文件,作为请求的响应内容。也就是说当用户请求了地址/,最终会展示出模板页面上的内容,也就是本项目中构建的前端页面。

render_template函数可以向模板中传递变量,将对应的变量名和变量值以键值的形式添加到参数中即可。本项目中没有向模板中传递变量,所以参数中只有模板文件一个参数。

注:模板文件需要放置在名为templates的文件夹下,Flask会在此文件夹内寻找模板。

下一个函数是image_handle函数,此函数用于实现图像分析功能:

@app.route('/get_assess_quality', methods=["POST"])
def image_handle():
    # 获取传递的url地址
    handle_type = request.values.get("type")
    if handle_type == "img_url":
        # 处理URL链接
        img_url_path = request.values.get("img_url_path")
        data = image_tools.get_assess_quality(image_url=img_url_path)
    elif request.files.get("img_file"):
        # 处理上传的图片文件
        img_file_data = request.files.get("img_file").read()
        base64_data = image_tools.image_to_base64(img_file_data)
        data = image_tools.get_assess_quality(image_base64=base64_data)
    return data

类似上方的路由装饰器,此处的装饰器将地址get_assess_quality与函数image_handle绑定在一起。参数methods=["POST"]表示此函数接收POST类型的请求。

函数get_assess_quality主要用于进行接收数据的判断。如果接收到的参数是图片的URL地址,会直接调用image_tools模块中的get_assess_quality函数(下方会详细介绍此函数)获取图片数据(传递参数img_url_path,即图片的URL地址);如果接收到的参数是上传的图片文件,则会先调用image_tools模块中的image_to_base64函数将图片文件转换为Base64编码,再调用get_assess_quality函数获取图片数据(传递参数base64_data,即图片转换后的Base64编码)。

无论是对那种方式的数据进行处理,最终都会将接收到的处理结果返回给前端页面。

此文件中最后一部分的代码为:

if __name__ == "__main__":
    # 定义监听host为0.0.0.0,表示此服务可以被外部网络访问
    # 默认监听端口为5000
    app.run(host="0.0.0.0")

其中if __name__ == "__main__":会判断当前文件的执行状态,如果当前文件作为脚本执行,下方的代码才会被执行;app.run(host="0.0.0.0")会启动Flask集成的Web服务器,此处设置host值为0.0.0.0表示此服务可以被外部网络访问。

(2)image_tools.py代码说明。

在此文件中,首先需要导入运行下方函数所需的模块及配置文件:

# 导入相关模块
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.tiia.v20190529 import tiia_client, models
import base64
# 导入配置文件
from config import *

其中import base64是为了将图片文件转换成Base64编码,from config import *是为了从config模块导入配置参数。剩余代码为调用腾讯云图片分析API需要用到的模块,通过API 3.0 Explorer页面的【代码生成】功能获取。关于这一部分的详细信息可以参考 任务2 图像分析介绍及API调用API 3.0 Explorer说明 这一部分的内容。

本文件中的第一个函数image_to_base64用于将图片转码为Base64编码:

def image_to_base64(file):
    """将图像转码为Base64编码"""
    base64_data = base64.b64encode(file).decode(encoding="utf-8")
    return base64_data

此处接收的参数file为读取的图片文件内容,返回的结果为转码后的Base64编码。

第二个函数get_assess_quality用于调用图像质量评估的API,并获取返回的评估数据:

def get_assess_quality(image_url="", image_base64=""):
    """调用图像质量评估API"""
    img_params = '{"ImageUrl":"%s"}'% image_url if image_url != "" else '{"ImageBase64":"%s"}' % image_base64
    try:
        cred = credential.Credential(secret_id, secret_key)  # 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
                                                             # 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
        httpProfile = HttpProfile()
        httpProfile.endpoint = "tiia.tencentcloudapi.com"
        clientProfile = ClientProfile()
        # 手动指定签名方法为——TC3-HMAC-SHA256
        # 否则将会报错:
        # code:AuthFailure.SignatureFailure message:由于请求包大小超过限制,请求签名验证失败,请使用新的签名方法 `TC3-HMAC-SHA256`。
        clientProfile.signMethod = "TC3-HMAC-SHA256"
        clientProfile.httpProfile = httpProfile
        client = tiia_client.TiiaClient(cred, region, clientProfile)
        req = models.AssessQualityRequest()
        params = img_params
        req.from_json_string(params)
        resp = client.AssessQuality(req)
        return resp.to_json_string()
    except TencentCloudSDKException as err:
        print(err)

这里的代码主要来自API 3.0 Explorer生成的代码内容,接下来会对新增的内容进行说明。

在函数开始定义变量img_params,判断要传递的参数是图片的URL地址ImageUrl还是图片的Base64编码ImageBase64。优先传递参数image_url,如果其值为空,则传递参数image_base64

img_params = '{"ImageUrl":"%s"}'% image_url if image_url != "" else '{"ImageBase64":"%s"}' % image_base64

手动指定签名方法为TC3-HMAC-SHA256

clientProfile.signMethod = "TC3-HMAC-SHA256"

如果没有进行这一步的操作,当上传较大的图片文件时,将会抛出类似下方的异常信息:

code:AuthFailure.SignatureFailure message:由于请求包大小超过限制,请求签名验证失败,请使用新的签名方法`TC3-HMAC-SHA256`

除此之外,代码中的腾讯云个人密钥和所属地域被替换为变量secret_idsecret_keyregion,可用通过文件config.py手动进行配置。

如果图像质量评估API调用成功,最后会返回请求的响应结果。

3.项目配置信息获取

项目中的config.py文件包含项目的配置信息,此文件主要用于存储项目中的配置参数。

接下来会介绍相关参数的获取。

(1)个人密钥的获取与配置。

前两个参数secret_idsecret_key对应腾讯云的个人密钥,学员可以通过 API密钥管理 页查看:

4-4-1 获取个人密钥

保存这个密钥,稍后将会用于替换config.py文件中的密钥信息:

# 请将下方信息替换为腾讯云的个人密钥
secret_id = "此处替换为腾讯云SecretId"    # 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
secret_key = "此处替换为腾讯云SecretKey"  # 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140

注:这一步主要讲解配置信息的获取方式,具体的替换流程会在 任务5 Web页面配置及效果展示 中进行介绍。下同。

(2)所属地域配置。

访问图像分析的官方文档,可以在图像分析的公共参数页查看 地域列表 的相关信息。图像分析中支持的所属地域可选值如下:

区域

取值

华北地区(北京)

ap-beijing

华南地区(广州)

ap-guangzhou

华东地区(上海)

ap-shanghai

本实验中默认使用华南地区(广州)的Region配置,学员可以根据个人需要选择是否要替换所属地域。所属地域的默认信息页包含在文件config.py中:

# 如有需要,可以手动替换下方的所属地域
region = "ap-guangzhou"

经过这一步学员已经了解了实验中所需参数的获取方式,接下来便可以将其配置在项目中,并尝试运行实验项目了。

如果希望替换所属地域,可以访问config.py,手动替换region变量的值。具体操作会在接下来的步骤中进行讲解。