Bagikan melalui


Peran web dan pekerja Python dengan Python Tools for Visual Studio

Penting

Cloud Services (klasik) sekarang tidak digunakan lagi untuk semua pelanggan per 1 September 2024. Setiap penyebaran yang sedang berjalan akan dihentikan dan dimatikan oleh Microsoft dan data akan hilang secara permanen mulai Oktober 2024. Penyebaran baru harus menggunakan model penyebaran berbasis Azure Resource Manager baru Azure Cloud Services (dukungan yang diperluas).

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

Prasyarat

Nota

Untuk menyelesaikan tutorial ini, Anda memerlukan akun Azure. Anda dapat mengaktifkan manfaat pelanggan Visual Studio atau mendaftar untuk uji 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 peran pekerja, menyediakan Platform as a Service (PaaS). Dalam layanan cloud, peran web menyediakan server web Layanan Informasi Internet (IIS) yang khusus untuk menghosting aplikasi web frontend. Peran kerja dapat menjalankan tugas asinkron, berjalan dalam waktu lama, atau berkelanjutan yang independen dari interaksi atau input pengguna.

Untuk informasi selengkapnya, lihat Apa itu Cloud Service?.

Nota

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 membahas 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.

Azure Cloud Service Dialog

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

Solusi Layanan Cloud

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 Service Bus atau antrean penyimpanan data.

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 penyiapan adalah bahwa mereka 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 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 requirements.txt . Jika variabel lingkungan PYTHON2 diatur ke aktif, maka Python 2.7 digunakan, jika tidak, Python 3.8 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"
    }
}

Modifikasi LaunchWorker.ps1

Nota

Dalam proyek dengan peran pekerja, file LauncherWorker.ps1 dibutuhkan untuk menjalankan file startup. Dalam proyek peran web , file startup didefinisikan dalam properti proyek.

Bin\LaunchWorker.ps1 awalnya dibuat untuk melakukan banyak pekerjaan persiapan, tetapi tidak benar-benar berfungsi. 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 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 mungkin membuat file ps.cmd di folder ./bin . Skrip shell ini memanggil skrip pembungkus PowerShell sebelumnya dan menyediakan pengelogan berdasarkan nama pembungkus PowerShell yang disebut. Jika file ini tidak dibuat, skrip berikut akan 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 proyek layanan awan sebagai proyek startup dan menekan F5, layanan awan berjalan di emulator Azure lokal.

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

Untuk memeriksa kesalahan pada peran web dan peran pekerja, Anda dapat menetapkan proyek peran sebagai proyek awal dan periksa kesalahan 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.

Masuk ke Microsoft Azure Publish

Ikuti panduannya. Jika perlu, aktifkan desktop jarak jauh. Desktop jarak jauh berguna ketika Anda harus memecahkan masalah sesuatu.

Saat Anda selesai mengonfigurasi pengaturan, pilih Terbitkan.

Beberapa kemajuan muncul di jendela output, lalu Anda 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 mesin virtual layanan cloud 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 kedaluarsa.

Langkah berikutnya

Untuk informasi selengkapnya tentang bekerja dengan peran web dan peran pekerja di "Python Tools for Visual Studio", Anda dapat melihat 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: