Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Azure Functions to bezserwerowa usługa obliczeniowa, która umożliwia uruchamianie kodu opartego na zdarzeniach bez aprowizowania infrastruktury ani zarządzania nią. Wykonania funkcji są wyzwalane przez zdarzenia, takie jak żądania HTTP, komunikaty w kolejce, czasomierze lub zmiany w magazynie — i są skalowane automatycznie na podstawie zapotrzebowania.
Ten przewodnik koncentruje się specjalnie na tworzeniu Azure Functions opartych na Python i ułatwia:
- Tworzenie i uruchamianie lokalnie aplikacji funkcjonalnych
- Omówienie modelu programowania Python
- Organizowanie i konfigurowanie aplikacji
- Wdrażanie i monitorowanie aplikacji w Azure
- Stosowanie najlepszych rozwiązań dotyczących skalowania i wydajności
Szukasz przeglądu pojęć? Zobacz dokumentację dla deweloperów Azure Functions.
Zainteresowany/a rzeczywistymi przypadkami użycia? Zapoznaj się ze stroną Scenariusze i przykłady .
Wprowadzenie
Wybierz środowisko pasujące do przepływu pracy i przejdź do Azure Functions dla Python:
Budowanie aplikacji funkcji
W tej sekcji opisano podstawowe składniki tworzenia i strukturyzowania aplikacji funkcji Python. Tematy obejmują model programowania, strukturę projektu, wyzwalacze i powiązania oraz zarządzanie zależnościami.
Model programowania
Funkcje obsługują dwie wersje modelu programowania Python:
| wersja | opis |
|---|---|
| 2.x | Użyj podejścia opartego na dekoratorze, aby zdefiniować wyzwalacze i powiązania bezpośrednio w pliku kodu Python. Każda funkcja jest implementowana jako globalna, bezstanowa metoda w function_app.py pliku lub w pliku planu, do którego się odwołujesz. Ta wersja modelu jest zalecana dla nowych aplikacji Python. |
| 1.x | Wyzwalacze i powiązania są definiowane dla każdej funkcji w osobnym function.json pliku. Każda funkcja jest implementowana jako globalna, bezstanowa funkcja w pliku kodu Pythona. Ta wersja modelu obsługuje starsze aplikacje. |
Artykuł ten dotyczy określonej wersji modelu Python. Wybierz żądaną wersję w górnej części artykułu.
Ważne
Użyj modelu programowania w wersji 2 dla podejścia opartego na dekoratorze , aby zdefiniować wyzwalacze i powiązania bezpośrednio w kodzie.
W modelu programowania Python w wersji 1 każda funkcja jest definiowana jako globalna, bezstanowa metoda main() wewnątrz pliku o nazwie __init__.py.
Wyzwalacze i powiązania funkcji są konfigurowane oddzielnie w function.json pliku, a wartości powiązań name są używane jako parametry w metodzie main() .
Przykład
Oto prosta funkcja, która odpowiada na żądanie HTTP:
# __init__.py
def main(req):
user = req.params.get('user')
return f'Hello, {user}!'
Oto odpowiedni function.json plik:
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
]
}
Najważniejsze pojęcia
- Funkcja ma jeden wyzwalacz HTTP.
- Obiekt HttpRequest zawiera nagłówki żądań, parametry zapytania, parametry trasy i treść komunikatu. Ta funkcja pobiera wartość parametru
namezapytania zparamsparametru obiektu HttpRequest . - Aby wysłać nazwę w tym przykładzie, dołącz
?name={name}do udostępnionego adresu URL funkcji. Jeśli na przykład działa lokalnie, pełny adres URL może wyglądać następująco:http://localhost:7071/api/http_trigger?name=Test. Przykłady użycia powiązań można znaleźć w temacie Triggers and Bindings (Wyzwalacze i powiązania).
Użyj zestawu azure-functions SDK i zastosuj adnotacje typów dla ulepszenia obsługi funkcji IntelliSense i edytora:
# __init__.py
import azure.functions as func
def http_trigger(req: func.HttpRequest) -> str:
# requirements.txt
azure-functions
Biblioteka azure-functions
Biblioteka azure-functions Python udostępnia podstawowe typy używane do interakcji ze środowiskiem uruchomieniowym Azure Functions. Aby wyświetlić wszystkie dostępne typy i metody, odwiedź APIazure-functions.
Możesz używać w kodzie funkcji azure-functions do:
- Dostęp do danych wejściowych wyzwalacza (na przykład
HttpRequest,TimerRequest) - Tworzenie wartości wyjściowych (takich jak
HttpResponse) - Interakcja z danymi kontekstu i danymi powiązań udostępnionymi w czasie wykonywania
Jeśli używasz azure-functions w aplikacji, musi ona być uwzględniona w zależnościach projektu.
Uwaga
Biblioteka azure-functions definiuje powierzchnię programowania dla Python Azure Functions, ale nie jest to zestaw SDK ogólnego przeznaczenia. Używaj jej specjalnie do tworzenia i uruchamiania funkcji w środowisku uruchomieniowym Azure Functions.
Alternatywny punkt wejścia
Domyślne zachowanie funkcji można zmienić, określając właściwości scriptFile i entryPoint w pliku function.json. Na przykład poniższy plik function.json kieruje środowisko uruchomieniowe do użycia metody custom_entry() w pliku main.py jako punktu wejścia dla funkcji Azure.
{
"scriptFile": "main.py",
"entryPoint": "custom_entry",
"bindings": [
...
]
}
Struktura folderów
Użyj następującej struktury dla projektu Python Azure Functions:
<project_root>/
│
├── .venv/ # (Optional) Local Python virtual environment
├── .vscode/ # (Optional) VS Code workspace settings
│
├── my_first_function/ # Function directory
│ └── __init__.py # Function code file
│ └── function.json # Function binding configuration file
│
├── my_second_function/
│ └── __init__.py
│ └── function.json
│
├── shared/ # (Optional) Pure helper code with no triggers/bindings
│ └── utils.py
│
├── additional_functions/ # (Optional) Contains blueprints for organizing related Functions
│ └── blueprint_1.py
│
├── tests/ # (Optional) Unit tests for your functions
│ └── test_my_function.py
│
├── .funcignore # Excludes files from being published
├── host.json # Global function app configuration
├── local.settings.json # Local-only app settings (not published)
├── requirements.txt # (Optional) Defines Python dependencies for remote build
├── Dockerfile # (Optional) For custom container deployment
Kluczowe pliki i foldery
| Plik / Folder | opis | Aplikacja wymagana do uruchomienia w Azure |
|---|---|---|
my_first_function/ |
Katalog dla pojedynczej funkcji. | ✅ |
__init__.py/ |
Skrypt główny, w my_first_function którym zdefiniowano kod funkcji. |
✅ |
function.json/ |
Zawiera konfigurację powiązania dla my_first_function funkcji. |
✅ |
host.json |
Konfiguracja globalna dla wszystkich funkcji w aplikacji. | ✅ |
requirements.txt |
Zależności Python są instalowane podczas publikowania przy użyciu kompilacji zdalnej remote build. | ❌ (zalecane w przypadku zarządzania pakietami) |
local.settings.json |
Ustawienia aplikacji i tajne informacje przeznaczone tylko dla lokalnego użytku (nigdy nie są udostępniane). | ❌ (wymagane do rozwoju lokalnego) |
.funcignore |
Określa pliki i foldery do wykluczenia z wdrożenia (na przykład .venv/, , tests/local.settings.json). |
❌ (zalecane) |
.venv/ |
Lokalne środowisko wirtualne dla Python (wykluczone z wdrożenia). | ❌ |
.vscode/ |
Konfiguracja edytora dla Visual Studio Code. Nie wymaga wdrożenia. | ❌ |
shared/ |
Przechowuje kod pomocniczy współdzielony w projekcie aplikacji funkcji | ❌ |
additional_functions/ |
Służy do modularnej organizacji kodu — zwykle ze szkicami. | ❌ |
tests/ |
Testy jednostkowe dla Twojej aplikacji funkcji. Nie opublikowano w Azure. | ❌ |
Dockerfile |
Definiuje kontener niestandardowy do wdrożenia. | ❌ |
W modelu programowania Python w wersji 2 Azure Functions używa podejścia opartego na decorator do definiowania wyzwalaczy i powiązań bezpośrednio w kodzie. Każda funkcja jest implementowana jako globalna, bezstanowa metoda w function_app.py pliku.
Przykład
Oto prosta funkcja, która odpowiada na żądanie HTTP:
import azure.functions as func
app = func.FunctionApp()
@app.route("hello")
def http_trigger(req):
user = req.params.get("user")
return f"Hello, {user}!"
# requirements.txt
azure-functions
Najważniejsze pojęcia
- Kod importuje pakiet
azure-functionsi używa dekoratorów oraz typów do zdefiniowania funkcji aplikacji. - Funkcja ma jeden wyzwalacz HTTP.
- Obiekt HttpRequest zawiera nagłówki żądań, parametry zapytania, parametry trasy i treść komunikatu. Ta funkcja pobiera wartość parametru
namezapytania zparamsparametru obiektu HttpRequest . - Aby wysłać nazwę w tym przykładzie, dołącz
?name={name}do udostępnionego adresu URL funkcji. Jeśli na przykład działa lokalnie, pełny adres URL może wyglądać następująco:http://localhost:7071/api/http_trigger?name=Test. Przykłady użycia powiązań można znaleźć w temacie Triggers and Bindings (Wyzwalacze i powiązania).
Biblioteka azure-functions
Biblioteka azure-functions Python jest główną częścią modelu programowania Azure Functions. Udostępnia on dekoratory, wyzwalacze i typy powiązań oraz obiekty żądań/odpowiedzi używane do definiowania i interakcji z funkcjami w czasie wykonywania.
Aby wyświetlić wszystkie dostępne typy i dekoratory, odwiedź azure-functions API.
Kod twojej aplikacji funkcji zależy od tej biblioteki, aby:
- Definiowanie wszystkich funkcji przy użyciu
FunctionAppobiektu - Deklarowanie wyzwalaczy i powiązań (na przykład
@app.route,@app.timer_trigger) - Dostęp do typiowanych danych wejściowych i wyjściowych (takich jak
HttpRequestiHttpResponse, i Out')
Element azure-functions musi być uwzględniony w zależnościach projektu. Aby dowiedzieć się więcej, zobacz Zarządzanie pakietami.
Uwaga
Biblioteka azure-functions definiuje powierzchnię programowania dla Python Azure Functions, ale nie jest to zestaw SDK ogólnego przeznaczenia. Używaj jej specjalnie do tworzenia i uruchamiania funkcji w środowisku uruchomieniowym Azure Functions.
Użyj adnotacji typu, aby ulepszyć obsługę funkcji IntelliSense i edytora:
def http_trigger(req: func.HttpRequest) -> str:
Organizowanie przy użyciu strategii
W przypadku większych lub modułowych aplikacji użyj blueprints aby zdefiniować funkcje w osobnych plikach Python i zarejestrować je w głównej aplikacji. Ta separacja zapewnia uporządkowanie kodu i możliwość ponownego wykorzystania.
Aby zdefiniować i zarejestrować strategię:
Zdefiniuj strategię w innym pliku Python, takim jak
http_blueprint.py:import azure.functions as func bp = func.Blueprint() @bp.route(route="default_template") def default_template(req: func.HttpRequest) -> func.HttpResponse: return func.HttpResponse("Hello World!")Zarejestruj strategię w pliku głównym
function_app.py:import azure.functions as func from http_blueprint import bp app = func.FunctionApp() app.register_functions(bp)
Za pomocą strategii można wykonywać następujące czynności:
- Podział aplikacji na moduły wielokrotnego użytku
- Zachowaj powiązane funkcje pogrupowane według pliku lub funkcji
- Rozszerzanie lub dzielenie się szkicami między projektami
Uwaga
Durable Functions obsługuje również blueprinty przy użyciu azure-functions-durable.
Zobacz przykład →
Struktura folderów
Użyj następującej struktury dla projektu Python Azure Functions:
<project_root>/
│
├── .venv/ # (Optional) Local Python virtual environment
├── .vscode/ # (Optional) VS Code workspace settings
│
├── function_app.py # Main function entry point (decorator model)
├── shared/ # (Optional) Pure helper code with no triggers/bindings
│ └── utils.py
│
├── additional_functions/ # (Optional) Contains blueprints for organizing related Functions
│ └── blueprint_1.py
│
├── tests/ # (Optional) Unit tests for your functions
│ └── test_my_function.py
│
├── .funcignore # Excludes files from being published
├── host.json # Global function app configuration
├── local.settings.json # Local-only app settings (not published)
├── requirements.txt # (Optional) Defines Python dependencies for remote build
├── Dockerfile # (Optional) For custom container deployment
Kluczowe pliki i foldery
| Plik / Folder | opis | Aplikacja wymagana do uruchomienia w Azure |
|---|---|---|
function_app.py |
Główny skrypt, w którym Azure Functions i wyzwalacze są definiowane przy użyciu dekoratorów. | ✅ |
host.json |
Konfiguracja globalna dla wszystkich funkcji w aplikacji. | ✅ |
requirements.txt |
Zależności Python są instalowane podczas publikowania przy użyciu kompilacji zdalnej remote build. | ❌ (zalecane w przypadku zarządzania pakietami) |
local.settings.json |
Ustawienia aplikacji i tajne informacje przeznaczone tylko dla lokalnego użytku (nigdy nie są udostępniane). | ❌ (wymagane do rozwoju lokalnego) |
.funcignore |
Określa pliki i foldery do wykluczenia z wdrożenia (na przykład .venv/, , tests/local.settings.json). |
❌ (zalecane) |
.venv/ |
Lokalne środowisko wirtualne dla Python (wykluczone z wdrożenia). | ❌ |
.vscode/ |
Konfiguracja edytora dla Visual Studio Code. Nie wymaga wdrożenia. | ❌ |
shared/ |
Przechowuje kod pomocniczy współdzielony w projekcie aplikacji funkcji | ❌ |
additional_functions/ |
Służy do modularnej organizacji kodu — zwykle ze szkicami. | ❌ |
tests/ |
Testy jednostkowe dla Twojej aplikacji funkcji. Nie opublikowano w Azure. | ❌ |
Dockerfile |
Definiuje kontener niestandardowy do wdrożenia. | ❌ |
[UWAGA!]
requirements.txtDołącz plik podczas wdrażania za pomocą kompilacji zdalnej. Jeśli nie używasz kompilacji zdalnej lub chcesz użyć innego pliku do definiowania zależności aplikacji, możesz wykonać lokalną kompilację i wdrożyć aplikację ze wstępnie utworzonymi zależnościami.
Aby uzyskać wskazówki dotyczące testowania jednostkowego, zobacz Testowanie jednostkowe. Aby zapoznać się z wdrożeniami kontenerów, zobacz Wdrażanie za pomocą kontenerów niestandardowych.
Wyzwalacze i powiązania
Azure Functions używa triggers do uruchamiania wykonywania funkcji i bindings w celu połączenia kodu z innymi usługami, takimi jak magazyn, kolejki i bazy danych. W modelu programowania Python w wersji 2 deklaruj powiązania przy użyciu dekoratorów.
Istnieją dwa główne typy powiązań:
- Wyzwalacze (dane wejściowe uruchamiające funkcję)
- Dane wejściowe i wyjściowe (dodatkowe źródła danych lub miejsca docelowe)
Aby uzyskać więcej informacji na temat dostępnych wyzwalaczy i powiązań, zobacz Triggers and Bindings in Azure Functions (Wyzwalacze i powiązania).
Przykład: Wyzwalacz czasomierza z danymi wejściowymi obiektu blob
Ta funkcja:
- Wyzwalacze co 10 minut
- Odczyty z Blob przy użyciu powiązań typowych SDK
- Buforuje wyniki i zapisuje w pliku tymczasowym
import azure.functions as func
import azurefunctions.extensions.bindings.blob as blob
import logging
import tempfile
CACHED_BLOB_DATA = None
app = func.FunctionApp()
@app.function_name(name="TimerTriggerWithBlob")
@app.schedule(schedule="0 */10 * * * *", arg_name="mytimer")
@app.blob_input(arg_name="client",
path="PATH/TO/BLOB",
connection="BLOB_CONNECTION_SETTING")
def timer_trigger_with_blob(mytimer: func.TimerRequest,
client: blob.BlobClient,
context: func.Context) -> None:
global CACHED_BLOB_DATA
if CACHED_BLOB_DATA is None:
# Download blob and save as a global variable
CACHED_BLOB_DATA = client.download_blob().readall()
# Create temp file prefix
my_prefix = context.invocation_id
temp_file = tempfile.NamedTemporaryFile(prefix=my_prefix)
temp_file.write(CACHED_BLOB_DATA)
logging.info(f"Cached data written to {temp_file.name}")
Najważniejsze pojęcia
- Używanie powiązań typu zestawu SDK do pracy z bogatymi typami. Aby uzyskać więcej informacji, zobacz Powiązania typu zestawu SDK.
- Zmienne globalne umożliwiają buforowanie kosztownych obliczeń, ale ich stan nie jest gwarantowany w przypadku wykonywania funkcji.
- Pliki tymczasowe są przechowywane w
tmp/i nie są gwarantowane jako trwałe między wywołaniami ani instancjami skalowalnymi w poziomie. - Dostęp do kontekstu wywołania funkcji można uzyskać za pomocą klasy Context.
Przykład: wyzwalacz HTTP z danymi wejściowymi usługi Cosmos DB i danymi wyjściowymi centrum zdarzeń
Ta funkcja:
- Wyzwalacze w żądaniu HTTP
- Odczytywanie z bazy danych Cosmos DB
- Zapisuje do wyjścia Event Hub
- Zwraca odpowiedź HTTP
# __init__.py
import azure.functions as func
def main(req: func.HttpRequest,
documents: func.DocumentList,
event: func.Out[str]) -> func.HttpResponse:
# Content from HttpRequest and Cosmos DB input
http_content = req.params.get("body")
doc_id = documents[0]["id"] if documents else "No documents found"
event.set(f"HttpRequest content: {http_content} | CosmosDB ID: {doc_id}")
return func.HttpResponse(
"Function executed successfully.",
status_code=200
)
// function.json
{
"scriptFile": "__init__.py",
"entryPoint": "main",
"bindings": [
{
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": ["get", "post"],
"route": "file"
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"type": "cosmosDB",
"direction": "in",
"name": "documents",
"databaseName": "test",
"containerName": "items",
"id": "cosmosdb-input-test",
"connection": "COSMOSDB_CONNECTION_SETTING"
},
{
"type": "eventHub",
"direction": "out",
"name": "event",
"eventHubName": "my-test-eventhub",
"connection": "EVENTHUB_CONNECTION_SETTING"
}
]
}
Kluczowe pojęcia
- Każda funkcja ma jeden wyzwalacz, ale może mieć wiele powiązań.
- Dodaj dane wejściowe, określając
directionjako "in" wfunction.json. Dane wyjściowe majądirectiono wartościout. - Możesz uzyskać dostęp do szczegółów żądania za pośrednictwem
HttpRequestobiektu i utworzyć niestandardowyHttpResponsez nagłówkami, kodem stanu i treścią.
import azure.functions as func
app = func.FunctionApp()
@app.function_name(name="HttpTriggerWithCosmosDB")
@app.route(route="file")
@app.cosmos_db_input(arg_name="documents",
database_name="test",
container_name="items",
connection="COSMOSDB_CONNECTION_SETTING")
@app.event_hub_output(arg_name="event",
event_hub_name="my-test-eventhub",
connection="EVENTHUB_CONNECTION_SETTING")
def http_trigger_with_cosmosdb(req: func.HttpRequest,
documents: func.DocumentList,
event: func.Out[str]) -> func.HttpResponse:
# Content from HttpRequest and Cosmos DB input
http_content = req.params.get('body')
doc_id = documents[0]['id']
event.set("HttpRequest content: " + http_content
+ " | CosmosDB ID: " + doc_id)
return func.HttpResponse(
f"Function executed successfully.",
status_code=200
)
Najważniejsze pojęcia
- Użyj dekoratora
@route()lub dekoratorów specyficznych dla wyzwalacza (@timer_trigger,@queue_triggeri innych), aby zdefiniować sposób, w jaki wywoływana jest twoja funkcja. - Dodaj dane wejściowe przy użyciu dekoratorów, takich jak
@blob_input,@queue_inputi innych. - Dane wyjściowe mogą być następujące:
- Zwracane bezpośrednio (jeśli tylko jedno dane wyjściowe)
- Przypisane przy użyciu powiązań
Outi metody.set()dla wielu wyników.
- Możesz uzyskać dostęp do szczegółów żądania za pośrednictwem
HttpRequestobiektu i utworzyć niestandardowyHttpResponsez nagłówkami, kodem stanu i treścią.
Wiązania typu SDK
W przypadku wybranych wyzwalaczy i powiązań można pracować z typami danych zaimplementowanymi przez podstawowe Azure SDKs i struktury. Korzystając z tych powiązań typu zestawu SDK, możesz wchodzić w interakcje z danymi powiązania, tak jak w przypadku korzystania z bazowego zestawu SDK usługi. Aby uzyskać więcej informacji, zobacz obsługiwane powiązania typu zestawu SDK.
Ważne
Obsługa powiązań typów zestawu SDK dla Python jest dostępna tylko w modelu programowania Python w wersji 2.
Zmienne środowiskowe
Zmienne środowiskowe w usłudze Azure Functions umożliwiają bezpieczne zarządzanie wartościami konfiguracji, parametrami połączenia i tajnymi danymi aplikacji bez twardego kodowania ich w kodzie funkcji.
Zmienne środowiskowe można zdefiniować:
- Lokalnie: w pliku local.settings.json, podczas lokalnego programowania.
- W portalu Azure: jako Ustawienia aplikacji na stronie konfiguracji w Twojej usłudze Function App.
Uzyskaj dostęp do zmiennych bezpośrednio w kodzie przy użyciu polecenia os.environ lub os.getenv.
setting_value = os.getenv("myAppSetting", "default_value")
Uwaga
Azure Functions rozpoznaje również zmienne środowiskowe systemu, które konfigurują środowisko uruchomieniowe funkcji i działanie procesów roboczych w Pythonie. Te zmienne nie są jawnie używane w kodzie funkcji, ale wpływają na sposób działania aplikacji. Aby uzyskać pełną listę zmiennych środowiskowych systemowych, zobacz Dokumentacja ustawień aplikacji.
Zarządzanie pakietami
Aby użyć innych pakietów Python w aplikacji Azure Functions, wyświetl je w pliku requirements.txt w katalogu głównym projektu. Te pakiety są importowane przez system importu Python, a następnie można odwoływać się do tych pakietów w zwykły sposób.
Aby dowiedzieć się więcej na temat tworzenia i wdrażania opcji z zależnościami zewnętrznymi, zobacz Opcje kompilacji dla aplikacji funkcji Python.
Na przykład, poniższa próbka pokazuje, jak moduł requests jest uwzględniony i używany w aplikacji funkcji.
<requirements.txt>
requests==2.31.0
Zainstaluj pakiet lokalnie za pomocą polecenia pip install -r requirements.txt.
Po zainstalowaniu pakietu można go zaimportować i użyć w kodzie funkcji:
import azure.functions as func
import requests
def main(req: func.HttpRequest) -> func.HttpResponse:
r = requests.get("https://api.github.com")
return func.HttpResponse(f"Status: {r.status_code}")
import azure.functions as func
import requests
app = func.FunctionApp()
@app.function_name(name="HttpExample")
@app.route(route="call_api")
def main(req: func.HttpRequest) -> func.HttpResponse:
r = requests.get("https://api.github.com")
return func.HttpResponse(f"Status: {r.status_code}")
Rozważania
- Konflikty z wbudowanymi modułami:
- Unikaj nazewnictwa folderów projektu od standardowych bibliotek Pythona (na przykład
email/,json/). - Nie dołączaj bibliotek natywnych Python (takich jak
logging,asynciolubuuid) wrequirements.txt.
- Unikaj nazewnictwa folderów projektu od standardowych bibliotek Pythona (na przykład
- Wdrażania:
- Aby zapobiec błędom
ModuleNotFound, upewnij się, że wszystkie wymagane zależności są wymienione w plikurequirements.txt. - Jeśli zaktualizujesz Python wersję aplikacji, skompilujesz i ponownie wdrożysz aplikację w nowej wersji Python, aby uniknąć konfliktów zależności z wcześniej utworzonymi pakietami.
- Aby zapobiec błędom
- Zależności inne niż PyPI:
- Możesz uwzględnić zależności, które nie są dostępne na PyPI w swojej aplikacji, takie jak pakiety lokalne, pliki wheel lub prywatne kanały. Aby uzyskać instrukcje dotyczące instalacji, zobacz Zależności niestandardowe w Python Azure Functions.
- Azure Functions zależności modułów roboczych Python:
- Jeśli pakiet zawiera pewne biblioteki, które mogą zderzać się z zależnościami procesu roboczego (na przykład
protobuflubgrpcio), skonfiguruj PYTHON_ISOLATE_WORKER_DEPENDENCIES na 1 w ustawieniach aplikacji, aby uniemożliwić aplikacji odwoływania się do zależności procesu roboczego. W przypadku Python 3.13 i nowszych funkcja this jest domyślnie włączona.
- Jeśli pakiet zawiera pewne biblioteki, które mogą zderzać się z zależnościami procesu roboczego (na przykład
Uruchamianie i wdrażanie
Ta sekcja zawiera informacje o lokalnym uruchamianiu funkcji, obsłudze wersji Python, opcjach budowania i wdrażania oraz konfiguracji środowiska wykonawczego. Użyj tych informacji, aby pomyślnie uruchomić aplikację funkcji w środowiskach lokalnych i Azure.
Uruchamianie lokalnie
Możesz uruchomić i przetestować aplikację funkcji Python na komputerze lokalnym przed wdrożeniem w Azure.
Korzystanie z narzędzi Azure Functions Core Tools
Zainstaluj Azure Functions Core Tools i uruchom lokalne środowisko uruchomieniowe, uruchamiając polecenie func start z katalogu głównego projektu:
func start
Po lokalnym uruchomieniu aplikacji funkcyjnej narzędzie Core Tools wyświetla wszystkie funkcje, które znajdzie dla Twojej aplikacji.
Functions:
http_trigger: http://localhost:7071/api/http_trigger
Aby dowiedzieć się więcej na temat korzystania z narzędzi Core Tools, zobacz Develop Azure Functions lokalnie przy użyciu narzędzi Core Tools.
Bezpośrednie wywoływanie funkcji
Używając azure-functions >= 1.21.0, można również wywoływać funkcje bezpośrednio przy użyciu interpretera Python bez uruchamiania narzędzi Core Tools. Takie podejście jest przydatne w przypadku szybkich testów jednostkowych:
# function_app.py
import azure.functions as func
app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@app.route(route="http_trigger")
def http_trigger(req: func.HttpRequest) -> func.HttpResponse:
return "Hello, World!"
# Test the function directly
print(http_trigger(None))
Aby wyświetlić dane wyjściowe, uruchom plik bezpośrednio przy użyciu Python:
> python function_app.py
Hello, World!
# __init__.py
import azure.functions as func
def main(req: func.HttpRequest) -> func.HttpResponse:
return func.HttpResponse("Hello, World!")
# Test the function directly
print(main(None))
Aby wyświetlić dane wyjściowe, uruchom plik bezpośrednio przy użyciu Python:
> python __init__.py
Hello, World!
Takie podejście nie wymaga żadnych dodatkowych pakietów ani konfiguracji i jest idealne do szybkiej weryfikacji podczas programowania. Aby uzyskać więcej szczegółowych informacji na temat testowania, zobacz Testowanie jednostkowe
Obsługiwane wersje Python
Azure Functions obsługuje wersje Python wymienione w Obsługiwane języki w Azure Functions. Aby uzyskać więcej ogólnych informacji, zobacz zasady obsługi środowiska uruchomieniowego Azure Functions.
Ważne
Jeśli zmienisz wersję Python dla aplikacji funkcji, musisz ponownie skompilować i wdrożyć aplikację przy użyciu nowej wersji. Istniejące artefakty wdrożenia i zależności nie są automatycznie odbudowywane po zmianie wersji Python.
Kompilowanie i wdrażanie
Aby dowiedzieć się więcej na temat zalecanego mechanizmu kompilacji dla danego scenariusza, zobacz Opcje kompilacji. Aby zapoznać się z ogólnym omówieniem technologii wdrażania, zobacz Deployment w Azure Functions.
Szybkie porównanie mechanizmów wdrażania
| Narzędzie/platforma | Polecenie/akcja | Najlepszy przypadek użycia |
|---|---|---|
| Azure Functions Core Tools | func azure functionapp publish <APP_NAME> |
Idealne dla operacji ciągłej integracji, automatyzacji lokalnej lub działań między platformami. |
| AZ CLI (Interfejs wiersza polecenia dla Azure) | az functionapp deployment source config-zip |
Przydatne podczas wykonywania skryptów wdrożeń poza narzędziami Core Tools. Działa dobrze w zautomatyzowanych potokach lub terminalach opartych na chmurze (Azure Cloud Shell). |
| Visual Studio Code (rozszerzenie Azure Functions) | Paleta Poleceń → "Azure Functions: Deploy to Azure..." | Najlepsze dla początkujących lub interaktywnych wdrożeń. Automatycznie obsługuje pakowanie i kompilowanie. |
| GitHub Actions | Azure/functions-action@v1 |
Idealne dla GitHub, oparte na ciągłej integracji i ciągłym wdrażaniu. Umożliwia automatyczne wdrożenia w scalaniu wypychanych lub żądań ściągnięcia. |
| Azure Pipelines |
AzureFunctionApp@2 Zadanie |
CI/CD w przedsiębiorstwie przy użyciu Azure DevOps. Najlepszy dla przepływów pracy z kontrolowanym wydaniem, kompilacji z kontrolowanym dostępem oraz potoków wieloetapowych. |
| Wdrożenie niestandardowego kontenera | Pchnij kontener az functionapp create --image <container> |
Wymagane, jeśli potrzebujesz pakietów na poziomie systemu operacyjnego, niestandardowych kompilacji Python, przypiętych środowisk uruchomieniowych lub nieobsługiwanych zależności (na przykład bibliotek systemowych, lokalnych plików binarnych). |
| Tworzenie funkcji opartej na portalu | Utwórz funkcję w portalu Azure → poprzez edytor inline | Używaj tylko dla prostych, wolnych od zależności funkcji. Doskonale sprawdza się w przypadku pokazów lub szkoleń, ale nie jest to zalecane w przypadku aplikacji wymagających pakietów innych firm. |
Uwaga
Tworzenie funkcji oparte na portalu nie obsługuje zależności innych firm i nie jest zalecane do tworzenia aplikacji produkcyjnych. Nie można zainstalować ani odwołać się do pakietów poza azure-functions i wbudowaną bibliotekę standardową Pythona.
Ważne
Po 30 września 2028 r. opcja hostowania aplikacji funkcyjnej w systemie Linux w planie konsumpcyjnym zostanie wycofana. Aby uniknąć zakłóceń, zmigruj istniejące aplikacje planu zużycia działające na Linuxie do planu Flex Consumption przed tą datą. Ta zmiana nie ma wpływu na aplikacje działające na Windows w planie Zużycie.
Po 30 września 2025 r. do planu Zużycie systemu Linux nie będą dodawane żadne nowe funkcje ani wsparcie dla nowych stosów językowych. Ostatnie obsługiwane wersje językowe użycia systemu Linux to: .NET 9, Python 3.12, Node.js 22, PowerShell 7.4 i Java 21. Nowsze wersje językowe nie są obsługiwane w przypadku użycia systemu Linux.
Aby uzyskać więcej informacji, zobacz Migrowanie aplikacji z planu zużycia na plan Flex Consumption.
Aktualizacje Python dla wersji 3.13 i nowsze
Począwszy od wersji Python 3.13, Azure Functions wprowadza kilka głównych ulepszeń środowiska uruchomieniowego i wydajności, które wpływają na sposób tworzenia i uruchamiania aplikacji. Kluczowe zmiany obejmują:
Kontrola wersji środowiska uruchomieniowego: Możesz teraz opcjonalnie przypisać lub zaktualizować swoją aplikację do określonych wersji worker Python, odwołując się do pakietu
azure-functions-runtimewrequirements.txt.Bez włączonej kontroli wersji aplikacja jest uruchamiana w domyślnej wersji środowiska uruchomieniowego Python, którym zarządza usługa Functions. Musisz zmodyfikować plik requirements.txt, aby zażądać najnowszej wersji, wersji wstępnie wydanej lub przypiąć aplikację do określonej wersji środowiska uruchomieniowego Python.
Możesz włączyć kontrolę wersji środowiska uruchomieniowego, dodając odwołanie do pakietu środowiska uruchomieniowego Python do pliku requirements.txt, gdzie wartość przypisana do pakietu określa używaną wersję środowiska uruchomieniowego.
Unikaj przypinania dowolnej aplikacji produkcyjnej do wersji wstępnych (alfa, beta lub deweloperskich).
Aby być świadomym zmian, regularnie przeglądaj notatki o wydaniu środowiska uruchomieniowego Python.
W poniższej tabeli przedstawiono zachowanie przechowywania wersji na podstawie wartości wersji tego ustawienia w pliku requirements.txt :
wersja Przykład Zachowanie Brak ustawionej wartości azure-functions-runtimeAplikacja Python w wersji 3.13 lub nowszej jest uruchamiana w najnowszej dostępnej wersji środowiska uruchomieniowego usługi Functions Python. Ta opcja jest najlepsza do utrzymania aktualności dzięki ulepszeniom i funkcjom platformy, ponieważ aplikacja automatycznie otrzymuje najnowsze stabilne aktualizacje środowiska uruchomieniowego. Przypięte do określonej wersji azure-functions-runtime==1.2.0Aplikacja Python w wersji 3.13 lub nowszej pozostaje w przypiętej wersji środowiska uruchomieniowego i nie otrzymuje aktualizacji automatycznych. Zamiast tego należy ręcznie zaktualizować przypiętą wersję, aby korzystać z nowych funkcji, poprawek i ulepszeń środowiska uruchomieniowego. Przypinanie jest zalecane w przypadku krytycznych obciążeń produkcyjnych, w których niezbędna jest stabilność i przewidywalność. Przypinanie umożliwia również testowanie aplikacji na przedpremierowych wersjach środowiska uruchomieniowego w trakcie rozwoju. Brak odwołania do pakietu n/a Nie ustawiając azure-functions-runtime, aplikacja Python w wersji 3.13 lub nowszej jest uruchamiana w domyślnej wersji środowiska uruchomieniowego Python, które znajduje się za najnowszą wydaną wersją. Aktualizacje są okresowo wprowadzane przez usługę Functions. Ta opcja zapewnia stabilność i szeroką zgodność. Jednak dostęp do najnowszych funkcji i poprawek jest opóźniony do momentu zaktualizowania wersji domyślnej.
Izolacja zależności: zależności aplikacji (na przykład
grpciolubprotobuf) są w pełni odizolowane od zależności modułu roboczego, co zapobiega konfliktom wersji. Ustawienie aplikacjiPYTHON_ISOLATE_WORKER_DEPENDENCIESnie będzie miało wpływu na aplikacje działające w Python 3.13 lub nowszym.Uproszczona konfiguracja przesyłania strumieniowego HTTP — nie są wymagane żadne specjalne ustawienia aplikacji.
Usunięto obsługę rozszerzeń procesów roboczych i funkcji pamięci udostępnionej.
Kontrola wersji środowiska uruchomieniowego: Możesz teraz opcjonalnie przypisać lub zaktualizować swoją aplikację do określonych wersji worker Python, odwołując się do pakietu
azure-functions-runtime-v1wrequirements.txt.Bez włączonej kontroli wersji aplikacja jest uruchamiana w domyślnej wersji środowiska uruchomieniowego Python, którym zarządza usługa Functions. Musisz zmodyfikować plik requirements.txt, aby zażądać najnowszej wersji, wersji wstępnie wydanej lub przypiąć aplikację do określonej wersji środowiska uruchomieniowego Python.
Możesz włączyć kontrolę wersji środowiska uruchomieniowego, dodając odwołanie do pakietu środowiska uruchomieniowego Python do pliku requirements.txt, gdzie wartość przypisana do pakietu określa używaną wersję środowiska uruchomieniowego.
Unikaj przypinania dowolnej aplikacji produkcyjnej do wersji wstępnych (alfa, beta lub deweloperskich).
Aby być świadomym zmian, regularnie przeglądaj notatki o wydaniu środowiska uruchomieniowego Python.
W poniższej tabeli przedstawiono zachowanie przechowywania wersji na podstawie wartości wersji tego ustawienia w pliku requirements.txt :
wersja Przykład Zachowanie Brak ustawionej wartości azure-functions-runtime-v1Aplikacja Python w wersji 3.13 lub nowszej jest uruchamiana w najnowszej dostępnej wersji środowiska uruchomieniowego usługi Functions Python. Ta opcja jest najlepsza do utrzymania aktualności dzięki ulepszeniom i funkcjom platformy, ponieważ aplikacja automatycznie otrzymuje najnowsze stabilne aktualizacje środowiska uruchomieniowego. Przypięte do określonej wersji azure-functions-runtime-v1==1.2.0Aplikacja Python w wersji 3.13 lub nowszej pozostaje w przypiętej wersji środowiska uruchomieniowego i nie otrzymuje aktualizacji automatycznych. Zamiast tego należy ręcznie zaktualizować przypiętą wersję, aby korzystać z nowych funkcji, poprawek i ulepszeń środowiska uruchomieniowego. Przypinanie jest zalecane w przypadku krytycznych obciążeń produkcyjnych, w których niezbędna jest stabilność i przewidywalność. Przypinanie umożliwia również testowanie aplikacji na przedpremierowych wersjach środowiska uruchomieniowego w trakcie rozwoju. Brak odwołania do pakietu n/a Nie ustawiając azure-functions-runtime-v1, aplikacja Python w wersji 3.13 lub nowszej jest uruchamiana w domyślnej wersji środowiska uruchomieniowego Python, które znajduje się za najnowszą wydaną wersją. Aktualizacje są okresowo wprowadzane przez usługę Functions. Ta opcja zapewnia stabilność i szeroką zgodność. Jednak dostęp do najnowszych funkcji i poprawek jest opóźniony do momentu zaktualizowania wersji domyślnej.
Izolacja zależności: zależności aplikacji (na przykład
grpciolubprotobuf) są w pełni odizolowane od zależności modułu roboczego, co zapobiega konfliktom wersji. Ustawienie aplikacjiPYTHON_ISOLATE_WORKER_DEPENDENCIESnie będzie miało wpływu na aplikacje działające w Python 3.13 lub nowszym.Usunięto obsługę rozszerzeń procesów roboczych i funkcji pamięci udostępnionej.
Obserwowanie i testowanie
W tej sekcji opisano logging, monitoring oraz testing capabilities w celu ułatwienia debugowania problemów, śledzenia wydajności i zapewnienia niezawodności aplikacji funkcji Python.
Rejestrowanie i monitorowanie
Azure Functions udostępnia rejestrator root, którego można używać bezpośrednio z wbudowanym modułem języka Python logging. Wszystkie komunikaty zapisywane przy użyciu tego rejestratora są automatycznie wysyłane do Application Insights gdy aplikacja jest uruchomiona w Azure.
Rejestrowanie umożliwia przechwytywanie informacji o środowisku uruchomieniowym i diagnozowanie problemów bez konieczności dodatkowej konfiguracji.
Przykład rejestrowania za pomocą wyzwalacza HTTP
import logging
import azure.functions as func
def main(req: func.HttpRequest) -> func.HttpResponse:
logging.debug("Example debug log")
logging.info("Example info log")
logging.warning("Example warning")
logging.error("Example error log")
return func.HttpResponse("OK")
import logging
import azure.functions as func
app = func.FunctionApp()
@app.route(route="http_trigger")
def http_trigger(req) -> func.HttpResponse:
logging.debug("Example debug log")
logging.info("Example info log")
logging.warning("Example warning")
logging.error("Example error log")
return func.HttpResponse("OK")
Możesz użyć pełnego zestawu poziomów rejestrowania (debug, info, warning, error, critical) i są one wyświetlane w portalu Azure w obszarze Dzienniki lub Application Insights.
Aby dowiedzieć się więcej na temat monitorowania Azure Functions w portalu, zobacz Monitorowanie Azure Functions.
Uwaga
Aby wyświetlić dzienniki debugowania w usłudze Application Insights, wymagana jest większa konfiguracja. Tę funkcję można włączyć, ustawiając PYTHON_ENABLE_DEBUG_LOGGING na 1 i ustawiając wartość logLeveltrace lub debug w plikuhost.json. Domyślnie dzienniki debugowania nie są widoczne w usłudze Application Insights.
Logowanie z wątków w tle
Jeśli funkcja uruchamia nowy wątek i musi zalogować się z tego wątku, pamiętaj o przekazaniu argumentu context do wątku. Zawiera context magazyn lokalny wątku oraz element invocation_id, który obecnie musi być ustawiony na wątku roboczym, aby dzienniki były prawidłowo skojarzone z wykonywaniem funkcji.
import logging
import threading
import azure.functions as func
def main(req: func.HttpRequest, context) -> func.HttpResponse:
logging.info("Function started")
t = threading.Thread(target=log_from_thread, args=(context,))
t.start()
return "okay"
def log_from_thread(context):
# Associate the thread with the current invocation
context.thread_local_storage.invocation_id = context.invocation_id
logging.info("Logging from a background thread")
import azure.functions as func
import logging
import threading
app = func.FunctionApp()
@app.route(route="http_trigger")
def http_trigger(req, context) -> func.HttpResponse:
logging.info("Function started")
t = threading.Thread(target=log_from_thread, args=(context,))
t.start()
return "okay"
def log_from_thread(context):
# Associate the thread with the current invocation
context.thread_local_storage.invocation_id = context.invocation_id
logging.info("Logging from a background thread")
Konfigurowanie niestandardowych rejestratorów
Niestandardowe rejestratory można skonfigurować w języku Python, gdy potrzebujesz większej kontroli nad zachowaniem logowania, takim jak niestandardowe formatowanie, filtrowanie dzienników lub integracje z firmami trzecimi.
Aby skonfigurować niestandardowy rejestrator, użyj Python logging.getLogger() z niestandardową nazwą i dodaj programy obsługi lub formatatory zgodnie z potrzebami.
import logging
custom_logger = logging.getLogger('my_custom_logger')
Obsługa funkcji OpenTelemetry
Azure Functions dla Python obsługuje również OpenTelemetry co umożliwia emitowanie śladów, metryk i dzienników w standardowym formacie. Korzystanie z technologii OpenTelemetry jest szczególnie przydatne w przypadku aplikacji rozproszonych lub scenariuszy, w których chcesz wyeksportować dane telemetryczne do narzędzi spoza usługi Application Insights (takich jak Grafana lub Jaeger).
Aby uzyskać instrukcje konfiguracji i przykładowy kod, zobacz przewodnik szybkiego startu OpenTelemetry dla Azure Functions (Python).
Testowanie jednostek
Napisz i uruchom testy jednostkowe dla swoich funkcji przy użyciu pytest.
Funkcje Python, takie jak inny kod Python, można przetestować przy użyciu standardowych struktur testowania. W przypadku większości powiązań można utworzyć pozorny obiekt wejściowy, tworząc wystąpienie odpowiedniej klasy z azure.functions pakietu.
Na przykładzie my_function, poniższy przykład to test próbny funkcji wyzwalanej przez HTTP.
Najpierw utwórz <plik project_root>/function_app.py i zaimplementuj my_function funkcję jako wyzwalacz HTTP.
# <project_root>/function_app.py
import azure.functions as func
import logging
app = func.FunctionApp()
# Define the HTTP trigger that accepts the ?value=<int> query parameter
# Double the value and return the result in HttpResponse
@app.function_name(name="my_function")
@app.route(route="hello")
def my_function(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Executing myfunction.')
initial_value: int = int(req.params.get('value'))
doubled_value: int = initial_value * 2
return func.HttpResponse(
body=f"{initial_value} * 2 = {doubled_value}",
status_code=200
)
Możesz rozpocząć pisanie przypadków testowych dla wyzwalacza HTTP.
# <project_root>/test_my_function.py
import unittest
import azure.functions as func
from function_app import my_function
class TestFunction(unittest.TestCase):
def test_my_function(self):
# Construct a mock HTTP request.
req = func.HttpRequest(method='GET',
body=None,
url='/api/my_function',
params={'value': '21'})
# Call the function.
func_call = main.build().get_user_function()
resp = func_call(req)
# Check the output.
self.assertEqual(
resp.get_body(),
b'21 * 2 = 42',
)
W folderze środowiska wirtualnego Python możesz uruchomić następujące polecenia, aby przetestować aplikację:
pip install pytest
pytest test_my_function.py
W terminalu widać wyniki pytest tak jak poniżej:
============================================================================================================ test session starts ============================================================================================================
collected 1 item
test_my_function.py . [100%]
============================================================================================================= 1 passed in 0.24s =============================================================================================================
Optymalizacja i tematy zaawansowane
Aby dowiedzieć się więcej na temat optymalizowania aplikacji funkcji Python, zobacz następujące artykuły:
- Skalowanie i wydajność
- Używanie frameworka Flask z funkcjami Azure
- Durable Functions
- Przesyłanie strumieniowe HTTP
Powiązane artykuły
Aby uzyskać więcej informacji na temat funkcji, zobacz następujące artykuły:
- dokumentacja interfejsu API pakietu Azure Functions
- Best practices for Azure Functions
- Azure Functions wyzwalacze i powiązania
- powiązania z Blob Storage
- Powiązania protokołu HTTP i elementu webhook
- Powiązania usługi "Queue Storage"
- Wyzwalacze czasowe
Masz problemy z używaniem Python? Daj nam znać i zgłoś problem.