python sdk flask框架實現web訪問時favicon.ico 404 這樣解決
- 2020 年 3 月 26 日
- 筆記
Django、Flask、Bottle都是Python Web框架,Django比較大眾化、Flask比較輕量、Bottle比Flask還輕量。

創建空白Flask Web項目

注意看箭頭所指,需要點一下創建虛擬環境

再注意看上圖左下有個unresolved import flask的告警
這個告警的原因是還沒有安裝flask框架
如下圖,通過PyPI安裝,安裝之前需要先配置pip中國源,要不然慢死了

輸入包名自動出來安裝命令,點一下命令自動安裝

輸入包名自動出來安裝命令,點一下命令自動安裝,安裝過程在左下方輸出欄有顯示



安裝完flask了,最初的那個unresolved import 'flask'的告警依舊在,但此時環境已配置好了,先忽略那個告警,點綠色小三角Web伺服器圖標進行調試

出來Hello World!說明環境配通了

至於那個unresolved import 'flask'的告警,你把項目保存、關閉、重新打開,發現那個告警自動消失了,但你注意看console最後一行的後半部分是 /favicon.ico 404
Google瀏覽器F12對網頁刷新的時候,很多站點都沒有favicon.ico,這無關緊要,但我就是彆扭
查了很多資料,走了很多彎路,最終找到一篇文檔完美解決了favicon.ico 404 not found的問題,文檔:https://www.jianshu.com/p/02980943ed81
這篇里的第2種辦法也有用https://flask.palletsprojects.com/en/1.1.x/patterns/favicon/
兩種辦法都可以

然後就是應用Python SDK了,把api explorer工具生成的python console程式碼全部粘貼到flask項目app.py的開頭第一句話from flask import Flask的後面,然後調試發現console端已經出結果了,但我們要的是網頁上出結果,而不是顯示"Hello World!"

終端顯示結果最關鍵的一句話是print(resp.to_json_string()) ,網頁顯示Hello World!是因為hello()里的return "Hello World!"

那我們用return resp.to_json_string()替換return "Hello World!"即可


如圖,Web呈現結果的目標已經達成,美中不足的是/favicon.ico 404,我們把之前提到的解決/favicon.ico 404的程式碼加到下圖2句話之間測試看看

@app.route('/favicon.ico') def favicon(): return send_from_directory(os.path.join(app.root_path, 'static'), 'favicon.ico', mimetype='image/vnd.microsoft.icon')注意分析程式碼裡面的app.root_path,這個就是app.py所在目錄,不用具體寫出來,就用app.root_path表示,app.root_path有個static目錄裡面有個mimetype為'image/vnd.microsoft.icon'的favicon.ico
整個程式碼說白了就一句話,當訪問/favicon.ico時,發送「根目錄/static/favicon.ico」作為返回值
def favicon(): return send_from_directory(os.path.join(app.root_path, 'static'), 'favicon.ico', mimetype='image/vnd.microsoft.icon') app.add_url_rule('/favicon.ico',view_func=favicon)加上程式碼預覽時報NameError: name 'send_from_directory' is not defined
需要參考https://flask.palletsprojects.com/en/1.1.x/patterns/favicon/
在開頭加上
import os from flask import send_from_directory
加上後再預覽發現不報剛才的錯了,但是/favicon.ico 404依然存在?如果你沒在app.py所在目錄建static目錄並在static目錄里放favicon.ico的話肯定是404。
讓./static/favicon.ico存在後再預覽就正常了

注意看網頁上出現ico圖標了,但是還有個不完美的地方,埠是隨機的,可程式碼里明明是寫死的呀

這裡的隨機埠是調試器屬性里給寫死了host為localhost,埠沒指定就是隨機的
如果我們想要從程式碼指定,那需要做:介面最上排的調試→flask屬性→調試→刪掉localhost使整個調試配置為空

然後將最後一段程式碼做些修改,一段並一行,紅框里的幾行程式碼用app.run(host='0.0.0.0', port=80,debug=False)替代


debug=True或False都行,最終的結果如下,localhost或外網IP或127.0.0.1都可以,而且是固定埠,這才是我要的東西

最後,再強調一點--安全意識!
就在測試的當兒,Web服務就被刷了,網路攻擊無處不在,雲規則第一條:雲是方便的、也是不安全的。




