本篇博客實戰解決一個真是場景,需求描述如下:
為團隊其它成員提供一個二維碼生成接口,傳入文本,返回圖片地址,數據存儲到 OSS 中。
采用 Python Flask 框架實現,並且使用一個第三方二維碼模塊,使用下述命令提前安裝 qrcode
。
pip install qrcode
同時還需要安裝一下 pillow
,可以使用清華源。
pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple
直接編寫如下代碼,運行查看結果,由於博客無法上傳二維碼,顧不進行展示。
import qrcodeqr = qrcode.QRCode( version=3,error_correction=qrcode.constants.ERROR_CORRECT_Q,box_size=10,border=4)qr.add_data("https://www.pachong.vip")qr.make(fit=True)img = qr.make_image(fill_color="black",back_color="white")img.show()
接下來對相關參數進行一下說明。
qrcode.QRCode() 參數清單:
version
:二維碼大小,取值范圍 1 到 40,當等於 1 時,大小是 21*21,取值為 None 或者後續使用 fit=true
時,二維碼自動調整大小。error_correction
:糾錯級別,有如下取值:ERROR_CORRECT_L
:7%以下會被糾正;ERROR_CORRECT_M
:默認值,15%以下會被糾正;ERROR_CORRECT_Q
:25%以下會被糾正;ERROR_CORRECT_H
:30%以下會被糾正。box_size
:每個個字的像素數,默認 10;border
:二維碼四周留白的格子,默認為 4;image_factory
:圖片生成形式,默認為 PIL,這也是為啥安裝 pillow
的原因;mask_pattern
:掩模。qr.add_data() 添加要轉換的內容,可以增加 optimize
參數,使用後,數據會被拆分為多個塊進行優化。
make_image(fill_color=None, back_color=None,image_factory=None) 創建二維碼圖像並返回,可以使用 fill_color
+ back_color
添加顏色。
安裝並搭建 Flask 框架,然後制作二維碼生成接口,詳細代碼如下所示,其中 OSS 使用阿裡雲相關值即可。
import qrcodefrom flask import Flaskfrom io import BytesIOimport timeimport oss2def upload_qrcode(bytes_content, qrcode_name): # 阿裡雲賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建並使用RAM用戶進行API訪問或日常運維,請登錄RAM控制台創建RAM用戶。 auth = oss2.Auth('AK', 'AS') # yourEndpoint填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。 # 填寫Bucket名稱。 bucket = oss2.Bucket(auth, 'oss-cn-beijing.aliyuncs.com', 'Bucket') # 填寫Object完整路徑和Bytes內容。Object完整路徑中不能包含Bucket名稱。 bucket.put_object(qrcode_name, bytes_content)app = Flask(__name__)@app.route('/qrcode')def qrcode_func(): create_qrcode() return 'Hello, World!'def create_qrcode(): qr = qrcode.QRCode( version=3, error_correction=qrcode.constants.ERROR_CORRECT_Q, box_size=10, border=4 ) qr.add_data("https://www.pachong.vip") qr.make(fit=True) img = qr.make_image(fill_color="black", back_color="white") # print(type(img)) img_byte = BytesIO() img.save(img_byte, format='PNG') binary_content = img_byte.getvalue() # im對象轉為二進制流 upload_qrcode(binary_content)if __name__ == '__main__': app.run(debug=True)
其中用到了 BytesIO
將圖片轉換為二進制流,便於直接上傳到 oss 中,後續邏輯只需要在 Flask 中配置返回拼接的地址即可。
file_name = create_qrcode()domain = "https://cdn.pachong.vip/qr/"if file_name: data = { "src": domain + file_name, "code": 200 }else: data = { "src": "", "code": 500 }response = json.dumps(data)return response, 200, {"Content-Type": "application/json"}
此時在通過浏覽器訪問,會得到一個 JSON 字符串,其中 src 就是拼接的 URL,code 是響應狀態碼。
{ "src": "https://cdn.pachong.vip/qr/1658397523.png", "code": 200 }
接下來給 Flask 加上一個 ULR 參數,二維碼基於傳入的 URL 生成,修改 qrcode_func()
函數,在其中增加參數獲取邏輯。
url = request.args.get("url", None)# print(url)if url is None: return json.dumps({"msg": "缺少url", "src": "", "code": 500}), 200, {"Content-Type": "application/json"}
邏輯實現完畢之後,就可以上傳 CentOS 系統進行部署了。
此時一個完整的 Python Flask 生成二維碼項目就已經完成了~