Flask请求最终在Azure上出现500服务器错误

时间:2017-08-14 05:33:32

标签: python azure flask

我在Azure上运行了一个Flask网络应用程序,我开始对应用程序进行编码,一切正常,直到我决定提出从YouTube API获取一些信息的请求。

以下是代码:

import requests
from flask_restful import Resource

class GetChannelList(Resource):
    def get(self):
        url = "https://content.googleapis.com/youtube/v3/search?key=AIzaSyDHYcHfhnhIiuQUejcfkeorMHNQDL4Htvc&channelId=UCvS6-K6Ydmb4gH-kim3AmjA&part=snippet,id&order=date&maxResults=20"
        return requests.get(url).content.json()

然后在另一个Python文件中:

from flask import Flask
from flask_restful import Api
from api.get_channel_list import GetChannelList
app = Flask(__name__)

api = Api(app)

api.add_resource(GetChannelList, "/api/get_channel_list")

import FlaskWebProject1.views

最后,在我的Angular控制器上,我有这个:

$scope.GetChannelList = function(){
            $http.get('api/get_channel_list').then(function(data){
                $scope.data = data;
            });
            return $scope.data;
        }

在应用程序向YouTube发出请求之前,一切正常,然后会显示以下消息:

azure error

所以我决定检查日志,这就是它们出现的内容:

azure error 2 azure error 3

我本周五刚开始使用Flask和Azure,我不知道接下来要做什么来解决这个问题。任何帮助或指示可以解决这个问题将不胜感激。

这是我的web.config文件:

<?xml version="1.0"?>
<!-- Generated web.config for Microsoft Azure. Remove this comment to prevent
     modifications being overwritten when publishing the project.
-->
<configuration>
  <system.diagnostics>
    <trace>
      <listeners>
        <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics">
          <filter type="" />
        </add>
      </listeners>
    </trace>
  </system.diagnostics>
  <appSettings>
    <add key="WSGI_ALT_VIRTUALENV_HANDLER" value="FlaskWebProject1.app" />
    <add key="WSGI_ALT_VIRTUALENV_ACTIVATE_THIS" value="D:\home\site\wwwroot\env\Scripts\activate_this.py" />
    <add key="WSGI_HANDLER" value="ptvs_virtualenv_proxy.get_virtualenv_handler()" />
    <add key="PYTHONPATH" value="D:\home\site\wwwroot" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <handlers>
      <add name="Python FastCGI" path="handler.fcgi" verb="*" modules="FastCgiModule" scriptProcessor="D:\Python27\python.exe|D:\Python27\Scripts\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" />
    </handlers>
    <rewrite>
      <rules>
        <rule name="Static Files" stopProcessing="true">
          <match url="^/static/.*" ignoreCase="true" />
          <action type="Rewrite" url="^/FlaskWebProject1/static/.*" appendQueryString="true" />
        </rule>
        <rule name="Configure Python" stopProcessing="true">
          <match url="(.*)" ignoreCase="false" />
          <conditions>
          </conditions>
          <action type="Rewrite" url="handler.fcgi/{R:1}" appendQueryString="true" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

修改

产生以下错误:

  

SNIMissingWarning:已经发出了HTTPS请求,但是SNI   (主题名称指示)此处不提供TLS扩展名   平台。这可能导致服务器出现错误的TLS   证书,可能导致验证失败。你可以升级到   更新版本的Python来解决这个问题。有关更多信息,请参阅   https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings

     

InsecurePlatformWarning:真正的SSLContext对象不可用。   这可以防止urllib3适当地配置SSL并可能导致   某些SSL连接失败。您可以升级到更新版本   Python来解决这个问题。有关更多信息,请参阅   https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings

     

InsecurePlatformWarning
  HTTPSConnectionPool(host =&#39; content.googleapis.com&#39;,port = 443):Max   使用url超出重试次数:   /的YouTube / V3 /搜索键= AIzaSyCxd3KGNNiZy-omyDH7U8Lr3zGQD6ZO448&安培;?的channelID = UCvS6-K6Ydmb4gH-kim3AmjA&安培;部分=片断,ID与秩序=日期&安培;的maxResults = 20   (由SSLError引起(SSLError(1,&#39; _ssl.c:499:错误:14090086:SSL)   例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败&#39;),))

2 个答案:

答案 0 :(得分:1)

正如您Rob van der woude 的链接所示,

  

<强> SNIMissingWarning

     

这发生在早于 2.7.9 的Python 2版本上。这些旧版本缺乏SNI支持。这可能导致服务器显示客户端认为无效的证书。按照pyOpenSSL指南解决此警告。

我在Kudu控制台上通过命令Python 2.7.8检查了Azure WebApps的Python2版本,即https://<your-webapp-name>.scm.azurewebsites.net/SiteExtensions/#gallery。因此,您可以尝试通过Kudu网站扩展程序(Python 2.7.12 x86)安装更高版本的Python2,如下图所示,例如D:\home\Python27\

SSL Warning

然后,它将安装在web.config路径上,您需要在{{1}}文件中更新Python的相关配置,以便再次尝试烧录应用程序。

希望它有所帮助。

答案 1 :(得分:0)

我不认为它与Azure有关。

我认为问题在于您对YouTube的请求引发了异常。

阻止并找出异常的

Try/Catch

class GetChannelList(Resource):
def get(self):
    try:
        url = "https://content.googleapis.com/youtube/v3/search?key=AIzaSyDHYcHfhnhIiuQUejcfkeorMHNQDL4Htvc&channelId=UCvS6-K6Ydmb4gH-kim3AmjA&part=snippet,id&order=date&maxResults=20"
        return requests.get(url).content.json()
    except Exception as e:
        print(str(e))
        return {'message': 'Something went wrong'}

要确切知道出了什么问题,请阅读youtube data api error documentation,并按照您的喜好抓住它们。

<强>更新

看起来您正在使用Python 2,默认情况下它带有不支持SNI的ssl模块。你有两个选择。首先,将python升级到Python 3.或者安装请求的安全版本:

pip install 'requests[security]'  

希望它有所帮助!