哈喽大家好,我是鹏哥。
今天要记录的是 —— 基于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吧!