标题基于django框架的模型能力封装:将模型部署在docker中提供WebAPI的服务

1 篇文章 0 订阅
1 篇文章 0 订阅

标题基于django框架的模型能力封装:将模型部署在docker中提供WebAPI的服务

近刚刚入职,公司要我将做好的能力部署在docker中,之前从来没有接触过,在网上也没有教程,在这里我分享并记录一下我的学习成果,希望对有需求的人有所帮助。

展示API的使用方法

首先,我们需要知道这是什么东西,我先演示一下最后的效果。假设现在已经部署好了我们的模型在docker中,我们只需要知道docker所在主机的ip和docker的端口(这个后续步骤就知道怎么知道了,可以自己设置),将两部分组成一个链接,在将输入给到这个链接我们就可以拿到结果了。下面就是使用模型的代码。

import requests
import json
data = json.dumps({	
	'x':'-1',	#模型输入为两个值
	'y':'4'
})
res = requests.post( url='http://192.168.65.128:8000/api/',data= data )
print(res.text)

部署的主要过程

我是在windows上开了linux的虚拟机,来练手,和和服务其是一样的,部署主要分为如下几部分:

  • 写webAPI的服务
  • 安装VMware虚拟机
  • 在虚拟机的linux系统中安装docker
  • 开一个docker容器
  • 将api的项目放到开启的docker容器中
  • 使用api

写webAPI的服务

django的项目文件很多,你最好先安装一个pycharm。我们通过pycharm构建一个新的django项目,项目结构如下图,不重要的地方没有展开:
在这里插入图片描述

./mysite/mysite/sittings.py:

#以下两个部分需要修改
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'login',
]
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

./mysite/mysite/urls.py:

from django.contrib import admin
from django.urls import path
from login import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', views.api),
]

./mysite/login/predict.py:

#我们的模型,我就写了一个很简单的
def model(x,y):
    z = x + y
    k = x*y + z
    return k

./mysite/login/views.py:

from django.http.response import HttpResponse
import json
from . import predict
from django.shortcuts import render
# Create your views here.

def api(request):
    dic = {
        'resultCode' : '',
        'resultDetail' : '',
        'resultDesc' : {
            'msg': '',
            'z' : ''
        }
    }
    if request.method == 'POST':
        data = str(request.body)
        data = eval(data[2:-1])
        try:
            x = int(data['x'])
            y = int(data['y'])
        except:
            dic['resultCode'] = '1'
            dic['resultDetail'] = 'input data exception'
            dic['resultDesc']['msg'] = 'predict failure'
            dic = json.dumps(dic)
            return HttpResponse(dic)
        try:
            z = predict.model(x,y)
            dic['resultCode'] = '0'
            dic['resultDesc']['msg'] = 'successful'
            dic['resultDesc']['z'] = z
            dic = json.dumps(dic)
            return HttpResponse(dic)
        except:
            dic['resultCode'] = '2'
            dic['resultDetail'] = 'Failed to call model'
            dic['resultDesc']['msg'] = 'predict failure'
            dic = json.dumps(dic)
            return HttpResponse(dic)
    else:
        dic['resultCode'] = '3'
        dic['resultDetail'] = 'Failed to call API'
        dic['resultDesc']['msg'] = 'predict failure'
        dic = json.dumps(dic)
        return HttpResponse(dic)

这样我们的api就完成了,你可以运行这个项目,然后post给 http://127.0.0.1:8000/api/ 两个值就可以了,如果有以下结果出现就说明你成功了第一步。
在这里插入图片描述

安装VMware

安装只要自己去官网下载就可以了,接下来就需要下载Linux的iso文件,然后解决传送文件的问题

在ubuntu中安装docker、开启docker容器并将api放入容器中

首先安装docker,教程有很多,这里就不说了。然后你要下载镜像,但是国内下载镜像很慢,所以需要加速镜像,阿里云有教程,很简单。
然后你就需要开一个容器,但是一定要有端口映射,不然外面是用不了你部署的服务的。

docker run -itd -p 8000:80 ubuntu /bin/bash 
#80是你开服务时候的端口 , 8000是你外面访问这个api时的端口,别弄反了
# ubuntu就是镜像,也就是给docker装一个ubuntu的系统

开启之后,同时把你写好的项目cp到容器里

sudo docker cp 文件 容器的ID:目的路径

接下来就需要给我们的容器的ubuntu系统安装python和pip,安装python3时会出现问题,这是解决方法

使用api

在使用时,我们只需要cd到我们的项目的manager.py所在目录中,运行以下命令即可:

nohup python3 manager.py runserver 0.0.0.0:80 &>log.log &
#挂起执行,运行的log写入 log.log文件,最后挂起这个容器即可

最后,通过第一部分API的使用方法即可使用我们的api来拿到结果了。post时,ip就是虚拟机的ip,端口是8000。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值