实用篇 | 一文学会人工智能中API的Flask编写(内含模板)
----------------------- 🎈API 相关直达 🎈--------------------------
🚀Gradio: 实用篇 | 关于Gradio快速构建人工智能模型实现界面,你想知道的都在这里-CSDN博客
🚀Streamlit :实用篇 | 一文快速构建人工智能前端展示streamlit应用-CSDN博客
🚀Flask: 实用篇 | 一文学会人工智能中API的Flask编写(内含模板)-CSDN博客
在日常人工智能演示中,比较常用的api展示方式如flask,gradio等Web调用方式。在本文中,详细描述了在编写flask api中语法及语音文本图像模版案例等~
Flask是微型的Python Web框架,如果模型本身就是用python语言构建的,那么利用FLask提供Api服务是一个不错的选择。
1.深度学习流程
2.Flask重要函数
2.1.flask
语法:
flask()
:创建一个 flask 应用程序实例
2.2.render_template
语法:
render_template(template_name_or_list, **context)
:渲染指定的模板文件,并将其传递给模板上下文的变量
#render_template 发送template模块下的html文件
2.3.app.route
语法:
route(rule, options)
:将一个 url 规则与视图函数绑定,其中rule
是一个字符串,表示匹配该 url 规则的 url 字符串;而options
则是一个字典,用于在请求对象中设置额外的参数。
定义路由和视图函数 要将URL映射到视图函数,可以使用@app.route()
装饰器。视图函数是处理请求并返回响应的函数。也就是根URL映射到名为函数名
的视图函数。
2.4.add_url_rule
add_url_rule与app.route都是flask为我们建立路由的方式,两者实现的功能是一样的。
语法:
add_url_rule(rule,endpoint=None,view_func=None)
一共是三个参数:relu、endpoint、view_func,其中rule(path)、view_func是必须填写的参数。
不填写endpoint则会默认使用view_func的名字作为endpoint。
2.5.run
语法:
run(host=none, port=none, debug=none, **options)
:运行 flask 应用程序,并将其绑定到指定的主机和端口号上。默认情况下,主机为"localhost"
,端口号为5000
。
运行应用程序 最后一步是运行应用程序。在开发过程中,可以使用app.run()
方法来启动应用程序。
2.6.request
语法:
request
:全局对象,代表客户端向服务器发出的 http 请求。可以使用该对象来访问请求的头部、请求参数、json 数据等等。
2.7.MethodView类视图
视图函数也可以结合类来实现,类视图的好处是支持继承
,可以将共性的东西放到父类中,类视图需要使用app.add_url_rule()
来进行注册,类视图分为标准类视图
和基于调度方法的类视图
标准类视图
标准类视图有标准的写法
- 父类继承
flask.views.View
- 子类调用
dispatch_request
进行返回,完成业务逻辑 - 子类需要使用
app.add_url_rule
进行注册,其中view_func参数不能直接传入子类的名称,需要使用as_view
做类方法转换 - 如果同时也指定了
endpoint
,endpoint会覆盖as_view指定的视图名,先endpoint名后as_view名
使用类视图,在父类中定义一个属性,在子类中完成各自的业务逻辑,同时都继承父类中的这一个属性
基于方法判断的类视图
如果同一个视图函数需要根据不同的请求方式
进行不一样的逻辑处理,需要在视图函数内部进行判断,可以使用方法类视图
实现,使用类继承flask.views.MethodView
,定义和请求方式同名的小写方法
来完成了逻辑处理。
实例:编辑一个页面直接访问是输出用户名密码页面,提交表单后是密码正确与否的提示
from flask.views import View, MethodView
from flask import Flask, render_template, requestapp = Flask(__name__)class MyView(MethodView):def get(self):return render_template('index.html')def post(self):username = request.form.get('username')password = request.form.get('password')if username == "gp" and password == "mypassword":return '密码正确'else:return '密码错误'app.add_url_rule('/', endpoint='login', view_func=MyView.as_view('login'))if __name__ == '__main__':app.run(host="0.0.0.0", port=5000)
在html中定义form
标签action属性关联url名
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
{% macro input(name, type='text', value='') %}<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}<form action="/" method="post">
<p>用户名:{{ input('username') }}</p>
<p>密码:{{ input('password', type='password') }}</p>
{{ input('submit', type='submit', value='提交') }}
</form>
</body>
</html>
2.8.请求用户输入
2.8.1.请求用户输入文本
文本的请求类型如下:
- json
- form
# 请求用户以json文件输入单一文本
input_text = request.json('text')
print("input_text ::: ", input_text)# 请求用户以表单(form)形式和图片等别的一起输入的文本
input_text1 = request.form('text1')
print("input_text1 ::: ", input_text1)
2.8.2.请求用户输入语音文件
# 请求用户输入一个音频
audio_files = request.files.getlist('audio')
print("audio_files ::: ", audio_files)# 请求用户输入的音频拉成一个列表
audio_files = request.files.getlist('audio')
print("audio_files ::: ", audio_files)
2.8.3.请求用户输入照片,视频
# 请求用户输入图像
image_files = request.files('')
print("image_files ::: ",image_files)# 请求用户输入视频
video_files = request.files('')
print("video_files ::: ",video_files)
实例1:基础代码结构如下
API设置中常使用Flask()
from flask import Flaskapp = Flask(__name__)@app.route("/")
def hello():return "Hello"if __name__ == "__main__":app.run(host="127.0.0.1", port="8080")
-> 在第 1 行导入Flask
-> 将第 3 行导入的 Flask 分配给 app 变量。
(这样以后使用flask相关的服务端功能时,就可以调用app并使用该方法)
-> 第5行是前面总结的Python装饰器相关的概念。
:通过使用route方法作为装饰器函数,当“/”路由到对应的API时,会执行底层的hello()函数,因此返回“hello”。
from flask import Flask
import joblibapp = Flask(__name__)@app.route("/getModel",methods=['GET'])
def getModel():#根据文件路径load模型model=joblib.load('/data/model.pkl')return "model 查询到了"if __name__ == "__main__":app.run(host='0.0.0.0',port=5003) # 指定ip:portapp.run(threaded=True) #开启多线程print('运行结束')
实例2:设置2个路由,查看请求方法
# 生成Flask rest-api
from flask import Flask, request
from flask_cors import CORS## 拉取 app
app = Flask(__name__)
# 安全库
CORS(app)@app.route("/predict" , methods=["GET", "POST"])
def predict():if request.method == "POST": message = {"name" : "post请求"}return messageif request.method == "GET":message = {"name" : "get请求"}return message
@app.route("/predict2" , methods=["GET", "POST"])
def predict2():if request.method == "POST":message = {"name" : "post请求 2"}return messageif __name__ == '__main__':app.run(host="0.0.0.0", port=50) # debug=True causes Restarting with stat
运行结果
如果出错请参考【PS3】
2.9.返回对象
- jsonify()【6】如果返回的是一个字典,那么调用 jsonify 创建一个响应对象。
- 返回函数的输出
3.输入与输出
3.1. 音频输入与输出
语音流输出音频
from flask import Flask,Responseapp = Flask(__name__)
@app.route('/')def stream_audio():def generate():with open('audio.wav','rb') as f:data=f.read(1024)while data:yield datadata=f.read(1024)return Response(generate(),mimetype='audio/wav')if __name__=='__main__':app.run()
在上面代码中,创建了一个路由,返回一个流式输出的音频文件,在geerate函数中,使用关键字yield将音频文件分块输出,response对象将会包装这个生成器,并设置正确的MIME类型。
将base64解码为wav音频文件[7]
def base64_to_audio(base64_str): # 用 b.show()可以展示audio = base64.b64decode(base64_str, altchars=None, validate=False)wavfile = "filename.wav"with open(wavfile, "wb") as f:f.write(audio)return wavfilereturn None
4.Flask部署深度学习api接口
4.1.语音类
4.1.1.语音转文本(Speech-To-Text),自己需设置前端版本
app.py
from flask import (Blueprint, flash, redirect, render_template, request)
import requestsbp = Blueprint('home', __name__)
@bp.route('/', methods=['GET', 'POST'])
def home():url = "http://server_ip:port/api/stt"if request.method == 'POST':audio_file = request.files['audio']model_name = request.form['name']error = Noneif not audio_file:error = "Audio file is required"if error is not None:flash(error)else:files = {"audio": audio_file, "name": model_name}result = requests.post(url, files=files)return render_template("index.html", result=result)return render_template("index.html", result=None)
templates/index.py
<div class="form-div"><form action="", method="POST" enctype="multipart/form-data", method="POST"><label for="audio">Audio: </label><input type="file", name="audio", required> <br><label for="name">Model:</label><select name="name" id=""><option value="none" selected disabled hidden>Select model</option><option value="tiny">tiny</option><option value="tiny.en">tiny.en</option><option value="base">base</option><option value="small">small</option><option value="small.en">Small.en</option><option value="medium">medium</option></select> <br><button type="submit">Transcribe</button></form></div>
结果如图
4.1.2.语音合成(TTS),无需设置前端版本,post进行请求
import sys
from flask import Flask, request, jsonify,render_template
from flask.views import MethodView
from flask_cors import CORS
import argparse
import base64
import librosa
import numpy as np
import matplotlib.pyplot as plt
import io
import loggingimport soundfile
import torchfrom flask import Flask, request, send_file
from flask_cors import CORS
from flask.views import MethodView# check device
if torch.cuda.is_available() is True:device = "cuda:0"
else:device = "cpu"def get_text(text, hps):text_norm = text_to_sequence(text, hps.data.text_cleaners)if hps.data.add_blank:text_norm = commons.intersperse(text_norm, 0)text_norm = torch.LongTensor(text_norm)return text_normdef infer(text, sdp_ratio, noise_scale, noise_scale_w, length_scale, sid):global net_gfltstr = re.sub(r"[\[\]\(\)\{\}]", "", text)stn_tst = get_text(fltstr, hps)speed = 1output_dir = 'output'sid = 0with torch.no_grad():x_tst = stn_tst.to(device).unsqueeze(0)x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).to(device)audio = net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.8, length_scale=1 / speed)[0][0, 0].data.cpu().float().numpy()return audioapp = Flask(__name__)
#CORS(app, resources={r'/*': {"origins": '*'}})class run_api(MethodView):def __init__(self):passdef post(self):# 请求用户输入data = request.get_json()text = data['text']print("Input text:", text)# 语音参数sdp_ratio = 0.2noise_scale = 0.667noise_scale_w = 0.1 length_scale = 1.0sid = 0# 配置文件config_name = "./config.json"hps = HParam(config_name)hps.set_hparam_yaml(config_name)# 模型权重checkpoint_path = "./G_179000.pth"checkpoint = torch.load(checkpoint_path, map_location=device)# text = get_text(text)out_wav_file = infer(text,sdp_ratio, noise_scale, noise_scale_w, length_scale, sid)print("Input text : ",text)return "Success", (hps.data.sampling_rate, out_wav_file)app.add_url_rule("/", view_func=run_api.as_view("run_api"))if __name__ == '__main__':app.run(port=6842, host="0.0.0.0", debug=False, threaded=False)
可参考1python - How to make a web app download mp3 file automatically [Flask on Google App Engine] - Stack Overflow
可参考2
Python Web版语音合成实例详解 - Python技术站 (pythonjishu.com)
语音合成后返回一组Base64编码格式的语音数据,用户需要用编程语言或者sdk将返回的Base64编码格式的数据解码成byte数组,再保存为wav格式的音频。
4.2.文本类
4.2.1.文本生成
# -*- coding: utf-8 -*-
import sys
from flask import Flask, request, jsonify
from flask_cors import CORS
import argparse
import torch
import os
#os.system('apt-get update')
#os.system('apt install gcc')
#os.system('pip install request')from transformers import pipeline, AutoModelForCausalLMparser = argparse.ArgumentParser()
parser.add_argument('--prefix', type=str, default='/')
parser.add_argument('--port', type=int, default=8555)
args = parser.parse_args()chat_history = []
for i in range(3):chat_history.append({"###提问":"","###回答":""})app = Flask(__name__)
CORS(app, resources={r'/*': {"origins": '*'}})def ask(x, context='', is_input_full=False):history = str(chat_history[-1]) + '\n' + str(chat_history[-2]) + '\n' + str(chat_history[-3]) + '\n'ans = pipe(f"### 对话记录: {history}\n" + f"### 提问: {x}\n\n### 上下文: {context}\n\n### 回答:" if context else f"### 提问: {x}\n\n### 回答:", do_sample=True, max_new_tokens=512,temperature=0.7,top_p=0.9,return_full_text=False,eos_token_id=2,)return ans[0]['generated_text']@app.route(args.prefix, methods=["POST"])
def API():print(request, flush=True)text1 = request.json['text']result = ask(text1)chat_history.append({"###提问":str(text1),"###回答":str(result)})print(result, flush=True)output = {"text": [{"历史记录": str(chat_history[-3:])},{"输入": str(text1)},{"@LLM大语言模型": str(result)}]}return jsonify(output)if __name__ == '__main__':MODEL = 'GPT12.8B'model = AutoModelForCausalLM.from_pretrained(MODEL,torch_dtype=torch.float16,low_cpu_mem_usage=True,).to(device=f"cuda", non_blocking=True)model.eval()pipe = pipeline('text-generation', model=model,tokenizer=MODEL,device=0) app.run(host="0.0.0.0", port=args.port, debug=True) # debug=True causes Restarting with stat
5.设置flask API时出现错误总结
出现400:Bed Request 坏请求
- 请求的文件不存在,或者文件路径不对
出现500:internal server error内部服务器错误
- 文件传输方法不对
***注意输入输出的请求及传输
6.总结
在制作人工智能模型flask api时,总结如下
- 首先设置flask 所需类以及路由,运行端口等
- 第二设置好模型所需的结构,一般情况下都在推理文件中,确保所需类都可以被调用
- 第三确定模型的输入:图片视频文本,每个输入单独写请求
最容易出错的部分就是第三部分,因为模型的话只要调用原有的就可以,出现的大部分错误是在运行后出现400,405,500等错误,首先大概率是api编写错误,其次是网络等问题~
过程中遇到的错误与解决【PS】
【PS1】Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
致命的Python错误: init_fs_encoding:无法获取文件系统的Python编解码器编码Python运行时状态:核心初始化的ModuleNotFoundError:没有名为'encodings‘的模块
如果将这两个环境变量设置为nil,问题应该会消失: set PYTHONHOME= set PYTHONPATH=
错误原因:pip不小心删除
sudo apt-get remove python-pip-whl
sudo apt -f install
sudo apt update && sudo apt dist-upgrade
sudo apt install python3-pip
pip install certifipip install chardetpip install idnapip instal urllib3
【PS2】 ImportError: cannot import name 'BaseResponse' from 'werkzeug.wrappers' (/usr/local/lib/python3.8/dist-packages/werkzeug/wrappers/__init__.py)
这个错误可以重新安装werkzeug
pip install --upgrade werkzeug==1.0.1
然后就好啦~
【PS3】get请求出现404
python app.py
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
警告是因为在开发环境中,Flask应用程序是使用内置的服务器(如SimpleServer或Lighttpd)运行的,而不是使用WSGI服务器。和最终出现的404没有关系!!
原因分析
- 上一个项目运行没有终止
- 端口(12.0.0.1:5000)被占用
最终原因
Flask的代码编写错误
【PS4】Flask请求出现500
500错误是指服务器内部出错,无法完成请求的情况。这可能是由于程序错误、错误的配置等原因造成的。
在此处是因为找不到样本中的html文件。
错误原因:文件格式错误
原格式
----app
---templates
----index.html
----run.py
修改后正确
---templates
----index.html
----run.py
在同一目录下!!
【PS5】Flask设置api时出现405,405等
有俩个路由的情况
出现405
提交信息后,未找到
【PS6】NameError: name 'api_monitor' is not defined
自定义方法,官方文档并没有此方法,自己重新定义或者删掉就可以~
参考文献
【1】app.py · RamAnanth1/Dolly-v2 at main (huggingface.co)
【2】 [Flask/Postman] Flask로 간단한 서버 구현, postman으로 테스트 (tistory.com)
【3】Flask 极致细节:1. 路由和请求响应规则,GET/POST,重定向_@app.route post_破浪会有时的博客-CSDN博客【4】Deploy a Flask REST API - The Docker way and the Serverless way (amlanscloud.com)
【5】Building Scalable REST APIs using Heroku Flask MongoDB: 6 Easy Steps - Learn | Hevo (hevodata.com)【6】Flask 学习-88. jsonify() 函数源码解读深入学习 - 上海-悠悠 - 博客园 (cnblogs.com)
【7】 Base64 Encoding and Decoding Using Python | Envato Tuts+ (tutsplus.com)
【8】How to Build a Text to Speech App (Python & Flask) [TTS API Python Tutorial] (rapidapi.com)
【9】Flask REST API Tutorial - Python Tutorial (pythonbasics.org)
相关文章:

实用篇 | 一文学会人工智能中API的Flask编写(内含模板)
----------------------- 🎈API 相关直达 🎈-------------------------- 🚀Gradio: 实用篇 | 关于Gradio快速构建人工智能模型实现界面,你想知道的都在这里-CSDN博客 🚀Streamlit :实用篇 | 一文快速构建人工智能前端展…...

Si24R03—低功耗 SOC 芯片(集成RISC-V内核+2.4GHz无线收发器)
Si24R03是一款高度集成的低功耗SOC芯片,其集成了基于RISC-V核的低功耗MCU和工作在2.4GHz ISM频段的无线收发器模块。 MCU模块具有低功耗、Low Pin Count、宽电压工作范围,集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC等丰…...

C# Winform 日志系统
目录 一、效果 1.刷新日志效果 2.单独日志的分类 3.保存日志的样式 二、概述 三、日志系统API 1.字段 Debug.IsScrolling Debug.Version Debug.LogMaxLen Debug.LogTitle Debug.IsConsoleShowLog 2.方法 Debug.Log(string) Debug.Log(string, params object[]) …...

【Java 基础】27 XML 解析
文章目录 1.SAX 解析器1)什么是 SAX2)SAX 工作流程初始化实现事件处理类解析 3)示例代码 2.DOM 解析器1)什么是 DOM2)DOM 工作流程初始化解析 XML 文档操作 DOM 树 3)示例代码 总结 在项目开发中࿰…...

地图服务 ArcGIS API for JavaScript基础用法全解析
地图服务 ArcGIS API for JavaScript基础用法全解析 前言 在接触ArcGIS之前,开发web在线地图时用过Leaflet来构建地图应用,作为一个轻量级的开源js库,在我使用下来Leaflet还有易懂易用的API文档,是个很不错的选择。在接触使用Ar…...

docker学习(八、mysql8.2主从复制遇到的问题)
在我配置主从复制的时候,遇到了一直connecting的问题。 起初可能是我ip配置的不对,slave_io_running一直connecting。(我的环境:windows中安装了wsl,是ubuntu环境的,在wsl中装了miniconda,mini…...

React-hook-form-mui(三):表单验证
前言 在上一篇文章中,我们介绍了react-hook-form-mui的基础用法。本文将着重讲解表单验证功能。 react-hook-form-mui提供了丰富的表单验证功能,可以通过validation属性来设置表单验证规则。本文将详细介绍validation的三种实现方法,以及如何…...

【私域运营秘籍】4大用户调研方法,让你轻松掌握用户心理!
我们常说私域运营的核心是用户运营。根据二八法则,20%的超级用户贡献企业80%的利润。因此,企业应该根据用户的价值贡献来有针对性地进行运营。 然而,在实际的私域运营中,我们不仅需要找出贡献价值不同的用户,还可以从…...

2.8寸 ILI9341 TFTLCD 学习移植到STM32F103C8T6
2.8寸 ILI9341 TFTLCD 学习移植到STM32F103C8T6 文章目录 2.8寸 ILI9341 TFTLCD 学习移植到STM32F103C8T6前言第1章 LCD简介1.1 LCD硬件接口介绍 第2章 LCD指令介绍第3章 LCD 8080驱动方式3.1 8080写时序3.2 8080读时序 第4章 LCD 驱动代码部分4.1 修改代码部分4.2 代码工程下载…...

Java利用TCP实现简单的双人聊天
一、创建新项目 首先创建一个新的项目,并命名为聊天。然后创建包,创建两个类,客户端(SocketClient)和服务器端(SocketServer) 二、实现代码 客户端代码: package 聊天; import ja…...

软件压力测试的重要性与用途
在当今数字化的时代,软件已经成为几乎所有行业不可或缺的一部分。随着软件应用规模的增加和用户数量的上升,软件的性能变得尤为关键。为了确保软件在面对高并发和大负载时仍然能够保持稳定性和可靠性,软件压力测试变得至关重要。下面是软件压…...

【数据挖掘】国科大苏桂平老师数据库新技术课程作业 —— 第二次作业
1 设 F { A B → C , B → D , C D → E , C E → G H , G → A } F\{AB\rightarrow C,B\rightarrow D, CD\rightarrow E, CE\rightarrow GH, G\rightarrow A \} F{AB→C,B→D,CD→E,CE→GH,G→A},用推理的方法证明 F ∣ A B → G F\;|AB\rightarrow G F∣AB→…...

Qt + MySQL(简单的增删改查)
Qt编译MySql插件教程 帮助: SQL Programming QSqlDatabase 静态函数 1.drivers(),得到可以使用的数据库驱动名字的集合 [static] QStringList QSqlDatabase::drivers();2.addDatabase(),添加一个数据库实例 [static] QSqlDatabase QSql…...

postgresql设置免密登录
您提供的步骤描述了在 PostgreSQL 数据库环境中配置服务器间的 SSH 无密码登录和数据库用户认证的过程。这些步骤主要用于设置一个高可用性、负载平衡的数据库集群环境。让我们逐一解释这些步骤的目的和应用场景: 1. 启动 PostgreSQL 服务 systemctl start postgr…...

视频汇聚/音视频流媒体视频平台/视频监控EasyCVR分享页面无法播放,该如何解决?
国标GB28181安防视频监控/视频集中存储/云存储EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统…...

机器学习-逻辑回归
一、引言 逻辑回归(Logistic Regression)是一种广泛应用于分类问题的监督学习算法。尽管名字中含有“回归”二字,但这并不意味着它用于解决回归问题。相反,逻辑回归专注于解决二元或多元分类问题,如邮件是垃圾邮件还是…...

Edge调用Aria2下载
一、准备工作 1、Edge浏览器:Windows系统自带或点击下载; 2、Aria2 gui:点击github下载或自行搜索下载其他版本; 二、启动Aria2 gui 解压下载的Aria2 gui到任意目录,点击“Aria2c启动器”或“AriaNg启动器”皆可。…...

解密QQ号——C语言
题目: 有一串已加密的数字“6 3 1 7 5 8 9 2 4”解密规则:首先将第1个数字删除,紧接着将第2个数字放到这串数字的末尾,再将第3个数字删除并将第4个数字放到这串数字的末尾,再将第5个数删除 代码实现: #inc…...

三、jvm中的对象及引用
一、对象在jvm的创建过程 检查加载-->分配内存-->内存空间初始化-->设置-->对象初始化 1) 检查加载 首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查类是否已经被加载、解析和初始化过。 虚拟机遇到一条 new 指令时…...

Docker网络架构介绍
本文主要介绍了Docker容器的单机网络架构与集群网络架构,辅以演示,并简单介绍了网络管理中的命令。 前文: Docker的安装与简单操作命令-CSDN博客 docker网络原理介绍 与ovs类似,docker容器采用veth-pair linux bridge (虚拟交…...

Android studio新版本aar包导入项目中配置
目录 1、so、aar导入在项目build.gradle中配置 2、新版本迁移到setting.grade配置 1、so、aar导入在项目build.gradle中配置 repositories {flatDir {dirs libs} }2、新版本迁移到setting.grade配置 flatDir {dirs libs } 如下图所示 pluginManagement {repositories {gra…...

HBase-架构与设计
HBase架构与设计 一、背景二、HBase概述1.设计特点2.适用场景2.1 海量数据2.2 稀疏数据2.3 多版本数据2.4 半结构或者非结构化数据 三、数据模型1.表逻辑结构2.RowKey3.Column Family4.TimeStamp5.存储结构 四、HBase架构图1.Client2.Zookeeper3.HMaster4.HRegionServer5.HRegi…...

SpringBoot基础系列:工具类使用
断言 Assert // 要求参数 object 必须为非空(Not Null),否则抛出异常,不予放行 // 参数 message 参数用于定制异常信息。 void notNull(Object object, String message) // 要求参数必须空(Null)ÿ…...

使用 nohup java - jar 不输出日志
要在使用nohup java -jar命令时不输出日志,可以将标准输出和标准错误输出重定向到特殊设备文件/dev/null。这样做将会丢弃所有的输出。 以下是在Linux中使用nohup java -jar命令并禁止输出日志的示例: 复制代码 nohup java -jar your-application.jar …...

前端开发学习 (五) 生命周期函数、Ajax请求
关于vue实例的声明周期,从Vue实例创建、运行、到销毁期间,总是伴随着各种各样的事件,这些事件,统称为生命周期 (https://cn.vuejs.org/v2/guide/instance.html#实例生命周期 ) 而声明周期勾子就是生命周期…...

TypeScript中的单件设计模式
基本概念 (1) 了解设计模式 设计模式通俗的讲,就是一种更好的编写代码方案,打个比喻:从上海到武汉,你可以选择做飞机,做轮船,开车,骑摩托车多种方式,把出行…...

【无标题】安装环境
这里写目录标题 清华镜像加速 安装cuda11.3 PyTorch 1.10.1https://pytorch.org/get-started/previous-versions/[如果没有可以点Previous pyTorch Versions,这里面有更多的更早的版本](https://pytorch.org/get-started/locally/) 复制非空文件夹cp: -r not specif…...

一. 初识数据结构和算法
数据结构与算法是一个达到高级程序员的敲门砖。当你脱离了语言的应用层面,去思考他的设计层面时,你就依旧已经开始初识数据结构与算法了 数据结构 什么是数据结构 对于数据结构的定义官方并没有统一的解释,在各个百科以及算法的书中…...

qt 使用百度在线地图 方法1
在使用Qt和百度在线地图时,你需要从百度地图开放平台获取API密钥,并使用该密钥在Qt应用程序中集成百度地图。以下是一个简单的示例,演示了如何在Qt中使用百度在线地图: 1,首先,从百度地图开放平台获取API密…...

轻快小miniconda3在linux下的安装配置-centos9stream-Miniconda3 Linux 64-bit
miniconda与anaconda的区别: Miniconda 和 Anaconda 是用于管理环境和安装软件包的 Python 发行版。它们之间的主要区别在于以下几点: 1. 安装内容和大小: Anaconda: Anaconda 是一个完整的 Python 数据科学平台,包含…...