Ich habe versucht, eine Django-App mit PostgreSQL für den App-Dienst von Microsoft Azure bereitzustellen, aber ich hatte große Probleme, daher werde ich sie aufschreiben.
Ich habe durch verschiedene Versuche und Irrtümer mit dem Dokument herausgefunden.
--App Service OS ist standardmäßig Windows
Es ist natürlich, dass das Betriebssystem Windows ist, weil es Microsoft ist, aber es ist leicht zu übersehen, dass Linux eine Person ist, die in der Welt des gesunden Menschenverstandes aufgewachsen ist.
Als ich die Seite über Python im Menü durchsuchte, fand ich die folgenden vier.
Ich denke, es ist am besten, zuerst 1 zu versuchen und dann 4 zu sehen. 2 ist ein Tutorial, aber seien Sie vorsichtig, da es sich um eine spezielle Verwendung der Bereitstellung mit einem Docker-Image in der Vorschau-Version von Linux handelt. Sie müssen sich 3 nicht ansehen, wenn Sie Visual Studio nicht verwenden.
** Erstellen einer Python-Webanwendung in Azure **
--Verfahren zum Bereitstellen einer einfachen App mit Flask.
** [Erstellen von Docker Python- und PostgreSQL-Apps auf Azure](https://docs.microsoft.com/en-us/azure/app-service-web/app-service-web-tutorial-docker-python-postgresql -app) **
** [Django und MySQL unter Azure mit Python Tools 2.2 für Visual Studio](https://docs.microsoft.com/en-us/azure/app-service-web/web-sites-python-ptvs- django-mysql) **
** Konfigurieren von Python mit Azure App Service-Webanwendungen **
Ich konnte mit dem folgenden Verfahren mit den Informationen des offiziellen Dokuments + α bereitstellen.
Normalerweise mache ich eine Django App. Die folgenden Einstellungen sind bei der Bereitstellung erforderlich.
settings.py
DEBUG = False
ALLOW_HOST = ['*']
STATIC_ROOT = 'static'
Erstellen von Docker Python- und PostgreSQL-Apps auf Azure, Erstellen Sie eine PostgreSQL-Datenbank in Azure unter "Erstellen einer betriebsbereiten PostgreSQL-Datenbank".
AZ_GROUP="<resource_group>"
AZ_LOCATION="japanwest"
AZ_PG="<postgresql_name>"
AZ_PG_USER="<admin_username>"
AZ_PG_PASS="<admin_password>"
az postgres server create -g $AZ_GROUP -n $AZ_PG -l $AZ_LOCATION -u $AZ_PG_USER -p $AZ_PG_PASS
az postgres server firewall-rule create -g $AZ_GROUP --server-name $AZ_PG --start-ip-address=0.0.0.0 --end-ip-address=255.255.255.255 --name AllowAllIPs
Erstellen Sie eine Datenbank und einen Benutzer.
$ psql -h ${AZ_PG}.postgres.database.azure.com -U ${AZ_PG_USER}@${AZ_PG} postgres
python
CREATE DATABASE <database_name>;
CREATE USER <user> WITH PASSWORD '<password>';
GRANT ALL PRIVILEGES ON DATABASE <database_name> TO <user>;
Weitere Informationen finden Sie unter Erstellen einer Python-Webanwendung in Azure und im Folgenden Führen Sie den Befehl aus.
AZ_GROUP="<resource_group>"
AZ_LOCATION="japanwest"
AZ_APPSERVICE_PLAN="<plan_name>"
AZ_APPSERVICE_PLAN_TYPE="Free"
AZ_APP_NAME="<app_name>"
az group create -n $AZ_GROUP -l $AZ_LOCATION
az appservice plan create -n $AZ_APPSERVICE_PLAN -g $AZ_GROUP --sku $AZ_APPSERVICE_PLAN_TYPE
az webapp create -n $AZ_APP_NAME -g $AZ_GROUP --plan $AZ_APPSERVICE_PLAN --deployment-local-git
Upgrading Python on Azure App Service – Python Engineering at Microsoft
Wählen Sie den von Ihnen erstellten App-Dienst im Azure Portal-Bildschirm aus.> Erweiterungen auswählen> Wählen Sie die Python-Version aus, die Sie installieren möchten, und installieren Sie sie.
Erstellen Sie die folgende Datei.
requirements.txt
Django
psycopg2
.deployment
[config]
command = deploy.cmd
deploy.cmd
kopiert die Standardversion und ändert den Pfad von python.exe und pip entsprechend der Version.
deploy.cmd
@if "%SCM_TRACE_LEVEL%" NEQ "4" @echo off
:: ----------------------
:: KUDU Deployment Script
:: Version: 1.0.15
:: ----------------------
SET PYTHON_HOME=D:\home\python361x86
SET PYTHON=%PYTHON_HOME%\python.exe
SET PIP=%PYTHON% -m pip
:: Prerequisites
:: -------------
:: Verify node.js installed
where node 2>nul >nul
IF %ERRORLEVEL% NEQ 0 (
echo Missing node.js executable, please install node.js, if already installed make sure it can be reached from current environment.
goto error
)
:: Setup
:: -----
setlocal enabledelayedexpansion
SET ARTIFACTS=%~dp0%..\artifacts
IF NOT DEFINED DEPLOYMENT_SOURCE (
SET DEPLOYMENT_SOURCE=%~dp0%.
)
IF NOT DEFINED DEPLOYMENT_TARGET (
SET DEPLOYMENT_TARGET=%ARTIFACTS%\wwwroot
)
IF NOT DEFINED NEXT_MANIFEST_PATH (
SET NEXT_MANIFEST_PATH=%ARTIFACTS%\manifest
IF NOT DEFINED PREVIOUS_MANIFEST_PATH (
SET PREVIOUS_MANIFEST_PATH=%ARTIFACTS%\manifest
)
)
IF NOT DEFINED KUDU_SYNC_CMD (
:: Install kudu sync
echo Installing Kudu Sync
call npm install kudusync -g --silent
IF !ERRORLEVEL! NEQ 0 goto error
:: Locally just running "kuduSync" would also work
SET KUDU_SYNC_CMD=%appdata%\npm\kuduSync.cmd
)
goto Deployment
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Deployment
:: ----------
:Deployment
echo Handling python deployment.
:: 1. KuduSync
IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" (
call :ExecuteCmd "%KUDU_SYNC_CMD%" -v 50 -f "%DEPLOYMENT_SOURCE%" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd"
IF !ERRORLEVEL! NEQ 0 goto error
)
IF NOT EXIST "%DEPLOYMENT_TARGET%\requirements.txt" goto postPython
pushd "%DEPLOYMENT_TARGET%"
:: 4. Install packages
echo Pip install requirements.
%PIP% install -r requirements.txt
IF !ERRORLEVEL! NEQ 0 goto error
REM Add additional package installation here
REM -- Example --
REM env\scripts\easy_install pytz
REM IF !ERRORLEVEL! NEQ 0 goto error
:: 5. Copy web.config
IF EXIST "%DEPLOYMENT_SOURCE%\web.%PYTHON_VER%.config" (
echo Overwriting web.config with web.%PYTHON_VER%.config
copy /y "%DEPLOYMENT_SOURCE%\web.%PYTHON_VER%.config" "%DEPLOYMENT_TARGET%\web.config"
)
:: 6. Django collectstatic
IF EXIST "%DEPLOYMENT_TARGET%\manage.py" (
echo Collecting Django static files. You can skip Django specific steps with a .skipDjango file.
IF NOT EXIST "%DEPLOYMENT_TARGET%\static" (
MKDIR "%DEPLOYMENT_TARGET%\static"
)
%PYTHON% manage.py collectstatic --noinput --clear
)
popd
:postPython
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
goto end
:: Execute command routine that will echo out when error
:ExecuteCmd
setlocal
set _CMD_=%*
call %_CMD_%
if "%ERRORLEVEL%" NEQ "0" echo Failed exitCode=%ERRORLEVEL%, command=%_CMD_%
exit /b %ERRORLEVEL%
:error
endlocal
echo An error has occurred during web site deployment.
call :exitSetErrorLevel
call :exitFromFunction 2>nul
:exitSetErrorLevel
exit /b 1
:exitFromFunction
()
:end
endlocal
echo Finished successfully.
web.config
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="PYTHONPATH" value="D:\home\site\wwwroot" />
<add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()" />
<add key="WSGI_LOG" value="D:\home\LogFiles\wfastcgi.log" />
<add key="DJANGO_SETTINGS_MODULE" value="project.settings" />
</appSettings>
<system.webServer>
<handlers>
<remove name="Python27_via_FastCGI" />
<remove name="Python34_via_FastCGI" />
<add name="Python FastCGI"
path="handler.fcgi"
verb="*"
modules="FastCgiModule"
scriptProcessor="D:\home\python361x86\python.exe|D:\home\python361x86\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>
Bitte ändern Sie den Teil von DJANGO_SETTINGS_MODULE
entsprechend dem Django-Projekt.
AZ_USER="<user>"
AZ_PASS="<password>"
az webapp deployment user set --user-name $AZ_USER --password $AZ_PASS
git remote add azure <git_url>
git push azure master
Die Git-URL wird angezeigt, wenn Sie eine Web-App erstellen. Sie können die App Service-Übersicht auch im Portal anzeigen.
ブラウザで<app_name>.azurewebsites.net/admin
にアクセスしてadminのログイン画面が表示されれば完了です。
Es war wegen der Struktur der offiziellen Dokumentation ziemlich schwankend. Ich war verwirrt, weil der Tutorial-Teil einen ganz anderen Weg erklärte. .. ..
Recommended Posts