【Python成长之路】共享平台
哈嘍大家好,我是鵬哥。
今天要記錄的是?——?基于python和Flask搭建一個(gè)共享平臺(tái)。
~~~上課鈴~~~
NUMBXXXTentacion?-???(Deluxe)?[Explicit]
1
寫在前面
之前在工作中,遇到一個(gè)問(wèn)題:有同事經(jīng)常需要我共享一些文件給他們。頻繁的共享操作,讓我不勝其煩。所以想到自己寫個(gè)共享平臺(tái),讓同事自己去拿。
當(dāng)然有人會(huì)說(shuō),window的文件夾共享一下不就行了嗎?哎呀,能用python解決的事情,絕對(duì)要裝下逼!不然我還怎么寫博客?另外,通過(guò)共享平臺(tái)有個(gè)好處是你可以知道哪個(gè)同事(控制臺(tái)會(huì)有IP信息打印)什么時(shí)候取了你的什么文件,有種一覽無(wú)遺的感覺(jué)。另外手機(jī)也可以一樣訪問(wèn)的喲。
2
效果展示
?
這里我用的共享平臺(tái)IP是127.0.0.1,對(duì)于工作中遇到時(shí)可以將IP地址設(shè)置成自己或者其他服務(wù)器的IP地址。
為了方便大家直接使用,我已將代碼上傳至GitHub網(wǎng)站,鏈接如下:
https://github.com/yuzipeng05/share_platform.git
使用指導(dǎo)如下:
通過(guò)python實(shí)現(xiàn)http局域網(wǎng)共享,通過(guò)共享平臺(tái)的簡(jiǎn)單操作進(jìn)行數(shù)據(jù)共享操作。使用前,只需要配置config.py文件中相關(guān)參數(shù),執(zhí)行main.py腳本即可 。
如:
# 設(shè)置共享路徑
share_path = 'F:\\Python成長(zhǎng)之路'
# 設(shè)置本地IP地址,127.0.0.1只有自己訪問(wèn)
ip = '127.0.0.1'
# 共享最大時(shí)長(zhǎng),默認(rèn)15min
MaxTime = 900
# 共享平臺(tái)的端口,若無(wú)沖突,可不用修改
share_port = 8000
3
知識(shí)串講(敲黑板啦)
(1)共享實(shí)現(xiàn)原理:
其實(shí)python可以通過(guò)以下命令,構(gòu)建http局域網(wǎng)從而實(shí)現(xiàn)所在路徑下的文件共享。
python -m http.server 8000我也是通過(guò)os.chdir()進(jìn)入配置文件中的共享路徑,從而啟動(dòng)共享模式。但是這 里,我遇到幾個(gè)問(wèn)題:1、已經(jīng)共享的進(jìn)程如何去關(guān)閉;2、如何友好地與用戶進(jìn)行交互。
(2)共享進(jìn)程處理
因?yàn)樵趩?dòng)main.py后,共享進(jìn)程相當(dāng)于是我程序的一個(gè)子進(jìn)程,之前我對(duì)子進(jìn)程的管理不太熟悉。因此在網(wǎng)上查找學(xué)習(xí),發(fā)現(xiàn)subprocess模塊。對(duì)于此模塊的介紹,自行百度吧,網(wǎng)上資料還是蠻全的。我就簡(jiǎn)單介紹下我用到的2個(gè)方法
subprocess.Popen():啟動(dòng)共享子進(jìn)程
share_process.kill()?:進(jìn)行共享子進(jìn)程的停止
另外,我需要針對(duì)不同用戶啟動(dòng)的子進(jìn)程都統(tǒng)一管理(總不能A啟動(dòng)后,B不能停止吧?)。這里我用的是global將共享子進(jìn)程設(shè)置為全局變量,從而實(shí)現(xiàn)了進(jìn)程管理。這里我覺(jué)得其實(shí)應(yīng)該還有其他方法來(lái)實(shí)現(xiàn)多用戶對(duì)同一進(jìn)程的操作管理。
(3)用戶交互
其實(shí)我一開始想用QT5來(lái)開發(fā)個(gè)APP,但是想想,誰(shuí)要用你的APP。所以只好再次寫起了Flask框架。Flask框架本身是易用的,但是我對(duì)html或jquery是完全不懂,也沒(méi)興趣系統(tǒng)地學(xué)習(xí)。所以只好遇山開山,遇水搭橋。
這里 我遇到的主要是2個(gè)問(wèn)題:1、html如何調(diào)用入?yún)?#xff08;哈哈好簡(jiǎn)單的問(wèn)題,但是我是真不懂)2、控件的響應(yīng)
1、如何調(diào)用 入?yún)?#xff1a;{{XX}}即可,果然是好簡(jiǎn)單的問(wèn)題
2、控件的響應(yīng):這里我參考了網(wǎng)上大神們的寫法。
<script>(function(){$('input[id="start"]').on('click', function(){$('#share_status').html('<p id="share_status"><b>【當(dāng)前共享狀態(tài)】:正在共享中!</b></p>')$.ajax({type: "get",url: "/update_status",data: {"status":"1"},dataType: "json"});});})(); </script>?
通過(guò)#ID?來(lái)定位p標(biāo)簽并修改共享狀態(tài)的html內(nèi)容;通過(guò)ajax進(jìn)行結(jié)果響應(yīng)。
4
示例代碼
main.py?主程序:
# coding=utf-8# @公眾號(hào) : "鵬哥賊優(yōu)秀"# @Date : 2020/3/14# @Software : PyCharm # @Python version: Python 3.7.2 from flask import Flask, render_template, requestfrom datebase import *import osimport subprocessimport timefrom 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('即將關(guān)閉共享……') 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('共享鏈接已打開!當(dāng)前時(shí)間為:', 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('共享鏈接已關(guān)閉,無(wú)法執(zhí)行kill命令!') print('共享鏈接已關(guān)閉!當(dāng)前時(shí)間為:', time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())) update('0') if __name__ == '__main__':????app.run(debug=True,?host=ip,?port=5000)????共享平臺(tái)的html模板:???????
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>共享平臺(tái)</title></head><body>{% if status == '1'%}<p id="share_status"><b>【當(dāng)前共享狀態(tài)】:正在共享中!</b></p>{% else%}<p id="share_status"><b>【當(dāng)前共享狀態(tài)】:未共享或者已取消共享!</b></p>{% endif %}<p>共享路徑為:{{share_path}}</p><input type="button" value="開始共享" id="start" style="background-color:#33FF33;"><br><br><a href={{share_website}}>在開啟共享后,請(qǐng)點(diǎn)擊此鏈接:{{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>【當(dāng)前共享狀態(tài)】:正在共享中!</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>【當(dāng)前共享狀態(tài)】:未共享或者已取消共享!</b></p>') $.ajax({ type: "get", url: "/update_status", data: {"status":"0"}, dataType: "json" }); }); })();</script></body></html>5
寫在最后
年后以來(lái),我一直都沒(méi)有靜下心來(lái)寫博客了,把當(dāng)初寫公眾號(hào)信誓旦旦的“一周一更”目標(biāo)早就丟在路邊了。嘿嘿,給自己找找借口:工作變忙了、沒(méi)好的主題、疫情嚴(yán)重、周五沒(méi)有了咖啡、王者打多了、關(guān)注人數(shù)太少……
好吧,其實(shí)是我自己變懶了,怠于學(xué)習(xí)。
偶爾見(jiàn)登錄QQ,看到自己10年前寫的一篇日志:
三月桃花,一生的旅程。
????收縮在一只蝴蝶的內(nèi)心,安然小憩。
可能錯(cuò)過(guò)風(fēng),也可能錯(cuò)過(guò)雨;
????雨過(guò)天晴,果實(shí)淡忘了花的記憶。
10年已過(guò),唯有當(dāng)時(shí)的文字能讓我喜歡起之前的自己!加油。
?
~~~下課鈴~~~
?
【往期熱門文章】:
【Python成長(zhǎng)之路】10行代碼教你免費(fèi)觀看無(wú)廣告版的《慶余年》騰訊視頻
【Python成長(zhǎng)之路】如何用python開發(fā)自己的iphone應(yīng)用程序,并添加至siri指令
【Python成長(zhǎng)之路】從 零做網(wǎng)站開發(fā) -- 基于Flask和JQuery,實(shí)現(xiàn)表格管理平臺(tái)
點(diǎn)擊下方詩(shī)句,可以留言互動(dòng)喔??
?
且笑風(fēng)塵,不敢造次;煮酒話桑,不敢相思。
?
【關(guān)注“鵬哥賊優(yōu)秀”公眾號(hào),回復(fù)“python學(xué)習(xí)材料”,將會(huì)有python基礎(chǔ)學(xué)習(xí)、機(jī)器學(xué)習(xí)、數(shù)據(jù)挖掘、高級(jí)編程教程等100G視頻資料,及100+份python相關(guān)電子書免費(fèi)贈(zèng)送!】
?
掃描二維碼
? ??與鵬哥一起
學(xué)python吧!
?
總結(jié)
以上是生活随笔為你收集整理的【Python成长之路】共享平台的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 番茄工作法总结-第二章:背景
- 下一篇: python繁简体转换【亲测有效】