Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Uyarı
Python 3.13'den itibaren python çalışan uzantıları artık desteklenmeyecektir.
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ıza olanak tanır. Ç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ı müşterilerinizin kullandığı şekilde bir uygulamada kullanın.
- Bir uzantıyı tüketim için 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ının v2 Python programlama modeliyle kullanılmasını destekleyen Azure functions core tools, sürüm 4.0.5095 veya üzeri. Sürümünüzü
func --versionile kontrol edin.Desteklenen platformlardan birinde yüklü Visual Studio Code.
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 | Description |
|---|---|
| .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, 'azure-functions >= 1.7.0, < 2.0.0'install_requires bölümünde olduğunu onaylayın.
Aşağıdaki şablonda , , author, author_email, install_requires, licenseve packages alanlarını gerektiği gibi değiştirmeniz urlgerekir.
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ı bir işlev düzeyi kapsamında 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ğrının başlangıç zamanını kaydetmek amacıyla bir hash map başlatılır.
configure yöntemi müşteriye yöneliktir. Benioku dosyanızda, müşterilerinize Extension.configure()'yi ne zaman aramaları gerektiğini belirtebilirsiniz. Readme dosyası ayrıca uzantı özelliklerini, yapılandırma seçeneklerini ve uzantınızın kullanımını belgelemelidir. Bu örnekte, müşteriler HttpResponse içinde geçen sürenin 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 kaydeder ve invocation_id'sine göre çağrının başlangıç zamanını 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. HTTP yanıtının dönüş değerini değiştirir.
README.md dosyası oluşturun
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 kullanın
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 --pythonAnonim 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
İş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.txtUzantıyı yerel dosya yolunuzdan aşağıdaki gibi düzenlenebilir modda yükleyin:
pip install -e <PYTHON_WORKER_EXTENSION_ROOT>Bu örnekte,
<PYTHON_WORKER_EXTENSION_ROOT>yerine uzantı projenizin kök dosya konumunu yerleştirin.Müşteri uzantınızı kullandığında, aşağıdaki örneklerde gösterildiği gibi uzantı paketi konumunuzu requirements.txt dosyasına ekler:
local.settings.json proje dosyasını açın ve içine aşağıdaki alanı
Valuesekleyin:"PYTHON_ENABLE_WORKER_EXTENSIONS": "1"Azure'da çalışırken bunun yerine
PYTHON_ENABLE_WORKER_EXTENSIONS=1eklersiniz.v1 programlama modeli için
maindosyasındaki işlevin önüne veya v2 programlama modelinin function_app.py dosyasına 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
TimerExtensionve yapılandırma değerini ayarlarappend_to_http_response.
Uzantıyı doğrulama
Uygulama projesi kök klasörünüzden
func host start --verbosekullanarak fonksiyon barındırıcısını başlatın. çıktısında işlevinizin yerel uç noktasını olarakhttps://localhost:7071/api/HttpTriggergörmeniz gerekir.Tarayıcıda
https://localhost:7071/api/HttpTriggeradresine bir GET isteği 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 şu 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 bir 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
twinewheeliçin aşağıdaki komutu çalıştırın:pip install twine wheelUzantı 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_wheelPaketi 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. Paket yüklemenizi
twine upload -r testpypi dist/*üzerinden de test edebilirsiniz. Daha fazla bilgi için Twine belgelerine bakın.
Bu adımlardan sonra müşteriler, requirements.txtpaket 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: