任务 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_id
、secret_key
和region
,可用通过文件config.py
手动进行配置。
如果图像质量评估API调用成功,最后会返回请求的响应结果。
3.项目配置信息获取
项目中的config.py
文件包含项目的配置信息,此文件主要用于存储项目中的配置参数。
接下来会介绍相关参数的获取。
(1)个人密钥的获取与配置。
前两个参数secret_id
和secret_key
对应腾讯云的个人密钥,学员可以通过 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
注:这一步主要讲解配置信息的获取方式,具体的替换流程会在 任务5 Web页面配置及效果展示 中进行介绍。下同。
(2)所属地域配置。
访问图像分析的官方文档,可以在图像分析的公共参数页查看 地域列表 的相关信息。图像分析中支持的所属地域可选值如下:
区域 | 取值 |
---|---|
华北地区(北京) | ap-beijing |
华南地区(广州) | ap-guangzhou |
华东地区(上海) | ap-shanghai |
本实验中默认使用华南地区(广州)的Region配置,学员可以根据个人需要选择是否要替换所属地域。所属地域的默认信息页包含在文件config.py
中:
# 如有需要,可以手动替换下方的所属地域
region = "ap-guangzhou"
经过这一步学员已经了解了实验中所需参数的获取方式,接下来便可以将其配置在项目中,并尝试运行实验项目了。
如果希望替换所属地域,可以访问config.py
,手动替换region
变量的值。具体操作会在接下来的步骤中进行讲解。
学员评价