利用FastAPI为wordpress弄一个API接口:WebStack Pro的API后端部署

前言

一为的wordpress主题WebStack Pro 内置了前端百度、知乎、微博等热门排名榜数据。据一为所说,其实他也是通过爬取获取的数据,再通过API的形式展现出来,所以我们获得主题之后要向作者免费索取token才行。

我的网站是做金融的,对默认自带的热门徘行榜没有兴趣。于是乎我就利用python的FastAPI 做了一个API接口。 这里只介绍具体如何利用FastAPI制作API接口,对于数据的爬取、mysql的搭建等操作就不是本教程的范畴了。

对了,我是利用了宝塔在CentOS上搭建的python, 所以下文多多少少会涉及宝塔上的操作。

部署

  1. 首先在root或其他文件夹API下建立新文件夹
mkdir API
cd API
  1. 用宝塔或者命令建立两个文件,一个是api.py,一个是requirements.txt文件。 py文件是代码文件,txt文件是python需要用到的运行库

  2. requirements.txt的内容:

pymysql
fastapi
uvicorn
starlette
gunicorn
  1. 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)

上面的数据库或访问地址设置,请根据自己的需求修改。不要麻木的复制粘贴。

下面是mysql对应的数据结构:

  1. 使用宝塔自带的python管理器建立新的应用

  1. 启动
    先不要在python管理器上启动程序,因为会启动失败。 我们需要进入SSH的python虚拟环境启动:
    在SSH上输入命令:
#进入虚拟环境
source /root/API/API_venv/bin/activate
#进入API文件夹
cd API
##使用gunicorn启动api.py,并制定运行端口
gunicorn api:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:5001
  1. 填写映射的网址

  2. 测试
    打开http://localhost:5001/fashenwei/1

应该会出现数据。

  1. 效果

最终的效果可以参考我的网站首页: cnVaR.cn

  1. 参考
    https://www.jianshu.com/p/8ea438251e44
    https://www.uvicorn.org/deployment/
    https://www.uvicorn.org/#running-with-gunicorn
    https://blog.csdn.net/pdcfighting/article/details/105424166
    https://blog.csdn.net/Lin_Hv/article/details/106116172
    https://www.jianshu.com/p/da6ed1d0c7e5
阅读量: | 柯西君_BingWong | 2020-08-17