Azure İşlevleri için Python çalışan uzantıları geliştirme

Azure İşlevleri, Python işlev yürütmesinin bir parçası olarak özel davranışları tümleştirmenize olanak tanır. Bu özellik, müşterilerin kendi işlev uygulamalarında kolayca kullanabileceği iş mantığı oluşturmanızı sağlar. Daha fazla bilgi edinmek için bkz. Python geliştirici başvurusu. Çalışan uzantıları hem v1 hem de v2 Python programlama modellerinde desteklenir.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Azure İşlevleri için uygulama düzeyinde bir Python çalışan uzantısı oluşturun.
  • Uzantınızı bir uygulamada müşterilerinizin olduğu gibi kullanma.
  • Tüketim için bir uzantıyı paketleyip yayımlayın.

Önkoşullar

Başlamadan önce şu gereksinimleri karşılamanız gerekir:

Python Çalışanı uzantısını oluşturma

Oluşturduğunuz uzantı, konsol günlüklerinde ve HTTP yanıt gövdesinde bir HTTP tetikleyicisi çağırma işleminin geçen süresini bildirir.

Klasör yapısı

Uzantı projenizin klasörü aşağıdaki yapıya benzer olmalıdır:

<python_worker_extension_root>/
 | - .venv/
 | - python_worker_extension_timer/
 | | - __init__.py
 | - setup.py
 | - readme.md
Klasör/dosya Açıklama
.venv/ (İsteğe bağlı) Yerel geliştirme için kullanılan bir Python sanal ortamı içerir.
python_worker_extension/ Python çalışan uzantısının kaynak kodunu içerir. Bu klasör, PyPI'da yayımlanacak ana Python modülünü içerir.
setup.py Python çalışan uzantısı paketinin meta verilerini içerir.
readme.md Uzantınızın yönergesini ve kullanımını içerir. Bu içerik, PyPI projenizin giriş sayfasında açıklama olarak görüntülenir.

Proje meta verilerini yapılandırma

İlk olarak, paketiniz hakkında temel bilgiler sağlayan öğesini oluşturursunuz setup.py. Uzantınızın müşterinizin işlev uygulamalarına düzgün bir şekilde dağıtılıp tümleştirildiğinden emin olmak için bölümünde olduğunu 'azure-functions >= 1.7.0, < 2.0.0'install_requires onaylayın.

Aşağıdaki şablonda , , author_email, install_requires, license, packagesve url alanlarını gerektiği gibi değiştirmelisinizauthor.

from setuptools import find_packages, setup
setup(
    name='python-worker-extension-timer',
    version='1.0.0',
    author='Your Name Here',
    author_email='your@email.here',
    classifiers=[
        'Intended Audience :: End Users/Desktop',
        'Development Status :: 5 - Production/Stable',
        'Intended Audience :: End Users/Desktop',
        'License :: OSI Approved :: Apache Software License',
        'Programming Language :: Python',
        'Programming Language :: Python :: 3.7',
        'Programming Language :: Python :: 3.8',
        'Programming Language :: Python :: 3.9',
        'Programming Language :: Python :: 3.10',
    ],
    description='Python Worker Extension Demo',
    include_package_data=True,
    long_description=open('readme.md').read(),
    install_requires=[
        'azure-functions >= 1.7.0, < 2.0.0',
        # Any additional packages that will be used in your extension
    ],
    extras_require={},
    license='MIT',
    packages=find_packages(where='.'),
    url='https://your-github-or-pypi-link',
    zip_safe=False,
)

Ardından, uzantı kodunuzu uygulama düzeyi kapsamında uygulayacaksınız.

Zamanlayıcı uzantısını uygulama

Uygulama düzeyi uzantısını uygulamak için aşağıdaki kodu python_worker_extension_timer/__init__.py ekleyin:

import typing
from logging import Logger
from time import time
from azure.functions import AppExtensionBase, Context, HttpResponse
class TimerExtension(AppExtensionBase):
    """A Python worker extension to record elapsed time in a function invocation
    """

    @classmethod
    def init(cls):
        # This records the starttime of each function
        cls.start_timestamps: typing.Dict[str, float] = {}

    @classmethod
    def configure(cls, *args, append_to_http_response:bool=False, **kwargs):
        # Customer can use TimerExtension.configure(append_to_http_response=)
        # to decide whether the elapsed time should be shown in HTTP response
        cls.append_to_http_response = append_to_http_response

    @classmethod
    def pre_invocation_app_level(
        cls, logger: Logger, context: Context,
        func_args: typing.Dict[str, object],
        *args, **kwargs
    ) -> None:
        logger.info(f'Recording start time of {context.function_name}')
        cls.start_timestamps[context.invocation_id] = time()

    @classmethod
    def post_invocation_app_level(
        cls, logger: Logger, context: Context,
        func_args: typing.Dict[str, object],
        func_ret: typing.Optional[object],
        *args, **kwargs
    ) -> None:
        if context.invocation_id in cls.start_timestamps:
            # Get the start_time of the invocation
            start_time: float = cls.start_timestamps.pop(context.invocation_id)
            end_time: float = time()
            # Calculate the elapsed time
            elapsed_time = end_time - start_time
            logger.info(f'Time taken to execute {context.function_name} is {elapsed_time} sec')
            # Append the elapsed time to the end of HTTP response
            # if the append_to_http_response is set to True
            if cls.append_to_http_response and isinstance(func_ret, HttpResponse):
                func_ret._HttpResponse__body += f' (TimeElapsed: {elapsed_time} sec)'.encode()

Bu kod AppExtensionBase'den devralır, böylece uzantı uygulamadaki her işleve uygulanır. FuncExtensionBase'den devralarak uzantıyı işlev düzeyinde bir kapsamda da uygulayabilirdiniz.

init yöntemi, uzantı sınıfı içeri aktarıldığında çalışan tarafından çağrılan bir sınıf yöntemidir. Uzantı için burada başlatma eylemleri gerçekleştirebilirsiniz. Bu durumda, her işlev için çağırma başlangıç saatini kaydetmek için bir karma eşleme başlatılır.

configure yöntemi müşteriye yöneliktir. Benioku dosyanızda, müşterilerinize çağrısı Extension.configure()yapmak istediklerinde bunu belirtebilirsiniz. Benioku ayrıca uzantı özelliklerini, olası yapılandırmayı ve uzantınızın kullanımını da belgelemelidir. Bu örnekte, müşteriler geçen sürenin içinde HttpResponseraporlanıp rapor edilmeyeceğini seçebilir.

pre_invocation_app_level yöntemi, işlev çalışmadan önce Python çalışanı tarafından çağrılır. İşlev bağlamı ve bağımsız değişkenler gibi işlevden bilgileri sağlar. Bu örnekte uzantı bir iletiyi günlüğe kaydeder ve invocation_id göre bir çağrının başlangıç saatini kaydeder.

Benzer şekilde, post_invocation_app_level işlevi yürütüldikten sonra çağrılır. Bu örnek, geçen süreyi başlangıç zamanına ve geçerli saate göre hesaplar. Ayrıca HTTP yanıtının dönüş değerinin üzerine yazar.

readme.md oluşturma

Uzantı projenizin kökünde bir readme.md dosyası oluşturun. Bu dosya, uzantınızın yönergelerini ve kullanımını içerir. readme.md içeriği, PyPI projenizin giriş sayfasında açıklama olarak görüntülenir.

# Python Worker Extension Timer

In this file, tell your customers when they need to call `Extension.configure()`.

The readme should also document the extension capabilities, possible configuration,
and usage of your extension.

Uzantınızı yerel olarak kullanma

Artık bir uzantı oluşturduğunuza göre, bu uzantıyı bir uygulama projesinde kullanarak istenen şekilde çalıştığını doğrulayabilirsiniz.

HTTP tetikleyici işlevi oluşturma

  1. Uygulama projeniz için yeni bir klasör oluşturun ve bu klasöre gidin.

  2. Bash gibi uygun kabuktan aşağıdaki komutu çalıştırarak projeyi başlatın:

    func init --python
    
  3. Anonim erişime izin veren yeni bir HTTP tetikleyici işlevi oluşturmak için aşağıdaki komutu kullanın:

    func new -t HttpTrigger -n HttpTrigger -a anonymous
    

Sanal ortamı etkinleştirme

  1. aşağıdaki gibi işletim sistemini temel alan bir Python sanal ortamı oluşturun:

    python3 -m venv .venv
    
  2. Python sanal ortamını işletim sistemine göre aşağıdaki gibi etkinleştirin:

    source .venv/bin/activate
    

Uzantıyı yapılandırma

  1. Aşağıdaki komutu kullanarak işlev uygulaması projeniz için uzak paketleri yükleyin:

    pip install -r requirements.txt
    
  2. Uzantıyı yerel dosya yolunuzdan, düzenlenebilir modda aşağıdaki gibi yükleyin:

    pip install -e <PYTHON_WORKER_EXTENSION_ROOT>
    

    Bu örnekte öğesini uzantı projenizin kök dosya konumuyla değiştirin <PYTHON_WORKER_EXTENSION_ROOT> .

    Müşteri uzantınızı kullandığında, aşağıdaki örneklerde olduğu gibi uzantı paketi konumunuzu requirements.txt dosyasına ekler:

    # requirements.txt
    python_worker_extension_timer==1.0.0
    
  3. local.settings.json proje dosyasını açın ve aşağıdaki alanı öğesine Valuesekleyin:

    "PYTHON_ENABLE_WORKER_EXTENSIONS": "1" 
    

    Azure'da çalışırken bunun yerine işlev uygulamasındaki uygulama ayarlarına eklersinizPYTHON_ENABLE_WORKER_EXTENSIONS=1.

  4. v1 programlama modeli için __init.py__ dosyasında veya v2 programlama modeli için function_app.py dosyasına işlevinden önce main aşağıdaki iki satırı ekleyin:

    from python_worker_extension_timer import TimerExtension
    TimerExtension.configure(append_to_http_response=True)
    

    Bu kod modülü içeri aktarır TimerExtension ve yapılandırma değerini ayarlar append_to_http_response .

Uzantıyı doğrulama

  1. Uygulama projesi kök klasörünüzden kullanarak func host start --verboseişlev ana bilgisayarını başlatın. çıktısında işlevinizin yerel uç noktasını olarak https://localhost:7071/api/HttpTriggergörmeniz gerekir.

  2. Tarayıcıda adresine bir GET isteği https://localhost:7071/api/HttpTriggergönderin. İstek için TimeElapsed verilerinin eklendiği aşağıdakine benzer bir yanıt görmeniz gerekir.

    This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response. (TimeElapsed: 0.0009996891021728516 sec)
    

Uzantınızı yayımlama

Uzantınızı oluşturup doğruladıktan sonra da kalan yayımlama görevlerini tamamlamanız gerekir:

  • Bir lisans seçin.
  • readme.md ve diğer belgeleri oluşturun.
  • Uzantı kitaplığını bir Python paket kayıt defterinde veya sürüm denetim sisteminde (VCS) yayımlayın.

Uzantınızı PyPI'da yayımlamak için:

  1. Varsayılan Python ortamınıza veya sanal ortamınıza yüklemek twinewheel için aşağıdaki komutu çalıştırın:

    pip install twine wheel
    
  2. Uzantı deponuzdan eski dist/ klasörü kaldırın.

  3. içinde dist/yeni bir paket oluşturmak için aşağıdaki komutu çalıştırın:

    python setup.py sdist bdist_wheel
    
  4. Paketi PyPI'ye yüklemek için aşağıdaki komutu çalıştırın:

    twine upload dist/*
    

    Karşıya yükleme sırasında PyPI hesabı kimlik bilgilerinizi sağlamanız gerekebilir. Paketinizi karşıya yükleme işlemini ile twine upload -r testpypi dist/*de test edebilirsiniz. Daha fazla bilgi için Twine belgelerine bakın.

Bu adımlardan sonra müşteriler, requirements.txt paket adınızı ekleyerek uzantınızı kullanabilir.

Daha fazla bilgi için resmi Python paketleme öğreticisine bakın.

Örnekler

  • Tamamlanmış örnek uzantı projesini bu makaledeki python_worker_extension_timer örnek deposunda görüntüleyebilirsiniz.

  • OpenCensus tümleştirmesi, Azure İşlevleri Python uygulamalarında telemetri izlemeyi tümleştirmek için uzantı arabirimini kullanan bir açık kaynak projedir. Bu Python çalışan uzantısının uygulamasını gözden geçirmek için opencensus-python-extensions-azure deposuna bakın.

Sonraki adımlar

Python geliştirme Azure İşlevleri hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın: