前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Flask在服务器实现一个API接口。

使用Flask在服务器实现一个API接口。

作者头像
小F
发布2020-10-09 15:45:52
1.8K0
发布2020-10-09 15:45:52
举报

上一期说了如何在本地实现一个API接口。

这一期就来说说如何在服务器上实现一个API接口。

主要涉及到Python3、MySQL、Flask、Nginx、uwsgi这几个东西。

首先来看一下小F的成果,历史长河数据接口(https访问)。

完美符合小程序的开发要求。

https://www.fanasite.xyz:33550/port/history/?month=11&day=29(复制到浏览器打开)

可以看到接口在浏览器中能够成功请求到。

其中「month」和「day」的参数可变。

那么是如何实现的,小F就来说一下。

首先在Mac的终端上登陆云服务器。

代码语言:javascript
复制
# 在Mac的终端上连接服务器
ssh root@0.0.0.0(你的IP)

然后在云服务器的根目录下安装下面这些依赖。

代码语言:javascript
复制
# 添加epel源
[root@VM_0_8_centos ~]# yum install epel-release
# 更新,时间特别久
[root@VM_0_8_centos ~]# yum -y update
# gcc可以make
[root@VM_0_8_centos ~]# yum install gcc
# 数据压缩库
[root@VM_0_8_centos ~]# yum -y install zlib*
# 安装ssl
[root@VM_0_8_centos ~]# yum install openssl-devel -y
# 安装开发工具
[root@VM_0_8_centos ~]# yum -y groupinstall "Development tools"
# 安装Python开发包
[root@VM_0_8_centos ~]# yum install python-devel

这样在安装过程中就不会报错了。

为此小F还把服务器重装系统,再跑了一遍流程,无问题。

接下来安装MySQL,并将本地的数据库数据导入到服务器上。

代码语言:javascript
复制
# 打开tmp文件夹,在此文件夹下安装MySQL
[root@VM_0_8_centos ~]# cd /tmp
# 下载MySQL的rpm包
[root@VM_0_8_centos tmp]# wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
# 解压rpm包
[root@VM_0_8_centos tmp]# rpm -ivh mysql-community-release-el7-5.noarch.rpm
# 安装MySQL服务,时间特别久
[root@VM_0_8_centos tmp]# yum install mysql-community-server
# 启动MySQL服务
[root@VM_0_8_centos tmp]# service mysqld restart


# 登陆数据库
[root@VM_0_8_centos tmp]# mysql -u root
# 进入MySQL服务,并且设置密码,此处设置为20191129
mysql> set password =password('20191129');
# 设置密码后刷新
mysql> flush privileges;
# 退出MySQL界面
mysql> quit;

这样MySQL在服务器上就安装好了,并且开启了服务。

现在则需将本地的数据上传到服务器,使用「Sequel Pro」远程连接服务器。

输入你的服务器IP、用户名、密码,即可连接上服务器的MySQL。

登陆进去后先新建一个数据库,名字为history,然后导入本地已经准备好的「.sql」文件。

这里出现了一个问题,文件会导入失败。

原因是本地和服务器上的MySQL版本不同,本地是8.0+,服务器上则是5.0+。

解决办法就是将「.sql」文件中的内容进行替换。

utf8mb4_0900_ai_ci替换为utf8_general_ci。

utf8mb4替换为utf8。

导入成功,MySQL这方面的事情就处理完了。

安装Python3,并且建立软链接。

代码语言:javascript
复制
# 打开tmp文件夹,在此文件夹下安装Python3
[root@VM_0_8_centos ~]# cd /tmp
# 下载Python3的rpm包
[root@VM_0_8_centos tmp]# wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
# 解压rpm包
[root@VM_0_8_centos tmp]# tar -xzvf Python-3.6.8.tgz -C /tmp
# 切换到解压后的目录
[root@VM_0_8_centos tmp]# cd /tmp/Python-3.6.8/
# 安装
[root@VM_0_8_centos Python-3.6.8]# ./configure --prefix=/usr/local
[root@VM_0_8_centos Python-3.6.8]# make
[root@VM_0_8_centos Python-3.6.8]# make altinstall

# 为Python3创建软链接,让系统识别Python3时调用Python3.6.8版本
[root@VM_0_8_centos Python-3.6.8]# ln -s /usr/local/bin/python3.6 /usr/bin/python3
# 建立软连接,让系统识别pip3
[root@VM_0_8_centos Python-3.6.8]# ln -s /usr/local/bin/pip3.6 /usr/local/bin/pip3
# 更新升级pip3,18→19
[root@VM_0_8_centos Python-3.6.8]# pip3 install --upgrade pip

然后再回到主目录,安装一些Python3的依赖。

如果不安装的话,在安装uwsgi的时候就会出错。

代码语言:javascript
复制
# 查看有哪些需要安装的Python3依赖
[root@VM_0_8_centos ~]# yum search python3 | grep devel

# 安装如下的Python3依赖,5个
[root@VM_0_8_centos ~]# yum install -y python36-cairo-devel.x86_64
[root@VM_0_8_centos ~]# yum install -y python36-greenlet-devel.x86_64
[root@VM_0_8_centos ~]# yum install -y python36-devel.x86_64
[root@VM_0_8_centos ~]# yum install -y python36-gobject-devel.x86_64
[root@VM_0_8_centos ~]# yum install -y shiboken-python36-devel.x86_64

注意这里的数字36对应你安装的Python3版本。

在主目录下安装虚拟环境包并且创建虚拟环境,这个在大家的PyCharm中应该很熟悉。

代码语言:javascript
复制
# 安装虚拟环境库
[root@VM_0_8_centos ~]# pip3 install virtualenv

# 新建一个文件夹,用于Flask项目
[root@VM_0_8_centos ~]# mkdir -p /root/app/test
# 新建一个文件夹,用于日志输出
[root@VM_0_8_centos ~]# mkdir -p /root/app/test/logs
# 打开文件夹
[root@VM_0_8_centos ~]# cd /root/app/test
# 在文件夹处创建虚拟环境
[root@VM_0_8_centos test]# virtualenv env
# 开启虚拟环境
[root@VM_0_8_centos test]# source env/bin/activate

# 在虚拟环境中安装相关库
(env) [root@VM_0_8_centos test]# pip3 install flask
(env) [root@VM_0_8_centos test]# pip3 install uwsgi
(env) [root@VM_0_8_centos test]# pip3 install pymysql

在Mac上创建一个名为uwsgi.ini文件,并且上传到虚拟环境下的文件夹。

uwsgi.ini文件内容如下。

代码语言:javascript
复制
[uwsgi]
# uwsgi 启动时所使用的地址与端口
socket = 127.0.0.1:8001

#虚拟环境目录 
home = /root/app/test/env

#项目目录
pythonpath = /root/app/test

#指向网站根目录
chdir = /root/app/test

#python启动程序文件
wsgi-file = history_river.py

#python程序内用于启动的application变量名
callable = app

#处理器数
processes = 4 

#线程数
threads = 2 

#状态监测地址
stats = 127.0.0.1:9191 

同样将本地history_river.py文件上传至该文件夹下。

代码语言:javascript
复制
import json
import pymysql
from flask import Flask, request
from pymysql.cursors import DictCursor

app = Flask(__name__)


# 只接受get方法访问
@app.route("/port/history/", methods=["GET"])
def check():
    # 默认返回内容
    return_dict = {'code': 1, 'result': False, 'msg': '请求成功'}
    # 判断入参是否为空
    if request.args is None:
        return_dict['return_code'] = '504'
        return_dict['return_info'] = '请求参数为空'
        return json.dumps(return_dict, ensure_ascii=False)
    # 获取传入的参数
    get_data = request.args.to_dict()
    month = get_data.get('month')
    day = get_data.get('day')
    date = str(month) + '/' + str(day)
    # 对参数进行操作
    return_dict['result'] = sql_result(date)
    return json.dumps(return_dict, ensure_ascii=False)


# 功能函数
def sql_result(date):
    conn = pymysql.connect(host='127.0.0.1', database='history', user='root', password='20191129')
    cursor = conn.cursor(DictCursor)
    cursor.execute("SELECT * FROM messages WHERE date= '%s'" % str(date))
    result = cursor.fetchall()
    conn.close()
    return result


if __name__ == "__main__":
    app.run(host='127.0.0.1', port=33550)

在虚拟环境下启动uwsgi.ini文件。

代码语言:javascript
复制
# 启动
(env) [root@VM_0_8_centos test]# uwsgi uwsgi.ini

这时窗口会监听服务状态,所以需要新建一个终端窗口访问服务器。

接下来配置Nginx部分,首先在主目录下安装Nginx。

代码语言:javascript
复制
# 安装Nginx
[root@VM_0_8_centos ~]# yum -y install nginx

# 安装后启动Nginx
[root@VM_0_8_centos ~]# nginx

# 修改Nginx的配置文件
[root@VM_0_8_centos ~]# vim /etc/nginx/nginx.conf

修改Nginx的配置文件,如下。

代码语言:javascript
复制
server {
        listen      33550 ssl;
        server_name www.fanasite.xyz;
        root        /usr/share/nginx/html;
        #证书文件名称
        ssl_certificate  1_www.fanasite.xyz_bundle.crt;
        #私钥文件名称
        ssl_certificate_key 2_www.fanasite.xyz.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        # 日志输出
        access_log  /root/app/test/logs/access.log;
        error_log   /root/app/test/logs/error.log;
        include /etc/nginx/default.d/*.conf;
        location / {
            include     uwsgi_params;
            uwsgi_pass  127.0.0.1:8001;
            uwsgi_param UWSGI_PYHOME /root/app/test/env;
            uwsgi_param UWSGI_CHDIR  /root/app/test;
            uwsgi_param UWSGI_SCRIPT app:app;
        }
}

此处的 /root/app/test/logs/access.log 中的文件夹logs,已在虚拟环境处新建好了。

回到主目录,重启Nginx服务,便能实现接口访问啦!

代码语言:javascript
复制
# 杀死所有Nginx进程
[root@VM_0_8_centos ~]# killall -9 nginx
# 启动Nginx
[root@VM_0_8_centos ~]# nginx
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 法纳斯特 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档