▌前言
一为
的wordpress主题WebStack Pro 内置了前端百度、知乎、微博等热门排名榜数据。据一为所说,其实他也是通过爬取获取的数据,再通过API的形式展现出来,所以我们获得主题之后要向作者免费索取token才行。
我的网站是做金融的,对默认自带的热门徘行榜没有兴趣。于是乎我就利用python的FastAPI 做了一个API接口。
之前利用了宝塔在CentOS上搭建的python管理器功能轻松部署了FastApi, 但后来发现这个海外VPS的配置不行,而且比较慢,动不动内存就爆满,后来自己在家搭建了一个服务器然后通过frp弄成了外网。但发现直接用python来部署不美观,所以直接改为用dockerfile来生成docker打包部署FastApi会比较符合美学原则。
▌准备工作
1、新建文件夹api
2、在文件夹下建立三个文件,分别是:
Dockerfile
requirements.txt
api.py
▌Dockerfile
FROM python:3.6
WORKDIR /home/xxxxx/api
COPY requirements.txt ./
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY . .
CMD ["gunicorn", "api:app", "-w", "4", "-k","uvicorn.workers.UvicornWorker", "-b", "0.0.0.0:5001"]
其中,第二行 WORKDIR 后面写的是python程序所在目录的路径
▌requirements.txt
pymysql
fastapi
uvicorn==0.12.0
starlette==0.13.6
gunicorn
uvloop
pandas
requests
httptools
▌api.py
import pymysql
from pymysql.cursors import DictCursor
from fastapi import FastAPI
import uvicorn
from starlette.middleware.cors import CORSMiddleware
import pandas as pd
app = FastAPI()
# 这里设置你自己网站的网址,主要防止别人盗用你的API
origins = ["https://cnvar.cn",
"https://www.cnvar.cn",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/{ann}/{item_id}")
async def read_item(ann:str, item_id: int):
return_dict = {'code': 1, 'result': False, 'msg': '请求成功'}
if ann=="fashenwei":
if item_id==1:
return_dict['result'] = sql_result(ann, "首发")
elif item_id==2:
return_dict['result'] = sql_result(ann, "可转债")
elif item_id==3:
return_dict['result'] = sql_result(ann, "配股")
elif item_id==4:
return_dict['result'] = sql_result(ann, "增发")
else:
return_dict['result'] = "nothing"
elif ann=="erp":
if item_id==1:
return_dict['result'] = sql_result(ann, "China")
else:
return_dict['result'] = "nothing"
else:
return_dict['result'] = "nothing"
return return_dict
# 功能函数, 下面为数据库的信息
def sql_result(select, type):
conn = pymysql.connect(host='127.0.0.1', database='XXXXXXXX', user='XXXXXXX', password='XXXXXXXXX')
cursor = conn.cursor(DictCursor)
if select=='fashenwei':
cursor.execute("SELECT time, excerpt, title, type, url FROM fashenwei WHERE type= '%s' ORDER BY time DESC LIMIT 10" % str(type))
elif select=='erp':
cursor.execute("SELECT * FROM erp WHERE Country= '%s' LIMIT 1" % str(type))
result = cursor.fetchall()
conn.close()
return result
if __name__ == "__main__":
uvicorn.run("api:app", port=5001)
▌构建Docker镜像
完成这三个文件的创建之后,在Dockerfile所在目录下(这里是/home/xxxxx/api
)执行如下命令,就可以开始构建Docker镜像:
sudo docker build -t 'fastapi' .
接下来我们可以直接运行了:
▌临时运行docker镜像:
sudo docker run -it --rm -p 5001:5001 fastpi
可以看到Docker镜像成功地运行起来了,并处于阻塞状态。这时,我们打开浏览器,输入服务器外网 ip,可以我们的网站已经部署上去。
▌生产环境运行(以daemon方式运行)
sudo docker run -d -p 5001:5001 --name fastapione fastapi