W dzisiejszym cyfrowym świecie bezpieczeństwo danych stało się jednym z kluczowych zagadnień dla każdego dewelopera. Ochrona danych użytkowników, zabezpieczenie przed atakami i zapewnienie zgodności z regulacjami prawnymi to tylko niektóre z wyzwań, przed którymi stają twórcy aplikacji. W kontekście aplikacji webowych, szczególnie tych opartych na API, odpowiednie zarządzanie dostępem, szyfrowanie danych oraz przestrzeganie zasad bezpieczeństwa mają kluczowe znaczenie.
Podstawowym krokiem w zapewnieniu bezpieczeństwa jest kontrola dostępu oparta na rolach (RBAC – Role-Based Access Control). System ten pozwala precyzyjnie określić, które dane i operacje są dostępne dla poszczególnych użytkowników w zależności od ich ról w systemie. Z kolei odpowiednia weryfikacja uprawnień, uwierzytelnianie użytkowników oraz monitorowanie ich działań pozwalają uniknąć nieautoryzowanego dostępu do wrażliwych informacji.
Jednym z najważniejszych aspektów w zapewnieniu bezpieczeństwa komunikacji w aplikacjach webowych jest użycie HTTPS, które zapewnia szyfrowanie danych przesyłanych pomiędzy serwerem a klientem. Dzięki temu, nawet jeśli atakujący przechwyci ruch, nie będzie w stanie odczytać przesyłanych informacji, co stanowi skuteczną barierę w przypadku aplikacji przetwarzających dane wrażliwe.
Bezpieczeństwo bazy danych to kolejny istotny element. Właściwa konfiguracja bazy, stosowanie bezpiecznych połączeń oraz unikanie publicznego udostępniania portów bazy danych to podstawowe zasady, które należy wdrożyć. Zasada najmniejszych uprawnień w kontekście dostępu do bazy danych zapewnia, że tylko autoryzowani użytkownicy mają dostęp do danych wrażliwych, minimalizując ryzyko ich nieautoryzowanego ujawnienia.
Regularne aktualizowanie zależności, takich jak biblioteki czy frameworki wykorzystywane w projekcie, to kluczowy element utrzymania bezpieczeństwa aplikacji. Starsze wersje oprogramowania mogą zawierać niezałatane luki bezpieczeństwa, które mogą zostać wykorzystane przez atakujących. Dbałość o to, aby aplikacja była zawsze aktualna, pozwala zminimalizować ryzyko wykorzystywania znanych podatności.
Bezpieczne przechowywanie danych wrażliwych to kwestia, która wykracza poza samo szyfrowanie. Ważne jest, aby przechowywać tylko te dane, które są rzeczywiście niezbędne, a w przypadku ich konieczności, należy zapewnić ich szyfrowanie i kontrolę dostępu. Warto również pamiętać, że dane wrażliwe nie powinny być przechowywane dłużej, niż to konieczne. Polityki przechowywania i usuwania danych muszą być jasno określone, a dane powinny być usuwane w sposób, który uniemożliwia ich odzyskanie, w tym także z kopii zapasowych czy logów.
W przypadku przesyłania danych wrażliwych szczególną uwagę należy zwrócić na zabezpieczenie API. Należy korzystać z bezpiecznych protokołów, a wszelkie zewnętrzne usługi, z którymi aplikacja wchodzi w interakcję, powinny przestrzegać tych samych zasad bezpieczeństwa. Przekazywanie informacji osobowych lub finansowych przez API wymaga stosowania standardów autoryzacji i uwierzytelniania, jak np. OAuth2, który jest powszechnie stosowany w branży do zapewnienia bezpiecznego dostępu do zasobów.
Bezpieczeństwo aplikacji to nie tylko kwestie techniczne, ale również odpowiednie monitorowanie i logowanie zdarzeń. Powinno się implementować mechanizmy wykrywania nieprawidłowych wzorców dostępu i potencjalnych prób naruszenia bezpieczeństwa. Z kolei logi powinny być przechowywane w sposób zapewniający ich integralność, a dostęp do nich powinien być ograniczony wyłącznie do uprawnionych osób. Należy unikać logowania danych wrażliwych, aby nie stanowiły one dodatkowego ryzyka w przypadku wycieku logów.
Dodatkowo, w miarę jak aplikacja się rozwija, zarządzanie wersjami API staje się kluczowe. Wersjonowanie API umożliwia wprowadzanie nowych funkcji i poprawek bez ryzyka łamania istniejących integracji. Zachowanie kompatybilności wstecznej jest niezbędne, aby użytkownicy i systemy, które korzystają z API, nie doświadczyły problemów z działaniem swoich aplikacji.
Podsumowując, zapewnienie bezpieczeństwa danych w aplikacjach webowych jest procesem, który wymaga ścisłego przestrzegania zasad, jak kontrola dostępu, szyfrowanie, monitorowanie i zarządzanie danymi. Zastosowanie tych praktyk nie tylko chroni użytkowników przed utratą danych, ale również zapewnia zgodność z regulacjami prawnymi i minimalizuje ryzyko ataków.
Jak zabezpieczyć połączenie WebSocket w FastAPI przy użyciu OAuth2?
W FastAPI, WebSockety są popularnym rozwiązaniem do budowy aplikacji w czasie rzeczywistym, takich jak czaty czy gry online. Jednak, jak w przypadku innych połączeń sieciowych, ważnym elementem jest zapewnienie odpowiedniego poziomu bezpieczeństwa. Jednym z najskuteczniejszych sposobów zabezpieczania połączeń WebSocket jest zastosowanie OAuth2. Poniżej przedstawimy sposób implementacji tego mechanizmu w FastAPI, co pomoże zwiększyć bezpieczeństwo komunikacji w twojej aplikacji.
Pierwszym krokiem jest stworzenie obiektu oauth2_scheme_for_ws, który będzie odpowiedzialny za weryfikację tokena autoryzacyjnego w połączeniu WebSocket. Poniżej znajduje się przykładowy kod do jego definicji:
Argument tokenUrl wskazuje na punkt końcowy, który będzie służył do uzyskiwania tokenu. Punkt ten musi być zgodny z używaną metodą autoryzacji tokena, którą wybierzemy. Następnie, aby uzyskać nazwę użytkownika na podstawie tokena, możemy zdefiniować funkcję get_username_from_token:
Funkcja fake_token_resolver ma na celu symulowanie procesu rozwiązywania tokena. Należy pamiętać, że przykładowa aplikacja korzysta z dwóch fikcyjnych użytkowników: johndoe i janedoe. Są oni wykorzystywani wyłącznie do celów testowych. Moduł security.py, znajdujący się w repozytorium GitHub, zawiera także punkt końcowy POST /token, który umożliwia uzyskanie tokenu. Jednak w przypadku środowiska produkcyjnego zaleca się korzystanie z autoryzacji opartej na tokenach JWT lub zewnętrznych dostawców tokenów.
Po skonfigurowaniu autoryzacji możemy przejść do zabezpieczenia punktu końcowego WebSocket w aplikacji. W tym celu, w module main.py, należy użyć dekoratora @app.websocket do zabezpieczenia połączenia WebSocket:
Tym sposobem połączenie WebSocket stanie się zabezpieczone i wymagać będzie autoryzacji przy każdej próbie połączenia. Aby przetestować to rozwiązanie, należy uruchomić serwer, wykonując polecenie:
Podczas próby połączenia z tym punktem końcowym WebSocket (np. przez Postmana lub inne narzędzie) nastąpi błąd autoryzacji, a połączenie zostanie odrzucone przed handshake. Aby umożliwić połączenie, użytkownik musi wcześniej uzyskać token, który zostanie przesłany w nagłówkach żądania WebSocket. Można go pobrać z dedykowanego punktu końcowego lub, korzystając z generatora tokenów dostępnego w repozytorium, po prostu dodać tokenizowany ciąg do nazwy użytkownika.
Na przykład dla użytkownika johndoe, token będzie wyglądał jak tokenizedjohndoe. Aby przesłać token, należy dodać nagłówek Authorization w żądaniu WebSocket w Postmanie, ustawiając jego wartość na bearer tokenizedjohndoe. Gdy token jest prawidłowy, połączenie zostanie nawiązane, a użytkownik będzie mógł wymieniać wiadomości.
Zabezpieczenie WebSocket w FastAPI za pomocą OAuth2 zwiększa poziom bezpieczeństwa komunikacji i skutecznie chroni aplikacje przed potencjalnymi zagrożeniami i lukami. Warto jednak pamiętać, że mechanizm ten może ulegać szybkiej ewolucji, a najlepsze praktyki są stale udoskonalane. Obecnie, implementacja OAuth2 w połączeniach WebSocket w FastAPI jest tematem aktywnej dyskusji w społeczności GitHub, co może wpłynąć na dalszy rozwój tej technologii.
Z perspektywy praktycznej, użytkownicy powinni być świadomi, że w przypadku bardziej zaawansowanych aplikacji konieczne może być zastosowanie bardziej złożonych metod autentykacji, takich jak OAuth2 w połączeniu z JWT, aby zapewnić wyższy poziom ochrony danych w aplikacjach o większej skali. Przy wdrażaniu tego mechanizmu należy również zadbać o aktualizowanie bibliotek i monitorowanie najnowszych rozwiązań w zakresie bezpieczeństwa.
Jak zintegrować FastAPI z innymi bibliotekami Pythona i stworzyć inteligentnego asystenta AI?
Integracja FastAPI z bibliotekami Pythona, takimi jak LangChain i Cohere, umożliwia stworzenie dynamicznych i interaktywnych aplikacji AI, które mogą znacząco usprawnić doświadczenia użytkowników. Dzięki tym narzędziom możliwe jest łatwe łączenie potężnych modeli językowych z zewnętrznymi źródłami danych i procesami roboczymi. FastAPI, jako framework oparty na Pythonie, sprawdza się tu doskonale, pozwalając na szybkie tworzenie aplikacji webowych z nowoczesnymi funkcjami opartymi na AI.
Aby zbudować aplikację, która łączy FastAPI z LangChain, najpierw należy stworzyć odpowiednie środowisko. Zainstalowanie wymaganych pakietów, takich jak fastapi, uvicorn, langchain i innych zależności, jest pierwszym krokiem. Ważne jest również, aby przygotować odpowiedni plik API key do współpracy z usługą Cohere, która dostarcza model LLM (Large Language Model). W tym przypadku aplikacja będzie wspierała asystenta AI dla sklepu z elektroniką, który będzie pomagał użytkownikom w znajdowaniu produktów oraz udzielaniu rekomendacji.
Po zainstalowaniu wszystkich potrzebnych narzędzi i uzyskaniu klucza API, możemy przejść do tworzenia punktów końcowych. Zaczynamy od skonfigurowania aplikacji FastAPI i połączenia jej z menedżerem kontekstu, który zarządza stanem aplikacji w trakcie jej działania. W tym celu, za pomocą dekoratora @asynccontextmanager, definiujemy funkcję lifespan, która przekazuje kontekst aplikacji do instancji FastAPI, umożliwiając zarządzanie wiadomościami użytkowników, które są przechowywane i wykorzystywane w późniejszym czasie.
Punkt końcowy aplikacji
Głównym celem jest stworzenie punktu końcowego, który będzie interagował z chatbotem, odpowiadającym na zapytania użytkowników. W tym przypadku zdefiniujemy punkt końcowy POST /query, który będzie przyjmować zapytanie w postaci tekstu i na jego podstawie generować odpowiedź. Funkcja query_chat_bot będzie odbierać zapytanie od użytkownika oraz historię wcześniejszych wiadomości, a następnie wysyłać je do modelu Cohere w celu uzyskania odpowiedzi. Dzięki temu użytkownicy mogą zadawać pytania dotyczące produktów lub innych kwestii technicznych związanych ze sklepem.
Ważnym aspektem jest tutaj walidacja danych. Zapewnienie minimalnej długości zapytania pozwala uniknąć błędów, które mogłyby wystąpić, gdyby użytkownik wysłał pustą wiadomość. Po udzieleniu odpowiedzi chatbot prosi użytkownika o ponowne zadanie pytań lub modyfikację zapytania, aby kontynuować rozmowę.
Rozbudowa aplikacji o dodatkowe punkty końcowe
W bardziej zaawansowanej wersji aplikacji warto dodać możliwość przeglądania historii rozmów użytkownika. Możemy to osiągnąć przez dodanie punktu końcowego GET /messages, który zwróci wszystkie wymienione wiadomości w sformatowanej formie. Kolejnym punktem może być POST /restart-conversation, który pozwoli na zresetowanie całej historii rozmowy i rozpoczęcie nowej sesji bez żadnych wcześniejszych danych.
Integracja FastAPI z LangChain
LangChain to framework, który pozwala na łatwe tworzenie aplikacji wykorzystujących modele językowe. W tym przypadku jego integracja z FastAPI pozwala na stworzenie interaktywnego asystenta, który może przetwarzać zapytania użytkowników, analizować dostępne dokumenty (np. FAQ), a następnie dostarczać precyzyjne odpowiedzi. Praca z LangChain wymaga zrozumienia kilku kluczowych pojęć, takich jak:
-
Prompting – zdefiniowanie odpowiednich szablonów wiadomości, które będą wysyłane do modelu.
-
Ingesting and vectorizing documents – proces przetwarzania dokumentów (np. FAQ) w taki sposób, aby były one łatwo przeszukiwalne przez model.
-
Building the model chain – tworzenie łańcucha procesów, które odpowiadają za całą logikę pracy modelu, od wejściowych zapytań po generowanie odpowiedzi.
Aby stworzyć odpowiedni system wiadomości, należy zaprojektować szablon, który będzie wykorzystywał zmienne takie jak pytanie użytkownika oraz kontekst, w którym to pytanie jest zadane. LangChain oferuje szereg gotowych klas do tworzenia takich szablonów, jak SystemMessagePromptTemplate czy HumanMessagePromptTemplate. Te obiekty będą odpowiadać za formatowanie wiadomości w sposób, który będzie zrozumiały dla modelu.
Kiedy już mamy przygotowany szablon wiadomości, musimy przejść do przetwarzania dokumentów, które będą wykorzystywane przez asystenta. Proces ten obejmuje podział dokumentów na mniejsze fragmenty, które następnie są konwertowane na wektory. Te wektory mogą być przechowywane w bazie danych wektorowej, co pozwala na szybkie wyszukiwanie informacji na podstawie podobieństwa.
Ważne aspekty w procesie budowy aplikacji
Warto pamiętać, że przy tworzeniu aplikacji wykorzystujących AI, kluczowe jest odpowiednie przygotowanie danych, które będą wykorzystywane do trenowania modelu. Dokumenty muszą być dobrze sformatowane i zawierać tylko te informacje, które będą przydatne w kontekście zapytań użytkowników. Dodatkowo, rozważając implementację takich rozwiązań, warto zwrócić uwagę na kwestie skalowalności i wydajności, zwłaszcza gdy aplikacja ma działać w środowisku produkcyjnym, gdzie liczba zapytań użytkowników może być bardzo wysoka.
Wydajność systemu może zależeć od wielu czynników, takich jak optymalizacja procesów przetwarzania dokumentów, wybór odpowiednich algorytmów wyszukiwania czy dobór modelu językowego. Przed wdrożeniem w środowisku produkcyjnym należy przeprowadzić dokładne testy, aby upewnić się, że aplikacja będzie działała płynnie, nawet przy dużym obciążeniu.
Jak skonfigurować środowisko pracy i rozpocząć projekt w FastAPI
Konfiguracja środowiska programistycznego jest jednym z pierwszych kroków, które należy wykonać przed rozpoczęciem pracy nad projektem. Kluczowe znaczenie ma dostosowanie IDE (środowiska programistycznego) do swoich potrzeb, tak aby pasowało do Twojego stylu pracy. Możliwość dostosowywania motywów, skrótów klawiaturowych i innych ustawień sprawia, że praca staje się bardziej komfortowa i produktywna.
W procesie tworzenia oprogramowania istotnym narzędziem jest kontrola wersji, a Git oraz GitHub stanowią w tym zakresie nieocenioną pomoc. Instalacja Gita jest prosta i dostępna na oficjalnej stronie git-scm.com. Po zainstalowaniu Gita, należy skonfigurować go, podając swoje imię oraz adres e-mail, używając poniższych komend w terminalu:
GitHub natomiast będzie platformą do przechowywania kodu źródłowego, którą użyjemy w tym poradniku do zarządzania projektem.
Tworzenie nowego projektu FastAPI
Zorganizowanie odpowiedniej struktury projektu to klucz do utrzymania czystości kodu, szczególnie gdy aplikacja będzie się rozwijać. FastAPI, podobnie jak inne frameworki, wymaga odpowiedniego podejścia do organizacji projektu, aby móc łatwo zarządzać rosnącą bazą kodu. Istnieje kilka ogólnych zaleceń co do struktury aplikacji, które ułatwiają jej późniejsze utrzymanie.
Aby rozpocząć projekt, najpierw tworzymy główny folder projektu o nazwie, np. fastapi_start. Następnie, w terminalu w tym folderze, tworzymy wirtualne środowisko:
Po utworzeniu folderu .venv zainstalujemy niezbędne pakiety:
Po zainstalowaniu FastAPI i Uvicorn, otwieramy folder projektu w wybranym IDE i tworzymy plik main.py. W tym pliku rozpoczynamy naszą aplikację FastAPI, importując odpowiednie moduły:
Teraz mamy stworzoną naszą pierwszą aplikację FastAPI. Aby śledzić zmiany w projekcie, uruchamiamy Git:
-
Inicjujemy repozytorium w głównym folderze projektu:
-
Następnie dodajemy wszystkie pliki:
-
I wykonujemy pierwszy commit:
Dzięki temu nasz projekt jest teraz śledzony przez Git. Zanim jednak przejdziemy do większych struktur i organizacji aplikacji, warto zapoznać się z kilkoma najlepszymi praktykami dotyczącymi struktury projektu w FastAPI.
Organizacja projektu FastAPI
Choć nie istnieje jedna, idealna struktura projektu FastAPI, warto pamiętać o kilku zasadach, które pomogą w utrzymaniu porządku w aplikacji:
-
Folder
/src: Zawiera główny kod aplikacji. Wewnątrz tego folderu można stworzyć podfoldery, np.modelsdla modeli baz danych,routesdla tras FastAPI,servicesdla logiki biznesowej. -
Folder
/tests: Testy powinny być przechowywane oddzielnie od głównego kodu aplikacji, co ułatwia ich zarządzanie i utrzymanie porządku w projekcie. -
Folder
/docs: Dokumentacja projektu powinna być również oddzielona od kodu. Dobrą praktyką jest stworzenie dedykowanego folderu na dokumentację API, instrukcje instalacji i obsługi aplikacji.
Dzięki odpowiedniemu podziałowi na foldery, projekt staje się łatwiejszy do zarządzania, nawet w przypadku dużych aplikacji.
Korzyści z używania FastAPI
FastAPI to jeden z najnowocześniejszych frameworków do tworzenia aplikacji webowych w Pythonie. Jego główne cechy to wydajność, prostota i automatycznie generowana dokumentacja API. Jest to narzędzie idealne dla programistów, którzy potrzebują tworzyć szybkie i skalowalne aplikacje.
Szybkość: FastAPI jest jednym z najszybszych frameworków do tworzenia API w Pythonie, dzięki wykorzystaniu podwalin frameworka Starlette do obsługi aplikacji webowych i Pydantic do obsługi danych.
Łatwość użycia: FastAPI charakteryzuje się intuicyjnością kodu, co pozwala na szybkie tworzenie aplikacji i skrócenie czasu rozwoju.
Automatyczna dokumentacja: Jednym z najbardziej cenionych aspektów FastAPI jest automatyczne generowanie dokumentacji API. Jest to olbrzymi atut dla programistów, którzy nie muszą ręcznie pisać dokumentacji. FastAPI korzysta z OpenAPI i Swagger, co pozwala na łatwe testowanie API bezpośrednio z przeglądarki.
Asynchroniczność w FastAPI
Jedną z najważniejszych cech FastAPI jest jego obsługa programowania asynchronicznego. Asynchroniczność pozwala na równoczesne przetwarzanie wielu zapytań, co znacząco zwiększa wydajność aplikacji. W FastAPI asynchroniczne funkcje są obsługiwane za pomocą składni async/await. Dzięki temu aplikacja może obsługiwać większą liczbę zapytań w tym samym czasie, co jest szczególnie istotne w przypadku aplikacji o dużym ruchu.
Aby skorzystać z tej funkcjonalności, wystarczy oznaczyć funkcje jako asynchroniczne:
Takie podejście sprawia, że aplikacje stają się bardziej responsywne, a czas odpowiedzi jest znacznie krótszy, zwłaszcza przy obsłudze dużej liczby zapytań.
Ważne informacje
Aby zapewnić prawidłowy rozwój projektu w FastAPI, warto zwrócić uwagę na kilka istotnych kwestii:
-
Zarządzanie środowiskiem wirtualnym: Korzystanie z wirtualnych środowisk (np.
.venv) pozwala na izolację zależności projektowych, co ułatwia utrzymanie porządku w systemie i unikanie konfliktów wersji bibliotek. -
Zarządzanie wersjami kodu: Git to narzędzie, które umożliwia śledzenie historii zmian w projekcie. Regularne commitowanie oraz stosowanie praktyki tworzenia odpowiednich gałęzi (branch) pozwala na lepsze zarządzanie kodem.
-
Testowanie: Oddzielenie testów od aplikacji oraz regularne uruchamianie testów jednostkowych i integracyjnych jest kluczowe, szczególnie w przypadku większych aplikacji.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский