Python简易轻量化图床搭建

一. 准备工作

  1. 需要一台具有公网IP的云服务器,腾讯云的轻量应用服务器就特别便宜,一个月不到10块钱
  2. 最好申请一个域名以及免费SSl证书(非必要)
  3. SSH工具以及FTP文件传输工具,推荐使用 Putty 和 Filezilla
  4. 配置好Python3环境,可参考前一篇文章 Centos7安装Python3

二. 开始手搓

  • 引入python常用模块
from flask import Flask, abort,send_from_directory, request, jsonify
import sys,os
app = Flask(__name__)
@app.route('/')
def root():
    return jsonify({'status': 404, 'message': 'not found'})
  • 定义上传图片接口,POST方法,两个参数,path为图片存储的相对路径,file为文件数据
@app.route('/upload', methods=['POST'])
def upload():
    try:
        path = request.form.get('path')
        file = request.files.get('file')
        if path[0]=='/':path = path[1:]
        filepath = os.path.join(DIR,path)
        print(filepath)
        if os.path.isfile(filepath):
            return jsonify({'code': 400, 'msg': 'file exists'})
        os.makedirs(os.path.dirname(filepath), exist_ok=True)
        file.save(filepath)
        return jsonify({'code': 200, 'url': request.url_root+path})
    except Exception as e:
        return jsonify({'code': 500, 'msg': 'error'})
  • 定义获取图片接口
@app.route('/<path:filename>', methods=['GET'])
def file(filename):
    filepath = os.path.join(DIR, filename)
    if not os.path.isfile(filepath):
        return jsonify({'code': 404, 'msg': 'file not found'})
    return send_from_directory(DIR, filename, as_attachment=False)
  • DIR为文件存储的根路径,默认8000端口
if __name__ == '__main__':
    try:
        port = int(sys.argv[1])
    except (IndexError, ValueError):
        port = 8000
    try:
        DIR = sys.argv[2]
    except (IndexError, ValueError):
        DIR = "./files/"
    app.run(host='0.0.0.0',port=port)

三. 完整代码(已加入域名功能)

from flask import Flask, abort, send_from_directory, request, jsonify
import sys,os

app = Flask(__name__)
@app.route('/')
def root():
    return jsonify({'status': 404, 'message': 'not found'})

@app.route('/upload', methods=['POST'])
def upload():
    try:
        path = request.form.get('path')
        file = request.files.get('file')
        if path[0]=='/':path = path[1:]
        filepath = os.path.join(DIR,path)
        print(filepath)
        if os.path.isfile(filepath):
            return jsonify({'code': 400, 'msg': 'file exists'})
        os.makedirs(os.path.dirname(filepath), exist_ok=True)
        file.save(filepath)
        return jsonify({'code': 200, 'url': request.url_root+path})
    except Exception as e:
        return jsonify({'code': 500, 'msg': 'error'})
    
@app.route('/<path:filename>', methods=['GET'])
def file(filename):
    filepath = os.path.join(DIR, filename)
    if not os.path.isfile(filepath):
        return jsonify({'code': 404, 'msg': 'file not found'})
    return send_from_directory(DIR, filename, as_attachment=False)

@app.before_request
def check_host():
    if request.host != '域名:8000':
        abort(400)

if __name__ == '__main__':
    try:
        port = int(sys.argv[1])
    except (IndexError, ValueError):
        port = 8000
    try:
        DIR = sys.argv[2]
    except (IndexError, ValueError):
        DIR = "./files/"
    app.run(host='0.0.0.0', port=port, ssl_context=('cert/域名.pem', 'cert/域名.key'))

三. 开始部署

  • 将py文件命名为main.py

  • 将代码中域名替换为自己的域名

  • 将申请到点证书放入cert文件夹中,cert文件夹与main.py同目录
    在这里插入图片描述

  • 将代码中证书路径替换为对应的存放路径

  • 完成后打包上传至服务器
    在这里插入图片描述

四. 运行python程序

#进入程序存放路径
cd 存放路径
#使用默认端口以及文件存放根路径
nohup python mian.py &
#可自定义端口以及文件存放根路径
nohup python mian.py 8000 ./data &

五. 测试接口

  • 使用Apipost或者Postman工具进行上传测试
    在这里插入图片描述
  • 成功获取到链接后在浏览器打开查看
    在这里插入图片描述
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaofang113

新人报到,请多关照

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值