【Python】吹爆Python!1行代码搭建Web服务器30行代码实现服务器的文件上传下载
需求:
手机每日下载图片,然后需经过本人编写的Python脚本处理一遍,再返回到手机上。
个人电脑不能保证时刻开机在线,自己也不可能一直在电脑旁边,故欲将脚本放置云服务器执行。因此,该云服务器应有Web界面,供我上传图片和下载处理后的图片。
简单说,手机上传图片,服务器处理,手机下载结果图片。
方案:
基于成本考虑,超过RMB 100元的都不考虑。看来看去,就A里和X讯比较靠谱。于是使用新手特权购买X里云服务器一台,配置较低:1核2G1M40G, CentOS7,但是价格非常之便宜,一年还不到100。这里是优惠链接。
这么低的配置,Java系就不考虑了。刚好图像处理脚本是Python,何不直接用Python搭建HTTP Server。搜索之,果不期然,Python没有让我失望。
1. 使用Python3命令开启Web服务
只用下面一句命令,即可搭建HTTP Server:
-
# 此为Python3脚本,在cmd中运行此命令。(Python2脚本与此不同请自行百度)
-
# 9900 是端口号,可随意设置
-
python -m http.server 9900
然后你就可以在浏览器中输入:http://localhost:9900 ,就能看到一个空白页面,这就说明HTTP Server已经运行了。
如果执行该命令的目录内有文件,你输入 http://localhost:9900,会看到该目录下的所有文件列表,很像一个FTP服务器。
对,没错,只需这一句话,你的当前文件夹就变成了FTP服务器根目录,局域网内都可以随意下载文件。简直是,内网搭建FTP服务器(发布文件)之利器!
2. 安装bottle库
很可惜,这一行命令只能下载,没有上传界面。于是,我又是一番搜索,得知,成型的Python Web服务器有
Flask:轻量自由;
Django:大而全;
在我看来都复杂了,我不想因运行一个脚本而搭建个完整的Web服务器。最后,看中了只有一个文件的Python Web服务器 Bottle 。一个文件,这才是小而美。
使用pip3安装bottle:
pip3 install bottle
既然用到 bottle,就去看了几篇帖子,该作者写的Bottle系列文章都挺好,分享之。
3. 使用bottle实现上传下载页面
参考该作者文章,我删繁就简,简化成了1个Python文件。但是能实现:上传界面,下载界面,调用服务器python脚本三大核心功能,最终实现手机即能下载到图片处理结果。
【这个下面这个脚本一定一定 不要起名 bottle.py,否则会遮盖bottle库文件,让python误以为这个脚本就是bottle库文件,导致出现import route报错】
-
#Python3脚本,不适用于Python2
-
#!/usr/bin/envpython
-
#coding=utf-8
-
from bottle import route,run,template,request,static_file
-
import os
-
import time
-
-
# 此处需改为你的目录地址
-
img_path='/home/unixq/testHttpServer/img' #定义上传文件的保存路径
-
-
# 此处可扩充为完整HTML
-
uploadPage='''
-
<form action="upload" method="POST" enctype="multipart/form-data">
-
<input type="file" name="data" />
-
<input type="submit" value="上传" />
-
</form>
-
'''
-
-
@route('/upload')
-
def upload():
-
return uploadPage
-
-
@route('/upload',method='POST')
-
def do_upload():
-
uploadfile=request.files.get('data') #获取上传的文件
-
uploadfile.save(img_path,overwrite=True) #overwrite参数是指覆盖同名文件
-
os.system('python3 imgProcess.py') # 执行服务器本地Python脚本
-
time.sleep(3) # 等待3秒,待本地脚本执行完毕
-
return u"转换成功,请点击<a href='/download/output.jpg'>下载文件</a>"
-
-
@route('/download/<filename:path>')
-
def download(filename):
-
return static_file(filename,root=img_path,download=filename)
-
-
-
run(host='0.0.0.0',port=8899,debug=True)
上云效果如下:(截图由 Snapaste 软件制作)
最后,如果在云服务器上执行时,使用 nohug 指令,可以使本脚本在我们关掉Shell的时候,依然在后台执行.
其中 & 命令是使脚本在后台执行。
$ nohup python3 upload.py &
查看所有在执行的任务【注意:此命令仅在当前终端有效】:
$ jobs
把后台任务调整到前台,使用 fg %任务号;反之,使用 bg %任务号:
-
$ fg %3
-
$ bg %2
注意:jobs命令仅在当前终端有效。过几日,我们再进入云服务器,jobs是没有结果的。此时需要使用 ps -ef | grep python3来查找还在后台运行的进程。如果需要关掉,使用命令“ kill 进程号”。
4. 转为正式Web服务持续运行
以上命令启动的服务,很容易挂掉,不知道为什么。如果要像网站一样7*24不间断提供访问,还是需要来一套正规的服务器软件。
推荐:Nginx + uwsgi + bottle,即可像 Apache + Tomcat 或者 Apache + PHP 一样长期提供Web服务。
参考资料:https://www.aliyun.com/minisite/goods?userCode=f3xmzovo