使用 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/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:上面的头图是随机的