使用 heroku 搭建随机萌图 API
起因是自己搭建了一个个人使用的导航站,背景图想要做成随机萌图,但又不想用别人搭建的现成 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/pythonCollecting 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:上面的头图是随机的