أدوار الويب والعاملين في Python باستخدام أدوات Python لـ Visual Studio

هام

تم الآن إهمال Cloud Services (كلاسيكي) للعملاء الجدد وسيتم استبعادها في 31 أغسطس 2024 لجميع العملاء. ينبغي أن تستخدم عمليات النشر الجديدة نموذج النشر الجديد القائم على Azure Resource Manager ‏‏Azure Cloud Services (الدعم الموسع) .

تقدم هذه المقالة نظرة عامة على استخدام ويب Python وأدوار العمال باستخدام Python Tools for Visual Studio. تعرف على كيفية استخدام Visual Studio لإنشاء ونشر خدمة سحابية أساسية تستخدم Python.

المتطلبات الأساسية

ملاحظة

لإكمال هذا البرنامج التعليمي، تحتاج إلى حساب Azure. يمكنك تنشيط ميزات المشتركين في Visual Studio أو تسجيل الاشتراك في الإصدار التجريبي.

ما هي مواقع ويب Python وأدوار العاملين؟

يوفر Azure ثلاثة نماذج حساب لتشغيل التطبيقات: ميزة تطبيقات الويب في Azure App Serviceو Azure Virtual Machinesو Azure Cloud Services. جميع النماذج الثلاثة تدعم لغة Python. توفر الخدمات السحابية، التي تتضمن أدوار الويب والعاملين، النظام الأساسي كخدمة (PaaS) . ضمن الخدمة السحابية، يوفر دور الويب خادم ويب مخصص لخدمات معلومات الإنترنت (IIS) لاستضافة تطبيقات الويب الأمامية، بينما يمكن لدور العامل تشغيل مهام غير متزامنة أو طويلة المدى أو دائمة مستقلة عن تفاعل المستخدم أو الإدخال.

لمزيد من المعلومات، راجع ما هي الخدمة السحابية؟.

ملاحظة

هل تبحث عن إنشاء موقع ويب بسيط؟ إذا كان السيناريو الخاص بك يتضمن مجرد واجهة أمامية بسيطة لموقع الويب، ففكر في استخدام ميزة تطبيقات الويب خفيفة الوزن في Azure App Service. يمكنك الترقية بسهولة إلى خدمة السحابة مع نمو موقع الويب الخاص بك وتغيير متطلباتك. راجع مركز مطوري Python للحصول على مقالات تتناول تطوير ميزة تطبيقات الويب في Azure App Service.

إنشاء المشروع

في Visual Studio، يمكنك تحديد Azure Cloud Service في مربع الحوار New Project، ضمن Python.

مربع حوار مشروع جديد

في معالج Azure Cloud Service، يمكنك إنشاء أدوار جديدة للويب والعاملين.

مربع حوار خدمة Azure Cloud

يأتي قالب دور العامل مع رمز معياري للاتصال بحساب تخزين Azure أو ناقل خدمة Microsoft Azure.

حل الخدمة السحابية

يمكنك إضافة أدوار ويب أو عامل إلى خدمة سحابية موجودة في أي وقت. يمكنك اختيار إضافة مشاريع حالية في الحل الخاص بك، أو إنشاء مشاريع جديدة.

أضف أمر الدور

يمكن أن تحتوي خدمتك السحابية على أدوار تم تنفيذها بلغات مختلفة. على سبيل المثال، يمكن أن يكون لديك دور ويب Python يتم تنفيذه باستخدام Django، مع Python، أو بأدوار عامل #C. يمكنك التواصل بسهولة بين الأدوار الخاصة بك باستخدام قوائم انتظار ناقل خدمة Microsoft Azure أو قوائم انتظار التخزين.

قم بتثبيت Python على الخدمة السحابية

تحذير

لا تعمل البرامج النصية للإعداد المثبتة مع Visual Studio (في وقت آخر تحديث لهذه المقالة). يصف هذا القسم حلًا.

المشكلة الرئيسية في نصوص الإعداد هي أنها لا تثبت python. أولًا، حدد startup tasks في ملف ServiceDefinition.csdef . تقوم المهمة الأولى (PrepPython.ps1) بتنزيل وتثبيت وقت تشغيل Python. تقوم المهمة الثانية (PipInstaller.ps1) بتشغيل pip لتثبيت أي تبعيات قد تكون لديك.

تمت كتابة البرامج النصية التالية لاستهداف Python 3.8. إذا كنت تريد استخدام الإصدار 2.x من python، فاضبط الملف المتغير PYTHON2 على on لمهمتي بدء التشغيل ووقت التشغيل: <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>

يجب إضافة متغيري PYTHON2 وPYPATH إلى مهمة بدء تشغيل العامل. يتم استخدام المتغير PYPATH فقط إذا تم تعيين المتغير PYTHON2 على on.

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

نموذج 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>

بعد ذلك، أنشئ ملفي PrepPython.ps1 وPipInstaller.ps1 في المجلد ./ bin لدورك.

PrepPython.ps1

يقوم هذا البرنامج النصي بتثبيت Python. إذا تم تعيين متغير البيئة PYTHON2 على on، فسيتم تثبيت Python 2.7، وإلا فسيتم تثبيت Python 3.8.

[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

يستدعي هذا النص البرمجي النقطة ويقوم بتثبيت جميع التبعيات في ملف requirements.txt . إذا تم تعيين متغير البيئة PYTHON2 على on، فسيتم استخدام Python 2.7، وإلا فسيتم استخدام Python 3.8.

$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"
    }
}

Modify LaunchWorker.ps1

ملاحظة

في حالة مشروع دور العامل، يكون ملف LauncherWorker.ps1 مطلوبًا لتنفيذ ملف بدء التشغيل. في مشروع دور الويب، يتم تحديد ملف بدء التشغيل بدلًا من ذلك في خصائص المشروع.

تم إنشاء bin \ LaunchWorker.ps1 في الأصل للقيام بالكثير من الأعمال التحضيرية ولكنها لا تعمل حقًا. استبدل محتويات هذا الملف بالنص التالي.

يستدعي هذا البرنامج النصي ملف worker.py من مشروع Python الخاص بك. إذا تم تعيين متغير البيئة PYTHON2 على on، فسيتم استخدام Python 2.7، وإلا فسيتم استخدام Python 3.8.

$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

يجب أن تكون قوالب Visual Studio قد أنشأت ملف ps.cmd في المجلد ./ bin . يستدعي هذا البرنامج النصي shell البرامج النصية لتضمين برنامج PowerShell أعلاه ويوفر التسجيل بناءً على اسم الغلاف المسمى PowerShell. إذا لم يتم إنشاء هذا الملف، فإليك ما يجب أن يحتويه.

@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"

شغّل محليًا

إذا قمت بتعيين مشروع الخدمة السحابية كمشروع بدء التشغيل وضغطت على F5، يتم تشغيل الخدمة السحابية في محاكي Azure المحلي.

على الرغم من أن PTVS يدعم التشغيل في المحاكي، إلا إن تصحيح الأخطاء (على سبيل المثال، نقاط التوقف) لا يعمل.

لتصحيح أدوار الويب والعاملين، يمكنك تعيين مشروع الدور كمشروع بدء التشغيل وتصحيحه بدلًا من ذلك. يمكنك أيضًا تعيين عدة مشاريع بدء تشغيل. انقر بزر الماوس الأيمن فوق الحل ثم حدد Set StartUp Projects.

خصائص مشروع بدء تشغيل الحل

نشر إلى Azure

للنشر، انقر بزر الماوس الأيمن فوق مشروع الخدمة السحابية في الحل ثم حدد Publish.

Microsoft Azure نشر تسجيل الدخول

اتبع المعالج. إذا كنت بحاجة إلى ذلك، فقم بتمكين سطح المكتب البعيد. سطح المكتب البعيد مفيد عندما تحتاج إلى تصحيح شيء ما.

عند الانتهاء من تكوين الإعدادات، انقر فوق Publish.

يظهر بعض التقدم في نافذة الإخراج، ثم سترى نافذة Microsoft Azure Activity Log.

نافذة سجل نشاط Microsoft Azure

يستغرق النشر عدة دقائق حتى يكتمل، ثم يتم تشغيل أدوار الويب و/أو العاملين على Azure!

التحقيق في السجلات

بعد بدء تشغيل الجهاز الظاهري للخدمة السحابية وتثبيته Python، يمكنك إلقاء نظرة على السجلات للعثور على أي رسائل فشل. توجد هذه السجلات في المجلد C:\Resources\Directory\{role}\LogFiles. يحتوي ملفPrepPython.err.txt على خطأ واحد على الأقل من وقت محاولة البرنامج النصي اكتشاف ما إذا كان Python مثبتًا أم لا PipInstaller.err.txt وقد يشكو من نقطة إصدار قديم.

الخطوات التالية

لمزيد من المعلومات التفصيلية حول العمل مع الويب وأدوار العمال في Python Tools لـ Visual Studio، راجع وثائق PTVS:

لمزيد من التفاصيل حول استخدام خدمات Azure من أدوار الويب والعاملين، مثل استخدام Azure Storage أو Service Bus، راجع المقالات التالية: