起因是自己搭建了一个个人使用的导航站,背景图想要做成随机萌图,但又不想用别人搭建的现成 API(不一定是喜欢的图)。

用 python + Flask 很容易就能搭建一个简易 API,而且个人使用并不需要考虑高并发和异步.

from flask import *
import pymongo

app = Flask(__name__)

myclient = pymongo.MongoClient('localhost', 27017)
mydb = myclient["moePic"]
mycol = mydb["pics"]
dblist = myclient.list_database_names()

def get_pic():
    pipeline = [{'$sample': { 'size': 1 }}]
    data = mycol.aggregate(pipeline)
    for item in data:
        picUrl = "{domain}{date}/{name}".format(date = item["date"],name = item["name"],domain = item["domain"])
    return picUrl

@app.route('/moePic', methods=['GET'])
def get_tasks():
    return redirect(get_pic())

@app.errorhandler(404)
def not_found(error):
    return make_response(jsonify({'error': 'Not found'}), 404)

if __name__ == '__main__':
    app.run(debug=True)

简单写写大概框架就是这样,从 mongoDB 数据库中随机找出一张图片的地址,用 redirect() 将查到的图片地址重定向,这样就可以用 API 地址获取随机图片的网址了。

下一步就是把这个简单的 API 部署到 heroku 上面,mongoDB 则使用免费的 mongodb.com

app.py 为上述代码段,要部署到 heroku 上还需要构建为对应的形式:

moePic/
|
|-- venv/
|
|-- app.py
|-- wsgi.py
|-- Procfile
|
└-- requirements.txt

wsgi.py

from app import app

if __name__ == "__main__":
    app.run()

Procfile

web: gunicorn wsgi:app

部署期间遇到的问题:

  • 部署失败

    忘记在 setting 中把 Buildpacks 选为 heroku/python

  • Collecting gevent==21.1.2
    Downloading gevent-21.1.2.tar.gz (5.9 MB)
    Installing build dependencies: started
    Installing build dependencies: finished with status 'done'
    Getting requirements to build wheel: started
    Getting requirements to build wheel: finished with status 'error'
    error: subprocess-exited-with-error

    本来用的是 gevent 库 wsgi,结果本地测试正常,部署就会报错,遂转而使用 gunicorn,完美解决

  • mogonDB 的数据库需要设置开放 IP

PS:上面的头图是随机的