【Python成长之路】共享平台
哈喽大家好,我是鹏哥。
今天要记录的是 —— 基于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吧!
【Python成长之路】共享平台相关推荐
- 【Python成长之路】快速理解复制、浅拷贝、深拷贝
哈喽大家好,我是鹏哥. 今天想聊聊的主题是 -- 浅拷贝/深拷贝. ~~~上课铃~~~ 赤伶HITA - 赤伶 1 写在前面 浅拷贝.深拷贝的知识点,在python笔试和面试的过程中,经常被作为考题来 ...
- 【Python成长之路】破解Boss直聘网站滑块验证
哈喽大家好,我是鹏哥. 今天要记录的内容是 -- 破解Boss直聘网站的滑块验证. -- 上 课 铃-- TuesdayBurak Yeter;Danelle Sandoval - Tuesday 1 ...
- 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xa)的解决方法【华为云分享】
[写在前面] 在用requests库对自己的CSDN个人博客(https://blog.csdn.net/yuzipeng)进行爬取时,发现乱码报错(\xe4\xb8\xb0\xe5\xaf\x8c\ ...
- 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xaf\x8c\xe7\x9)的解决方法
[写在前面] 在用requests库对自己的CSDN个人博客(https://blog.csdn.net/yuzipeng)进行爬取时,发现乱码报错(\xe4\xb8\xb0\xe5\xaf\x8c\ ...
- 【Python成长之路】如何用python开发自己的iphone应用程序,并添加至siri指令
哈喽大家好,我是鹏哥. 今天想记录的学习主题是 -- 基于pythonista3 app开发自己的iphone应用程序. ~~~上课铃~~~ (由于今天被小伙伴推荐了这首歌,因此就应他的要求,作为此文 ...
- Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程–>错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个人 ...
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- 【Python成长之路】如何用2行代码将抖音视频设置成我的手机铃声
哈喽大家好,我是鹏哥. 今天想学习记录的内容是 -- 如何用python提取视频中的音频. ~~~上课铃~~~ 1 写在前面 本来按我的性子和精力,一周一般只想写一篇博客:但是今天在刷抖音时,发现有个 ...
- 计算机毕业设计django基于python的读书笔记共享平台
项目介绍 本论文主要论述了如何使用PYTHON语言开发一个读书笔记共享平台 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发.在引言中,作者将论述读书笔 ...
- 计算机毕业设计django基于python的读书笔记共享平台(源码+系统+mysql数据库+Lw文档)
项目介绍 本论文主要论述了如何使用PYTHON语言开发一个读书笔记共享平台 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发.在引言中,作者将论述读书笔记 ...
最新文章
- NVIDIA Jetson 系列产品开发相关文档,TAO、TLT、NGC
- CSS中用 opacity、visibility、display 属性将 元素隐藏 的 对比分析
- Java蓝牙电话_Android mediaPlayer和蓝牙汽车/耳机电话
- Windows安全配置加固
- NIO中Selector分析
- 为什么今年好多人开始买基金了,是疫情影响的吗?
- CSS 自定义属性 -- 使用 JS 和不使用 JS
- ANT发送邮件需要的3个JAR包
- Linux下修改PATH的方法
- Ubuntu运行中文识别CHINESE
- mybatis plus分页插件 total数为0
- 如何用matlab求出矩阵简化阶梯形顺带算出主元所在的列
- 不可不读的百句良言!!
- VC 用发音函数Beep 播放简谱音乐
- Linux学习1-Vmware创建虚拟机以及Xshell连接
- sap crm button_如何安装SAP软件?
- 方舟服务器建家位置,方舟生存进化新手建家图文攻略 方舟生存进化在哪建家比较好-游侠网...
- 热门的国人开发开源项目
- 百万钱包借款时填资料一直显示服务器异常,百万钱包有连续放款失败,然后突然推过的吗?我已经失败四五...
- it技术烂大街_我是如何从在大街上卖食物到在顶尖的技术公司工作的方式
热门文章
- android9 三星 港版,三星S9+官方港版安卓9固件rom刷机包:TGY-G9650ZHS4CSD7
- 交换机tagged与untagged的关系深入探讨
- matlab常用代码及操作
- keil教程之创建基础软件工程
- 计算机软件编程英语词汇集锦(转载)
- .arx 与此版本的 AutoCAD 不兼容。
- Xmind模板文档分享——学习记录(4)
- Atitit r7 doc list on home ntpc.docx 驱动器 D 中的卷是 p2soft 卷的序列号是 9AD0-D3C8 D:\ati\r2017 v3 r01\
- 西南科技大学OJ题 顺序栈基本操作的实现1044
- 使用maven官方仓库直接下载项目需要的jar包方法