如何通过带Flask的RESTAPI在Python中部署Pytork?

如何通过带Flask的RESTAPI在Python中部署Pytork?,python,python-3.x,flask,pytorch,Python,Python 3.x,Flask,Pytorch,我正在AWS Sagemaker上工作,我的目标是遵循Pytorch的官方文档 上述教程中的原始预测函数如下所示: @app.route('/predict', methods=['POST']) def predict(): if request.method == 'POST': file = request.files['file'] img_bytes = file.read() class_id, class_name = get

我正在AWS Sagemaker上工作,我的目标是遵循Pytorch的官方文档

上述教程中的原始预测函数如下所示:

@app.route('/predict', methods=['POST'])
def predict():
    if request.method == 'POST':
        file = request.files['file']
        img_bytes = file.read()
        class_id, class_name = get_prediction(image_bytes=img_bytes)
        return jsonify({'class_id': class_id, 'class_name': class_name})
我得到了这个,所以我添加了“GET”作为一个方法,正如我在中提到的,我还将我的示例简化为它的最小表达式:

from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/predict', methods=['GET','POST'])
def predict():
    if request.method == 'POST':
        return jsonify({'class_name': 'cat'})
    return 'OK'

if __name__ == '__main__':
    app.run()
我使用以下代码执行请求:

import requests

resp = requests.post("https://catdogclassifier.notebook.eu-west-1.sagemaker.aws/proxy/5000/predict",
                     files={"file": open('/home/ec2-user/SageMaker/cat.jpg', 'rb')})
resp是
,但是resp.json()返回
JSONDecodeError:期望值:第1行第1列(char 0)
最后,resp.url将我指向一个页面,说
'OK'

此外,这是相应内容的输出

<!DOCTYPE HTML>

<html>
<head>
  <style type="text/css">

#loadingImage {
    margin: 10em auto;
    width: 234px;
    height: 238px;
    background-repeat: no-repeat;
    background-image: url(data:image/png;base64,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);

    -webkit-animation:spin 4s linear infinite;
    -moz-animation:spin 4s linear infinite;
    animation:spin 4s linear infinite;
}


@-moz-keyframes spin { 100% { -moz-transform: rotate(360deg); } }
@-webkit-keyframes spin { 100% { -webkit-transform: rotate(360deg); } }
@keyframes spin { 100% { -webkit-transform: rotate(360deg); transform:rotate(360deg); } }

  </style>
</head>

<body>

  <div id="loadingImage"></div>

<script type="text/javascript">



var RegionFinder = (function()
{
    function RegionFinder( location ) {
        this.location = location;
    }


    RegionFinder.prototype = {


        getURLWithRegion: function() {

            var isDynamicDefaultRegion = ifPathContains(this.location.pathname, "region/dynamic-default-region");

            var queryArgs = removeURLParameter(this.location.search, "region");

            var hashArgs = this.location.href.split("#")[1] || "";
            if (hashArgs) {
                hashArgs = "#" + hashArgs;
            }

            var region = this._getCurrentRegion();
            var newArgs = "region=" + region;
            if (_shouldAuth()) {
                newArgs = "needs_auth=true";
                region = "nil";
            }

            if (queryArgs &&
                queryArgs != "?") {
                queryArgs += "&" + newArgs;
            } else {
                queryArgs = "?" + newArgs;
            }



            if (!region) {

                var contactUs = "https://portal.aws.amazon.com/gp/aws/html-forms-controller/contactus/aws-report-issue1";

                alert("How embarrassing! There is something wrong with this URL, please contact AWS at " + contactUs);
            }

            var pathname = isDynamicDefaultRegion ?  "/console/home" : this.location.pathname;

            return this.location.protocol + "//" + _getRedirectHostFromAttributes() +
                pathname + queryArgs + hashArgs;
        },


        _getCurrentRegion: function() {

            return _getRegionFromHash( this.location ) ||
                   _getRegionFromAttributes();
        }
    };



    function ifPathContains(url, parameter) {
        return (url.indexOf(parameter) != -1);
    }


    function removeURLParameter(url, parameter) {
        var urlparts= url.split('?');
        if (urlparts.length>=2) {
            var prefix= encodeURIComponent(parameter);
            var pars= urlparts[1].split(/[&;]/g);
            //reverse iteration as may be destructive
            for (var i= pars.length; i-- > 0;) {
                if (pars[i].lastIndexOf(prefix, 0) !== -1) {
                    pars.splice(i, 1);
                }
            }
            url= urlparts[0]+'?'+pars.join('&');
            return url;
        } else {
            return url;
        }
    }


    function _getRegionFromAttributes() {
        return "eu-west-1";
    };

    function _shouldAuth() {
        return "";
    };

    function _getRedirectHostFromAttributes() {
        return "eu-west-1.console.aws.amazon.com";
    }


    function _getRegionFromHash( location ) {

        var hashArgs = "#" + (location.href.split("#")[1] || "");


        var hashRegionArg = "";


        var match = hashArgs.match("region=([a-zA-Z0-9-]+)");
        if (match && match.length > 1 && match[1]) {
            hashRegionArg = match[1];
        }
        return hashRegionArg;
    }

    return RegionFinder;
})();


var regionFinder = new RegionFinder( window.location );

window.location.href = regionFinder.getURLWithRegion();

</script>


</body>
</html>

#加载图像{
保证金:10em自动;
宽度:234px;
高度:238px;
背景重复:无重复;
背景图片:url(数据:image/png;base64,Ivborw0kgoaaaansuhueugaaooaaadubamaaadfk4zraamfbmveuaaaghoxfxfo6og3nzdpt0/4+pgmjibfxcwhoaf8fhzy2niysrjmzmany1dq0olk+cnaaaxtrstlmakmaqobyzgaabljrefuentnyx5+a3ox1tfpxfxzzmbzzzzmbmzmzzmly7xfjtmslljtmslljtllh4h3fh3fh3fzzf13/+www7f8f8f8f8f8f8f8f8f8f8f8f8+w9f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f82.2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 Khqdvpaunbvtumsvubskqoapd2)2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 QKU6YFUVDWVGXNT4FFVVZUXDR2.这两个词的意思是一个词的意思是一个词的意思是一个词的意思是一个词的意思是一个词的意思是一个词的意思是一个词的意思是一个词的意思是,这个词的意思是一个词的意思是,这个词的意思是一个词的意思是一个词的意思是,这个词的意思是一个词的意思是一个词的意思是一个词的意思是一个词的意思是一个词,这个词的意思是一个词的意思是一个词的意思是一个词的意思是一个词的意思是一个词的意思是一个词的意思意思是一个词的意思是一个词的意思是一个词的意思是一个词的意思意思是一个词的意思是一个词的意思意思是一个词的意思是一个词的意思是一个词的意思意思是一个词的意思是一个词的意思是一个词,或者或者或者或者或者JFZFJQLUUXQPMW5MQCUYO2.在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,QQQQQQQQQQQQBBBBBBBBBBBBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBTHB7SrMoluzWMZLQ+(2)这两种研究方法是:一种研究方法是:ZZZZZZZZZZZZZZZVZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ2 2 2 2/AZZZZZZZZVVVBBBBBXXXXXXXXXXXBBBBBBBBBBBBBBBBBBBXXXXXXXXXXXXXXBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBYRJWJMFZ96+IHI0TBR29US3A1WXNEBWM4Civerfprlbxtrytcyyd5lrqodizhvf+LWOZiJkQ+pgkw8lpn4gyltel5aoljpu7mlkwdpsce9kih/fc1znduqqpkphp9mukhpgx50j3a+jR/pjN9MQmHwGl/1cqtwsmjbsn2+n1ku7ycj9ysgyjse25x5ovgr0bd2imh0axbu96tcvzi2eo9fpfgje32nx2+qVu/tuwhtwww5bw8phcd4x4x4qwwg4x4qwjjjj4x4h4x4jjjjj4h4h4h4h4h4h4h4h4h4h4h4h4h4h4h4h4;
-webkit动画:旋转4s线性无限;
-moz动画:旋转4s线性无限;
动画:旋转4s线性无限;
}
@-moz关键帧旋转{100%{-moz变换:旋转(360度);}
@-webkit关键帧旋转{100%{-webkit变换:旋转(360度);}
@关键帧旋转{100%{-webkit变换:旋转(360度);变换:旋转(360度);}
var RegionFinder=(函数()
{
功能区域文件夹(位置){
这个位置=位置;
}
RegionFinder.prototype={
getURLWithRegion:函数(){
var isDynamicDefaultRegion=ifPathContains(this.location.pathname,“区域/动态默认区域”);
var queryArgs=removeURLParameter(this.location.search,“region”);
var hashArgs=this.location.href.split(“#”)[1]||;
if(hashArgs){
hashArgs=“#”+hashArgs;
}
var region=这个。_getCurrentRegion();
var newArgs=“region=”+区域;
如果(_shouldAuth()){
newArgs=“needs\u auth=true”;
region=“nil”;
}
if(queryArgs)&&
queryArgs!=“?”){
queryArgs+=“&”+newArgs;
}否则{
queryArgs=“?”+newArgs;
}
如果(!区域){
var contactUs=”https://portal.aws.amazon.com/gp/aws/html-forms-controller/contactus/aws-report-issue1";
警告(“多么尴尬!此URL有问题,请通过“+联系我们”与AWS联系);
}
var pathname=isDynamicDefaultRegion?/console/home:this.location.pathname;
返回this.location.protocol+“/”+_getRedirectHostFromAttributes()+
路径名+queryArgs+hashArgs;
},
_getCurrentRegion:函数(){
return\u getRegionFromHash(this.location)||
_getRegionFromAttributes();
}
};
函数ifPathContains(url,参数){
返回(url.indexOf(参数)!=-1);
}
函数removeURLParameter(url,参数){
var urlparts=url.split(“?”);
如果(urlparts.length>=2){
var prefix=encodeURIComponent(参数);
var pars=urlparts[1]。拆分(/[&;]/g);
//可能具有破坏性的反向迭代
对于(变量i=pars.length;i-->0;){
if(pars[i].lastIndexOf(前缀,0)!=-1){
部分拼接(i,1);
}
}
url=urlparts[0]+'?'+pars.join('&');
返回url;
}否则{
返回url;
}
}
函数_getRegionFromAttributes(){
返回“eu-west-1”;
};
函数_shouldAuth(){
返回“”;
};
乐趣
import requests

resp = requests.post("https://localhost:5000/predict",
                     files={"file": open('/home/ec2-user/SageMaker/cat.jpg', 'rb')})