哈嘍大家好,我是鵬哥。
今天要記錄的是 —— 基於python和Flask搭建一個共享平臺。
~~~上課鈴~~~
NUMBXXXTentacion - ? (Deluxe) [Explicit]
1
寫在前面
之前在工作中,遇到一個問題:有同事經常需要我共享一些文件給他們。頻繁的共享操作,讓我不勝其煩。所以想到自己寫個共享平臺,讓同事自己去拿。
當然有人會說,window的文件夾共享一下不就行了嗎?哎呀,能用python解決的事情,絕對要裝下逼!不然我還怎麼寫博客?另外,通過共享平臺有個好處是你可以知道哪個同事(控制檯會有IP信息打印)什麼時候取了你的什麼文件,有種一覽無遺的感覺。另外手機也可以一樣訪問的喲。
2
效果展示
這裏我用的共享平臺IP是127.0.0.1,對於工作中遇到時可以將IP地址設置成自己或者其他服務器的IP地址。
爲了方便大家直接使用,我已將代碼上傳至GitHub網站,鏈接如下:
https://github.com/yuzipeng05/share_platform.git
使用指導如下:
通過python實現http局域網共享,通過共享平臺的簡單操作進行數據共享操作。使用前,只需要配置config.py文件中相關參數,執行main.py腳本即可 。
如:
# 設置共享路徑
share_path = 'F:\\Python成長之路'
# 設置本地IP地址,127.0.0.1只有自己訪問
ip = '127.0.0.1'
# 共享最大時長,默認15min
MaxTime = 900
# 共享平臺的端口,若無衝突,可不用修改
share_port = 8000
3
知識串講(敲黑板啦)
(1)共享實現原理:
其實python可以通過以下命令,構建http局域網從而實現所在路徑下的文件共享。
python -m http.server 8000
我也是通過os.chdir()進入配置文件中的共享路徑,從而啓動共享模式。但是這 裏,我遇到幾個問題:1、已經共享的進程如何去關閉;2、如何友好地與用戶進行交互。
(2)共享進程處理
因爲在啓動main.py後,共享進程相當於是我程序的一個子進程,之前我對子進程的管理不太熟悉。因此在網上查找學習,發現subprocess模塊。對於此模塊的介紹,自行百度吧,網上資料還是蠻全的。我就簡單介紹下我用到的2個方法
subprocess.Popen():啓動共享子進程
share_process.kill() :進行共享子進程的停止
另外,我需要針對不同用戶啓動的子進程都統一管理(總不能A啓動後,B不能停止吧?)。這裏我用的是global將共享子進程設置爲全局變量,從而實現了進程管理。這裏我覺得其實應該還有其他方法來實現多用戶對同一進程的操作管理。
(3)用戶交互
其實我一開始想用QT5來開發個APP,但是想想,誰要用你的APP。所以只好再次寫起了Flask框架。Flask框架本身是易用的,但是我對html或jquery是完全不懂,也沒興趣系統地學習。所以只好遇山開山,遇水搭橋。
這裏 我遇到的主要是2個問題:1、html如何調用入參(哈哈好簡單的問題,但是我是真不懂)2、控件的響應
1、如何調用 入參:{{XX}}即可,果然是好簡單的問題
2、控件的響應:這裏我參考了網上大神們的寫法。
<script>
(function(){
$('input[id="start"]').on('click', function(){
$('#share_status').html('<p id="share_status"><b>【當前共享狀態】:正在共享中!</b></p>')
$.ajax({
type: "get",
url: "/update_status",
data: {"status":"1"},
dataType: "json"
});
});
})();
</script>
通過#ID 來定位p標籤並修改共享狀態的html內容;通過ajax進行結果響應。
4
示例代碼
main.py 主程序:
# coding=utf-8
# @公衆號 : "鵬哥賊優秀"
# @Date : 2020/3/14
# @Software : PyCharm
# @Python version: Python 3.7.2
from flask import Flask, render_template, request
from datebase import *
import os
import subprocess
import time
from config import *
app = Flask(__name__)
@app.route('/')
def share_platform():
now_status = query()
return render_template('share.html', status=now_status,share_path=share_path,share_website=share_website)
@app.route('/update_status', methods=['get'])
def update_status():
new_status = request.args.get('status')
old_status = query()
share = Share()
if new_status == '1' and old_status != new_status:
share.begin_share()
return '已開啓共享!'
elif new_status == '1' and old_status == new_status:
return '已開啓共享!'
elif new_status == '0' and old_status != new_status:
print('即將關閉共享……')
share.end_share()
return '已停止共享!'
else:
return '已停止共享!'
class Share():
def begin_share(self):
update('1')
os.chdir(share_path)
start_time = time.time()
global share_process
share_process = subprocess.Popen('python -m http.server {0}'.format(share_port))
print('共享鏈接已打開!當前時間爲:', time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
while (time.time() - start_time) < MaxTime:
pass
self.end_share()
def end_share(self):
try:
share_process.kill()
except:
print('共享鏈接已關閉,無法執行kill命令!')
print('共享鏈接已關閉!當前時間爲:', time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
update('0')
if __name__ == '__main__':
app.run(debug=True, host=ip, port=5000)
共享平臺的html模板:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>共享平臺</title>
</head>
<body>
{% if status == '1'%}
<p id="share_status"><b>【當前共享狀態】:正在共享中!</b></p>
{% else%}
<p id="share_status"><b>【當前共享狀態】:未共享或者已取消共享!</b></p>
{% endif %}
<p>共享路徑爲:{{share_path}}</p>
<input type="button" value="開始共享" id="start" style="background-color:#33FF33;">
<br>
<br>
<a href={{share_website}}>在開啓共享後,請點擊此鏈接:{{share_website}}/share</a>
<br>
<br>
<input type="button" value="取消共享" id="end" style="background-color:#33FF33;">
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"
integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49"
crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"
integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy"
crossorigin="anonymous"></script>
<script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>
<script>
(function(){
$('input[id="start"]').on('click', function(){
$('#share_status').html('<p id="share_status"><b>【當前共享狀態】:正在共享中!</b></p>')
$.ajax({
type: "get",
url: "/update_status",
data: {"status":"1"},
dataType: "json"
});
});
})();
</script>
<script>
(function(){
$('input[id="end"]').on('click', function(){
$('#share_status').html('<p id="share_status"><b>【當前共享狀態】:未共享或者已取消共享!</b></p>')
$.ajax({
type: "get",
url: "/update_status",
data: {"status":"0"},
dataType: "json"
});
});
})();
</script>
</body>
</html>
5
寫在最後
年後以來,我一直都沒有靜下心來寫博客了,把當初寫公衆號信誓旦旦的“一週一更”目標早就丟在路邊了。嘿嘿,給自己找找藉口:工作變忙了、沒好的主題、疫情嚴重、週五沒有了咖啡、王者打多了、關注人數太少……
好吧,其實是我自己變懶了,怠於學習。
偶爾見登錄QQ,看到自己10年前寫的一篇日誌:
三月桃花,一生的旅程。
收縮在一隻蝴蝶的內心,安然小憩。
可能錯過風,也可能錯過雨;
雨過天晴,果實淡忘了花的記憶。
10年已過,唯有當時的文字能讓我喜歡起之前的自己!加油。
~~~下課鈴~~~
【往期熱門文章】:
【Python成長之路】10行代碼教你免費觀看無廣告版的《慶餘年》騰訊視頻
【Python成長之路】如何用python開發自己的iphone應用程序,並添加至siri指令
【Python成長之路】從 零做網站開發 -- 基於Flask和JQuery,實現表格管理平臺
點擊下方詩句,可以留言互動喔
【關注“鵬哥賊優秀”公衆號,回覆“python學習材料”,將會有python基礎學習、機器學習、數據挖掘、高級編程教程等100G視頻資料,及100+份python相關電子書免費贈送!】
掃描二維碼
與鵬哥一起
學python吧!