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 3.7 veya üzeri. Azure İşlevleri'da desteklenen Python sürümlerinin tam listesini denetlemek için bkz. Python geliştirici kılavuzu.
uzantıyı v2 Python programlama modeliyle kullanmayı destekleyen Azure İşlevleri Core Tools, sürüm 4.0.5095 veya üzeri. ile
func --version
sürümünüzü denetleyin.Visual Studio Codedesteklenen platformlardan birine yüklenir.
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
, packages
ve 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 HttpResponse
raporlanı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
Uygulama projeniz için yeni bir klasör oluşturun ve bu klasöre gidin.
Bash gibi uygun kabuktan aşağıdaki komutu çalıştırarak projeyi başlatın:
func init --python
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
aşağıdaki gibi işletim sistemini temel alan bir Python sanal ortamı oluşturun:
Python sanal ortamını işletim sistemine göre aşağıdaki gibi etkinleştirin:
Uzantıyı yapılandırma
Aşağıdaki komutu kullanarak işlev uygulaması projeniz için uzak paketleri yükleyin:
pip install -r requirements.txt
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:
local.settings.json proje dosyasını açın ve aşağıdaki alanı öğesine
Values
ekleyin:"PYTHON_ENABLE_WORKER_EXTENSIONS": "1"
Azure'da çalışırken bunun yerine işlev uygulamasındaki uygulama ayarlarına eklersiniz
PYTHON_ENABLE_WORKER_EXTENSIONS=1
.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 ayarlarappend_to_http_response
.
Uzantıyı doğrulama
Uygulama projesi kök klasörünüzden kullanarak
func host start --verbose
işlev ana bilgisayarını başlatın. çıktısında işlevinizin yerel uç noktasını olarakhttps://localhost:7071/api/HttpTrigger
görmeniz gerekir.Tarayıcıda adresine bir GET isteği
https://localhost:7071/api/HttpTrigger
gö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:
Varsayılan Python ortamınıza veya sanal ortamınıza yüklemek
twine
wheel
için aşağıdaki komutu çalıştırın:pip install twine wheel
Uzantı deponuzdan eski
dist/
klasörü kaldırın.içinde
dist/
yeni bir paket oluşturmak için aşağıdaki komutu çalıştırın:python setup.py sdist bdist_wheel
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: