在Azure应用服务上使用python 3.6 - 尽管它是作为扩展安装的,但仍无法正常工作

时间:2017-10-23 05:22:32

标签: python django azure azure-web-sites wagtail

使用外部Git仓库(Bitbucket)将Azure网络服务部署到Django应用程序(确切地说是wagtail),我遇到了一个挑战。我想使用Python 3.6.1,因此我按照Managing Python on Azure App Service manual

的说明进行操作
  • 我安装了python 3.6.1扩展程序
  • 我在我的应用程序的根目录中创建了web.config文件(我已检查并将其上传到服务器)

但是,部署失败并显示消息

Detecting Python runtime from runtime.txt
Unsupported runtime: python-3.6.1

Supported runtime values are:
python-2.7
python-3.4
An error has occurred during web site deployment.
\r\nD:\Program Files (x86)\SiteExtensions\Kudu\66.61008.3066\bin\Scripts\starter.cmd "D:\home\site\deployments\tools\deploy.cmd"

我的web.config文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="PYTHONPATH" value="D:\home\site\wwwroot"/>
    <!-- Django apps only -->
    <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()"/>
    <add key="WSGI_LOG" value="D:\home\LogFiles\wfastcgi.log"/>
  </appSettings>
  <system.webServer>
    <handlers>
      <add name="PythonHandler" path="*" verb="*" modules="FastCgiModule"
           scriptProcessor="D:\home\python361x64\python.exe|D:\home\python361x64\wfastcgi.py"
           resourceType="Unspecified" requireAccess="Script"/>
    </handlers>
  </system.webServer>
</configuration>

路径没问题,下面是来自Kudu控制台的ls

D:\home\python361x64>ls
DLLs
Lib
Scripts
__pycache__
python.exe
python3.dll
python36.dll
pythonw.exe
sitecustomize.py
vcruntime140.dll
wfastcgi.py

看起来部署过程没有考虑我的web.config文件,或者我通过扩展程序安装的python版本不可见。

你能告诉我可能的问题在哪里吗?

最好的问候,
康拉德

3 个答案:

答案 0 :(得分:9)

经过几个小时的战斗,我终于设法像预期的那样运行这个混蛋;)

非常感谢@Jay Gong在本教程中一步一步地向您介绍了一些事情。

    我在根文件夹中的
  1. runtime.txt文件是第一个问题。由于3.6版本的python是通过扩展安装的,实际上,部署过程现在不存在这个v。(它“知道”只有2.7和3.4)。所以第一步是摆脱这个文件。
  2. 删除runtime.txt后,部署过程一直在使用python 3.4,并且在安装requirements.txt文件的某个依赖项时失败(可能是因为旧版本的python)。所以下一步是添加.skipPythonDeployment,以避免自动安装需求并通过kudu console手动安装。在我们的python env文件夹中(在我的情况下为D:\home\python361x64),启动了以下命令 python.exe -m pip install --upgrade -r D:\home\site\wwwroot\requirements.txt
    所有依赖项都已正确安装。

  3. 部署后,在Web浏览器中启动应用程序会显示消息The page cannot be displayed because an internal server error has occurred.。下一步是收集有关该问题的更多信息,因此我在web.config文件中添加了一些新行:

    ....
    <system.webServer>
    ....
        <httpErrors errorMode="Detailed"></httpErrors>
    </system.webServer>
    <system.web>
        ....
         <customErrors mode="Off" />
    </system.web>
    

    多亏了这一点,我能够检查导致问题的原因。就我而言,WSGI_HANDLER中的值为web.config。我将它设置为正确的值(对于wagtail它是<app_name>.wsgi.application然后它开始工作。

  4. 谢谢大家的支持。

答案 1 :(得分:3)

我尝试重现您的问题但失败了。我尝试将自己的django web app部署到azure并且它可以正常工作。

您可以参考我的步骤并检查您是否遗漏了某些内容。

第1步: 按照official tutorial创建您的azure网络应用。

第2步: 添加Python扩展程序。

enter image description here

第3步: 添加web.config文件并部署您的网络应用。

<configuration>
  <appSettings>
    <add key="WSGI_HANDLER" value="<your project name>.wsgi.application"/>
    <add key="PYTHONPATH" value="D:\home\site\wwwroot"/>
    <add key="WSGI_LOG" value="D:\home\LogFiles\wfastcgi.log"/>
  </appSettings>
  <system.webServer>
    <handlers>
      <add name="PythonHandler" path="handler.fcgi" verb="*" modules="FastCgiModule" scriptProcessor="D:\home\python361x64\python.exe|D:\home\python361x64\wfastcgi.py" resourceType="Unspecified" requireAccess="Script"/>
    </handlers>
    <rewrite>
      <rules>
        <rule name="Static Files" stopProcessing="true">
          <conditions>
            <add input="true" pattern="false" />
          </conditions>
        </rule>
        <rule name="Configure Python" stopProcessing="true">
          <match url="(.*)" ignoreCase="false" />
          <conditions>
            <add input="{REQUEST_URI}" pattern="^/static/.*" ignoreCase="true" negate="true" />
          </conditions>
          <action type="Rewrite" url="handler.fcgi/{R:1}" appendQueryString="true" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

第4步: pip plugin安装python extension environment

第5步: 安装django模块以及您要使用的其他模块。

你可以参考一些类似的SO线程。

  1. Only getting Your App Service app has been created - after deploying to azure
  2. Django web app deploy in Azure via Visual Studio 2017
  3. 希望它对你有所帮助。

答案 2 :(得分:0)

我发布了Calfy答案缺失的部分。

<add key="WSGI_ALT_VIRTUALENV_HANDLER" value="app.wsgi_app" />
<add key="WSGI_ALT_VIRTUALENV_ACTIVATE_THIS" value="D:\home\python361x64\python.exe" />
<add key="WSGI_HANDLER" value="ptvs_virtualenv_proxy.get_venv_handler()"/>

app.wsgi_app实际上是你文件夹中的app.py,从我的理解它必须是一个wsgi应用程序而不是常规python应用程序..(我也在这里使用cherrypy mod)这个示例应用程序是从互联网上复制的。

import sys
import cherrypy

class Hello(object):
    @cherrypy.expose
    @cherrypy.tools.response_headers(headers=[('Content-Type', 'text/plain')])
    def index(self):
        message = """\
Hello Azure!
Python: {python_version}
CherryPy: {cherrypy_version}

More info: http://blog.cincura.net/id/233498
"""
        return message.format(python_version=sys.version, cherrypy_version=cherrypy.__version__)


wsgi_app = cherrypy.Application(Hello(), '/')

if __name__ == '__main__':
    from wsgiref.simple_server import make_server

    httpd = make_server('', 6600, wsgi_app)
    httpd.serve_forever()