Aplikacja webowa w Pythonie – Flask – Migracja z localhosta na serwer, czyli co może pójść nie tak z bazą danych – #10
Powoli nadchodzi taki etap, że Twoja aplikacja jest już niemal gotowa – ale niestety na localhoście, a nie na właściwym serwerze. W tym przypadku chodzi o serwer Unixowy, a dokładniej Ubuntu. Niestety Windows i Linux znacznie się od siebie różnią i czasem coś, co działa na jednym, niekoniecznie pójdzie na drugim. W moim przypadku utrudnienie jest jeszcze jedno – nie posiadam uprawnień root-a, w związku z czym prosta instalacja pakietów przez pip niestety nie wchodzi w grę. Na szczęście Flask jest już na nim postawiony, więc chociaż to nie powinno mnie zawieść :)
Baza danych na serwerze
Jako że o instalowaniu czegokolwiek w miły sposób mogę jedynie pomarzyć, pozostaje mi pobranie odpowiednich paczek i dodanie do swojego folderu na serwerze manualnie. Zaczęłam od bazy danych, jako że większość aplikacji z niej korzysta.
I pojawiła się pierwsza wątpliwość – z czego ja w ogóle korzystam? Flask-MySQL czy Flask-MySQLdb? Twórcy, którzy nazywali te paczki i zrobili strony z ich dokumentacją w taki sposób (ta bez “db” i ta z “db”) chcieli chyba wybitnie utrudnić życie ludzkości. Sieczka z mózgu robi się jeszcze większa po spojrzeniu w obie biedne dokumentacje:
Z tego co zdążyłam wyczytać w internecie, nie tylko ja mam problem z tymi dwoma rozszerzeniami.
Wróciłam więc szybko do wpisu, w którym informowałam Was jak podłączyć się do bazy danych i odkryłam, że… popełniłam błąd. W nagłówku napisałam, że połączymy się z Flask-MySQLdb, a w treści opisałam łączenie z Flask-MySQL (i tego już trzymałam się do końca). Pomyłkę już oczywiście poprawiłam i bardzo za nią przepraszam, ale pewnie sami widzicie gdzie leży problem.
Z ciekawości ściągnęłam sobie oba pakiety i popatrzyłam w kod – tak naprawdę różnic między nimi jest niewiele. W jednej korzystamy z connection, a w drugiej z connect i zmienne ze screenshota zawierają (bądź nie) jedno słowo więcej. Więcej różnic, które miałyby znaczenie dla zwykłego użytkownika raczej nie ma – każda z paczek korzysta z innych importów ale w sumie dla nas nie ma to ogromnego znaczenia.
Ale – wróćmy do tematu.
Aby móc przerzucić moją aplikację na serwer, potrzebuję umieścić na nim rozszerzenie bazodanowe. Ściągnijmy więc Flask-MySQLa stąd i folder flaskext z pobranej paczki umieśćmy w nowym folderze zawierającym projekt.
Wysłanie aplikacji na serwer
Po dorzuceniu potrzebnej paczki, przekopiowałam cały folder z moim projektem na serwer. Plik run.py, tak jak wcześniej, zostawiłam “poziom wyżej”, tak jak na screenie:
Nadeszła więc ta wielka chwila, aby uruchomić apkę… i error! Najlepiej:
Jak widać, do naszego Flask-MySQL potrzebujemy jeszcze jednej paczki – pymysql. Szybko pobierzmy ją z githuba i właściwy folder umieśćmy na naszym serwerze.
Gotowe :) Teraz ponownie spróbujmy uruchomić aplikację – nie wiem jak u Was, ale moja ruszyła!
Ciekawe, czy coś się wyświetla… Niestety – odpowiedź brzmi nie. Przypominając sobie to, co pisałam w pierwszym odcinku tutorialu, zauważam, że moje app.run(debug=True) w run.py jest trochę łyse. Dodam do niego port oraz host składający się z samych zer (jeżeli uruchamiamy Flaska na zdalnym serwerze i chcemy, aby był on dostępny również z zewnątrz, powinniśmy ustawić ‘0.0.0.0’).
Podmieniam linijkę na: app.run(host="0.0.0.0", port=5019, debug=True)
Wchodzę pod www.adres-serwera:5019 i z pozoru wszystko wydaje się śmigać…
…dopóki nie spróbuję się zalogować :)
Błąd spowodowany jest ustawieniami bazy danych – na localhoście w pliku __init__.py wygląda to tak:
1 2 3 4 5 |
app.config['MYSQL_DATABASE_USER'] = 'root' app.config['MYSQL_DATABASE_PASSWORD'] = '' app.config['MYSQL_DATABASE_DB'] = 'flask' app.config['MYSQL_DATABASE_HOST'] = 'localhost' app.config['MYSQL_CHARSET'] = 'utf8' |
A powinno wyglądać tak:
1 2 3 4 5 |
app.config['MYSQL_DATABASE_USER'] = 'nazwa_na_serwerze' app.config['MYSQL_DATABASE_PASSWORD'] = 'haslo_na_serwerze' app.config['MYSQL_DATABASE_DB'] = 'baza_danych_na_serwerze' app.config['MYSQL_DATABASE_HOST'] = 'localhost' app.config['MYSQL_CHARSET'] = 'utf8' |
Oczywiście pod nazwa_na_serwerze, haslo_na_serwerze itd. należy podstawić swoje dane :). Wcześniej należy również upewnić się, czy dana baza istnieje i czy tabele, z których korzystamy na pewno są utworzone.
Gotowy kod!
Masz serwer z zainstalowanym Flaskiem? Przygotowałam dla Ciebie dwie paczki z prostym skryptem, który łączy się z bazą danych i wyświetla dane z jednej tabeli. Jedna paczka korzysta z Flask-MySQLdb, a druga z Flask-MySQL, więc wybierz tą, która Ci bardziej odpowiada :)
Aby całość ruszyła, uzupełnij plik __init__.py swoimi danymi dostępowymi do bazy i wrzuć całą paczkę na zewnętrzny serwer. Przez konsolę uruchom apkę: python run.py (lub python3 run.py, jeżeli masz zainstalowane kilka wersji pythona) i sprawdź czy działa wpisując w przeglądarce nazwa-serwera:5019 :). Dopilnuj również, aby odwołać się do istniejącej tabeli.
Powyższe kody znajdziesz również na moim Githubie.
Jeżeli cokolwiek Ci nie zadziała, pisz śmiało – chętnie na to spojrzę :).