Python-feldolgozóbővítmények fejlesztése Azure Functions
Azure Functions lehetővé teszi az egyéni viselkedések integrálását a Python-függvények végrehajtása során. Ezzel a funkcióval olyan üzleti logikát hozhat létre, amelyet az ügyfelek egyszerűen használhatnak a saját függvényalkalmazásaikban. További információért tekintse meg a Python fejlesztői referenciáját. A feldolgozóbővítmények a v1 és a v2 Python programozási modellekben is támogatottak.
Ebből az oktatóanyagból az alábbiakat sajátíthatja el:
- Hozzon létre egy alkalmazásszintű Python-feldolgozóbővítményt Azure Functions.
- Használja fel a bővítményt egy alkalmazásban az ügyfelek által használt módon.
- Csomagolja be és tegye közzé a bővítményt felhasználás céljából.
Előfeltételek
A kezdés előtt meg kell felelnie az alábbi követelményeknek:
Python 3.7 vagy újabb verzió. A támogatott Python-verziók teljes listájának megtekintéséhez Azure Functions tekintse meg a Python fejlesztői útmutatóját.
A Azure Functions Core Tools 4.0.5095-ös vagy újabb verziója, amely támogatja a bővítmény használatát a v2 Python programozási modellel. Ellenőrizze a verzióját a használatával
func --version
.Az egyik támogatott platformra telepített Visual Studio Code.
A Python-feldolgozó bővítmény létrehozása
A létrehozott bővítmény egy HTTP-eseményindító hívásának eltelt idejét jelenti a konzolnaplókban és a HTTP-válasz törzsében.
Mappastruktúra
A bővítményprojekt mappájának a következő struktúrához hasonlónak kell lennie:
<python_worker_extension_root>/
| - .venv/
| - python_worker_extension_timer/
| | - __init__.py
| - setup.py
| - readme.md
Mappa/fájl | Leírás |
---|---|
.venv/ | (Nem kötelező) Helyi fejlesztéshez használt Python virtuális környezetet tartalmaz. |
python_worker_extension/ | A Python-feldolgozóbővítmény forráskódját tartalmazza. Ez a mappa tartalmazza a PyPI-ben közzéteendő fő Python-modult. |
setup.py | A Python-feldolgozóbővítmény-csomag metaadatait tartalmazza. |
readme.md | A bővítmény utasításait és használatát tartalmazza. Ez a tartalom leírásként jelenik meg a PyPI-projekt kezdőlapján. |
Projekt metaadatainak konfigurálása
Először hozza létre setup.py
a elemet, amely alapvető információkat nyújt a csomagról. Annak érdekében, hogy a bővítmény megfelelően legyen elosztva és integrálva legyen az ügyfél függvényalkalmazásaiba, győződjön meg arról, hogy 'azure-functions >= 1.7.0, < 2.0.0'
az a install_requires
szakaszban található.
A következő sablonban szükség szerint módosítania author
kell a , author_email
, install_requires
, license
, packages
és url
mezőket.
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,
)
Ezután implementálja a bővítménykódot az alkalmazásszintű hatókörben.
Az időzítőbővítmény implementálása
Adja hozzá a következő kódot python_worker_extension_timer/__init__.py
az alkalmazásszintű bővítmény implementálásához:
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()
Ez a kód az AppExtensionBase-től öröklődik, így a bővítmény az alkalmazás minden függvényére érvényes lesz. A funcExtensionBase-től örökölt bővítményt függvényszintű hatókörön is implementálhatta volna.
A init
metódus egy osztálymetódus, amelyet a feldolgozó hív meg a bővítményosztály importálásakor. A bővítmény inicializálási műveleteit itt végezheti el. Ebben az esetben a rendszer egy kivonattérképet inicializál az egyes függvények hívási kezdési időpontjának rögzítéséhez.
A configure
metódus ügyféloldali. Az olvasófájlban tudathatja az ügyfelekkel, hogy mikor kell meghívniuk Extension.configure()
őket. Az olvasási eszköznek emellett dokumentálnia kell a bővítmény képességeit, lehetséges konfigurációját és használatát. Ebben a példában az ügyfelek eldönthetik, hogy az eltelt idő szerepel-e a HttpResponse
jelentésben.
A pre_invocation_app_level
metódust a Python-feldolgozó hívja meg a függvény futtatása előtt. Megadja a függvény információit, például a függvénykörnyezetet és az argumentumokat. Ebben a példában a bővítmény naplóz egy üzenetet, és rögzíti a hívás kezdő időpontját a invocation_id alapján.
Ehhez hasonlóan a post_invocation_app_level
függvény végrehajtása után is meghívja a függvényt. Ez a példa kiszámítja az eltelt időt a kezdési idő és az aktuális idő alapján. Felülírja a HTTP-válasz visszatérési értékét is.
Readme.md létrehozása
Hozzon létre egy readme.md fájlt a bővítményprojekt gyökerében. Ez a fájl tartalmazza a bővítmény utasításait és használatát. A readme.md tartalma leírásként jelenik meg a PyPI-projekt kezdőlapján.
# 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.
A bővítmény helyi felhasználása
Most, hogy létrehozott egy bővítményt, használhatja egy alkalmazásprojektben annak ellenőrzésére, hogy az a kívánt módon működik-e.
HTTP-eseményindító-függvény létrehozása
Hozzon létre egy új mappát az alkalmazásprojekthez, és navigáljon hozzá.
Futtassa a következő parancsot a megfelelő rendszerhéjból, például a Bashből a projekt inicializálásához:
func init --python
A következő paranccsal hozzon létre egy új HTTP-eseményindító függvényt, amely lehetővé teszi a névtelen hozzáférést:
func new -t HttpTrigger -n HttpTrigger -a anonymous
Virtuális környezet aktiválása
Hozzon létre egy Python virtuális környezetet az operációs rendszer alapján az alábbiak szerint:
Aktiválja a Python virtuális környezetet az operációs rendszer alapján az alábbiak szerint:
A bővítmény konfigurálása
Telepítse a függvényalkalmazás-projekt távoli csomagjait a következő paranccsal:
pip install -r requirements.txt
Telepítse a bővítményt a helyi fájl elérési útjáról, szerkeszthető módban az alábbiak szerint:
pip install -e <PYTHON_WORKER_EXTENSION_ROOT>
Ebben a példában cserélje le a elemet
<PYTHON_WORKER_EXTENSION_ROOT>
a bővítményprojekt gyökérfájljának helyére.Amikor egy ügyfél az Ön bővítményét használja, ehelyett hozzáadja a bővítménycsomag helyét a requirements.txt fájlhoz, ahogyan az alábbi példákban látható:
Nyissa meg a local.settings.json projektfájlt, és adja hozzá a következő mezőt a fájlhoz
Values
:"PYTHON_ENABLE_WORKER_EXTENSIONS": "1"
Az Azure-ban való futtatáskor ehelyett hozzáadja
PYTHON_ENABLE_WORKER_EXTENSIONS=1
a függvényalkalmazás alkalmazásbeállításaihoz.Adjon hozzá két sort a függvény elé a
main
v1 programozási modell __init.py__ fájljában, vagy a v2 programozási modell function_app.py fájljában:from python_worker_extension_timer import TimerExtension TimerExtension.configure(append_to_http_response=True)
Ez a kód importálja a modult
TimerExtension
, és beállítja aappend_to_http_response
konfigurációs értéket.
A bővítmény ellenőrzése
Indítsa el a függvénygazdát az alkalmazásprojekt gyökérmappájából a paranccsal
func host start --verbose
. A kimenetben a függvény helyi végpontjának kell megjelennie.https://localhost:7071/api/HttpTrigger
A böngészőben küldjön get kérést a következőnek:
https://localhost:7071/api/HttpTrigger
. Az alábbihoz hasonló válasznak kell megjelennie, amelyhez hozzá van fűzve a kérelem TimeElapsed adatai.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)
A bővítmény közzététele
A bővítmény létrehozása és ellenőrzése után is el kell végeznie a hátralévő közzétételi feladatokat:
- Válasszon egy licencet.
- Hozzon létre egy readme.md és egyéb dokumentációt.
- Tegye közzé a bővítménytárat egy Python-csomagjegyzékben vagy egy verziókövetési rendszerben (VCS).
A bővítmény közzététele a PyPI-ben:
Futtassa a következő parancsot az alapértelmezett Python-környezetben vagy virtuális környezetben való telepítéshez
twine
wheel
:pip install twine wheel
Távolítsa el a régi
dist/
mappát a bővítménytárból.Futtassa a következő parancsot egy új csomag létrehozásához a fájlban
dist/
:python setup.py sdist bdist_wheel
Futtassa a következő parancsot a csomag PyPI-be való feltöltéséhez:
twine upload dist/*
Előfordulhat, hogy a feltöltés során meg kell adnia a PyPI-fiók hitelesítő adatait. A csomagfeltöltést a használatával
twine upload -r testpypi dist/*
is tesztelheti. További információt a Twine dokumentációjában talál.
A lépések után az ügyfelek használhatják a bővítményt úgy, hogy a csomag nevét belevetik a requirements.txt.
További információkért tekintse meg a Python hivatalos csomagolási oktatóanyagát.
Példák
A befejezett mintabővítmény-projektet ebből a cikkből tekintheti meg a python_worker_extension_timer mintaadattárban.
Az OpenCensus-integráció egy nyílt forráskódú projekt, amely a bővítményfelülettel integrálja a telemetriai nyomkövetést Azure Functions Python-alkalmazásokban. Tekintse meg az opencensus-python-extensions-azure adattárat ennek a Python-feldolgozóbővítménynek a megvalósításának áttekintéséhez.
Következő lépések
A Python Azure Functions fejlesztésével kapcsolatos további információkért tekintse meg az alábbi forrásanyagokat: