使用外部Git仓库(Bitbucket)将Azure网络服务部署到Django应用程序(确切地说是wagtail),我遇到了一个挑战。我想使用Python 3.6.1,因此我按照Managing Python on Azure App Service manual
的说明进行操作但是,部署失败并显示消息
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版本不可见。
你能告诉我可能的问题在哪里吗?
最好的问候,
康拉德
答案 0 :(得分:9)
经过几个小时的战斗,我终于设法像预期的那样运行这个混蛋;)
非常感谢@Jay Gong在本教程中一步一步地向您介绍了一些事情。
runtime.txt
文件是第一个问题。由于3.6版本的python是通过扩展安装的,实际上,部署过程现在不存在这个v。(它“知道”只有2.7和3.4)。所以第一步是摆脱这个文件。删除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
所有依赖项都已正确安装。
部署后,在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
然后它开始工作。
谢谢大家的支持。
答案 1 :(得分:3)
我尝试重现您的问题但失败了。我尝试将自己的django web app
部署到azure并且它可以正常工作。
您可以参考我的步骤并检查您是否遗漏了某些内容。
第1步: 按照official tutorial创建您的azure网络应用。
第2步: 添加Python扩展程序。
第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线程。
答案 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()