Peran web dan pekerja Python dengan Python Tools for Visual Studio

Penting

Cloud Services (klasik) sekarang tidak lagi digunakan untuk pelanggan baru dan akan dihentikan untuk semua pelanggan pada 31 Agustus 2024. Penyebaran baru sebaiknya menggunakan Azure Resource Manager yang baru berdasarkan model penyebaran Azure Cloud Services (dukungan tambahan) .

Artikel ini memberikan gambaran umum tentang penggunaan peran web dan pekerja Python menggunakan Python Tools for Visual Studio. Pelajari cara menggunakan Visual Studio untuk membuat dan menerapkan Cloud Service dasar yang menggunakan Python.

Prasyarat

Catatan

Untuk menyelesaikan tutorial ini, Anda memerlukan akun Azure. Anda dapat mengaktifkan keuntungan pelanggan Visual Studio atau mendaftar untuk coba gratis.

Apa itu peran web dan pekerja Python?

Azure menyediakan tiga model komputasi untuk menjalankan aplikasi: fitur Web Apps di Azure App Service, Azure Virtual Machines, dan Azure Cloud Services. Ketiga model mendukung Python. Cloud Services, yang mencakup peran web dan pekerja, menyediakan Platform as a Service (PaaS) . Dalam layanan awan, peran web menyediakan server web khusus Layanan Informasi Internet (IIS) untuk menghosting aplikasi web front-end, sementara peran pekerja dapat menjalankan tugas asinkron, jangka panjang, atau abadi yang independen dari interaksi atau input pengguna.

Untuk informasi selengkapnya, lihat Apa itu Cloud Service?.

Catatan

Ingin membuat situs web sederhana? Jika skenario Anda hanya melibatkan front-end situs web sederhana, pertimbangkan untuk menggunakan fitur Web Apps yang ringan di Azure App Service. Anda dapat dengan mudah meningkatkan ke Cloud Service saat aplikasi web Anda berkembang dan persyaratan Anda berubah. Lihat Pusat Pengembang Python untuk artikel yang mencakup pengembangan fitur Web Apps di Azure App Service.

Pembuatan proyek

Di Visual Studio, Anda dapat memilih Azure Cloud Service dalam kotak dialog Proyek Baru, di bawah Python.

Dialog Proyek Baru

Dalam wizard Azure Cloud Service, Anda bisa membuat peran web dan pekerja baru.

Dialog Azure Cloud Service

Templat peran pekerja dilengkapi dengan kode boilerplate untuk terhubung ke akun penyimpanan Azure atau Azure Service Bus.

Solusi Cloud Service

Anda dapat menambahkan peran web atau pekerja ke layanan awan yang ada kapan saja. Anda dapat memilih untuk menambahkan proyek yang ada dalam solusi Anda, atau membuat proyek baru.

Tambahkan Perintah Peran

Layanan awan Anda dapat berisi peran yang diterapkan dalam berbagai bahasa. Misalnya, Anda dapat menerapkan peran web Python menggunakan Django, dengan Python, atau dengan peran pekerja C#. Anda dapat dengan mudah berkomunikasi antara peran Anda menggunakan antrean Azure Service Bus atau antrean penyimpanan.

Instal Python di layanan awan

Peringatan

Skrip pengaturan yang diinstal dengan Visual Studio (pada saat artikel ini terakhir diperbarui) tidak berfungsi. Bagian ini menjelaskan solusinya.

Masalah utama dengan skrip pengaturan adalah bahwa skrip tidak menginstal python. Pertama, tentukan dua tugas startup dalam file ServiceDefinition.csdef. Tugas pertama (PrepPython.ps1) mengunduh dan menginstal runtime Python. Tugas kedua (PipInstaller.ps1) menjalankan pip untuk menginstal dependensi apa pun yang mungkin Anda miliki.

Skrip berikut ditulis menargetkan Python 3.8. Jika Anda ingin menggunakan python versi 2.x, atur file variabel PYTHON2 ke aktif untuk dua tugas startup dan tugas runtime: <Variable name="PYTHON2" value="<mark>on</mark>" />.

<Startup>

  <Task executionContext="elevated" taskType="simple" commandLine="bin\ps.cmd PrepPython.ps1">
    <Environment>
      <Variable name="EMULATED">
        <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
      </Variable>
      <Variable name="PYTHON2" value="off" />
    </Environment>
  </Task>

  <Task executionContext="elevated" taskType="simple" commandLine="bin\ps.cmd PipInstaller.ps1">
    <Environment>
      <Variable name="EMULATED">
        <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
      </Variable>
      <Variable name="PYTHON2" value="off" />
    </Environment>

  </Task>

</Startup>

Variabel PYTHON2 dan PYPATH harus ditambahkan ke tugas startup pekerja. Variabel PYPATH hanya digunakan jika variabel PYTHON2 diatur ke aktif.

<Runtime>
  <Environment>
    <Variable name="EMULATED">
      <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
    </Variable>
    <Variable name="PYTHON2" value="off" />
    <Variable name="PYPATH" value="%SystemDrive%\Python27" />
  </Environment>
  <EntryPoint>
    <ProgramEntryPoint commandLine="bin\ps.cmd LaunchWorker.ps1" setReadyOnProcessStart="true" />
  </EntryPoint>
</Runtime>

Sampel ServiceDefinition.csdef

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="AzureCloudServicePython" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6">
  <WorkerRole name="WorkerRole1" vmsize="Small">
    <ConfigurationSettings>
      <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" />
      <Setting name="Python2" />
    </ConfigurationSettings>
    <Startup>
      <Task executionContext="elevated" taskType="simple" commandLine="bin\ps.cmd PrepPython.ps1">
        <Environment>
          <Variable name="EMULATED">
            <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
          </Variable>
          <Variable name="PYTHON2" value="off" />
        </Environment>
      </Task>
      <Task executionContext="elevated" taskType="simple" commandLine="bin\ps.cmd PipInstaller.ps1">
        <Environment>
          <Variable name="EMULATED">
            <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
          </Variable>
          <Variable name="PYTHON2" value="off" />
        </Environment>
      </Task>
    </Startup>
    <Runtime>
      <Environment>
        <Variable name="EMULATED">
          <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
        </Variable>
        <Variable name="PYTHON2" value="off" />
        <Variable name="PYPATH" value="%SystemDrive%\Python27" />
      </Environment>
      <EntryPoint>
        <ProgramEntryPoint commandLine="bin\ps.cmd LaunchWorker.ps1" setReadyOnProcessStart="true" />
      </EntryPoint>
    </Runtime>
    <Imports>
      <Import moduleName="RemoteAccess" />
      <Import moduleName="RemoteForwarder" />
    </Imports>
  </WorkerRole>
</ServiceDefinition>

Selanjutnya, buat file PrepPython.ps1 dan PipInstaller.ps1 di folder ./bin peran Anda.

PrepPython.ps1

Skrip ini menginstal python. Jika variabel lingkungan PYTHON2 diatur ke aktif, maka Python 2.7 diinstal, jika tidak Python 3.8 akan diinstal.

[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
$is_emulated = $env:EMULATED -eq "true"
$is_python2 = $env:PYTHON2 -eq "on"
$nl = [Environment]::NewLine

if (-not $is_emulated){
    Write-Output "Checking if Python is installed...$nl"
    if ($is_python2) {
        & "${env:SystemDrive}\Python27\python.exe"  -V | Out-Null
    }
    else {
        py -V | Out-Null
    }

    if (-not $?) {

        $url = "https://www.python.org/ftp/python/3.8.8/python-3.8.8-amd64.exe"
        $outFile = "${env:TEMP}\python-3.8.8-amd64.exe"

        if ($is_python2) {
            $url = "https://www.python.org/ftp/python/2.7.18/python-2.7.18.amd64.msi"
            $outFile = "${env:TEMP}\python-2.7.18.amd64.msi"
        }

        Write-Output "Not found, downloading $url to $outFile$nl"
        Invoke-WebRequest $url -OutFile $outFile
        Write-Output "Installing$nl"

        if ($is_python2) {
            Start-Process msiexec.exe -ArgumentList "/q", "/i", "$outFile", "ALLUSERS=1" -Wait
        }
        else {
            Start-Process "$outFile" -ArgumentList "/quiet", "InstallAllUsers=1" -Wait
        }

        Write-Output "Done$nl"
    }
    else {
        Write-Output "Already installed"
    }
}

PipInstaller.ps1

Skrip ini memanggil pip dan menginstal semua dependensi dalam file filerequirements.txt. Jika variabel lingkungan PYTHON2 diatur ke aktif, maka Python 2.7 digunakan, jika tidak Python 3.8 akan digunakan.

$is_emulated = $env:EMULATED -eq "true"
$is_python2 = $env:PYTHON2 -eq "on"
$nl = [Environment]::NewLine

if (-not $is_emulated){
    Write-Output "Checking if requirements.txt exists$nl"
    if (Test-Path ..\requirements.txt) {
        Write-Output "Found. Processing pip$nl"

        if ($is_python2) {
            & "${env:SystemDrive}\Python27\python.exe" -m pip install -r ..\requirements.txt
        }
        else {
            py -m pip install -r ..\requirements.txt
        }

        Write-Output "Done$nl"
    }
    else {
        Write-Output "Not found$nl"
    }
}

Ubah LaunchWorker.ps1

Catatan

Dalam kasus proyek peran pekerja, file LauncherWorker.ps1 diperlukan untuk menjalankan file startup. Dalam proyek peran web, file startup malah ditentukan dalam properti proyek.

bin\LaunchWorker.ps1 awalnya dibuat untuk melakukan banyak pekerjaan persiapan tetapi tidak benar-benar berhasil. Ganti konten dalam file tersebut dengan skrip berikut.

Skrip ini memanggil file worker.py dari proyek Python Anda. Jika variabel lingkungan PYTHON2 diatur ke aktif, maka Python 2.7 digunakan, jika tidak Python 3.8 akan digunakan.

$is_emulated = $env:EMULATED -eq "true"
$is_python2 = $env:PYTHON2 -eq "on"
$nl = [Environment]::NewLine

if (-not $is_emulated)
{
    Write-Output "Running worker.py$nl"

    if ($is_python2) {
        cd..
        iex "$env:PYPATH\python.exe worker.py"
    }
    else {
        cd..
        iex "py worker.py"
    }
}
else
{
    Write-Output "Running (EMULATED) worker.py$nl"

    # Customize to your local dev environment

    if ($is_python2) {
        cd..
        iex "$env:PYPATH\python.exe worker.py"
    }
    else {
        cd..
        iex "py worker.py"
    }
}

ps.cmd

Templat Visual Studio seharusnya membuat file ps.cmd di folder ./bin. Skrip shell ini memanggil skrip pembungkus PowerShell di atas dan menyediakan pencatatan berdasarkan nama pembungkus PowerShell yang disebut. Jika file ini tidak dibuat, inilah yang seharusnya ada di dalamnya.

@echo off

cd /D %~dp0

if not exist "%DiagnosticStore%\LogFiles" mkdir "%DiagnosticStore%\LogFiles"
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Unrestricted -File %* >> "%DiagnosticStore%\LogFiles\%~n1.txt" 2>> "%DiagnosticStore%\LogFiles\%~n1.err.txt"

Jalankan secara lokal

Jika Anda menetapkan project layanan awan sebagai proyek startup dan menekan F5, cloud service berjalan di emulator Azure lokal.

Meskipun PTVS mendukung peluncuran di emulator, debugging (misalnya, titik henti) tidak berfungsi.

Untuk men-debug peran web dan pekerja, Anda dapat mengatur proyek peran sebagai proyek startup dan debug itu sebagai gantinya. Anda juga dapat mengatur beberapa proyek startup. Klik kanan solusi, lalu pilih Atur Proyek StartUp.

Properti Proyek Startup Solusi

Menerbitkan ke Azure

Untuk menerbitkan, klik kanan proyek layanan awan dalam solusi, lalu pilih Terbitkan.

Info Masuk Penerbitan Microsoft Azure

Ikuti wizard. Jika perlu, aktifkan desktop jauh. Desktop jauh berguna ketika Anda perlu men-debug sesuatu.

Bila Anda sudah selesai mengonfigurasi pengaturan, klik Terbitkan.

Progres muncul di jendela output, lalu Anda akan melihat jendela Log Aktivitas Microsoft Azure.

Jendela Log Aktivitas Microsoft Azure

Penerapan membutuhkan waktu beberapa menit untuk diselesaikan, lalu peran web dan/atau pekerja Anda berjalan di Azure!

Menyelidiki log

Setelah komputer virtual layanan awan dimulai dan menginstal Python, Anda dapat melihat log untuk menemukan pesan kegagalan. Log ini terletak di folder C:\Resources\Directory\{role}\LogFiles. PrepPython.err.txt memiliki setidaknya satu kesalahan di dalamnya dari ketika skrip mencoba mendeteksi apakah Python diinstal dan PipInstaller.err.txt mungkin mengeluh tentang versi pip yang sudah lama.

Langkah berikutnya

Untuk informasi selengkapnya tentang bekerja dengan peran web dan pekerja di Python Tools for Visual Studio, lihat dokumentasi PTVS:

Untuk detail selengkapnya tentang menggunakan layanan Azure dari peran web dan pekerja Anda, seperti menggunakan Azure Storage atau Azure Service Bus, lihat artikel berikut ini: