Python使用Flask構(gòu)建智能的靜態(tài)文件服務(wù)器
摘要
本文將詳細介紹一個使用Flask構(gòu)建的智能靜態(tài)文件服務(wù)器,該服務(wù)器具有自動識別和處理JSON文件的功能。當(dāng)請求沒有擴展名的文件時,服務(wù)器會自動嘗試添加.json擴展名并返回JSON格式的數(shù)據(jù),為前端開發(fā)提供便利。
1. 項目簡介
這是一個基于Flask的靜態(tài)文件服務(wù)器,主要特點包括:
- 支持常見的靜態(tài)文件類型(HTML、CSS、JS、圖片等)
- 智能處理無擴展名的JSON文件
- 自動識別文件MIME類型
- 支持GET和POST請求
2. 代碼實現(xiàn)
from flask import Flask, send_file, jsonify, abort
import os
import json
import magic
# pip install Flask python-magic
app = Flask(__name__, static_folder='')
# 你支持的已知擴展名(不會自動加 .json)
KNOWN_EXTENSIONS = {
'.html', '.js', '.css', '.png', '.jpg', '.jpeg', '.gif',
'.svg', '.ico', '.wav', '.mp3', '.mp4', '.webp', '.ttf', '.woff', '.woff2'
}
def has_known_extension(filename):
_, ext = os.path.splitext(filename)
return ext.lower() in KNOWN_EXTENSIONS
def is_valid_json_file(file_path):
if not os.path.isfile(file_path):
return False
try:
with open(file_path, 'r', encoding='utf-8') as f:
json.load(f)
return True
except Exception:
return False
def get_mime_type(file_path):
if is_valid_json_file(file_path):
return 'application/json'
mime = magic.Magic(mime=True)
return mime.from_file(file_path)
@app.route('/', defaults={'req_path': 'index.html'})
@app.route('/<path:req_path>', methods=['GET', 'POST'])
def serve_file(req_path):
full_path = os.path.join(app.static_folder, req_path)
# 情況 1: 請求的是存在的實際文件
if os.path.isfile(full_path):
mime_type = get_mime_type(full_path)
if mime_type == 'application/json':
with open(full_path, 'r', encoding='utf-8') as f:
return jsonify(json.load(f))
return send_file(full_path, mimetype=mime_type)
# 情況 2: 無已知擴展名,嘗試加 `.json`
if not has_known_extension(req_path):
json_path = full_path + '.json'
if os.path.isfile(json_path) and is_valid_json_file(json_path):
with open(json_path, 'r', encoding='utf-8') as f:
return jsonify(json.load(f))
# 情況 3: 都沒有命中
abort(404)
if __name__ == '__main__':
app.run(debug=True)
3. 功能詳解
3.1 已知擴展名集合
KNOWN_EXTENSIONS = {
'.html', '.js', '.css', '.png', '.jpg', '.jpeg', '.gif',
'.svg', '.ico', '.wav', '.mp3', '.mp4', '.webp', '.ttf', '.woff', '.woff2'
}
定義了一個包含常見靜態(tài)文件擴展名的集合,服務(wù)器會根據(jù)這個集合判斷文件是否具有已知擴展名。
3.2 擴展名檢查函數(shù)
def has_known_extension(filename):
_, ext = os.path.splitext(filename)
return ext.lower() in KNOWN_EXTENSIONS
該函數(shù)檢查文件名是否包含已知的擴展名。
3.3 JSON文件驗證函數(shù)
def is_valid_json_file(file_path):
if not os.path.isfile(file_path):
return False
try:
with open(file_path, 'r', encoding='utf-8') as f:
json.load(f)
return True
except Exception:
return False
該函數(shù)驗證文件是否為有效的JSON文件。
3.4 MIME類型獲取函數(shù)
def get_mime_type(file_path):
if is_valid_json_file(file_path):
return 'application/json'
mime = magic.Magic(mime=True)
return mime.from_file(file_path)
該函數(shù)獲取文件的MIME類型,如果是JSON文件則返回application/json,否則使用python-magic庫自動識別。
3.5 文件服務(wù)路由
@app.route('/', defaults={'req_path': 'index.html'})
@app.route('/<path:req_path>', methods=['GET', 'POST'])
def serve_file(req_path):
# ... 實現(xiàn)邏輯
路由函數(shù)支持GET和POST請求,并實現(xiàn)以下邏輯:
- 如果請求的文件存在,直接返回該文件
- 如果文件不存在且沒有已知擴展名,嘗試添加
.json擴展名 - 如果仍然找不到文件,返回404錯誤
4. 使用方法
安裝依賴:
pip install Flask python-magic
將文件保存為app.py并運行:
python app.py
將靜態(tài)文件放置在與app.py同級的目錄中
5. 請求處理邏輯
服務(wù)器按照以下順序處理請求:
- 直接文件匹配:如果請求的路徑對應(yīng)一個實際存在的文件,直接返回該文件
- JSON擴展名補全:如果請求的文件沒有已知擴展名,服務(wù)器會嘗試添加
.json擴展名并返回JSON格式數(shù)據(jù) - 404錯誤:如果以上兩種情況都不滿足,返回404錯誤
6. 應(yīng)用場景
這個服務(wù)器特別適用于以下場景:
- 前端開發(fā)中需要提供靜態(tài)文件服務(wù)
- API模擬,返回JSON數(shù)據(jù)
- 靜態(tài)網(wǎng)站托管
- 原型開發(fā)和快速演示
7. 總結(jié)
這個Flask靜態(tài)文件服務(wù)器通過智能的文件處理邏輯,為開發(fā)者提供了便利的靜態(tài)文件服務(wù)。其核心優(yōu)勢在于能夠自動處理無擴展名的JSON文件,使前端開發(fā)更加高效。通過簡單的配置和擴展,可以滿足大多數(shù)靜態(tài)文件服務(wù)的需求。
服務(wù)器具有良好的擴展性,可以根據(jù)實際需要添加更多功能,如緩存控制、跨域支持等。
到此這篇關(guān)于Python使用Flask構(gòu)建智能的靜態(tài)文件服務(wù)器的文章就介紹到這了,更多相關(guān)Python Flask靜態(tài)文件服務(wù)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用Matplotlib實現(xiàn)創(chuàng)建動態(tài)圖形
動態(tài)圖形是使可視化更具吸引力和用戶吸引力的好方法,它幫助我們以有意義的方式展示數(shù)據(jù)可視化,本文將利用Matplotlib實現(xiàn)繪制一些常用動態(tài)圖形,希望對大家有所幫助2024-02-02
Python計數(shù)器collections.Counter用法詳解
本文主要介紹了Python計數(shù)器collections.Counter用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
python?字符串模糊匹配Fuzzywuzzy的實現(xiàn)
本文主要介紹了python?字符串模糊匹配Fuzzywuzzy的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Python數(shù)據(jù)分析23種Pandas核心操作方法總結(jié)
在本文中,作者從基本數(shù)據(jù)集讀寫、數(shù)據(jù)處理和?DataFrame?操作三個角度展示了?23?個?Pandas?核心方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
對Python中class和instance以及self的用法詳解
今天小編就為大家分享一篇對Python中class和instance以及self的用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
python簡單實現(xiàn)旋轉(zhuǎn)圖片的方法
這篇文章主要介紹了python簡單實現(xiàn)旋轉(zhuǎn)圖片的方法,涉及Python中image模塊使用技巧,需要的朋友可以參考下2015-05-05

