Praktyczne głębokie uczenie się i bezpieczeństwo internetowe według przykładu Trzecie wydanie Charlotte Harper 3 lipca 2024 r Zaktualizowano/przekonwertowano 3 czerwca 2025
Przedmowa:
Rozważania dotyczące bezpieczeństwa w budowaniu oprogramowania dla sieci są ważną częścią każdego planu i realizacji programisty internetowych podczas inżynierii prototypu, który jest niezawodny, stabilny i przydatny do celów praktycznych. DOM (znaczniki obiektu Dokument), wraz z jego wdrożeniem HTML, JavaScript i CSS, a także oprogramowania zaplecza wdrażającego Python, C/C ++, Java i Bash, daj programistom internetowym swobodę i władzy, aby stworzyć różnorodne projekty, które wyrażają kreatywność, zapewniają łatwość użytkowania i funkcjonalność, przedstawienie pospolitowania i charakteru oraz zapewnianie łatwości wykorzystania, a także wygody i ważnych usług, które są atrakcyjnymi dla użytkowników, które są uboczne, które są dla końca użytkownika, które są uboczne, a także użytkownika. Zabij czas lub zrób coś w Internecie, zwykle na urządzeniu do smartfona z ekranem dotykowym. Większość ludzi nawet nie wiedziałaby, od czego zacząć, kiedy chcą zbudować stronę internetową od zera, miałyby tendencję do zaczynania na stronie internetowej innej osoby i budowania czegoś ograniczonego pod względem funkcjonalności, niezawodności, łatwości użytkowania, a zwłaszcza kreatywności, gdy mogli mieć do dyspozycji wszystkie najnowsze narzędzia, aby zbudować coś przydatnego bez marnowania czasu, a zwłaszcza marnowanie pieniędzy za kosztowne subskrypcje na oprogramowanie, które niewiele osób chce korzystać z ich ograniczeń, aby ułatwić korzystanie i elastyczność. Jeśli masz kilka minut na przeczytanie tej książki i dowiedz się, czego chcę cię uczyć, a nawet porozmawiać ze mną osobiście o swoich celach i uzyskać wskazówki we właściwym kierunku, i jesteś zmotywowany do nauki kodowania i pisania własnego oprogramowania, zabierania tej książki do domu i odłożenia czasu na naukę budowania następnego wpływowego, potężnego, usprawiedliwionego i ważnego aplikacji internetowej, strony internetowej, która jest na tobie, i robi to, czego chcesz, i spotyka się z potrzebami publiczności.
O mnie: Jestem programistą z szerokim zakresem doświadczeń w C/C ++, Java, Python, HTML, CSS i JavaScript. Buduję strony internetowe, które ludzie chcą korzystać, chcą odwiedzić, a nawet uzależnić się od używania, aby uczyć się, odtwarzać i zabijać czas, a co najważniejsze, sprzedaję oprogramowanie. Jeśli miałeś pomysł na to, jak chcesz wyglądać i funkcjonować witryny, byłeś gotów mnie wspierać, abym mógł zaspokoić własne potrzeby, gdy spotykam twoje, i jesteś gotów pokryć koszty uruchomienia witryny, zbudowałbym następny YouTube, Tiktok, Twitter, Google lub nawet aplikację bezpieczeństwa w wysokiej technologii. Zamiast próbować sprzedać ci mój czas, staram się kupić twoje: chcę sam porozmawiać o budowie aplikacji (strony internetowej) z informacjami, które już istnieją, i nauczyć, czego potrzebujesz, aby być niezależnym programistą oprogramowania, przedsiębiorcą, prowadząc udaną karierę w dowolnej dziedzinie. I pozwól, że wyjaśnię, edukacja, którą ci daję, będzie nieformalne. Możesz pójść do szkoły i nauczyć się tego wszystkiego z formalnym wykształceniem, a nawet przeczytać tę książkę w szkole, wypełnić swoje zadania i odebrać wiele z edukacji, ale formalnie nie postawię cię na gorąco i poprosić o wykonanie zadań. Nie jestem twoim profesorem, możesz pomyśleć o mnie jak o przyjacielu, który chce cię poprowadzić w kierunku kariery prowadzonej przez twój osobisty sukces. I też nie sprzedaję ci sukcesu, będziesz musiał go kupić wraz z czasem. Nauka kodu ma stromą krzywą uczenia się i nigdy nie była łatwa, a nawet nie powinna być. Musisz pracować tak ciężko, jak to możliwe, i nadal próbować porażić się i próbować ponownie, nawet jeśli jesteś sfrustrowany, aby samodzielnie uczyć się i budować aplikacje. To ma charakter samego kodu. Kod jest prowadzony przez kompilator, który ma na celu przekazanie komunikatów o błędach programisty, które nauczy Cię, jak kodować, nawet jeśli po prostu kopiujesz błąd w wyszukiwarce i czytasz przykłady innych osób. I muszę powiedzieć, że nie musisz być niezwykle bogaty, inteligentny, odnoszący sukcesy, a nawet zorientowany na szczegóły lub zorganizowany w celu zbudowania aplikacji. Komputer opiekuje się tą organizacją. Musisz tylko wytrwać przez próbę i błędy, koncentrować się i ciężko pracować nad tym, co robisz, a będziesz miał bardzo udaną karierę w całości tego, co robisz.
Kim jestem: Zdaję sobie sprawę, że ostatnia sekcja była bardziej na temat nauki i przechodzisz z tej książki. Kim dokładnie jestem? To skomplikowane pytanie. Nie jestem jasny, że sam, ponieważ cierpię na warunki medyczne, które mogą mi utrudniać nawet kodowanie lub pisanie tej książki, jednocześnie prezentując wyzwania związane z socjalizacjami i tożsamością, które utrudniają moje życie, jeśli chodzi o wprowadzenie siebie. Krótko mówiąc, jeśli czytasz tę książkę, przyniósł ją do domu, ponieważ przerzuciłeś ją i myślałeś, że jest to przydatne, a nawet jeśli po prostu przeczytałeś tak daleko, jestem dla ciebie osobą, która chce zobaczyć, jak odniesiesz sukces we wszystkim, co robisz. Sam jestem inżynierem, programistą i studentem, i piszę tę książkę dla innych studentów, którzy chcą ułatwić swoje życie, mając podręcznik oprogramowania, którego potrzebują, ułatwiając swoje życie, podając przykłady, które pasują do siebie jak duża puzzle w działającą, użyteczną, funkcjonalną, spójną i angażującą aplikację aplikacji, która może zwiększyć sukces. W dużej mierze to właśnie robię: buduję aplikacje, aby pomóc sobie i innym ludziom odnieść sukces. Jestem również autorem, choć jest to moja pierwsza publikacja, którą zamierzam ukończyć, aby połączyć moje portfolio w użyteczny dokument, a także artysta. Przyznaję ci to, jestem trochę dziwną osobą. Nie jestem doskonały, biegałem INS z prawem, nawet prowadząc mnie do opuszczenia uczelni i uniwersytetów i opuszczenia stanów, aby spróbować nadać sobie markę z większym sukcesem. Jestem kobietą z urodzenia, noszę makijaż, robię zdjęcia siebie, noszę sukienki i inne odzież damskie, a z natury jestem świadomy siebie jako kobiety. W przeszłości miałem problemy z innymi ludźmi, które doprowadziły do walki z pisaniem i budowaniem WebApps, i przepraszam, że nie byłem w stanie wcześniej dostać tej książki w twoich rękach: potrzebujesz tego. Będziesz chciał przeczytać i napisać kod, który wygląda jak mój i działa jak moje i robi to samo, ale jeszcze lepiej, ponieważ jeśli możesz sobie pozwolić na zakup tej książki zamiast tłumić klawiaturę, tak jak ja tylko po to, aby sam stworzyć książkę, prosząc o to pieniądze, masz zasoby, aby odnieść sukces w swoim życiu. Miałem różnego rodzaju problemy z dorastaniem rodziny, warunkami zdrowotnymi, lekarzami, mediami i prawem, a mój kod głęboko odzwierciedla walkę, jaką jest feminizm i kobieca natura w podzielonym i sfrustrowanym świecie. Jednak ta książka jest czymś, na czym mnie bardzo zależy, moje dziecko, moje portfolio i moje utrzymanie, więc doceniam twoje rozważanie, gdy zabierasz SMS -a do domu i starannie nad nią uczą się ode mnie. Pamiętaj, że nie jestem idealny, ta książka będzie miała błędy, poprawki i nowe wydania, a będziesz musiał pomyśleć z swoim logicznym mózgiem najlepiej jak potrafisz, aby mieć udane doświadczenie z moim pisaniem. Zrozum również, że mam na myśli dobrze dla ciebie, nawet jeśli napotykasz wyzwania podczas pisania. Pomyśl o tym w ten sposób: kiedy możesz po prostu wynająć system komputerowy, aby zrobić wszystko, co możesz sobie wyobrazić w przestrzeni cyfrowej, przechowywać wszystkie informacje, które napotkasz, analizujesz i zorganizuj je, i zrozumiesz je, nieuchronnie napotkasz trudności z informacjami, które spożywasz, a nawet publikujesz. Mówię ci to, ponieważ napotykam te same trudności. Skorzystaj z tej książki we własnym ryzyku, pracuj ze swoją społecznością i społecznościami dostępnymi, aby budować oprogramowanie w bezpiecznym otoczeniu, i nie bierz rzeczy osobiście, kiedy zawodzisz, a nawet odniesiesz sukces w niewłaściwy sposób: w ten sposób dotarłem tak daleko, i dlaczego mogę przynieść ci ten tekst i pomóc ci odnieść sukces bez rozbieżności na ścieżce szaleństwa, który pozostawia mnie zrujnowaną, rozdartą i obdarzam się, gdy spotykam się z zwykłymi problemami z globalnym podziękowaniami za Parallistic Sacyna Będziemy pracować, Internet. Być może nie znasz tego, kim jestem z kilkoma słowami, ale zachęcam do czytania, poznajesz mnie, gdy nadal czytasz i rozumiesz, budując własne projekty, aby ukończyć swoją pracę. W tej książce nie będzie pracy domowej, o ile twoi profesorowie lub nauczyciele niczego ci nie przypisują, ale gorąco zachęcam do samodzielnego zbudowania portfela projektów podczas czytania, a także projektu Capstone pokazującego, jak możesz zastosować to, czego się nauczyłeś. Mój projekt Capstone jest podstawą większości tego, co przeczytasz w tej książce, ponieważ zawiera kod z moich poprzednich projektów, kod, który stworzyłem i nauczyłem się pisać metodycznie ręcznie, a szeroki zakres pomysłów i wskazówek, które pomogły mi odnieść sukces do tego, że mogę zwrócić prostą aplikację, która jest w pełni wyróżniona, wyglądała i zachowuje się jak popularna aplikacja, którą możesz zobaczyć, w Internecie, reklamę, reklamę, lub w wiadomościach.
Jaka jest ta książka: Ta książka jest samouczkiem według przykładu. Możesz znaleźć kod tutaj, instrukcje dotyczące nauki kodowania, informacji o debugowaniu kodu i błędów ustalania, rozwiązywania kroków, instrukcji, w jaki sposób tworzyć kopie zapasowe i zapisywać kod, ponownie wdrażanie, jeśli ktoś złamie kod, zabezpieczanie kodu, wdrażanie kodu, budować interaktywne strony internetowe, które są zabawne, angażujące i uzależnione, a będziesz mieć poczucie tego, kto jestem ważny, a to, jak to ważne, a to, jak to zrobić, jest to, że jest to samooceny, jak to zrobić. Budujesz w absolutnie najlepszym świetle, aby być najbardziej atrakcyjne dla użytkowników końcowych, odwiedzających witrynę. W tej książce zademontuję szereg przykładów projektowania oprogramowania, koncentrując się na sieci jako platforma, a także bezpieczeństwo. Zainicjujemy doświadczenie edukacyjne, budując podstawowy projekt przy użyciu powłoki UNIX, z funkcjami tworzenia kopii zapasowych i scenariuszy. Następnie przeanalizujemy podstawową stronę blogu, zaktualizujemy nasz blog o funkcjach fotograficznych i wideo, a także skorzystamy z tych funkcji do zastosowania rozwiązań bezpieczeństwa za pomocą bezpłatnego oprogramowania, i zabezpieczyć nasz serwer za pomocą modułu uwierzytelniania wtyczki (PAM). Następnie przeglądamy obsługę i przetwarzanie plików, eksplorując edycję wideo, darowiznę głosową, skanowanie kodów kreskowych i rozpoznawanie znaków optycznych, między innymi. Po drodze zbadamy interfejsy API, które pomogą nam uczynić nasze oprogramowanie bardziej użytecznym i bezpiecznym, z bezpłatnymi i płatnymi opcjami. Po drodze zbadamy fizyczne bezpieczeństwo i bojowe narzędzia, takie jak projektowanie i produkcja broni palnej i amunicji, w tym projektowanie beczek i repeater, projektowanie wieży i dronów oraz innych dyrektorów, zintegrujemy się z naszym oprogramowaniem w istniejącej sieci w celu ochrony naszego oprogramowania i wykazania się samoobrony i odporności. Zrobimy przerwy po drodze do budowania gier, silników renderowania 2D i 3D i będziemy pracować z osadzonym sprzętem w przykładach podstawowego oprogramowania do renderowania wymiarowego i elektronicznego wibrującego masażera odlewanego odpowiednio w gumy silikonowej. Po drodze będziemy również dostępne rozwiązania uczenia maszynowego, aby lepiej zabezpieczyć nasze oprogramowanie. Będziemy również zastosować narzędzia magazynowe dostępne dla Internetu w celu usprawnienia i zabezpieczenia procesu. Ta książka jest przewodnikiem po twoim sukcesie w budowaniu aplikacji internetowej i integracji jej z profesjonalną siecią komputerów i wbudowanych systemów mechanicznych oraz ogólnie przewodnikiem po budowaniu oprogramowania i osadzonego sprzętu bez wiedzy w tle lub wcześniejszych doświadczeniach.
Czym nie jest ta książka: Jeśli naprawdę chcesz mieć stronę internetową, możesz po prostu skonfigurować prosty sklep i sprzedać to, czego potrzebujesz, opublikować blog, opublikować zdjęcia lub filmy lub inaczej bez pisania jednego wiersza kodu. Ta książka nie jest taka. Ta książka nauczy Cię, jak budować oprogramowanie, które jest bardziej przydatne, w pełni wyróżnione, funkcjonalne i bezpieczne niż jakiekolwiek oprogramowanie, które już możesz znaleźć, ponieważ wdraża najnowsze oprogramowanie, które nadal jest prototypami, może być drogie w obsłudze starszych firm i nie przemawia do zacofanych, przekonanych firm, które ustawiają się, aby zarobić pieniądze dla osób, które tak naprawdę nie robią. Jeśli uważnie śledzisz tę książkę, będziesz chciał napisać kod, kod zbadania, zbudować własne aplikacje i zarabiasz na tym, co robisz. Zarabiam na tej książce, nawet na wczesnych etapach, ponieważ zawiera ona informacje, które ludzie potrzebują i chcą czytać, i już kupują, gdy kupują lub korzystają z moich aplikacji. Ta książka nie zbuduje dla ciebie aplikacji, ale wskazuje ci właściwy kierunek i uzbroi cię potrzebnymi narzędziami oraz umiejętnościami i wskazówkami, które ułatwią Twojego sukcesu w tworzeniu oprogramowania dla sieci, z każdą linią kodu, który będziesz musiał pisać jako przykład, gotowe do połączenia się we wspólne oprogramowanie, a także twoimi kibicami, gościami, klientami, przyjaciółmi, odwiedzającymi, kontrahentami, kontrahentami, a ludem Internetu i wsparcia.
Czego się nauczysz: Ta książka nauczy Cię, jak tworzyć i sprzedawać oprogramowanie, naprawdę funkcjonalne, przydatne oprogramowanie, nagrywanie mediów, funkcje bezpieczeństwa, takie jak rozpoznawanie twarzy, skanowanie kodów kreskowych odczytu maszynowego, interfejsy API w celu uwierzytelniania, nagrywania i renderowania wideo i zdjęć oraz wymiany komunikatów, takich jak Bluetooth i Blish Field (NFC). Ta książka nauczy Cię, jak korzystać z komputera sieciowego, koncentrując się na Debian Linux, jak zbudować kod bash, aby instalować i tworzyć tworzenie oprogramowania bezproblemowo, zautomatyzowaną premierą, jak budować kod Python jako zaplecza do obsługi dynamicznych wiadomości, ładnie zażywając STYLE STYLU CSS STYLE STYLU STORYFIKACJI SEBS Inne cele, skanowanie ID, moderacja obrazu i wideo, mikrotransakcje danych, aby zapewnić bezpieczeństwo oprogramowania, przetwarzanie płatności, handel kryptowalutami, zadania asynchroniczne i inne. Dowiesz się, jak budować własne urządzenia Bluetooth, z akumulatorami, ładowarkami, mikrokontrolerów, obwodami, silnikami i czujnikami, używając lutu, drutu i 3D, a także odlewane materiały. Wykazam dyrektorów projektowania 3D zastosowanych do produkcji addytywnej oraz produkcji narzędzi i matrycy, dzięki czemu możesz wyprodukować własne wbudowane urządzenia sprzętowe ze zintegrowanymi bateriami, ładowarkami, obwodami elektronicznymi i wyjściami funkcjonalnymi. I połącz je z Bluetooth i Internet. W szczególności zbadamy dwa studia przypadków, wibrujący masażer i domową broń palną, oba zaprogramowane w Openscad, które jest dostępne jako interfejs graficzny lub narzędzie linii poleceń i może być zintegrowane z siecią dla szybszych wyników. Dowiesz się, jak budować i wdrażać stronę internetową od podstaw bez wcześniejszego doświadczenia, sprawić, że jest funkcjonalna, bezpieczna, piękna, przydatna i, co najważniejsze. Dowiesz się, jak korzystać z uczenia maszynowego i wizji komputerowej, aby witryna była bezpieczna i bardziej praktyczna, nagrywać wideo i audio z witryny, przekazać głos, tworzyć muzykę i modulować dźwięk, aby tworzyć przydatne próbki, a także przełamać szum, wykorzystując inne strony internetowe, aby zbudować najlepszą sieć stron internetowych, które możesz połączyć bezpośrednio z Twoją, aby udostępnić wszystkie przydatne informacje, które masz, a co ważniejsze, przenosi ludzi do twoich oprogramowania i biznesowych. Ta książka będzie najbardziej skoncentrowana na mediach, bezpieczeństwie i uczeniu maszynowym, które są głównymi trzema komponentami, które pomogą Ci zbudować użyteczne oprogramowanie dla sieci, angażując odpowiednich użytkowników i rozłączając niewłaściwe w sposób realistyczny, praktyczny, praktyczny i angażujący, a także automatyczny i solidny. Ta książka uczy UNIX, szczególnie Debiana (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript oraz szeregu przydatnych pakietów oprogramowania dla żądań Pythona, a także przydatne oprogramowanie do bash, takie jak GIT i FFMPEG. Nauczę cię również, jak automatycznie handlować kryptowalutą i przyjmować płatności w kryptowalutach lub z regularnych kart debetowych, a nawet wypłacając odwiedzającym udział w przychodach, jeśli zdecydujesz się to zrobić. Nauczę cię, jak zarabiać pieniądze ze swojej witryny za pośrednictwem reklamy, jak przygotować aplikację do wyszukiwarek i uczynić ją szybką, ocenianą w pierwszym rankingu tego, co Twoi klienci będą szukać, aby cię znaleźć, i ranking w jak największej liczbie wspólnych wyszukiwań. Nauczę cię, jak sprzedawać swoje oprogramowanie, reklamować je, odwoływać się do klientów szukających twoich usług i nadawać sobie nazwę w Internecie za pośrednictwem możliwości, które już istnieją, są niedrogie i dobrze działać. Nauczę cię, jak zapisywać dane na komputerach w chmurze, które działają dla Ciebie i tanio zapisać dane, jak planować i zbudować witrynę, która robi to, czego chcą użytkownicy i co chcesz, i jak utrzymywać swoje użytkowników, umieszczając swoją witrynę, aby odrzucić swoje telefony za pomocą powiadomień, e -maila, wiadomości telefonicznych i więcej. Ta książka koncentruje się na praktyczności publikowania i dystrybucji mediów w dużych ilościach, od tekstu, przez zdjęcia, przez filmy po dźwięku, wywieranie dobrego wrażenia dla użytkowników końcowych (Twoja klienta) i sprzedaży w dowolny sposób, aby stworzyć stronę internetową, aplikację, która jest reprezentatywna tylko dla Ciebie i Ty, i sprawia, że Twoje oprogramowanie i Twoja firma wyglądają na najlepszy sposób. Nauczysz się również kilku wskazówek i wskazówek, od wskazówek kodowania, próżnej próżności, takich jak makijaż i fotografia, modelowanie i aktorstwo, a więcej, które będą ważne dla przedstawiania siebie i Twojej firmy w najlepszym możliwym świetle, używając wszystkich dostępnych narzędzi, jednocześnie dystrybuując tyle treści, ile potrzebujesz na zdrowym równowadze platform, aby zapewnić twoje oprogramowanie, które nie mają większego wysiłku, pracą lub pieniądze. Ta książka nazywa się „PraktyczneInternetowe głębokie uczenie się i bezpieczeństwo według przykładu „Z jakiegoś powodu: dotyczy uczenia się kodu, szczególnie dla sieci, w szczególności z naciskiem na bezpieczeństwo, z praktycznego punktu widzenia, z przykładami kodu roboczego, który obsługuje praktycznych celów opisanych w tekście. Komponent uczenia się tego tekstu obejmuje również uczenie maszynowe, kod, który pokażę, jak uruchomić internet, który będzie obsługiwał wizję komputerową, obraz i wideokonię. Podpis i inne zadania, takie jak wskaźniki prognozowania z obrazów, takie jak charakter autentyczny, transferowy komputerowy lub kopia optyczna (zdjęcie z drukowaniem) Może sprawić, że komputer serwerowy, komputer, który normalnie poprosi o nazwę użytkownika i kodu i zalogować się, być może z tokenem potwierdzającym dla każdego nowego logowania lub nowego adresu IP, ale jeśli buduje się na dużą skalę, łatwe w użyciu, zasadniczo bezpieczne i potężne oprogramowanie, może to być wystarczające. Każdy, kto buduje oprogramowanie, które jest nienagannie bezpieczne, ma pewne pojęcie o tym, co to implikuje. Oprogramowanie jest z natury niepewne, ponieważ urządzenia i konta, których używamy, aby uzyskać do niego dostęp, nie zawsze są do naszej dyspozycji, mogą być w rękach każdego, kto ma źle zamierzony oprogramowanie, a zatem mogą stanowić zagrożenie dla samego oprogramowania. To jest w centrum tej książki. Komputer sieciowy jest domyślnie zabezpieczony długim tokenem klucza, nazywanym i SSH lub Secure Shell Key, a poza tym najlepiej jest zabezpieczyć serwer WWW, ponieważ serwer WWW zapewnia otwarty dostęp, a także najnowocześniejsze narzędzia bezpieczeństwa działające na samym serwerze. Serwer WWW ma dostęp do przeglądarki internetowej użytkownika, która jest prawdopodobnie najpotężniejszą częścią urządzenia użytkownika, ponieważ jest to miejsce, w którym użytkownik może uzyskać dostęp do oprogramowania sieciowego. Ten zestaw narzędzi może renderować tekst, strony internetowe, które widzisz, a także rejestrować obrazy, audio i wideo (jak zdjęcie twarzy lub identyfikatora stanu), może czytać i pisać na urządzeniach radiowych Bluetooth, a także czytać i pisać na tagach przesyłania bliskiego, niedrogie karty kluczy, FOBS, naklejki, dzwonki i wiórki z unikalnymi numerami serialnymi, które można przeczytać i pisać z wynikiem danych i walidacji danych internetowych. Korzystając z wszystkich narzędzi do Twojej dyspozycji, dzięki tej książce wyposażysz się w wiedzę do budowy bezpiecznej strony internetowej i ogólnie bezpiecznego systemu komputerowego, który działa dla Ciebie, wykonuje licytację, wygląd i odczucia
Od czego zacząć: Zapraszamy do pominięcia sekcji, z którą zaczynam tę książkę lub dowolną sekcję, do dokładnego potrzebnego kodu, zwłaszcza jeśli masz doświadczenie w kodowaniu wcześniej lub dowolnym z wyżej wymienionych narzędzi, które szczegółowo opisam w tej książce, a także dokumentować przypadki użycia i ich praktyczne przykłady. Jeśli nie masz doświadczenia w pisaniu kodu, zdecydowanie polecam przeczytanie całej tej książki, a zwłaszcza polecam przeczytanie poprzednich sekcji, aby upewnić się, że ta książka jest dla Ciebie odpowiednia. Jeśli ta książka nie jest dla ciebie odpowiednia, rozważ podarowanie jej przyjaciela lub krewnego, który może być zainteresowany samodzielnym uczeniem się o rozwoju stron internetowych, a nawet rozważ pożyczenie jej z powrotem i uczeniem się od nich, aby wypełnić luki, w których zawiodłem cię jako nauczyciela lub inni nauczyciele przede mną. Zacznij tam, gdzie chcesz, każda część tej książki będzie przydatna, jeśli zamierzasz zbudować przydatną aplikację, i rozważ, że najlepsze aplikacje są budowane z myślą o użytkowniku końcowym: Poznaj swojego klienta. Teraz mnie znasz, znasz tę książkę i jesteś gotowy do rozpoczęcia. Aby rozpocząć, weź komputer (nawet najtańszy laptop ze sklepu z pudełkami, Amazon lub stary komputer stacjonarny i skonfiguruj go w sposób, który działa dla Ciebie.
Jak przeczytać tę książkę: Podświetlony tekst oznacza, że tekst należy do wiersza polecenia, w którym napiszesz uruchomiony kod. Pojownik polecenia jest mocno skupiony na klawiaturze i wymaga niewielkiego lub żadnego kliknięcia, przyspieszania przepływu pracy i ułatwiania ci rzeczy.
Pierwsze kroki: Zanurzmy się w środku. Zaczniemy od budowy kodu na lokalnym komputerze i zaczniemy bez budowania strony internetowej podłączonej do Internetu. Jest to bezpieczniejsze na początek, nic nie kosztuje i jest dla ciebie łatwe. W zależności od systemu operacyjnego wejście do skorupy bash będzie nieco inne. W przypadku Mac OS zalecam zainstalowanie maszyny wirtualnej w tym momencie, ponieważ uzyskasz największą kompatybilność z maszyną wirtualną. Różni dostawcy, tacy jak VirtualBox i Paralells, mogą uruchomić dla Ciebie maszynę wirtualną, choć można również zainstalować Ubuntu bezpośrednio na komputerze, jeśli wolisz korzystać z natywnego środowiska, które jest zalecane w celu stworzenia szybkiego, usprawnionego doświadczenia. Jeśli używasz Linux lub Windows, co polecam, utworzenie projektu powinno być dość łatwe. Otwórz terminal, dostosuj rozmiar, jak postrzegasz dopasowanie, i zacznij następnego kroku 2. Jeśli korzystasz z systemu Windows, wykonaj krok 1.
Krok 1: - Tylko użytkownicy Windows W systemie Windows otwórz wiersz polecenia jako administrator i wpisz WSL - Instalul
Krok 2: - Kontynuuj tutaj lub przejdź do kroku 1 do tutaj, jeśli nie używasz systemu Windows W otwartym terminalu (w zależności od systemu operacyjnego, o nazwie Ubuntu w systemie Windows, Terminal w Mac lub Linux lub podobnej nazwie), zacznij od utworzenia projektu. Robimy to z poleceniem MKDIR, które tworzy katalog. Jeśli chcesz utworzyć katalog do przechowywania projektu, który jest zalecany, użyj polecenia CD, aby zmienić w katalogu i i
CD/ścieżka/do/Directory - ścieżka to foldery (pliki) poprzedzające katalog docelowy, domyślną ścieżką jest ~ lub/home/nazwa użytkownika (gdzie nazwa użytkownika jest twoją nazwą użytkownika). Aby zmienić na domyślny katalog, wpisz CD lub CD ~ Przykład MKDIR - Wymień „Przykład" na nazwę katalogu
Teraz masz działający katalog do swojego projektu. Będąc tak ważne, aby ten katalog został zapisany na wypadek, gdybyś musiał przejść na inny komputer lub wdrożyć kod, który piszesz, aby był gotowy do sieci, zbudujemy skrypt, aby utworzyć kopię zapasową katalogu w następnych kilku krokach. Ale zbudowanie skryptu wymaga odrobiny kodu, a kod musi być zautomatyzowany, aby był jak najbardziej przydatny. Zbudujmy więc skrypt, aby najpierw zbudować skrypty. Zacznijmy od utworzenia skryptu i uczynienia go wykonywaniem. Użyjemy do tego sudo, chmod i dotyk i nazwiemy skrypt „ascript".
sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
Teraz utworzyliśmy skrypt, uczyniliśmy go wykonywaniem i jesteśmy gotowi go edytować. Nano to edytor tekstu, który pozwoli edytować tekst bez klikania, co jest znacznie łatwiejsze niż użycie graficznego interfejsu użytkownika. Aby edytować plik z Nano, użyj Nano, a następnie ścieżka do pliku. Aby zrobić scenariusz, który tworzy scenariusz, jest to dość podobne do tworzenia naszego scenariusza. Użyjemy tego samego kodu co powyżej, zastępując nazwę skryptu „Ascript" parametrem argumentu, 1 USD. To pozwala nam nazwać skrypt, wpisując po prostu Sudo Ascript Newscript, w którym to momencie możemy stworzyć dowolny nowy skrypt, zastępując „Newscript" nazwą twojego skryptu. Kod w Nano powinien wyglądać:
sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
Aby zamknąć Nano, możemy przytrzymać klawisz kontrolny i nacisnąć x, a następnie Y, aby oznaczyć, że zapisujemy plik i nacisnąć powrót. Teraz zamiast wpisywać te trzy polecenia w celu edytowania skryptu, będziemy mogli wpisać Ascript Ascript, aby ponownie edytować skrypt. To działa! I każdy nowy skrypt można łatwo uruchomić, nazywając go w skorupce. Zapiszmy naszą pracę teraz: napiszmy skrypt kopii zapasowej, aby zapisać nasz nowy skrypt, a następnie poprzeć go w naszym katalogu projektu, jednocześnie tworząc kopię zapasową skryptu kopii zapasowej.
sudo ascript backup
Teraz w Nano:
sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
Gdzie/ścieżka/do/katalog jest ścieżką do projektu utworzonego za pomocą mkdir. Później dowiemy się, jak kopiować takie powtarzające się ścieżki z pętlą i listą, która jest mniej kodem, ale na razie zachowajmy to proste i miej kilka wierszy. Aby uruchomić ten skrypt i wykonać kopię zapasową kodu, zapisz plik w Nano z Control+X, Y i zwróć i wpisz poniżej w skorcie
backup
Jeśli w ogóle otrzymujesz monit o hasło podczas czytania tej książki i śledząc w powłoce, prawidłowo wprowadź hasło użytkownika, będziesz mieć trzy próby przed ponownym uruchomieniem polecenia. Możesz użyć strzałek w górę i w dół, aby ponownie je powtórzyć i edytować je, jeśli będziesz musiał uruchomić coś dwa razy. Prosty naciśnij w górę i w dół, aby wybrać polecenie, przed edycją polecenia z prawą, lewą strzałką i usuwanie klawisza, a także klawiatury, i uruchom go z powrotem.
Gratulacje! Udało ci się stworzyć niesamowity skrypt kopii zapasowej, który tworzy kopię zapasową dwóch ważnych skontleitów w swoim katalogu roboczym. Możemy się poruszać później, gdy projekt staje się większy, ale na razie działa. Przejdźmy do tworzenia kopii zapasowych w chmurze, użyjemy do tego GitHub (choć istnieje wiele innych rozwiązań GIT do tworzenia kopii zapasowych, wszystkie są one takie same.) GIT to oprogramowanie do sterowania Verision, które umożliwia tworzenie kopii zapasowych edycji oprogramowania, gdy dotrzesz do serwera, a jednocześnie umożliwić pobieranie całego oprogramowania za hasłem lub klawiszem. Przygotowuje się to do zapisywania oprogramowania, zwłaszcza gdy migrujemy do zabezpieczonych instancji Linux, które czasami pękają, gdy niepowodzenie po jednej linii kodu, pozostawiając cię zablokowaną, gdy kod może nie być kopii zapasowej, jeśli nie będziesz miał okazji go automatycznie poprzeć go automatycznie, co obejmiemy.
Jeśli w tym momencie nie korzystasz z maszyny wirtualnej Ubuntu, w tym momencie polecam korzystanie z maszyny wirtualnej Ubuntu, ponieważ ułatwi to podczas instalowania wszystkich pakietów niezbędnych do zbudowania działającej strony internetowej i wstępnej realizacji operacji głębokiego uczenia się na komputerze. W najbliższej przyszłości przeniesiemy kod na serwer WWW, ale chcemy upewnić się, że za naszym serwerem WWW jest co najmniej kilka warstw bezpieczeństwa, które są odporne na phishing, i zastosujemy szereg pakietów Linux, aby to zrobić. Jeśli nadal chcesz korzystać z systemu operacyjnego Mac, możesz wyszukać i zainstalować niezbędne pakiety online, ale może nie być alternatywy dla każdego pakietu, że ta książka lub seria obejmie.
Dodajmy kilka poleceń, aby popełnić naszą pracę ze skryptem kopii zapasowej, uruchamiając kopię zapasową Ascript Sudo.
# …
Jeszcze raz kontroluj X, aby zapisać.
Teraz musimy zrobić jedną konfigurację dla tego projektu. Ponieważ wkrótce będzie to projekt GIT, nie musimy pisać każdego polecenia za każdym razem, gdy wdrażamy z repozytorium GIT, ale otrzymamy to, kiedy piszemy nasze skrypty wdrażania. Na początek upewnijmy się, że jesteśmy we właściwym katalogu i zainicjujemy repozytorium GIT i generujemy klucze SSH.
cd /path/to/directory
git init
git branch -m master
ssh-keygen
Po wpisaniu SSH-KeyGen nowy klucz powinien zostać zapisany w folderze domowym pod folderem o nazwie .ssh. Nazywa się to id_rsa.pub. Znajdźmy ten klucz i skopiuj go. Aby to zobaczyć,
cd ~
cat .ssh/id_rsa.pub
Skopiuj tekst zwracany przez ostatnie polecenie, i utwórz konto u swojego dostawcy GIT (idealnie Github), przed dodaniem klucza SSH do konta. Po uzyskaniu konta kliknij prawe górne menu i wprowadź ustawienia, przed dodaniem klawisza SSH w klawiszach SSH i GPG w menu w menu. Wybierz Dodaj klawisz SSH i dodaj swój, wklejając go i nadając mu tytuł, zanim zapisasz i wróć do GitHub, aby utworzyć nowe repozytorium. Jest to podobne dla innych dostawców GIT, musisz przeczytać ich dokumentację. W nowej konfiguracji repozytorium podaj repozytorium opisową nazwę i zdecyduj, czy chcesz je opublikować, i upewnij się, że nie konfigurujesz żadnych plików do włączenia. Po utworzeniu repozytorium skopiuj klon za pomocą URL SSH i wklej go do następującego polecenia.
git remote add git://… (your remote URL)
Teraz możesz wrócić do repozytorium za pomocą CD, będziesz to znany. Wypróbuj skrypt kopii zapasowej teraz z kopią zapasową
Świetnie! Teraz naprawdę możemy uzyskać kodowanie. Zainstalujmy Django teraz, kiedy mamy dobre zrozumienie Bash i Git. Django pozwoli nam automatycznie utworzyć kopię zapasową naszego oprogramowania, Bash też może to zrobić, ale Django powinien mieć prostszą bezpieczniejszą implementację (można go łatwiej wyłączyć i łatwiej skonfigurować).
Aby zainstalować oprogramowanie w Ubuntu, użyjemy polecenia sudo apt-get. Najpierw zaktualizujmy i zaktualizujmy oprogramowanie, które już mieliśmy. Można to zrobić za pomocą aktualizacji sudo apt-get i sudo apt-get aktualizację -y. Następnie zainstalujmy Python i nasze wirtualne środowisko, dom naszego kodu, z następującym poleceniem: sudo apt-get instaluj Python-IS-Python3 Python3-venv
To wszystko, czego potrzebujesz z Django pod względem instalacji oprogramowania w instancji Ubuntu. W przypadku systemu Windows i Linux powinno to być dość proste, ale w przypadku komputerów Mac możesz zainstalować na nim maszynę wirtualną i Linux przy użyciu bezpłatnego lub płatnego środowiska wirtualnego, takiego jak pulpit VirtualBox lub Paralells i odtworzyć powyższe kroki w celu skonfigurowania środowiska Ubuntu. Ubuntu ma kluczowe znaczenie w tym przypadku, ponieważ jest to oprogramowanie prowadzone przez strony internetowe i umożliwia im obsługę stron internetowych ze wszystkimi wspomnianym oprogramowaniem.
Zagłębmy się w Django.
W naszym katalogu ponownie z CD:
python -m venv venv # Tworzy wirtualne środowisko, w którym kod jest przechowywany
source venv/bin/activate # Aktywuje środowisko wirtualne
django-admin startproject mysite . # Gdzie Mysite to projekt, który zaczynam w moim obecnym katalogu.
Django dopiero nas zaczyna, ponieważ Django hostuje serwer WWW i robi wszystko, czego potrzebujemy, aby uruchomić podstawową lokalną stronę internetową. Teraz, gdy zainstalowaliśmy Django, edytujmy ustawienia trochę, aby działało, jak potrzebujemy. Najpierw utwórzmy nową aplikację
python manage.py startapp feed
Zauważysz, że pierwsza aplikacja nazywa się Feed. Aplikacja powinna być nazywana, jakkolwiek chcesz, a my utworzymy nowe aplikacje, ale nazwa każdej aplikacji musi być spójna za każdym razem, gdy aplikacja jest odwoływana w kodzie. Aby dodać nową aplikację, zawsze będziemy edytować setting.py w drugim katalogu utworzona aplikacja, wymieniona w StartProject, dalej aplikacji. Używając nano,
nano app/settings.py
W ustawieniach znajdź zainstalowane_apps i oddziel [] na 3 linie. Za pomocą czterech przestrzeni na pustej linii środkowej dodaj „Podaj" lub nazwę swojej aplikacji. Ta sekcja Settings.py powinna wyglądać:
INSTALLED_APPS = [
'feed',
]
Zanim zapomniemy, sprawdźmy, że Django działa. Korzystając z poleceń Python Manage.py Runserver 0.0.0.0:8000, możemy uruchomić serwer, a następnie nawigować w przeglądarce internetowej na komputerze, uruchamiając kod do http: // localHost: 8000 i zobacz przykładową stronę (to działa!) Opuść serwer z Control C, tak samo jak każde inne polecenie.
Teraz zacznijmy pisać jakiś kod Pythona. Django ma trzy główne komponenty, wszystkie z nich są całkowicie uruchomione kodem. Komponenty nazywane są modelem, widokiem i szablonem, a każdy z nich jest odpowiednio na wyższym i niższym poziomie przed dostarczaniem strony internetowej.
Model to kod, który przechowuje informacje w bazie danych do pobierania, sortowania i renderowania.
Widok decyduje, w jaki sposób model jest renderowany, manipulowany i modyfikowany, prawie każdy widok będzie bezpośrednio użyć modelu.
Szablon jest kodem HTML z dodatkowymi dzwonkami i gwizdkami o nazwie Język szablonu. Szablon jest renderowany przez widok, w którym jest wypełniony kodem Python i kontekstem, takimi jak modele i informacje (ciągami i liczb całkowitych) z widoku.
Django ma również inne komponenty, w tym między innymi:
Ustawienia, które konfigurują aplikację podczas dyskusji.
URL, które są wzorami, które użytkownik podąża, aby uzyskać dostęp do określonych części aplikacji internetowej.
Formularze, które określają, w jaki sposób informacje wysyłane do serwera są obsługiwane i renderowane do bazy danych, a także do użytkownika. Są to podstawa informacji przetwarzania po stronie serwera i mogą akceptować dowolny rodzaj informacji, które przechowuje komputer, w szczególności struny tekstowe, liczby i prawdziwe/fałszywe boolean (zwykle pola wyboru).
Szablony, które są kodem HTML i językiem szablonów oraz wypełniają lukę między Pythonem i HTML, co oznacza, że informacje Pythona mogą być obsługiwane jako kod HTML, do którego każdy może uzyskać dostęp i może zabezpieczyć witrynę z ograniczonym dostępem, jednocześnie udostępniając kod Python do sieci i przydatne dla różnych celów zdalnego urządzenia.
Pliki statyczne, które zwykle są JavaScript i jego biblioteki, które serwer obsługuje i są połączone z szablonem.
Pliki multimedialne, które serwer obsługuje lub są hostowane zewnętrznie, lub po prostu zapisane na serwerze przed przetworzeniem i opublikowaniem na innym serwerze (wiadro) w celu hostingu.
Oprogramowanie pośrednie, które są elementami kodu, które są uruchamiane w tym samym czasie, co każdy widok i są uważane za „uwzględnione" w widoku.
Procesory kontekstowe, które przetwarzają kontekst każdego widoku i są używane do dodania dodatkowego kontekstu.
Testy, które potwierdzają, że użytkownik lub żądanie przekazuje określone wymagania przed renderowaniem widoku.
Konsumenci, którzy decydują o tym, w jaki sposób WebSockets radzą sobie i reagują na komunikację.
Administrator, który służy do rejestrowania modeli, aby można je było szczegółowo manipulować na stronie administratora Django, gdzie bazę danych może być administrowana za pośrednictwem interfejsu graficznego.
Seler, który definiuje zadania asynchroniczne Części kodu Django mogą rozpocząć działanie przed natychmiastowym przejściem do następnego zadania lub wiersza kodu.
Django może mieć wiele innych komponentów, które szczegółowo omówimy tutaj. Istnieje wiele sposobów, aby Django był bardziej funkcjonalny, dodając WebSockets, które są szybkimi, usprawnionymi kanałami komunikacji, selerem, które wykonują zadania asynchroniczne i wiele innych oprogramowania do rozszerzenia Django, szczególnie w funkcjach widoku, w których większość kodu jest wykonywana. Funkcje widoku są kluczowe, ponieważ zwykle deklarują każdy element kodu specyficzny dla określonego wzoru adresu URL lub sekcji serwera.
Najpierw zbadajmy funkcje widoku. Funkcje widoku zaczynają się od importu oznaczającego kod, który będzie używany w widoku i są zdefiniowane przy użyciu regularnych definicji lub klas funkcji. Najprostsze poglądy są zdefiniowane przez definicję funkcji def i zwracają HTTPRESPONE z podstawowym szablonem. Zacznijmy od zdefiniowania podstawowego poglądu, aby zwrócić tekst „Hello World". Pamiętaj, że za każdym razem, gdy dodajesz kod po instrukcji takiej jak def, jeśli, dla itp., Musisz dodać 4 przestrzenie dla każdej z pretendujących definicji, które chcesz zastosować do swojej funkcji. Wkrótce wejdziemy w to, co każdy z nich oznacza.
Z katalogu naszej witryny edytuj plik Feed/Views.py za pomocą Nano i dodaj następujące wiersze na końcu pliku.
from django.http import HttpResponse
def hello(request):
return HttpResponse('hello world')
HTTPResponse Django odpowiada ciągem tekstowym, oznaczonym otwieraniem i zamykaniem ". Za każdym razem, gdy przekazujesz informacje do funkcji lub klasy, na przykład żądanie lub ciąg, musisz użyć nawiasu (otwieranie i zamykanie).
To nie wszystko, co musimy jeszcze zobaczyć. Oczywiście nie powiedzieliśmy serwera, gdzie jest dokładnie widok, nadal musimy zdefiniować ścieżkę, za pomocą której widok powinien renderować. Zacznijmy od zdefiniowania podstawowej ścieżki w app/urls.py, a później przejdziemy do grup ścieżek.
W app/urls.py dodaj wiersz po instrukcjach importu po rozpoczęciu importu, który właśnie utworzyliśmy.
from feed import views as feed_views
Teraz zdefiniujmy wzór widoku. Wzorce widoku mają trzy komponenty, komponent ścieżki, który mówi serwerowi, w którym widok istnieje na serwerze (ścieżka URL, którą użytkownicy wpisują na pasku nawigacji, aby wprowadzić stronę internetową), komponent widoku, w którym widok jest określony, a także przyjazną nazwę widoku, aby łatwo pobrać wzór podczas pracy z szablonem, zwłaszcza nazwa, a nazwa może zostać zmieniona i zaktualizowana, jeśli jest to konieczne, aby zrobić miejsce na widok lub podjąć więcej nazwy logicznej. Sensowne jest robienie rzeczy w ten sposób i być elastycznym, ponieważ baza kodowa będzie ciągle zmieniającym się środowiskiem, które wymaga elastyczności i improwizacji, aby być cennym i łatwym w obsłudze. Oto, jak będzie wyglądał twój widok, możesz to dodać do urlpatterns = [sekcja app/urls.py. Wzór widoku jest zdefiniowany z trzema opisanymi powyżej komponentami i funkcją zwaną ścieżką. Twoje wzorce adresów URL są listą, więc zawsze kończą każdy element w nich przecinkiem, ponieważ to oddziela każdy z nich. Każdy element powinien również trafić na nową linię, ponownie z czterema przestrzeniami przed nią, tak jak aplikacja w Settings.py. Zdefiniujemy pierwszy element widoku z funkcją pustego ciągu, aby utworzyć widok działający w katalogu głównym serwera WWW. Twoje URL.py powinien teraz wyglądać tak:
from feed import views as feed_views
urlpatterns = [
path('', feed_views.hello, name='hello'),
]
Jest to podstawa do tworzenia strony internetowej z Django, która jest całkowicie statyczna. Aby stworzyć bardziej dynamiczną stronę internetową, na której możemy rozpocząć buforowanie informacji, takich jak obrazy, filmy, audio i wiele innych, będziemy musieli użyć modeli, które zbadamy następne. Na razie sprawdźmy nasz kod i uruchommy serwer. Aby sprawdzić kod błędów, uruchom:
python manage.py check
Jeśli istnieją jakieś komunikaty o błędach, powinieneś dokładnie przejrzeć zmiany wprowadzone w aplikacji i sprawdzić, czy jest coś, co należy naprawić, na przykład obce lub pozbawione miejsca, dodatkowy znak, nieostronny ciąg, dowolne literówki, dowolne przypadkowo usunięte znak lub cokolwiek innego. Czytając komunikat o błędzie (jeśli go masz), powinieneś być w stanie zobaczyć ścieżkę do utworzonego lub edytowanego pliku wraz z numerem linii, więc spójrz na ten plik i wiersz i sprawdź, czy możesz naprawić coś, co tam jest. Jeśli naprawiłeś problem, uruchom powyższe polecenie ponownie. Kiedy oprogramowanie jest gotowe do uruchomienia i działa, zobaczysz wyjście „Kontrola systemu nie zidentyfikowano żadnych problemów". Teraz jesteś gotowy. Uruchom serwer z:
python manage.py runserver 0.0.0.0:8000
Teraz otwórz przeglądarkę internetową i przejdź do http: // localhost: 8000. Powinieneś zobaczyć tekst zwrócony w nawiasie i cytatach funkcji HTTPRESPONE w swoim zdaniu. To tylko podstawowy przykład, ale jeśli dotarłeś tak daleko, rozumiesz podstawy pracy Linux, Bash, Python i Django. Zagłębiajmy się w modelowanie bazy danych i zbadajmy moc klasy Python w przechowywaniu informacji. Następnie zaczniemy chwycić HTML i CSS, zanim uczynimy naszą witrynę w pełni wyróżnioną, elastyczną i bezpieczną za pomocą JavaScript i Machine Learning.
Zajęcia są przechowywane w modelach. Syp. Za pomocą nano, edytuj app/modele.py i dodaj nową klasę. Klasa jest zdefiniowana w definicji klasy i jest przekazywana nadklasą, od której dziedziczy, w tym przypadku modele.Model. Nazwa klasy następuje po definicji klasy, a po definicji klasy A: (Colon) jest używana, zanim atrybuty i definicje funkcji powiązane z klasą zostaną oznaczone poniżej. Nasza klasa potrzebuje identyfikatora, którego możemy użyć, aby go odzyskać i utrzymać unikalne, a także potrzebuje pola tekstowego do przechowywania niektórych informacji. Później możemy dodać znacznik czasu, pliki, logiczne (prawdziwe lub fałszywe definicje, które mogą pomóc naszemu kodowi podejmować decyzje dotyczące tego, co zrobić z modelem, i może być używany do sortowania), instancję powiązania modelu z użytkownikiem zalogowanym na serwerze i nie tylko. Rozpakujmy poniższy kod:
from django.db import models # Import używany do definiowania naszej klasy i jej atrybutów
class Post(models.Model): # Definicja samej klasy
id = models.AutoField(primary_key=True) # Identyfikator naszego modelu, automatycznie wygenerowany klucz, który pozwoli nam zapytać o model, zachować wyjątkowy i jest przydatny, gdy musimy wchodzić w interakcje z modelem po jego utworzeniu.
text = models.TextField(default='') # Atrybut naszych klas przechowuje w tym przypadku tekst, domyślnie do pustego ciągu.
Zamknij i zapisz plik tak jak wcześniej, aby zakończyć.
Istnieje wiele innych dziedzin i opcji, które zbadamy, kiedy aktualizujemy tę klasę w miarę ewolucji naszej aplikacji, ale jest to podstawowa potrzeby tworzenia aplikacji do opublikowania tekstu. Jednak ten model nie będzie działał sam. Jak opisano wcześniej, będziemy potrzebować niestandardowego widoku i niestandardowego wzoru URL, aby ten model działał, a także będziemy potrzebować formularza wraz z szablonem. Najpierw zbadajmy formularz.
Aby zdefiniować formularz, edytuj app/forms.py z nano i dodaj następujące wiersze. Będziemy potrzebować dwóch importów, naszej klasy formularzy, a także modelu, który utworzyliśmy (Feed.Models.post), definicję klasy podobną do modelu, oraz pola wraz z podklasą o nazwie Meta, która zdefiniuje model, z którym formularz oddziałuje. Formularz może również mieć funkcję inicjalizacyjną, która ustawia ją na podstawie informacji w żądaniu, modelu lub w inny sposób, zbadamy to później.
Formularze modelu są tak przydatne, ponieważ mogą tworzyć model lub edytować model, więc użyjemy ich dla obu. Zdefiniujmy jeden w formach. Sy poniżej.
from django import forms
from feed.models import Post
class PostForm(forms.ModelForm):
text = forms.CharField(widget=forms.Textarea)
class Meta:
model = Post
fields = ('text',)
To są podstawy tego, jak wygląda forma i model. Ten formularz modelu może być używany do tworzenia instancji lub edytowania postu, zmieniając zawarty tekst. Następnie spojrzymy na zintegrowanie tego formularza z widokiem. Najpierw spraw, aby migracje i migrację bazy danych, aby nasz kod mógł oddziaływać z modelem podczas jej działania. Aby to zrobić, uruchom następujące polecenia:
python manage.py makemigrations
python manage.py migrate
Wykonanie zajmie to minutę, ale kiedy to zrobi, pozwoli ci uzyskać dostęp do modelu w widokach, oprogramowaniu pośredniego lub gdziekolwiek indziej w oprogramowaniu. Kontynuujmy widok, w którym możemy zobaczyć nasz model. Edytuj Feed/Views.py i dodaj następujący kod, jak wspomniano. Nie musisz niczego dodawać po znaku #, ten kod to komentarze, które służą do oznaczania informacji o kodzie. Zaczniemy od zaimportowania naszego modelu w widokach i dodania go do kontekstu, w którym możemy renderować go w szablonie jako lista wyświetlania. Następnie dodamy szablon, w którym możemy renderować formularz i model z przyciskiem, aby utworzyć nowy obiekt na podstawie modelu i opublikować go na serwerze. Brzmi to skomplikowane, więc zróbmy to krok po kroku. Zanim zakończymy widok, utwórzmy szablon, który po prostu renderuje model i upewnij się, że możemy go zobaczyć, tworząc nowy post w skorupce. Oto jak powinien wyglądać ten pogląd:
posts = Post.objects.all() # Zapytaj wszystkie posty w bazie danych
Wszystko to wygląda dość prosto, dopóki nie dojdziemy do dna. Render, wartość zwrócona przez funkcję zamiast w odpowiedzi HTTP, takiej jak poprzedni przykład, zawsze przyjmuje żądanie jako pierwsze wejście, akceptuje kontekst (w tym przypadku słupki w bazie danych), które można teraz renderować w szablonie, i zwraca szablon zdefiniowany w funkcji. Szablon będzie dokumentem HTML z odrobiną języka o nazwie Jinja2, który przekazuje informacje Pythona w HTML.
Aby rozpocząć tworzenie szablonów, zrób dwa katalogi w kanale.
mkdir feed/templates
mkdir feed/templates/feed
Następnie edytuj szablon w powyższym katalogu, pasze/szablony/paszę i dodaj kod dla tego przykładu. Spójrzmy na szablon tego przykładu.
To bardzo prosty szablon. Definiuje otwieranie i zamykanie tagów HTML, znacznik typu dokumentu, znacznik ciała z tytułem legendy, znacznik przerwy, który dodaje niewielką linię na ekranie oraz pętlę dla każdego postu na liście postów jako akapitu w szablonie. To wszystko, czego potrzeba, aby renderować posty, ale w bazie danych nie ma jeszcze żadnych. Stwórzmy trochę z powłoką. Możemy uruchomić powłokę z zarządzaniem.py
python manage.py shell
Teraz zaimportujmy nasz model post
from feed.models import Post
Następnie utworzymy prosty post z ciągiem i wyjdziemy z powłoki. Ciąg może być wszystkim, o ile jest to prawidłowy tekst.
Post.objects.create(text='hello world')
exit()
Na koniec będziemy musieli dodać wzór adresu URL do naszego kanału. Ponieważ nasza aplikacja do kanału będzie korzystać z wielu adresów URL i chcemy, aby rozmiary plików były małe, utwórzmy lokalny adres URL.py w naszej aplikacji kanałowej, która wygląda tak:
from django.urls import path
from . import views
urlpatterns = [
path('', views.feed, name='feed'),
]
Będziemy również musieli edytować adres URL.py w aplikacji podstawowej, jakkolwiek postanowiliśmy to nazwać, był to pierwszy katalog, który stworzyliśmy. Edytuj app/app.py i dodaj następujące do wzorów adresów URL
from django.urls import include # na górze
# ... poprzedni kod tutaj
Teraz, kiedy uruchamiamy serwer z Python Manage.py RunServer, zobaczymy stronę, którą utworzyliśmy, ponieważ mamy model, widok i szablon, a także wzór adresu URL, wraz z elementami w bazie danych. Następnie zaimplementujmy formularz, który stworzyliśmy i zacznij tworzyć własne posty. Ale zanim napiszemy zbyt dużo kodu, wykonajmy kopię zapasową za pomocą skryptu, który napisaliśmy wcześniej, tworzenie kopii zapasowych. Uruchom ten skrypt w powłoce, poczekaj kilka chwil, a cały kod zostanie poparty do naszego repozytorium Git.
backup
Wdrożenie formularza jest stosunkowo proste. Zaimportujemy nasz formularz, dodamy obsługę żądania postu do widoku i zapiszemy post w bazie danych przed przekierowaniem do tego samego widoku. Możemy użyć funkcji przekierowania, którą już zaimportowaliśmy, a inna funkcja nazywała się odwrotną, aby uzyskać adres URL dla wzoru widoku. Zapytamy o to za pomocą ciągu „Feed: Feed", ponieważ przestrzeń nazw zawodowego wzoru to pasek, a widok nazywany jest również paszem.
posts = Post.objects.all() # Zapytaj wszystkie posty w bazie danych
if request.method == 'POST': # Obsługuj żądanie pocztów
form = PostForm(request.POST) # Utwórz instancję formularza i zapisz w nim dane
if form.is_valid(): # Potwierdzić formularz
form.save() # Zapisz nowy obiekt
return redirect(reverse('feed:feed')) # Przekieruj do tego samego adresu URL z żądaniem GET
'form': PostForm(), # Pamiętaj, aby przekazać formularz do kontekstu, abyśmy mogli go renderować.
Teraz będziemy musieli zaktualizować szablon, aby uwzględnić nowy formularz. Możemy to zrobić za pomocą
Rozbijmy to. Istnieje nowa klasa formularza, token, sam formularz i przycisk Przesyłania. Całkiem proste, ale kiedy patrzymy na to, możemy chcieć sprawić, by wyglądało to lepiej. Działa, możemy publikować nowe posty z formularzem i są one zapisane w bazie danych. Dzieje się tutaj kilka rzeczy. Używamy tagów HTML, aby oświadczyć, że dokument jest dokumentem HTML, używamy znacznika szablonu ({ %… %}), aby renderować token dla formularza, a drugi, {{…}} do renderowania formularza. Mamy również pętlę renderowania tekstu za pomocą znaczników blokowych i znacznika szablonu. Tagi blokowe są naprawdę ważne, ponieważ możemy zdefiniować, w jaki sposób sekcje szablonu są z nimi renderowane, a znaczniki szablonów są podstawą tego, jak umieszczamy zmienne w naszym kodzie.
Teraz musimy sprawić, by nasza aplikacja wyglądała lepiej, ponieważ na razie wygląda naprawdę podstawowo. Możemy to zrobić, używając CSS, one lub w klasach związanych z każdym obiektem w dokumencie. CSS jest naprawdę fajny, ponieważ mówi wszystko na stronie, jak powinno wyglądać, i może sprawić, że wygląda naprawdę dobrze. Istnieje kilka bibliotek, które mogą to zrobić, ale mój osobisty przejdź do bootstrap.
Bootstrap można pobrać z ich strony internetowej,getbootstrap.com/. Tam naciśnij przycisk, aby odczytać dokumenty instalacyjne, i skopiuj kod z sekcji Aluxing za pośrednictwem CDN. Będziesz potrzebował tego kodu u góry dokumentu HTML, w znaczniku o nazwie Head. Przejdźmy też i utwórzmy szablon podstawowy, abyśmy nie musieli odtwarzać tych linków w każdym szablonie.
Zrób nowy katalog zwany szablonami z szablonami MKDIR, a następnie edytuj szablony/base.html.
Powinno to wyglądać:
Pamiętaj, aby skopiować pliki CSS i JavaScript,.
Wróćmy teraz do powłoki bash i uruchommy szybkie polecenie. Pamiętaj, jeśli kiedykolwiek potrzebujesz uzyskać dostęp do środowiska wirtualnego, wpisz źródło Venv/Bin/Aktywuj. Pozwoli ci to instalować pakiety Python lokalnie w sposób, który pozwala Django uzyskać do nich dostęp. Aby zapewnić nasze formularze generowane przez klasy Bootstrap Django, użyjemy pakietu Python o nazwie Crispy Forms. Możemy to pobrać za pomocą następującego polecenia
pip install django-crispy-forms
Po zainstalowaniu dodaj go do settings.py
# … Poprzedni kod tutaj
Teraz, w naszym szablonie kanału, możemy usunąć niektóre rzeczy. Usuńmy początek i koniec dokumentu i zastąp go dziedzictwem z naszego szablonu podstawowego, za pomocą rozszerza i definicji bloku. Ponadto dodamy filtr szablonu import z ładowaniem i filtr szablonu do formularza. Na koniec dodajmy klasę bootstrap do przycisku na formularzu, aby wyglądał bardziej jak przycisk. To powinno wyglądać tak:
Piękny! To już sporo kodu. Następnie powinniśmy to przetestować i upewnić się, że możemy zobaczyć, że wszystko wygląda ładnie, a także upewnij się, że wszystko działa poprawnie. Uruchom serwer zgodnie z poprzednimi instrukcjami i upewnij się, że strona wygląda i działa dobrze. Świetna robota! Jesteś gotowy przejść do następnego kroku, w którym dodamy funkcję logowania użytkowników za pomocą podobnych adresów URL, formularzy, widoków i szablonów. Podstawowy szablon jest ważny i będziemy go nadal modyfikować i wprowadzać zmiany w razie potrzeby, ale na razie skupmy się na zwiększeniu bezpieczeństwa naszej witryny, umożliwiając użytkownikom zalogowanie się za pomocą nazwy użytkownika i kodu pasów, a ostatecznie jeszcze ważniejszych informacji, które pomogą zapewnić bezpieczeństwo aplikacji i własne konto dostępne tylko przez Ciebie.
Aby to zrobić, będziemy musieli użyć modelu użytkownika wbudowanego w Django. Model użytkownika to model bazy danych, podobnie jak nasz post, który można renderować, aby zalogować użytkownika do witryny. W przyszłości, zanim wdrożymy witrynę w Internecie, przedłużymy ten model o inne modele przypisywane mu i zbudujemy dodatkowe środki bezpieczeństwa dla logowania odpornego na phishing. Zaczniemy od użycia wbudowanych formularzy logowania, które zapewnia Django. Najpierw utwórzmy nową aplikację, której użyjemy do renderowania szablonów i widoków dla podstawowej strony logowania. Utworzymy także inne aplikacje, aby reprezentować ciągłe wyzwania logowania w celu zabezpieczenia aplikacji, w tym pincode, rozpoznawania twarzy, komunikacji w pobliżu pola, urządzeń zewnętrznych, uwierzytelniania wielofunkcyjnego i rozpoznawania odcisków palców.
Rozmawialiśmy już o założeniu aplikacji. Z naszego katalogu, wewnątrz środowiska wirtualnego, przejdź zarządę.py te argumenty
python manage.py startapp users
Teraz powinniśmy mieć katalog nowej aplikacji. Zacznijmy od utworzenia widoku w tym katalogu, który odpowiada loginowi użytkownika. Django ma wbudowane widoki loginów użytkowników, ale nie będą dla nas odpowiednie, ponieważ potrzebujemy niestandardowego widoku, który najlepiej jest wykonany z definicją.
W tym widoku zaczniemy od sprawdzania żądania postu, przejdź do żądania. Post do loginoru zaimportowanego z Django, uwierzytelnianie konta użytkownika i zaloguj się użytkownik przed przekierowaniem ich do naszej aplikacji kanałowej.
W użytkownikach/widokach dodaj następujący kod
username = request.POST['username'] # Uzyskaj nazwę użytkownika i hasło z żądania pocztowego
password = request.POST['password'] # Uwierzytelnij użytkownika
To wszystko, czego potrzebujesz do podstawowego widoku logowania. Teraz utwórzmy formularz widoku, rozszerzając szablon podstawowy. Zaczniemy od utworzenia nowego katalogu szablonów w folderze użytkowników.
mkdir users/templates
mkdir users/templates/users
Teraz powinniśmy być w stanie edytować użytkowników/szablony/Users/login.html. Gdy jesteśmy przy tym, utworzymy szablon, który umożliwia również zarejestrowanie się użytkownika.
nano users/templates/users/login.html
Teraz w szablonie,
To są podstawy szablonu logowania. To naprawdę jak drugi szablon w strukturze, ale wygląda trochę inaczej, gdy jest renderowany. Możemy skopiować ten kod, aby zbudować kolejny bardzo podobny szablon o nazwie Register.html, w którym zmienimy sformułowanie i użyjemy nowego formularza, który budujemy. Zróbmy najpierw szablon. Edytuj użytkowników/szablony/Users/Register.html i dodaj następujący kod:
Teraz zbudujmy formularz rejestracji użytkowników i zwróćmy się do widoków, zanim uaktualnimy loginy naszych użytkowników za pomocą modelu. Na początek ten formularz będzie na początek, ale w przyszłości uwzględnimy więcej szczegółów i funkcji bezpieczeństwa, takich jak umowy i captcha. Edytuj formularze za pomocą nano użytkowników/forms.py i dodaj następujący kod.
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class UserRegisterForm(UserCreationForm):
email = forms.EmailField()
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
Mamy więc inną formę, która działa dość prosto. Jest to formularz rejestru użytkownika z nazwą użytkownika, e -mailem i hasłem, a także pole potwierdzają hasło. Zauważ, że ten formularz nie rozszerza zwykłej klasy. Jedno pole jest zdefiniowane tak samo, a meta klasy definiuje model, który formularz odpowiada reszcie informacji, które zostaną zapisane do formularza. Większość z nich istnieje już w wbudowanych tworzeniu użytkowników Django, więc wykorzystamy to jako podstawę klasy (przekazaną w nawiasach).
Następnie zbadamy widok, aby zarejestrować użytkownika, teraz, gdy mamy formularz i szablon. To jest modele, podobnie jak ten w nowym widoku postu. Edytuj użytkowników/views.py i dodaj następujący kod:
# … Import
To wszystko, czego potrzebujemy, aby zarejestrować użytkownika, ale powinniśmy mieć więcej informacji. Chcemy poznać czas zarejestrowania użytkownika, o której godzinie był ostatni na stronie, niektóre informacje o nich, takie jak biografia, strefa czasowa itp. Będziemy również musieli zaktualizować nasz model kanałów, opublikować, aby podliczyć dla modelu użytkownika i atrybut postów każdemu użytkownikowi. Aby to zrobić, zaktualizujemy modele.py w obu aplikacjach. Zacznijmy od edytowania modelu paszowego. Powinno teraz wyglądać:
from django.db import models # … Import
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Dodaj tę linię
Zwróć uwagę na drugą linię dodaną do pliku. Jest to klucz obcy, który przypisuje każdy post pojedynczego użytkownika na post, dzięki czemu możemy upewnić się, że zapisujemy posty na zasadzie użytkownika-użytkownika i nie można wykonać postu bez przypisywania go użytkownikowi. Definiujemy ten obcy klucz z reprezentowaną przez niego klasą, usuń argument, aby zapewnić usunięcie postów z użytkownikami, zerowymi i pustymi argumentami, aby upewnić się, że możemy usunąć użytkownika w razie potrzeby, i aby pomieścić brak użytkownika na postach, które już utworzyliśmy, oraz powiązaną nazwę, której możemy użyć, aby odwołać się do obiektów Post, które tworzy użytkownik. Ta powiązana nazwa, w przeciwieństwie do Post.Author, autor postu, daje nam użytkownika, który sam opublikował post. Możemy teraz uzyskać posty, które uruchomił użytkownik, uruchamiając User.posts.all () lub autor.posts.all ().
Teraz uczyńmy nasze loginy bardziej odporne. Możemy już uczynić naszą witrynę znacznie mniej podatną na phishing, po prostu ograniczając liczbę przypadków, kiedy pozwolimy zalogować się do witryny, jest to dość łatwe. Zacznijmy również przechowywać informacje o każdym użytkowniku wcześniej, gdy nadal rozwijamy naszą aplikację. Edycja użytkowników/modeli.py, dodaj następujący kod.
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True, related_name='profile')
account_created = models.DateTimeField(default=timezone.now)
last_seen = models.DateTimeField(default=timezone.now)
can_login = models.DateTimeField(default=timezone.now)
preferred_name = models.CharField(max_length=20,default='', null=True, blank=True)
bio = models.TextField(blank=True, default='')
Zauważ, że ten model jest dość podobny do modelu post. Mamy dodatkowy import, stref czasowy, który pozwoli nam ustawić wartości domyślne na polach DATETIME, a także mamy charakterystyczny i tekstowy pole, takie jak post. Korzystanie ze wszystkich tych znaczników czasu pomaga nam zabezpieczyć witrynę i zrozumieć jej użycie, a pola tekstowe pozwalają nam informować o każdym użytkowniku lub autorze na stronie internetowej. OneToonefield powinien być jedynym niewielkim rozważaniem, zachowuje się dokładnie tak samo jak przedwcześnie, ale tylko jeden na kolejny model. W ten sposób użytkownik ma tylko jeden profil, podczas gdy może mieć wiele postów.
Teraz poprawmy nasze logowanie i zarejestrujmy widoki, aby uwzględnić profil. Najpierw edytuj użytkowników/views.py i skup się na widoku rejestru:
# … Import
Profile.objects.create(user=user) # Pamiętaj, aby dodać ten wiersz, aby utworzyć profil dla użytkownika
To po prostu tworzy profil dla użytkownika, bez wypełniania żadnej informacji. Teraz chcemy upewnić się, że konta użytkownika nie można zalogować się zbyt często, a przynajmniej hasła nie można wypróbować zbyt często, więc zaktualizujmy widok logowania.
# … Import
if user and user.profile.can_login < timezone.now(): # Zauważ, że teraz sprawdzamy, czy użytkownik może się zalogować
else: # Jeśli login nie powiódł się,
user = User.objects.filter(username=username).first() # To jest część, w której aktualizujemy profil użytkowników
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Więc nie mogą się ponownie zalogować przez kilka sekund
Jest to podstawowa podstawowa bezpieczeństwa. Upewnij się, że strona nie jest podatna na kogoś po prostu wypróbowującą każdą możliwą kombinację haseł, a nawet kilku z nich jednocześnie. Nie będzie to frustrujące dla zwykłego użytkownika, który zna swój kod i po prostu loguje się na kilku urządzeniach, ale będzie trzymał wiele robotów phishingowych poza aplikacją. Zauważ, że dodaliśmy instrukcję IF ze zmienną, can_login, to powinien być czas w przeszłości, i zaktualizować ją przy każdym nieudanym logowaniu przy użyciu tej samej nazwy użytkownika. W ten sposób złośliwy użytkownik nie będzie w stanie odgadnąć hasła tak szybko. Liczba sekund w DateTime.timedelta () również może zostać zaktualizowana, a strona internetowa będzie bardziej odporna, ale nieco mniej użyteczna, a więcej sekund. Polecam 15 na początek.
Pamiętaj, że zbudowaliśmy skrypt zapasowy, aby zapisać naszą pracę, więc przejdźmy do przodu i cofnijmy to, co mamy do tej pory, aby upewnić się, że wszystko zapisano. Uruchom polecenie:
sudo backup
Po raz kolejny zaoszczędzi to jak dotąd twoją pracę. Polecam uruchamianie częstych kopii zapasowych, aby zapisać swoją pracę, a możesz nawet automatycznie uruchomić zadanie tworzenia kopii zapasowych. Możesz to zrobić za pomocą narzędzia Unix o nazwie Cron. Aby aktywować to narzędzie, uruchom następujące polecenie i wprowadź hasło:
sudo crontab -e
Jeśli nie wybierzesz jeszcze opcji 1 dla Nano, edytor tekstu, który już powinieneś się zapoznać, i przewiń na dole pliku za pomocą klawiszy strzałek. Dodaj następujący wiersz:
0 * * * * sudo backup
Cron wykorzystuje format minuty, godzinę, dzień miesiąca, miesiąca, dzień tygodnia, gdzie * lub liczba reprezentuje, kiedy uruchomić polecenie. Używając 0 za minutę i * przez resztę opcji, możemy uruchomić polecenie w pierwszej minucie każdej godziny na początku minuty. To pozwala nam automatycznie tworzyć kopię zapasową kodu. Wszystkie zadania Cron po wykonaniu z sudo działają jako root, więc nie będziemy musieli pisać hasła co godzinę.
Aby ułatwić tworzenie kopii zapasowych naszego kodu bez użycia hasła, wyłączmy hasło dla naszego polecenia tworzenia kopii zapasowych. Zrobimy to, wykonując następujące polecenie i wprowadzając hasło:
sudo visudo
Teraz przewińmy na dno pliku i dodajmy inną linię:
ALL ALL=NOPASSWD: /bin/backup
To pozwala nam uruchomić polecenie „tworzenie kopii zapasowych" jako każdego użytkownika, bez hasła. Format tego jest łatwy, po prostu poprzedzaj wiersz „all all = nopasswd:/bin/" i zakończ polecenie, na przykład/bin/backup, który istnieje w/usr/bin/.
Teraz zacznijmy pracować z e -mailem. E -mail jest naprawdę ważny dla stron internetowych, ponieważ jest to sposób na utrzymanie witryny bezpieczniejszej, weryfikacja użytkowników to prawdziwi ludzie, a nawet produkty lub usługi rynkowe dla klientów. Wiele osób, które często odwiedzają Internet codziennie, i otrzymują wszelkiego rodzaju e -mail marketingowy o produktach i usługach, które są zainteresowane. Istnieje kilka opcji, jeśli chodzi o włączenie wiadomości e -mail na stronie internetowej Django i możesz wybrać, który jest dla Ciebie najlepszy.
Po pierwsze, możesz zapłacić za usługę e -mail, która umożliwi wysyłanie wiadomości e -mail z domeny i wymaga minimalnego kodu. Istnieje wiele usług, które to oferują, takich jak Google Workspace, SendInblue, Mailgun i wiele innych.
W przeciwnym razie od zera, dobrze budujesz własną usługę e -mail na serwerze. Polecam tę opcję, mimo że jest to więcej kodu i może wymagać specjalnego hostingu. Najprawdopodobniej nie będziesz mógł uruchomić serwera poczty z komputera domowego, więc przejdźmy dalej i zbadajmy konfigurację i kod, aby wysłać wiadomość e -mail, zanim uruchomimy serwer w chmurze i utworzyć własny serwer pocztowy.
Najpierw edytuj Setting.py z następującym poleceniem:
nano app/settings.py
Gdzie aplikacja jest nazwą aplikacji utworzonej z StartApp.
Dodaj następujące wiersze:
SITE_NAME = 'Django App'
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_ADDRESS = username@server.com'
EMAIL_HOST_USER = 'username'
EMAIL_HOST_PASSWORD = config['EMAIL_HOST_PASSWORD']
DEFAULT_FROM_EMAIL = '{} <{}>'.format(SITE_NAME, EMAIL_HOST_USER)
Zmień je, gdy będziesz gotowy do wdrożenia aplikacji, ponownie to ponownie. Ustawienie e -mail_address powinno być e -mailem, z którego chcesz wysłać, a hasło (e -mail_host_password) powinno być ustawione na hasło generowane dla serwera. Ładuję hasło z pliku konfiguracyjnego, aby trzymać go z dala od kodu za pomocą następującej logiki, powyżej tych wierszy w setting.py:
import os
import json
with open('/etc/config.json') as config_file:
config = json.load(config_file)
Następnie skonfigurowałem plik JSON z Config in /etc/config.json za pomocą Nano w następujący sposób.
Aby edytować plik:
sudo nano /etc/config.json
Dodaj następujące wiersze:
{
"EMAIL_HOST_PASSWORD": "<some password here>"
}
Będziemy nadal edytować plik konfiguracji i dodać wszystkie hasła i klawisze, których użyjemy w aplikacji. Na razie szybko sprawdźmy, jak wysłać e -mail za pomocą Pythona. Najpierw utwórzmy szablon e -maila weryfikacyjnego, który możemy wysłać do naszych użytkowników, i umieść go w katalogu szablonów użytkowników. Ten szablon zostanie napisany w HTML.
nano users/templates/users/verification_email.html
Ten e -mail jest dość prosty. Wymaga kontekstu użytkownika, podstawowego adresu URL witryny oraz identyfikatora użytkownika i tokena używanego do weryfikacji e -maila użytkownika. Pamiętaj, aby zdefiniować podstawowy adres URL w setting.py, zanim napiszemy kod Pythona, aby renderować szablon. Śmiało i dodaj następujące wiersze do app/settings.py, blisko początku.
SITE_NAME = 'Django App'
PROTOCOL = 'https'
DOMAIN = 'example.com'
BASE_URL = PROTOCOL + '://' + DOMAIN
W końcu, gdy Twoja witryna jest gotowa do Internetu i wdrożesz ją, będziesz chciał zdefiniować swoją domenę jako nazwę domeny, którą kupujesz, aby reprezentować witrynę. Jest to nazwa, którą wpiszesz w pasku NAV w celu uzyskania dostępu do Twojej witryny. Na razie możesz zostawić domenę pustą lub użyć symboli zastępczego. Będziesz także chciał zmienić nazwę Site_name na nazwę, którą chcesz podać swoją witrynę wyboru.
Zanim wyślemy e -mail, utwórzmy generator tokenów, abyśmy mogli mieć token aktywacyjny konta, który nigdy nie wygasa. Możemy to zrobić, budując i importując token aktywacyjny konta, który wygląda jak następujące. Edytuj plik:
nano users/tokens.py
Dodaj następujący kod:
from django.contrib.auth.tokens import PasswordResetTokenGenerator
import six
class TokenGenerator(PasswordResetTokenGenerator):
def _make_hash_value(self, user, timestamp):
return (
six.text_type(user.pk) + six.text_type(timestamp)
)
account_activation_token = TokenGenerator()
unsubscribe_token = TokenGenerator()
Ten podstawowy generator tokenów generuje token. Możemy wysłać użytkownika w adresie URL, a użytkownik może użyć do weryfikacji ich wiadomości e -mail i aktywowania konta.
Następnie zobaczmy, jak wysłać wiadomość e -mail. Za pomocą Nano, edytuj użytkowników/e -mail.py.
nano users/email.py
Wysyłanie weryfikacji e -mail HTML będzie wyglądał tak:
from django.contrib.auth import get_user_model
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.contrib.sites.shortcuts import get_current_site
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.utils.encoding import force_bytes
from django.core.mail import EmailMultiAlternatives
from django.shortcuts import render
from .tokens import account_activation_token
from django.template.loader import render_to_string
from django.utils.html import strip_tags
from django.template import Template, Context
from django.conf import settings
import traceback
def send_verification_email(user):
User = get_user_model()
mail_subject = '[{}] Activate your account.'.format(settings.SITE_NAME)
html_message = render_to_string('users/verification_email.html', {
'user': user,
'domain': settings.DOMAIN,
'protocol': 'https',
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
})
send_html_email(user, mail_subject, html_message)
To jest dość proste. Importujemy funkcje, które musimy wysłać wiadomość e -mail, renderować wiadomość e -mail z szablonami i naszymi ustawieniami, a następnie definiujemy wiadomość e -mail według nazwy szablonu i wysyłamy ją do użytkownika za pomocą funkcji. Zauważysz, że nie zdefiniowaliśmy funkcji, aby wysłać pocztę, wysłać_html_email, więc napiszmy to poniżej kodu, który już dodaliśmy do users/e -mail.py
def send_html_email(user, mail_subject, html_message):
to_email = user.email
username = user.username
if to_email == '':
return None
unsub_link = settings.BASE_URL + user.profile.create_unsubscribe_link()
html_message = html_message + "<p><a href=\"" + unsub_link + "\" + title=\"Unsubscribe from " + settings.SITE_NAME + " emails\">Unsubscribe</a></p></body></html>"
msg = EmailMultiAlternatives(mail_subject, strip_tags(html_message), settings.DEFAULT_FROM_EMAIL, [to_email], headers={'List-Unsubscribe' : '<' + unsub_link + '>'},)
msg.attach_alternative(html_message, "text/html")
profile = user.profile
try:
msg.send(fail_silently=False)
if not profile.email_valid:
profile.email_valid=True
profile.save()
except:
profile.email_valid=False
profile.save()
Jest to nieco bardziej złożone i nie jesteśmy jeszcze gotowi uruchomić cały ten kod. Zauważ, że definiujemy UNSUB_LINK, link, którego użytkownik może użyć do rezygnacji z subskrypcji z naszych e -maili. Jest to ważne, ponieważ użytkownicy będą musieli zrezygnować z naszych e -maili, chyba że chcą je zobaczyć w dowolnym momencie. Dodajemy również alternatywę tekstową do naszej wiadomości, która jest komunikatem HTML pozbawionym tagów HTML. Na koniec sprawdzamy, czy wiadomość e -mail wysłana, a jeśli nie, oznaczamy profil użytkownika, że ich e -mail nie jest ważny.
Wróćmy do modeli użytkowników, abyśmy mogli to wszystko zadziałało. Musimy zdefiniować funkcję, aby wygenerować link do rezygnacji z subskrypcji, i zdefiniować pole boolean, aby oznaczyć, że e -mail użytkownika jest nieprawidłowy.
Najpierw dodaj następujący import na górze użytkowników/modeli.py
nano users/models.py
# …
Następnie dodajmy funkcje do modelu użytkownika, aby zrobić token i sprawdź token używany do aktywacji wiadomości e -mail, a także pole, aby zapisać, czy użytkownik z powodzeniem otrzymuje pocztę. W Users/Models.py Ponownie dodaj następujący kod do końca modelu (kod zintegrowany)
# …
TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Ważne przez 30 dni
Jest to dość proste, używamy znacznika czasu, który jest podstawowym narzędziem kryptograficznym, aby utworzyć token, który wygasa po określonym czasie, a także używamy innej funkcji, aby sprawdzić, czy jest on poprawny. Używamy tych tokenów dwa razy, raz, aby zweryfikować wiadomość e -mail i raz na link do rezygnacji z subskrypcji.
Teraz, gdy je mamy, ostatnią pracą, którą będziemy musieli wykonać, jest widoki. W ramach użytkowników/views.py dodajmy widoki, aby zweryfikować adres e -mail i zrezygnować z subskrypcji.
nano users/views.py
Najpierw dodaj następujące import. Wrzuciłem kilka dodatkowych, więc nie będziemy musieli ponownie importować więcej przedmiotów później.
from .email import send_verification_email # Pamiętaj, aby zaimportować funkcję wysyłania e -maila weryfikacji
Być może masz już niektóre z tych importów, ale powtórzenie ich nie zaszkodzi. Będziesz musiał zaimportować funkcję wysyłania e -maila weryfikacyjnego, a także konta_aktywacji_token od użytkowników.Tokens, między innymi import.
Teraz, na dole pliku, dodaj następujący kod:
# Odejść je
# W przeciwnym razie przekieruj na stronę logowania
# sendWelcomeEMail (żądanie, użytkownik)
To dużo kodu. Rozbijmy to. Pierwsza funkcja, czysta i prosta, rezygnuje z użytkownika z listy mailingowej. Druga funkcja aktywuje ich e -mail, a zauważysz, że dodałem komentowaną funkcję, SendWelcomeEutilail. Zapraszamy do użycia szablonu e -maila i definicji funkcji, aby wysłać wiadomość e -mail, po prostu jeszcze tego nie zrobiłem. Ostatnia funkcja, którą rzuciłem, jest ważna, ponieważ e -maile aktywacyjne wygasa. Dlatego będziemy musieli ponownie wysłać wiadomość e -mail z aktywacją. Możemy użyć do tego podstawowego formularza i wywołać funkcję, aby wysłać wiadomość e -mail weryfikacyjną. Zanim to zrobimy, upewnijmy się, że zostanie wysłany w pierwszej kolejności, dodając wywołanie funkcji do widoku rejestru. Dodaj ten wiersz tuż przed przekierowaniem w widoku rejestru, rejestr def, w użytkownikach/views.py.
nano users/views.py
# … (Po) rejestr def (żądanie):
# … (Przed) przekierować (
Nie musisz dodawać pierwszych i ostatnich wierszy w tym fragmencie kodu, po prostu upewnij się, że widok rejestru wysyła e -mail weryfikacyjny do użytkownika. Powinno to wyglądać:
# … Import
send_verification_email(user) # Pamiętaj, aby dodać tę linię!
Teraz będziemy musieli dodać formularz, aby ponownie wysłać wiadomość e -mail aktywacyjną. W użytkownikach/forms.py dodaj następujący formularz:
# … (Import)
Będziemy również potrzebować szablonu odpowiadającego niniejszego formularza aktywacji e -maila. Dodajmy ten szablon. Edytuj plik:
nano users/templates/users/resend_activation.html
Następnie dodaj następujący kod do pliku.
Uff, to dużo! Teraz, kiedy wdrażamy kod na naszym serwerze, będziemy mogli wysłać e -mail HTML i aktywować konta użytkowników za pomocą e -maila. Możemy również chcieć wysłać prosty e -mail powitalny, więc zobaczmy, jak to zrobić. Wróć do użytkowników/e -mail.py, dodaj następujący kod:
def sendwelcomeemail(user):
User = get_user_model()
html = open('{}/users/welcome_email.html'.format(settings.BASE_DIR)).read()
subject = 'Welcome to ' + settings.SITE_NAME + ', {{ username }}!'
template = Template(html)
subjtemplate = Template(subject)
context = Context({'username': user.username, 'base_url': settings.BASE_URL, 'model_name': 'Daisy Holton, 'site_name': settings.SITE_NAME})
renderedtemplate = template.render(context)
subjcontext = Context({'username': user.username})
subjrenderedtemplate = subjtemplate.render(subjcontext)
send_html_email(user, subjrenderedtemplate, renderedtemplate)
Będziemy również potrzebować szablonu, aby przekazać wszystkie te informacje. Na mojej stronie szablon wygląda jak poniżej, ale możesz go sformatować, jak chcesz.
Pamiętaj, że nie mamy tagów zamykających ani tagów HTML, ponieważ dodajemy je, gdy dodamy link do rezygnacji z subskrypcji HTML. Są to ważne, ale nie chcemy ich definiować dwa razy.
Więc co dalej? Przeszliśmy długą drogę. Naprawdę powinniśmy być gotowi wdrożyć witrynę na serwerze. Możemy dodać dekoratora @login_required i zapewnić bezpieczeństwo naszych widoków, przyjmować rejestracja użytkowników, wysłać informacje e -mail i informacje o pamięci podręcznej, co jest podstawą tego, co musi zrobić witryna, aby zachować aktualność. Dodamy kilka bardziej przydatnych funkcji, a następnie zbudujemy podstawę do wdrożenia naszego kodu na zdalnym serwerze, konfigurowanie serwera poczty, konfiguracji domeny i filtry, aby nasza witryna była bezpieczna i odpowiednia.
Potrzebujemy również widoku resetowania hasła, więc dodajmy to naprawdę szybko. Widok resetowania hasła Django jest rozbity w niektórych funkcjach, ale przyjrzymy się, jak napisać własny widok, szablon e -mail, formularze i wzorce URL. Oto, jak wygląda widok, w użytkownikach/views.py
# ... import
Ten formularz jest wbudowany w Django, ale będziemy potrzebować szablonu, aby potwierdzić resetowanie hasła, użytkowników/szablonów/użytkowników/hasło_set_confirm.html
Mamy również szablon wysyłania wiadomości e -mail z resetowaniem hasła z prostym formularzem, w użytkownikach/szablonach/użytkownikach/hasło_reset.html
Szablon samego e -maila jest prosty, jest to podstawowy plik HTML, który renderuje link do zresetowania hasła, w użytkownikach/szablonach/Users/Password_Reset_Email.html. Django automatycznie zinterpretuje ten plik.
Potrzebujemy również dwóch kolejnych szablonów. Pierwszym jest potwierdzenie, że wiadomość e -mail została wysłana. Widoki na te są już w Django, więc musimy tylko zająć się nimi w URL.py. Ten szablon znajduje się w użytkownikach/szablonach/Users/Password_Reset_Done.html
I na koniec, aby potwierdzić, że resetowanie hasła jest zakończone, użytkownicy/szablony/Users/Password_Reset_Complete.html
Teraz potrzebujemy wzorców adresów URL dla tych widoków. W użytkownikach/urls.py dodaj następujące wzorce URL:
# ... poprzednie adresy URL tutaj
Cztery szablony, to dużo! Ale teraz możemy być w stanie zresetować hasło użytkownika w dowolnym momencie, wszystko z przeglądarki internetowej.
Rozumiem, że to dużo kodu. Jeśli wydaje się to trochę nad twoją głową, to jest w porządku. Poprawicie się, twoje zrozumienie poprawi się i wkrótce staniesz się znacznie bardziej kompetentny w kodzie. Jeśli jesteś całkowicie zagubiony, polecam powrót do tego oprogramowania po pracy nad pracą nad samozadowoleniem, naucz się kodować kurs online. Zwykle można je zacząć i poprowadzą Cię przez wszystko, czego potrzebujesz, aby odnieść sukces po powrocie do tego projektu. Jeśli uważasz, że jesteś gotowy, czytaj dalej, następnie omówimy wdrażanie kodu na zdalnym serwerze i konfigurację serwera pocztowego, a także automatyzację wdrożenia za pomocą BASH, aby zawsze możesz skonfigurować nowy projekt z kilkoma prostymi poleceniami.
Ostatnią rzeczą, którą musimy zrobić przed wdrożeniem na zdalnym serwerze, jest sprawianie, że nasza witryna była nieco bezpieczniejsza. Zauważysz, że widok logowania przyjmuje tylko nazwę użytkownika i hasło, a nie ma uwierzytelniania wielu czynników ani jednorazowego kodu. Jest to łatwa poprawka, a dzięki temu samemu kodowi możemy sprawić, by nasza strona wysyłała wiadomości tekstowe, a nawet reagować na wiadomości tekstowe wysyłane na serwer. Na początek wrócimy do modeli użytkowników i dodamy sygnatariusz znaczników czasu, który będzie reprezentował każdy login. Dodamy również unikalny, obrotowy identyfikator do modelu użytkownika, który zostanie użyty do dodania dodatkowego bezpieczeństwa do naszego logowania. Edycja modeli użytkowników, Users/Models.py, dodaj następujący kod:
# Pamiętaj, aby zaimportować UUID, sygnatariusz znacznika czasu i generator adresu URL (odwrotne)
# Dodaj ten kod tutaj
# I dodaj tę funkcję
TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Ważne przez 3 minuty
Upewnij się, że użytkownicy/modele.py wygląda tak, oprócz komentarzy (kod w wierszach z #). Rozbijając to, to proste. Mamy kilka importów, znacznik czasu, który jest użytecznością kryptograficzną, która może wygenerować bezpieczny kod i zweryfikować go, aby upewnić się, że jest on ważny, został użyty tylko raz i nie starszy niż określona liczba sekund. Używamy również UUID, który jest unikalnym identyfikatorem, który identyfikuje naszego użytkownika w podpisywaniu tokena, oraz w adresie URL, w którym token jest wysyłany do użytkownika. Użyjemy tej podstawowej kryptografii, aby zbudować widok uwierzytelniania dwóch czynników. Zanim zrobimy cokolwiek innego, uruchommy migracje, aby nasze modele użytkowników były aktualizowane. W katalogu z zarządzaniem.py uruchom następujące polecenia, aby wykonać i wypełnić migrację.
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
Jest to ważne, ponieważ za każdym razem, gdy wprowadzamy zmiany w modelach, będziemy musieli utworzyć tabele i zaktualizować bazę danych o wartości domyślne, zanim będziemy mogli skorzystać z modeli.
Następnie zaimprowizujmy nasz pogląd logowania, aby przekierować wtórny widok uwierzytelnienia. W użytkownikach/views.py usuń funkcję logowania i przekieruj do adresu URL, który właśnie wygenerowaliśmy w modelach użytkowników.
# … Import
if user and user.profile.can_login < timezone.now(): # Zauważ, że teraz sprawdzamy, czy użytkownik może się zalogować
# Usuń funkcję auth_login, która tu była
return redirect(user.profile.create_auth_url()) # Zwróć uwagę na nowy adres URL
else: # Jeśli użytkownik nie korzysta z uwierzytelniania wieloczynnikowego, po prostu zaloguj się.
else: # Jeśli login nie powiódł się,
user = User.objects.filter(username=username).first() # To jest część, w której aktualizujemy profil użytkowników
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Więc nie mogą się ponownie zalogować przez kilka sekund
Jest to więc dość proste, mamy teraz sposób na przekierowanie do widoku uwierzytelniania dwóch czynników podczas jego tworzenia. Mamy również awarię na wypadek, gdyby użytkownik nie dodał numeru telefonu. Dodamy podstawowy widok, aby wkrótce dodać numer telefonu i wkrótce zaloguj się za pomocą wiadomości tekstowej.
Po pierwsze, potrzebujemy łatwego sposobu wysyłania wiadomości tekstowej z naszego kodu. Aby to zrobić, możemy wybierać spośród wielu interfejsów API, ale moim zdaniem najłatwiejszym jest Twilio. Oferują również dobre ceny za mniejsze projekty, a także zniżki masowe. Utwórz konto na twilio.com, wypełnij kilka szczegółów na temat swojego projektu, kup numer telefonu i skopiuj klucze API do swoich ustawień. Następnie dodaj ten kod w nowym pliku, Users/sma.py.
nano users/sms.py
# Zaimportuj wszystkie niezbędne pakiety
# Ten kod wysyła tekst z Twilio
# Funkcja pomocnicza, aby uzyskać liczbę z tak wieloma cyframi
# Wyślij tekst, aby zweryfikować użytkownika
# Wyślij użytkownika dowolny tekst z tą funkcją
# Sprawdzaj kod za pomocą tej funkcji
# Sprawdź czas
Pamiętaj, aby odpowiednio zmienić swoje ustawienia, dodając te linie za pomocą klawiszy:
# Pamiętaj, aby skopiować je z pulpitu nawigacyjnego Twilio
AUTH_VALID_MINUTES = 3 # Liczba minut strona TFA jest aktywna po instancji
Po pierwsze, będziemy potrzebować formularzy dla naszych dwóch współczynników uwierzytelniania. Edycja użytkowników/forms.py, dodaj następujący kod.
# … Import
# Formularz do wprowadzenia naszego numeru telefonu
# Formularz uwierzytelniania
Następnie utwórzmy widoki w użytkownikach/views.py
# … Import
Będziemy również potrzebować szablonów obu tych poglądów. Najpierw dodajmy szablon MFA.
nano users/templates/users/mfa.html
Dodaj ten kod HTML do szablonu
To jest dość wyjaśniające. Formularz wysyła kod lub pusty kod, a zauważysz w widoku, wysyłamy kod, jeśli otrzymamy pusty kod. Następnie mamy tylko dwa przyciski przesyłania i w ten sposób możemy wysłać kod z dowolnym przyciskiem. Następnie dodamy prosty formularz, aby dodać numer telefonu.
nano users/templates/users/mfa_onboarding.html
Dodaj następujące HTML:
Ten formularz jest o wiele prostszy, po prostu renderuje formularz numeru, który utworzyliśmy i pozwala użytkownikowi dodać numer telefonu.
To wygląda naprawdę dobrze! Dopóki wszystko jest odpowiednio skonfigurowane, powinniśmy być w stanie wysyłać wiadomości i zalogować użytkownika za pomocą numeru telefonu, gdy tylko dodamy wzorce URL. Ostatnią rzeczą, którą musimy skonfigurować, jest widok profilu, abyśmy mogli upewnić się, że użytkownik może zmienić swój numer telefonu bez logowania. W końcu będziemy chcieli dodać opcję „Stop, aby rzucić", aby użytkownik mógł wysłać SMS -a „zatrzymać", aby zrezygnować z przyszłych wiadomości tekstowych.
Dodajmy widok profilu do użytkowników/Views.py. Ten widok zaktualizuje biografię użytkownika, e -mail, nazwę użytkownika i numer telefonu, a także pozwoli nam włączyć uwierzytelnianie wieloletnie. Najpierw będziemy potrzebować dwóch kolejnych formularzy w użytkownikach/forms.py
# ... import
Następnie możemy utworzyć widok, aby użyć obu tych formularzy. Edytuj użytkowników/views.py i dodaj widok.
# Dodaj te import
Potrzebujemy również szablonu tego widoku.
nano users/templates/users/profile.html
Zauważysz, że jest to dość prosta formularz, ale ma w niej trochę JavaScript, który automatycznie publikuje zawartość formularza podczas ich aktualizacji. Jest to przydatne, więc możesz dokonywać edycji bez konieczności przesyłania przesyłania za każdym razem.
Następnie potrzebujemy adresów URL reprezentujących wszystkie te poglądy w wzorach URL użytkowników. Edytuj użytkowników/urls.py i dodaj ten kod:
# … Poprzedni kod, import
# … Wzory adresów URL, do których wcześniej wprowadziliśmy, dodaj kolejne trzy wiersze
Teraz jest dobry moment na przetestowanie naszego projektu. Ale najpierw uruchommy kolejną kopię zapasową.
backup
I uruchom serwer. Zanim wdrożymy na serwerze Linux, warto włączyć uwierzytelnianie dwóch czynników na koncie. Zrobimy to do naszego adresu URL profilu,/użytkowników/profilu/i zaznaczanie pole, aby włączyć uwierzytelnianie po wprowadzeniu naszego numeru telefonu, a następnie przesłaniu formularza.
python manage.py runserver localhost:8000
Odwiedź stronę internetową, przechodząc do przeglądarki internetowej, używam Google Chrome w tym przykładzie i wprowadzając adres URL https: // localhost: 8000/konta/profilu//
W razie potrzeby będziesz mógł zalogować się i włączyć uwierzytelnianie dwóch czynników.
Ten projekt potrzebuje serwera do uruchomienia, aby mógł naprawdę wysłać pocztę. Ale najpierw potrzebujemy sposobu, aby zobaczyć błędy. Zauważysz, że jeśli uruchomisz serwer w trybie debugowania, z settings.debug równą true, serwer automatycznie wyświetla błędy. Aby pokazać błędy bez korzystania z trybu debugowania, który jest niebezpieczny na serwerze produkcyjnym, powinniśmy dodać do niego widok. Najważniejsze błędy, które musimy obsłużyć, to:
Błąd 500 - Problem z naszym kodem Błąd 404 - Nie znaleziono strony (zepsuty adres URL) Błąd 403 - Błąd odmowy uprawnień
Dodajmy nową aplikację do obsługi tych błędów, zwanych błędami.
python manage.py startapp errors
Dodaj to do settings.py tak jak wcześniej, w ustawieniu instalowanego_apps i zacznij od dodania odniesień do niektórych widoków w app/urls.py, gdzie aplikacja jest nazwą twojego projektu Django.
handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
To wszystko, czego potrzebujemy oprócz widoków błędów, szablonów i odrobiny oprogramowania pośredniego. Zdefiniujmy je jako:
# Utwórz swoje widoki tutaj.
Następnie zdefiniujmy oprogramowanie pośrednie, aby obsłużyć te błędy. Zrobimy to, najpierw dodając do Middleware_classes w Setting.py, z nazwą naszego oprogramowania pośredniego.
# ... poprzednie oprogramowanie pośrednie
Następnie dodajmy oprogramowanie pośrednie.
from threading import local
import traceback
from django.utils.deprecation import MiddlewareMixin
_error = local()
class ExceptionVerboseMiddleware(MiddlewareMixin):
def process_exception(self, request, exception):
_error.value = traceback.format_exc()
def get_current_exception():
try:
return _error.value
except AttributeError:
return None
def set_current_exception(exception):
try:
_error.value = exception
except AttributeError:
print('Attribute error setting exception.')
Dodajemy funkcję, aby uzyskać bieżący wyjątek za pomocą lokalnego gwintowania, który pomaga nam prześledzić wszelkie błędy w naszym kodzie. Jeśli chodzi o szablony, potrzebujemy tylko jednego, ponieważ dynamicznie definiujemy tytuł w widoku. Szablon musi po prostu renderować tytuł i „śledzenie", nasza śledzenie błędów z kontekstu.
nano errors/templates/errors/error.html
To jest nasz najprostszy szablon, ale tak łatwo jest zobaczyć błędy w naszym projekcie. Następnie wyłączmy debugowanie w ustawieniach.
nano app/settings.py
Znajdź ten wiersz, w którym jest ustawiony na true, i zmień ją na false
DEBUG = False
Śmiało teraz i wykonaj kopię zapasową aplikacji. Jesteśmy gotowi wdrożyć na zdalnym serwerze Linux i stamtąd dodawać funkcje.
sudo backup
Zanim opublikujemy ten kod na serwerze, powinniśmy rozważyć, że mogą wystąpić pewne problemy z kodem. W zależności od sprawy strony, które akceptują opublikowane w nich informacje, będą miały problemy z publikowaniem spamu i trudnościami w usunięciu spamu. Nie powinno się to zdarzyć natychmiast, ale jeśli tak się dzieje, później zbadamy, jak automatycznie moderować spam na stronie i utrudnić robotom dostęp do witryny, wraz z tym, jak dezaktywować konta użytkowników i sprawdzić tożsamość użytkownika za pomocą skanowania jego identyfikatora lub skanowania biometrycznego, takiego jak rozpoznawanie palca lub rozpoznawanie twarzy.
Patrząc na przykład uwierzytelniania wielu czynników, który zbadaliśmy w produkcji, rzeczy mogą być inaczej. Zwróć uwagę, w jaki sposób ograniczamy logowanie i wygasamy tokeny. Jeśli roboty uzyskują dostęp do witryny, uwierzytelnianie dwóch czynników może być trudniejsze, ponieważ mogą one wprowadzać kody w tym samym czasie. Aby to walczyć, użyjmy modelu w modelach użytkowników, deklarując, w jaki sposób wchodzimy w interakcję z witryną, gdy uwierzytelniamy przy użyciu uwierzytelniania wieloskładnikowego za pomocą numeru telefonu. Dodamy również opcję uwierzytelniania się za pomocą wiadomości e -mail. Zacznij od edytowania modeli użytkowników z Nano.
nano users/models.py
Tak powinien wyglądać model, który dodajemy. Nie potrzebujemy żadnych metod, po prostu zmiennych do przechowywania identyfikatora, użytkownika, znacznika czasu, wygaśnięcia, długości i prób w stosunku do dowolnego uwierzytelniania wielu czynników (kod taki jak 123456 wysłany na telefon lub e -mail).
# Podstawowy token używany do logowania się na stronie internetowej
Dodajmy również przywilej naszemu użytkownikowi, a na razie ustawimy go ręcznie, zanim ostatecznie automatycznie migrujemy do rekrutacji uprzywilejowanych użytkowników. W modelach użytkowników dodaj ten wiersz w profilu:
vendor = models.BooleanField(default=False)
Podobnie jak w przypadku wszelkich zmian w bazie danych, musimy dokonać migracji i migracji bazy danych za każdym razem, gdy edytujemy plik Models.py w Django. Pamiętaj, aby to zrobić, najpierw używamy źródła (jeśli nie był już używany od momentu otwartego terminala), a następnie Python Manage.py, aby migracje i migracja.
cd project-directory-you-named # (W razie potrzeby)
Na razie możesz zaciągnąć wszelkie konta, które utworzyłeś jako dostawcy za pomocą powłoki.
python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
Teraz ewoluujmy nasz pogląd na uwierzytelnianie wielu czynników, aby użyć tego tokena. Najpierw musimy zmodyfikować nasze media pomocnicze MFA. Używając nano,
nano users/mfa.py
from django.utils import timezone
import random
import datetime
from django.conf import settings
from feed.middleware import get_current_request
from django.contrib import messages
from .email import send_html_email
import traceback
from .models import MFAToken
account_sid = settings.TWILIO_ACCOUNT_SID
auth_token = settings.TWILIO_AUTH_TOKEN
source_phone = settings.PHONE_NUMBER
def send_text(target_phone, text):
from twilio.rest import Client
try:
client = Client(account_sid, auth_token)
if len(target_phone) >= 11:
message = client.messages.create(
to=target_phone,
from_=source_phone,
body=text + ' Text STOP to cancel.')
except:
messages.warning(get_current_request(), 'There was an error sending the message.')
print(traceback.format_exc())
def get_num_length(num, length):
n = ''
for x in range(length):
n = n + str(num)
return int(n)
def send_verification_text(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_user_text(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)))
def send_verification_email(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))
def send_user_text(user, text):
send_text(user.profile.phone_number, text)
def check_verification_code(user, token, code):
token.attempts = token.attempts + 1
profile = user.profile
result = (token != None and code != '' and token.token == code and (token.expires > timezone.now()) and token.attempts <= settings.MFA_TOKEN_ATTEMPTS)
if token.attempts < 3 and result:
profile.verification_code_length = 6
elif token.attempts > 1 and not result:
profile.verification_code_length = profile.verification_code_length + 2
if profile.verification_code_length > settings.MFA_TOKEN_LENGTH: profile.verification_code_length = settings.MFA_TOKEN_LENGTH
token.save()
profile.save()
return result
# Uwierzytelnij użytkownika za pomocą numeru e -mail lub numeru telefonu
token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Odfiltruj token przez wartość przekazaną w adresie URL (UUID)
if not token: token = MFAToken.objects.create(user=User.objects.filter(profile__uuid=username).first(), uid=username, expires=timezone.now() + datetime.timedelta(seconds=115)) # Jeśli ta sesja nie została utworzona, utwórz ją
user = User.objects.filter(id=token.user.id).first() # Zdobądź użytkownika z tokena
if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Jeśli są już uwierzytelnieni, zaloguj się
if not user: raise PermissionDenied() # Zaprzecz, jeśli nie znaleziono użytkownika
if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Sprawdź token Auth
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Zaloguj użytkownika, jeśli nie są jeszcze zalogowani
user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Ustaw wygaśnięcie ich uwierzytelniania wielu czynników
return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Przekieruj użytkownika na następną stronę
if not user.profile.mfa_enabled: # Sprawdź, czy MFA jest włączona
if not check_verification_time(user, token): # Sprawdź czas
user.profile.mfa_enabled = False # Wyczyść numer telefonu
user.profile.enable_two_factor_authentication = True # Włącz Mfa
user.profile.phone_number = '+1' # Wyłącz numer telefonu
user.profile.save() # Zapisz profil
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Zaloguj użytkownika, jeśli jego MSZ nie jest włączony
if request.method == 'POST' and not fraud_detect(request, True): # Jeśli żądanie jest żądaniem pocztowym
form = TfaForm(request.POST) # Utworzyć formularz
code = str(form.data.get('code', None)) # Zdobądź kod
if code and code != '' and code != None: # Upewnij się, że nie jest pusty
token_validated = user.profile.check_auth_token(usertoken) # Sprawdź token Auth
is_verified = check_verification_code(user, token, code) # Sprawdź kod
if token_validated: # Jeśli wszystko
if is_verified: # Jest w porządku
user.profile.mfa_enabled = True # Włącz MFA (jeśli jeszcze nie włączony)
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Zaloguj użytkownika
for key, value in request.GET.items(): # Zbuduj QueryString dla następnego parametru (jeśli istnieje)
return HttpResponseRedirect(next) # Przeadresować
elif not token_validated: # Jeśli token był nieważny
if p.mfa_attempts > 3: # Gdyby było zbyt wiele prób
if form.data.get('send_email', False): # Wyślij wiadomość e -mail (lub SMS)
# Renderować formularz (dla żądań GET)
Gdy dodajemy ten kod, upewnij się, że zaimportować funkcję, aby wysłać wiadomość e -mail. Na górze pliku użytkownik wyświetla (z innymi importami), dodaj
from .mfa import send_verification_email as send_mfa_verification_email
Teraz musimy napisać tę funkcję, zanim z tego zadziała. Powinno to przedłużyć naszą funkcję wysyłania e -maila i po prostu wysłać wiadomość e -mail do użytkownika z kodem weryfikacji.
nano users/mfa.py
def send_verification_email(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))
Więc to wszystko działa świetnie, teraz mamy system uwierzytelniania wielu czynników, który zależy numer telefonu lub e -mail, aby się zalogować. Ale potrzebujemy również sposobu na usunięcie, a przynajmniej ukryj użytkowników, którzy nie współpracują z naszymi warunkami. Mogą to być spamery, roboty lub każdy, kto nie znaczy dobrze dla naszej pracy. Spójrz na widok na monitorowanie użytkowników na mojej stronie:
# import
from .tests import is_superuser_or_vendor # Będziemy musieli utworzyć ten test
# Uzyskaj listę użytkowników
return render(request, 'users/users.html', { # Zwracaj użytkowników w szablonie
Zauważ, że ten kod używa testu, będziemy musieli zadeklarować ten test w pliku tests.py i zaimportować go. Edycja użytkowników/tests.py, utwórzmy test.
def is_superuser_or_vendor(user):
return user.profile.vendor or user.is_superuser
Jest to w połączeniu z szablonem Users/Users.html, który wygląda mniej więcej tak:
Zauważ, że szablon zawiera inny szablon, użytkownicy/user.html. Podczas korzystania z szablonu, który ma subtelną płytę i nie używa Extends, dobrym pomysłem jest dodanie podkreślenia () Przed nazwą pliku do rozszerzenia, w celu rozróżnienia szablonów.
Zauważ, że jest to dużo Jinja, możesz nie mieć zdefiniowania wszystkich tych zmiennych. Ale tak wygląda mój kod.
<small># {{user.id}} </small>
Potrzebujemy również kolejnej subtelnej płyty, toggle_active.html. Ten szablon powinien być formą, która pozwala nam przełączać, czy użytkownik jest aktywny.
Będziemy również musieli dodać widok, aby przełączyć aktywność użytkownika i odpowiednie wzorce URL. Podczas gdy jesteśmy przy tym, dodajmy widok, aby usunąć użytkownika na wypadek, gdybyśmy tego potrzebujemy.
# Import
success_url = '/' # Przekierowanie URL sukcesu
def test_func(self): # Przetestuj, czy użytkownik jest superuser i ma pozwolenie na usunięcie
Chociaż jest to praktyczne w razie potrzeby, usunięcie użytkownika nie powinno być konieczne przez większość czasu, możemy po prostu przełączyć widoczność użytkowników, którzy odwiedzają witrynę, jeśli będziemy musieli je odrzucić.
Wzory adresów URL, które dodaliśmy, wyglądają tak. Z nano, edytuj użytkowników/urls.py i dodaj te wiersze:
nano users/urls.py
Linie powinny trafić na listę ścieżek w widokach użytkownika, przed zakończeniem „]", ale po początku „[".
# …
# …
Teraz pamiętaj, aby utworzyć kopię zapasową witryny, abyś mógł pobrać ją na serwerze WWW, nad którym będziemy kontynuować pracę. Z wiersza poleceń,
sudo backup
Teraz nasza strona jest kopowana.
Więc teraz mamy kilka bardziej przydatnych funkcji. Ale co z dużym zdjęciem tutaj? Ten kod nadal nie jest dostępny z Internetu, nie mamy jeszcze serwera poczty i musimy rozwinąć naszą aplikację, aby zawierać kompleksowy proces weryfikacji, a także sprawne układy, które pomogą nam zbadać witrynę, a także bezpieczne protokoły uwierzytelniania uprzywilejowanych użytkowników.
Dostaniemy to wszystko. Najważniejszą rzeczą na razie będzie po prostu wprowadzenie tego kodu online, co możemy zrobić z zaledwie kilkoma wierszami bash na serwerze Ubuntu. Będziesz jednak musiał wypożyczyć serwer do tego, chyba że masz serwer w domu i subskrypcję internetową biznesową, która pozwala otwierać porty. Osobiście uruchamiam moją stronę internetową na HP Z440, który jest zainstalowany w moim mieszkaniu, ale zwykle jest to znacznie tańsze w przypadku podstawowych potrzeb do wypożyczenia wirtualnego prywatnego serwera (VPS).
Należy pamiętać, że kod, który teraz uruchomimy, jest stosunkowo cienki, będzie musiał być utrzymywany i ulepszony, zanim będziemy gotowi do użycia tego, co musimy zbudować produkt. Uważaj, co robisz z Internetem, upewnij się, że jeśli publicznie wdrożysz tę stronę na serwerze Linux, planujesz zablokować niechciane interakcje ze swoją witryną. To prawdopodobnie nie stanowi problemu, ale przyjrzymy się różnorodnym rozwiązaniom, aby to zwalczyć, w tym uczenie maszynowe, sztuczną inteligencję i wizję komputerową. Kiedy staje się problemem, poszukaj dalej w tym tekście, aby uzyskać rozwiązanie.
Jeśli chodzi o wynajęcie VPS, można znaleźć wiele miejsc. Google Cloud ma serwery VPS, Ionos, Kamatera, Amazon AWS i więcej dostawców oferuje rozwiązania serwerów w chmurze, które będą odpowiadające naszym potrzebom.
Musisz kliknąć ich formularze i wybrać plan, aby rozpocząć. Możesz przejść do planu podstawowego z dowolnym dostawcą, ale upewnij się, że dostawca umożliwia otwieranie portów serwera poczty portowej w celu wysyłania wiadomości e -mail (powinien to być port 587 i port 25), niektórzy dostawcy blokują te porty. Do tej pory miałem najlepsze doświadczenie z Ionos i Kamatera, oboje pozwoli mi wysłać nieograniczoną e -mail, a ich ceny są dość tanie.
Połączysz się z nowym serwerem przez protokół o nazwie SSH lub Secure Shell, który umożliwia zdalne połączenie z serwerem dokładnie tak, jak komputer osobisty, z komputera osobistego. Po skonfigurowaniu serwera dostawca hostingów prawdopodobnie poprosi Cię o dodanie klucza SSH, w przeciwnym razie da ci nazwę użytkownika i hasło. Klucz SSH to sposób logowania się na serwerze z wiersza poleceń, aby edytować kod. Użyj poniższych opcji SSH-KeyGen, aby wygenerować klucz SSH.
ssh-keygen
Zapisz plik i zastąp go, jeśli potrzebujesz, dobrze jest obrócić klawisze SSH, jeśli jeszcze tego nie zrobiłeś. Teraz możesz użyć następującego polecenia, aby zobaczyć swój klucz SSH. Będziesz chciał skopiować go na swój zdalny serwer, aby użyć go do uwierzytelnienia.
cat ~/.ssh/id_rsa.pub
Jeśli nie byłeś w stanie zobaczyć klawisza SSH podczas pisania tego polecenia (długi ciąg cyfr i liter, zaczynając od „SSH-RSA AAA"), spróbuj wygenerować klucz RSA (są one bezpieczniejsze, więc radzę ich użyć.) Poniższy kod wygeneruje klucz 4096-bitowy RSA SSH.
ssh-keygen -t rsa -b 4096
Utwórz VPS z Ubuntu, jednak planujesz to zrobić. Po utworzeniu VPS, klikając formularze na stronie internetowej dostawców (kamatera.com, ionos.com lub podobne), będziesz chciał się zalogować. Aby to zrobić, użyj polecenia SSH z adresem IP (adres, który wygląda jak xx.xx.xx.xx). Będziesz także musiał być wrażliwy na domyślną nazwę użytkownika na utworzonym serwerze, na przykład Ubuntu.
ssh ubuntu@XX.XX.XX.XX
Możesz zostać poproszony o hasło, jeśli zostaniesz poproszony o hasło, wprowadź je. Nie użyjemy domyślnej nazwy użytkownika, więc zacznijmy od utworzenia nowego użytkownika i dodania klucza SSH do ich konta.
Zacznijmy od dodania nowego pliku SSHD_CONFIG, który informuje serwer, jak korzystać z SSH.
nano sshd_config
# Jest to plik konfiguracyjny systemu konfiguracyjnego serwera SSHD. Widzieć
# SSHD_CONFIG (5) Aby uzyskać więcej informacji.
# Ten SSHD został skompilowany z ścieżką =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
# Strategia zastosowana do opcji w domyślnym sshd_config dostarczonym z
# OpenSSH to określenie opcji o ich wartości domyślnej, gdzie
# możliwe, ale zostaw je skomentowane. Niezwykłe opcje zastępują
# Wartość domyślna.
# Port 22
# Adressfamily dowolne
# SłuchajadDress 0.0.0.0
# Słuchajaddress ::
# Hostkey/etc/ssh/ssh_host_rsa_key
# Hostkey/etc/ssh/ssh_host_ecdsa_key
# Hostkey/etc/ssh/ssh_host_ed25519_key
# Szyfry i keying
# Rekeylimit domyślnie brak
# Wycięcie lasu
# SYSLOGFACILE Auth
# Informacje o logowaniu
# Uwierzytelnianie:
# Logowanie, acetację 2M
# Permitrootlogin zakaz słowa
# StrictModes tak
# Maxauthtries 6
# Maxsessions 10
# Spodziewaj się.
# AutoryzowanyPrincipalSfile Brak
# AutoryzowanyKeysComand nikt
# AutoryzowanyKeysComanduser nikt
# Aby to zadziałało
# HostbasedAuthentication nr
# Zmień na tak, jeśli nie ufasz ~/.ssh/znane_hosts
# HostbaseAuthentication
# IgnororeUser Nownownhosts nr
# Nie czytaj plików ~/.rhosts i ~/.
# Ignorerhosts tak
# Aby wyłączyć tunelowane hasła tekstowe, zmień na NO TUTAJ!
# Zezwolenie na słowa nr
# Zmień się na tak, aby włączyć hasła do odpowiedzi na wyzwanie (uważaj na problemy z
# Niektóre moduły i wątki PAM)
# Opcje Kerberos
# Kerberosauthentication nr
# KerberosorlocalPasswd Tak
# KerberosticketCleanup Tak
# Kerberosgetafstoken nr
# Opcje GSSAPI
# Gssapiauthentication nr
# Gssapicleanupcredentials tak
# Gssapistrictacceptorcheck tak
# GssapikeyExchange nr
# Ustaw to na „Tak", aby włączyć uwierzytelnianie PAM, przetwarzanie konta,
# i przetwarzanie sesji. Jeśli jest to włączone, uwierzytelnianie PAM
# być dozwolone poprzez KBDInteractiveAutentication i
# HasłoAuthentication. W zależności od konfiguracji PAM,
# Uwierzytelnianie PAM za pośrednictwem KBDInteractiveAuthentication może ominąć
# Ustawienie „Pertrootlogin bez słowa".
# Jeśli chcesz, aby konto PAM i kontrole sesji działały bez
# Uwierzytelnianie PAM, a następnie włącz to, ale ustaw hasłoAutentowanie
# i kbdinteractiveAuthentication do „nie".
# Bezpełnienie, tak
# Zezwolenie, tak
# Gatewayports nr
# X11Displayoffset 10
# X11uselocalhost Tak
# Permittty tak
# Printlastlog Tak
# Tcpkeepalive tak
# Pozwolenie na środowisko nr
# Opóźniona kompresja
# ClientAliveInterval 0
# ClientAliveCountMax 3
# Używane nr
# Pidfile /run/sshd.pid
# MaxStartups 10: 30: 100
# PermitTunnel nr
# Chrootdirectory brak
# VersionAddendum Brak
# Brak domyślnej ścieżki banerowej
# Pozwól klientowi przejść zmienne środowiskowe
# Zastąp domyślnie brak podsystemów
# Przykład nadrzędnych ustawień na zasadzie dla użytkownika
# Dopasuj anoncvs użytkownika
# X11 wściekłość nr
# Zezwolenie dla nr
# Permittty no
# Serwer CVS ForceCommand
Pamiętaj, Ctrl+X i Y, aby zapisać plik. Następnie napiszmy podstawowy skrypt o nazwie inicjaliza (wszystko w domyślnym katalogu domowym naszego użytkownika).
nano initialize
Dodaj te linie do pliku, zastępując
# !/Bin/Bash
Aby przeprowadzić cię przez ten plik, startujmy po linii. Pierwszy wiersz mówi kompilatorowi, że jest to skrypt bash. Następnie instalujemy zależności, kopiujemy SSHD_CONFIG do poprawnego katalogu, ponowne uruchomienie SSH, generowanie klawiszy SSH dla roota, dodanie „zespołu" użytkownika (możesz wybrać nazwę, którą lubisz, użyj polecenia AddUser z ich nazwą i na razie hasło wyłączone). Dodajemy również zespół do grupy Sudo, generujemy ich klucz SSH, dodajemy nasz klucz do autoryzowanych kluczy i ich również oraz drukuje ich klucz. Ten nowy użytkownik będzie sposobem logowania się do witryny.
W nowym terminalu śmiało ponownie otwórz serwer.
ssh team@XX.XX.XX.XX
Tym razem nie powinieneś potrzebować hasła, ponieważ masz klucz SSH. Wyłączyliśmy również login z hasłem, aby zapewnić bezpieczeństwo witryny.
Teraz ten serwer zaczyna się całkowicie puste, bez żadnych informacji na ten temat. Zacznijmy od klonowania naszego projektu z GIT, abyśmy mogli pobrać go i uruchomić na zdalnym komputerze. Na zdalnym serwerze podłączonym do SSH najpierw wydrukuj klucz SSH:
cat ~/.ssh/id_rsa.pub
Następnie wklej ten klucz do ustawień git, tak jak wcześniej, aby skonfigurować nasze repozytorium Git. Możemy teraz sklonować nasz projekt bezpośrednio do serwera. Upewnij się, że najpierw utworzyłeś kopię zapasową projektu, aby pobrać na serwerze GIT.
git clone git://github.com/you/yourproject.git
Doskonały. Teraz wszystkie pliki są tutaj. Widzimy je z LS
ls
Teraz zacznijmy konfigurować serwer. Najpierw skopiuj swój katalog projektu na prostą, niezapomnianą nazwę, której użyjemy do projektu.
cp -r yourproject whatyoucalledit
Gdzie „WhatyouCalledit" to nowa nazwa twojego projektu. Następnie będziemy musieli zbudować podstawowe narzędzie do skonfigurowania serwera. Zapiszemy to narzędzie i wykorzystamy je w przyszłości. Aby zbudować to narzędzie, utwórzmy binarne użytkownika, aby zdefiniować sposób edycji skryptu. Za pomocą bash, edytuj/usr/bin/ascript
sudo nano /usr/bin/ascript
Pamiętaj, aby używać tam sudo, aby mieć uprawnienia do edycji pliku. W pliku dodaj te wiersze:
# !/Bin/Bash
echo "# !/bin/bash ">>/usr/bin/1 $
Pamiętaj, że ten skrypt przyjmuje argument, nazwę skryptu, jako 1 USD. Najpierw sprawdza, czy plik istnieje, czy w inny sposób go tworzy, dodaje pierwszy wiersz, który deklaruje skrypt, zmienia jego uprawnienia, edytuje je i dodaje swoją nazwę do /etc /ascripts, które pozwala nam przechowywać nazwy tworzonych scenariuszy. Jeśli plik już istnieje, po prostu zmień uprawnienia i edytuj go. Zapisz plik, a następnie zmienimy jego uprawnienia. Dopóki używamy tego skryptu, nie będziemy musieli tego ponownie robić.
sudo chmod a+x /usr/bin/ascript
Doskonały. Teraz utwórzmy skrypt o nazwie Setup. Po pierwsze, nie przytłaczają cię, ale spójrz na to, jak wygląda mój skrypt konfiguracji. Przejdziemy przez to, jak powinien wyglądać ten skrypt w twoim projekcie, nie będziesz potrzebować wszystkiego w moim skrypcie na początek.
# !/Bin/Bash
# sudo chmod A+x Scripts/Userstetup
# ./scripts/usersetup
# ssh-keygen
# Katalog projektu
# Polecenia dziennika
# Nano Config
# Git Config
# Zaktualizuj i zainstaluj
# Włącz antywirus CLAMAV
# Ustaw nazwę hosta
# Konfiguracja postgres
# Ustawienie kopii zapasowej bazy danych
# Wyłącz iptables
# Zainstaluj BitDefender
# Konfiguracja postfix
# Utwórz reż
# Konfiguracja Virtualenv
# Uzyskaj i buduj zależności
# Ustaw zasady zapory ogniowej
# Zainstaluj zależności PYPI
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP Instaluj openCV-Python == 4.5.5.64
# PIP Instaluj openCV-Contib-Python == 4.5.5.64
# Zainstaluj certbot
# Uruchom certbot
# Załaduj serwer poczty
# Kopiuj certyfikaty
# sudo cp /etc/letscrypt/live/femmebabe.com/privey.pem privey.pem
# sudo cp /etc/letscrypt/live/femmebabe.com/cert.pem cert.pem
# Patch Venv
# Ustaw ustawienia użytkownika
# Ustaw uprawnienia
# Zespół sudo chown -r: użytkownicy/var/run/
# sudo chown root: root/run/sudo/ts -r
# sudo chmod 664 db.sqlite3
# sudo chown www-data: użytkownicy db.sqlite3
# Skopiuj konfigurowanie i ustaw uprawnienia
# Konfiguracja bazy danych
# Wstrzykiwać PAM Config i usuń wadliwą konfigurację SSH
# sudo sed -i '' -e '$ d' /etc/pam.d/sshd
# sudo sed -i '' -e '$ d' /etc /profil
# Skopiuj skrypty kosza i ustaw uprawnienia
# Załaduj i włącz usługi
# Włącz moduły Apache
# sudo a2dismod mpm_event
# sudo a2dismod mpm_Worker
# sudo a2enmod mpm_prefork
# Wyłącz domyślną witrynę
# Włącz naszą stronę
# Załaduj demona i uruchom ponownie Apache, Postfix i Opendkim
# Ustaw uprawnienia
# Konfiguracja zamiany
# Silnik podpisu inicjowego
# Konfiguracja git
# Pokaż IPv6 i Opendkim do konfiguracji domeny
# Ukończona konfiguracja
To dużo konfiguracji! Krótko mówiąc, ten kod rejestruje polecenia, konfiguruje nano i git, kopie pliki, pobieranie i instaluje pakiety Ubuntu apt, zależności Pythona, konfiguruje postfix, konfiguruje PostgreSQL (serwer bazy danych) i ładuje bazę danych, konfiguruje UFW (niezmienne ognia) Konfiguruje serwer, instaluje konfigurację, uruchamia się i umożliwia Sever, przydziela zamianę, ustawia uprawnienia i drukuje adres IP, IPv6 i klucz OpenDkim. Całkiem proste, ale wygląda na dużo kodu. Nie będziemy tego dużo potrzebować, ponieważ nie mamy zależności, nie używamy selera, selerybeatu ani Daphne, ale i tak zainstalujemy niektóre z nich, aby zacząć. Zauważ, że ten kod ma domenę zadeklarowaną kilka razy.
Będziemy również musieli kupić nazwę domeny (która jest małą opłatą roczną). Polecam Squarespace do zakupu domeny, ich układ jest intuicyjny i łatwy w użyciu. Możesz kupić dowolną wybraną domenę, ale w tym przykładzie używam domeny femmebabe.com. Po zakupie domeny udaj się do panelu konfiguracji Squarespace DNS i dodaj rekord A wskazujący domenę na serwer według adresu IP. Powinno to wyglądać:
@ A xx.xx.xx.xx
Z operatorem @ jako hostem, co oznacza wszystkie subdomeny w tej domenie, a domena root będzie przekierować na serwer. Deklaracja należy zadeklarować więcej, ale możemy przejść do nich, gdy będziemy gotowi wysłać pocztę. Pamiętaj, że może to potrwać kilka dni, zanim będziesz w stanie pomyślnie wysłać pocztę z serwera. Propiowanie, które ustawiamy w DNS, zajmie czas na propagowanie.
W każdym razie jedynym rekordem, który musimy rozpocząć, jest rekord A. Więc teraz możemy wypełnić poniższy skrypt zgodnie z naszym projektem i uruchomić go.
Zacznijmy od mniejszego skryptu konfiguracji, aby po prostu zainstalować to, czego potrzebujemy do podstawowego postępu. Nie będziemy jeszcze używać tak wielu zależności ani PostgreSQL, po prostu uruchomimy podstawowy serwer HTTP i martwimy się o jego certyfikację, gdy to skończy. Pamiętaj, aby uzyskać certyfikat HTTPS i bezpiecznie uruchomić serwer, będziemy musieli kupić domenę wraz z Rent A Server. Na razie zastąp „Zespół" w tym pliku na nazwę użytkownika „Dir" z katalogiem projektu oraz podaj e -mail i domenę w tagach <>.
Ponadto, zanim uruchomię ten kod, musimy zmienić ustawienia na zaporę zapory obsługującej dostawcę hostingów, jeśli istnieje. Zwykle jest to w zakładce „sieci" twojego dostawcy hostingów lub jeśli jesteś hostingiem, jest to w sekcji „Przekazywanie portów" routera. Jeśli używasz hostingu. Będziesz musiał otworzyć następujące porty w celu odczytu/zapisu.
22 (SSH) 25 (poczta) 587 (poczta) 110 (klient pocztowy) 80 (HTTP) 443 (HTTPS)
# !/Bin/Bash
# Polecenia dziennika
# Nano Config
# Git Config
# Zaktualizuj i zainstaluj
# Włącz antywirus CLAMAV
# Ustaw nazwę hosta
# Ustawienie kopii zapasowej bazy danych
# Wyłącz iptables
# Konfiguracja Virtualenv
# Zainstaluj certbot
# Uruchom certbot
# Ustaw ustawienia użytkownika
# Ustaw uprawnienia
# Zespół sudo chown -r: użytkownicy/var/run/
# sudo chown root: root/run/sudo/ts -r
# Załaduj i włącz usługi
# Włącz moduły Apache
# Załaduj demona i uruchom ponownie Apache, Postfix i Opendkim
# Pokaż IPv6 i Opendkim do konfiguracji domeny
Przed uruchomieniem tego kodu upewnij się, że zakupiona domena jest podłączona do serwera. Aby to zrobić, otwórz terminal na komputerze lokalnym i uruchom to polecenie za pomocą swojej domeny:
ping femmebabe.com # Włóż swoją domenę tutaj, po ping
Jeśli wszystko wygląda dobrze, a serwer wysyła odpowiedzi, jesteśmy gotowi uruchomić skrypt i zainstalować pakiety, a także start, włączyć i certyfikować nasz serwer Apache.
To nie jest cała konfiguracja potrzebna do skonfigurowania postfix, przyjrzymy się tej konfiguracji bardziej później. Na razie uruchom ten kod instalacyjny i zainstalowanie i poświadczenie serwera powinno zająć kilka minut. Ponownie, pamiętaj, aby zastąpić nazwę, e -mail i nazwę domeny w skrypcie zgodnie z zakupioną nazwą.
Teraz, gdy serwer jest udostępniany, możesz przejść do adresu URL w dowolnej przeglądarce internetowej i sprawdzić, czy serwer uruchamia HTTPS. Jeśli tak nie jest, spróbuj trochę poczekać, aż rekordy DNS nadrobią zaległości, a następnie uruchom następujące polecenie, aby ponieść certyfikat Certbot:
sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
Tak długo, jak poprawnie skonfigurowałeś wszystko, powinieneś być w stanie uzyskać dostęp do domyślnej strony Apache, aby wiedzieć, że Twój kod działa i wyświetla stronę internetową na żywo. Następnie edytujmy setting.py, aby zmienić nasz domyślny tryb debugowania na produkcję. Skonfigurujemy również domenę w ustawieniach, a także wewnętrzne IPS.
nano yourproject/settings.py
W ustawieniach zmień/dodaj te linie.
# Konfiguracja witryny
Teraz będziemy musieli skonfigurować Apache2. Edytujmy plik konfiguracji, który wdrożymy w tym wierszu:
sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf
Ten plik konfiguracji powinien mieć naszą nazwę domeny oraz nazwę użytkownika i projektu. Używam nazwy domeny femmebabe.com, zespołu nazwy użytkownika i nazwy projektu femmebabe.
ServerSignature Off
ServerTokens Prod
<IfModule mod_ssl.c>
<VirtualHost *:80>
Redirect permanent / https://femmebabe.com/
</VirtualHost>
<VirtualHost *:443>
ServerName femmebabe.com
ServerAdmin team@femmebabe.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /static /home/team/femmebabe/static
<Directory /home/team/femmebabe/static>
Require all granted
</Directory>
Alias /media/icons /home/team/femmebabe/media/
<Directory /home/team/femmebabe/media>
Require all granted
</Directory>
<Directory /home/team/femmebabe/femmebabe>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIScriptAlias / /home/team/femmebabe/femmebabe/wsgi.py
WSGIDaemonProcess femmebabe python-path=/home/team/femmebabe/ python-home=/home/team/femmebabe/venv header-buffer-size=100000000000 user=team
WSGIProcessGroup femmebabe
WSGIApplicationGroup %{GLOBAL}
<Directory /home/team/femmebabe/static>
Options Indexes FollowSymLinks
AllowOverride All
</Directory>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} \.(css|webp|webm|gif|png|mp3|wav|jpeg|jpg|svg|webp)$ [NC]
RewriteCond %{HTTP_REFERER} !^https://femmebabe.com/media/.*$ [NC]
RewriteRule ^(.+?)/$ /media/$1 [F,L]
</IfModule>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/femmebabe.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/femmebabe.com/privkey.pem
Header set X-Frame-Options: "SAMEORIGIN"
Header set Access-Control-Allow-Origin "https://femmebabe.com"
TimeOut 60000
LimitRequestBody 0
<FilesMatch ".(ico|pdf|flv|jpg|jpeg|png|gif|webp|JPG|JPEG|wav|mp3|mp4|public|js|css|swf|webp|svg)$">
Header set Cache-Control "max-age=30, public"
</FilesMatch>
</VirtualHost>
</IfModule>
<IfModule mod_ssl.c>
<VirtualHost *:80>
ServerName femmebabe.com
ServerAdmin team@femmebabe.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =femmebabe.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
</IfModule>
Podczas konfigurowania serwera należy zastąpić nazwę projektu, katalogów i domeny w tym przykładowym kodzie. Teraz będziemy musieli wyłączyć witrynę domyślną. Można to zrobić za pomocą Bash.
sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl
Następnie możemy włączyć domyślną stronę i ponownie załadować Apache2, również za pomocą Bash. Pamiętaj, aby zastąpić femmebabe nazwą zadeklarowanego pliku podczas edytowania w/etc/apache2/witryn-dostępna/.
sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
Wróć do swojej domeny w pasku Nav. Powinieneś zobaczyć stronę skonfigurowaną w przeglądarce internetowej. Gratulacje! Jeśli tego nie widzisz, być może będziesz musiał wprowadzić pewne zmiany. Dokładnie przejrzyj ustawienia w swoim projekcie, konfigurację Apache i upewnij się, że nie masz żadnych błędów, i uruchom następujące polecenia, aby sprawdzić projekt pod kątem błędów.
cd projectname
source venv/bin/activate
python manage.py check
Jeśli masz błędy w swoim projekcie Python, prześledź je tam, gdzie są i napraw. Być może nie będziesz w stanie zobaczyć wszystkich swoich błędów w zależności od tego, gdzie są, więc jeśli masz błąd, który po prostu mówi, że „zapełnianie nie jest powtórne", edytuj następujący plik w środowisku wirtualnym, Registry.py, aby ujawnić błąd.
nano venv/lib/python3.12/site-packages/django/apps/registry.py
Przewiń do wiersza 83, gdzie ten błąd wykonawczy jest podniesiony (podnieś runtimeerror („populacji () nie jest powtórny")) i dodaj komentarz przed tą linią, a następnie dodaj, z tym samym wgłębieniem, self.app_configs = {}. To wygląda na to:
# Zapobiegaj połączeniom Reentrant, aby uniknąć uruchamiania AppConfig.Ready ()
# metody dwa razy.
# Raise RuntimeError („populacja () nie jest powtórzenie")
Następnie możesz ponownie sprawdzić projekt i ujawnić błąd.
python manage.py check
Następnie możesz zobaczyć błąd i naprawić go. Po naprawie i kod kompiluje bez błędów, pamiętaj, aby zmienić plik z powrotem, aby wyglądał tak:
# Zapobiegaj połączeniom Reentrant, aby uniknąć uruchamiania AppConfig.Ready ()
# metody dwa razy.
# self.app_configs = {}
Pod warunkiem, że serwer jest online, gdy wprowadzamy do niego dalsze zmiany, musimy użyć następującego polecenia, aby ponownie załadować serwer:
sudo systemctl reload apache2
Wspaniały! Ale co z wysłaniem poczty? Aby rozpocząć wysyłanie wiadomości e -mail, najpierw będziemy musieli zaktualizować konfigurację domeny. Powinno to znajdować się w panelu DNS w Squarespace lub dowolnym rejestrowaniu nazwy domeny. Będziemy również musieli zainstalować i dodać konfigurację oraz uruchomić kilka poleceń.
Najpierw uzyskajmy adres IPv6 serwera. Następnie otworzymy Twoje DNS i dodamy rekordy.
Aby uzyskać adres IPv6 serwera, użyj tego polecenia:
ip -6 addr
Teraz możemy dodać następujące rekordy do ustawień DNS. Moje płyty wyglądają tak. Jednak w przypadku rekordów należy zastąpić adres IP swoim IP (nie 75.147.182.214, to moje). Dodaj także swoją domenę zamiast femmebabe.com, a także adres IPv6 znaleziony z poprzednim poleceniem (nie możesz użyć mojego, Fe80 :: 725a: FFF: FE49: 3E02). Na razie nie martw się o dominę, jest to tworzone, gdy konfigurujemy Postfix, serwer pocztowy z Opendkim i drukuje klucz. Skonfigurujemy to ostatnie.
@ A Nie dotyczy 75.147.182.214
@ MX 10 femmebabe.com
@ Ptr Nie dotyczy femmebabe.com
@ Txt Nie dotyczy Txt @ v = SPF1 MX IP75.147.182.214IP6: Fe80 :: 725a: FFF: FE49: 3E02 ~ All All
default._BIMI Txt Nie dotyczy v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg
_dmarc Txt Nie dotyczy v = dmarc1; p = Brak
sendonly._domainkey
Txt
Nie dotyczy
Teraz będziemy musieli dodać trwałą konfigurację dla Postfix. Wszystko, co musimy zrobić, to upewnić się, że zastępujemy nazwę domeny, femmebabe.com, z używaną nazwą domeny. Spójrzmy na wszystkie pliki konfiguracyjne jeden po drugim i zainstaluj je w katalogu o nazwie Config w naszym projekcie, aby zainstalować system operacyjny.
nano config/etc_postfix_main.cf
Dodaj ten tekst do pliku
# Patrz /usr/share/postfix/main.cf.dist, aby uzyskać skomentowaną, pełniejszą wersję
# Debian specyficzny: Określenie nazwy pliku spowoduje pierwszą
# wiersz tego pliku, który ma być używany jako nazwa. Debian domyślnie
# IS /ETC /MailName.
# miorigin = /etc /MailName
# Dołączenie .domain to praca MUA.
# Odkształcić następny wiersz, aby wygenerować ostrzeżenia „opóźnionej poczty"
# Delay_Warning_Time = 4H
# Zobacz http://www.postfix.org/compatibity_readme.html - domyślnie na 3.6
# Świeże instalacje.
# Parametry TLS
# Konfiguracja miltera
Następna konfiguracja!
nano config/etc_postfix_master.cf
Dodaj te linie:
#
# Plik konfiguracji procesu postfix. Szczegółowe informacje na temat formatu
# z pliku patrz strona ręczna Master (5) (polecenie: „Man 5 Master" lub
# on-line: http://www.postfix.org/master.5.html).
#
# Nie zapomnij o wykonaniu „Postfix Reload" po edycji tego pliku.
#
# =======================================================================
# Typ usługi Prywatne bezbolesne Command MAXPROC Wakeup + Args
# (Tak) (tak) (nie) (nigdy) (100)
# =======================================================================
# SMTP INET N - Y - 1 PostScreen
# SMTPD PASS - - Y - - SMTPD
# DNSBLog UNIX - - Y - 0 DNSBLog
# TLSproxy Unix - - Y - 0 tlsproxy
# Wybierz jeden: Włącz przesyłanie tylko dla klientów pętli lub dla każdego klienta.
# 127.0.0.1: Submission inet N - Y - - SMTPD
# -O SYSLOG_NAME = Postfix/Zwrot
# -O smtpd_tls_security_level = Szyfrowanie
# -O smtpd_sasl_auth_enable = tak
# -O smtpd_tls_auth_only = tak
# -O smtpd_reject_unlisted_recipient = no
# -O smtpd_client_restrictions = $ mua_client_restrictions
# -O smtpd_helo_restrictions = $ mua_helo_restrictions
# -O smtpd_sender_restrictions = $ mua_sender_restrictions
# -O smtpd_recipient_restrictions =
# -O smtpd_relay_restrictions = augt_sasl_authentive, odrzucić
# -O MILTER_MACRO_DAEMON_NAME = Pochodzenie
# Wybierz jeden: Włącz SMTPS tylko dla klientów pętli lub dla każdego klienta.
# 127.0.0.1:smtps inet n - y - - smtpd
# SMTPS INET N - Y - - SMTPD
# -O syslog_name = postfix/smtps
# -O SMTPD_TLS_WRAPREMODE = Tak
# -O smtpd_sasl_auth_enable = tak
# -O smtpd_reject_unlisted_recipient = no
# -O smtpd_client_restrictions = $ mua_client_restrictions
# -O smtpd_helo_restrictions = $ mua_helo_restrictions
# -O smtpd_sender_restrictions = $ mua_sender_restrictions
# -O smtpd_recipient_restrictions =
# -O smtpd_relay_restrictions = augt_sasl_authentive, odrzucić
# -O MILTER_MACRO_DAEMON_NAME = Pochodzenie
# 628 INET N - Y - - QMQPD
# QMGR UNIX N - N 300 1 OQMGR
# -O smtp_helo_timeout = 5 -o SMTP_Connect_Timeout = 5
#
# ==================================================================
# Interfejsy do oprogramowania bez Postfix. Pamiętaj, aby zbadać instrukcję
# Strony oprogramowania bez Postfix, aby dowiedzieć się, jakie opcje chce.
#
# Wiele z poniższych usług korzysta z rur postfix (8) dostawy
# agent. Informacje o $ {odbiorcy} zobacz stronę rur (8)
# i inne opcje koperty wiadomości.
# ==================================================================
#
# Maildrop. Szczegółowe informacje można znaleźć w pliku Postfix Maildrop_Readme.
# Podaj także w main.cf: Maildrop_Destination_Recipient_Limit = 1
#
#
# ==================================================================
#
# Ostatnie wersje Cyrus mogą korzystać z istniejącego wpisu „LMTP" Master.cf.
#
# Określ w Cyrus.conf:
# lmtp cmd = "lmtpd -a" słuchanie = "localhost: lmtp" proto = tcp4
#
# Określ w main.cf jeden lub więcej z poniższych:
# Mailbox_transport = LMTP: INET: LocalHost
# Virtual_transport = LMTP: INET: LocalHost
#
# ==================================================================
#
# Cyrus 2.1.5 (Amos Gouaux)
# Podaj także w main.cf: Cyrus_Destination_recipient_Limit = 1
#
# Cyrus Unix - N N - - Rura
# flagi = DRX User = Cyrus argv =/cyrus/bin/dostarczenie -e -r $ {sender} -m $ {rozszerzenie} $ {użytkownik}
#
# ==================================================================
# Stary przykład dostawy przez Cyrus.
#
# Old -Cyrus Unix - N n - - rurka
# flagi = r użytkownik = Cyrus argv =/cyrus/bin/dostarczenie -e -m $ {rozszerzenie} $ {użytkownik}
#
# ==================================================================
#
# Szczegółowe informacje konfiguracji znajdują się w pliku Postfix UUCP_Readme.
#
#
# Inne zewnętrzne metody dostarczania.
#
I konfiguracja Opendkim. Opendkim identyfikuje serwery e -mail za pomocą klawiszy domenowych, aby były bardziej bezpieczne. Bez tego poczta nie jest podpisana i może nie dotrzeć do skrzynki odbiorczej.
nano config/etc_default_opendkim
Dodaj te linie:
# Uwaga: Jest to starszy plik konfiguracyjny. Nie jest używany przez Opendkim
# Usługa systemu. Użyj odpowiednich parametrów konfiguracji w
# /etc/opendkim.conf zamiast tego.
#
# Wcześniej można było tutaj edytować ustawienia domyślne, a następnie wykonać
# /lib/opendkim/opendkim.service.generate w celu wygenerowania systemu zastępowania plików pod adresem
# /etc/systemd/system/opendkim.service.d/override.conf i
# /etc/tmpfiles.d/opendkim.conf. Chociaż jest to nadal możliwe, jest teraz
# Zalecane w celu dostosowania ustawień bezpośrednio w /etc/opendkim.conf.
#
# Daemon_opts = ""
# Zmień na/var/szpula/postfix/run/opendkim, aby używać gniazda Unixa z
# Postfix w chroot:
# Rundir =/var/buol/postfix/run/opendkim
#
# Ukształcenie, aby określić alternatywne gniazdo
# Zauważ, że ustawienie to zastąpi dowolną wartość gniazda w opendkim.conf
# domyślny:
# Słuchaj wszystkich interfejsów na porcie 54321:
# Gniazdo = INET: 54321
# Posłuchaj Loopback na porcie 12345:
# Socket = INET: 12345@LocalHost
# Posłuchaj 192.0.2.1 na porcie 12345:
# Socket = INET: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf
Dodaj te linie:
# Default_Process_Limit = 100
# default_client_limit = 1000
# Domyślny limit VSZ (wielkość pamięci wirtualnej) dla procesów serwisowych. To jest głównie
# Miejsce do złapania i zabicia procesów, które wyciekają pamięć, zanim się zjedzą
# wszystko.
# Default_VSZ_LIMIT = 256M
# Użytkownik logowania jest wewnętrznie używany przez procesy logowania. To jest najbardziej niezgodne
# Użytkownik w systemie dovecot. W ogóle nie powinien mieć dostępu do niczego.
# default_login_user = dovenull
# Użytkownik wewnętrzny jest używany przez nieuprzywilejowane procesy. Powinien być oddzielony od
# Zaloguj się użytkownik, aby procesy logowania nie mogą zakłócać innych procesów.
# default_internal_user = dovecot
# port = 143
# port = 993
# SSL = Tak
# Liczba połączeń do obsługi przed rozpoczęciem nowego procesu. Zazwyczaj
# Jedynymi przydatnymi wartościami są 0 (nieograniczona) lub 1. 1 jest bezpieczniejszy, ale 0
# jest szybszy. <ca/wiki/loginProcess.txt>
# service_count = 1
# Liczba procesów, które zawsze czekają na więcej połączeń.
# proces_min_avail = 0
# Jeśli ustawisz service_count = 0, prawdopodobnie musisz to rozwinąć.
# VSZ_LIMIT = $ default_VSZ_LIMIT
# port = 110
# Port = 995
# SSL = Tak
# Port = 587
# Utwórz słuchacz inet tylko wtedy, gdy nie możesz użyć powyższego gniazda Unix
# inet_listener LMTP {
# Unikaj uczynienia LMTP widocznego dla całego Internetu
# adres =
# port =
# }
# Większość pamięci trafia do plików MMAP (). Może być konieczne zwiększenie tego
# Limit, jeśli masz ogromne skrzynki pocztowe.
# VSZ_LIMIT = $ default_VSZ_LIMIT
# Max. Liczba procesów IMAP (połączenia)
# proces_limit = 1024
# Max. Liczba procesów POP3 (połączenia)
# proces_limit = 1024
# Max. Liczba procesów przesyłania SMTP (połączenia)
# proces_limit = 1024
# Auth_socket_path wskazuje domyślnie ten gniazdo użytkownika Zazwyczaj jest
# używane przez Dovecot-LDA, Doveadm, prawdopodobnie proces IMAP itp. Użytkownicy, którzy mają
# Pełne uprawnienia do tego gniazda są w stanie uzyskać listę wszystkich nazw użytkowników i
# Uzyskaj wyniki wszystkich wyszukiwań użytkownika.
#
# Domyślny tryb 0666 pozwala każdemu podłączyć się do gniazda, ale
# wyszukiwania użytkownika
# Dopasowuje UID procesu dzwoniącego. Również jeśli UID lub GID dzwoniącego pasuje do
# UID lub GID Socket, wyszukiwanie się udaje. Cokolwiek innego powoduje porażkę.
#
# Aby zapewnić pełne uprawnienia dzwoniącego w celu wyszukiwania wszystkich użytkowników, ustaw tryb na
# coś innego niż 0666 i Dovecot pozwala jądrze egzekwować
# Uprawnienia (np. 0777 pozwala na pełne uprawnienia).
# Proces pracownika autoryzacji jest domyślnie uruchamiany jako root, aby mógł uzyskać dostęp
# /itp./Shadow. Jeśli to nie jest konieczne, użytkownika powinno zostać zmienione na
# $ default_internal_user.
# użytkownik = root
# Jeśli używany jest proxy DICT, procesy pocztowe powinny mieć dostęp do gniazda.
# Na przykład: tryb = 0660, Group = vmail i global Mail_Access_groups = vmail
# Tryb = 0600
# użytkownik =
# grupa =
Jeszcze raz upewnij się, że zastąp domenę we wszystkich tych plikach, femmebabe.com, z wybraną domeną. Edytuj następny plik, konfigurację Dovecot,
nano config/etc_dovecot_dovecot
I dodaj te linie
## Plik konfiguracyjny dovecot
# Jeśli się spieszysz, patrz http://wiki2.dovecot.org/quickconfiguration
# Polecenie „DoVeconf -n" daje czyste wyjście zmienionych ustawień. Użyj go
# Zamiast kopiowania i wklejania plików podczas publikowania na liście mailingowej Dovecot.
# '# „Postać i wszystko po tym, jak jest traktowane jako komentarze. Dodatkowe przestrzenie
# i zakładki są ignorowane. Jeśli chcesz użyć któregokolwiek z nich jawnie, umieść
# value inside quotes, eg.: key = "# zwęglenie i ciągłe białe listy "
# Większość (ale nie wszystkie) ustawienia można zastąpić różnymi protokołami i/lub
# Źródło/docelowe IPS, umieszczając ustawienia wewnątrz sekcji, na przykład:
# Protokół IMAP {}, lokalny 127.0.0.1 {}, zdalny 10.0.0.0/8 {}
# Wartości domyślne są wyświetlane dla każdego ustawienia, nie jest wymagane odkształcenie
# te. Są to jednak wyjątki od tego: brak sekcji (np. Przestrzeń nazw {})
# lub ustawienia wtyczek są domyślnie dodawane, są wymienione tylko jako przykłady.
# Ścieżki są również przykładami, a rzeczywiste wartości domyślne są oparte na konfiguracji
# opcje. Ścieżki wymienione tutaj są dla konfiguracji - -prefix =/usr
# --SYSCONFDIR =/etc--localstatedir =/var
# Włącz zainstalowane protokoły
# Oddzielona przecinek IPS lub hosty, gdzie słuchać połączeń.
# „*" słucha we wszystkich interfejsach IPv4, "::„ słucha we wszystkich interfejsach IPv6.
# Jeśli chcesz określić porty bezbłędne lub cokolwiek bardziej złożonego,
# Edytuj conf.d/master.conf.
# Słuchaj = *, ::
# Katalog podstawowy, gdzie przechowywać dane wykonawcze.
# base_dir =/var/run/dovecot/
# Nazwa tego instancji. W konfiguracji wielu instancji Doveadm i innych poleceń
# może użyć -i <name_name>, aby wybrać, która instancja jest używana (alternatywa
# do -c <config_path>). Nazwa instancji jest również dodawana do procesów Dovecot
# W PS wyjściu.
# instance_name = dovecot
# Wiadomość z życzeniami dla klientów.
# login_greeting = dovecot gotowy.
# Oddzielona przestrzeń lista zaufanych zakresów sieciowych. Połączenia z nich
# IPS mogą zastąpić ich adresy IP i porty (w celu rejestrowania i
# do kontroli uwierzytelnienia). disable_plaintext_auth jest również ignorowany dla
# te sieci. Zazwyczaj określasz tutaj swoje serwery proxy IMAP.
# login_trusted_networks =
# Oddzielona przestrzeń lista dostępu do logowania do sprawdzania gniazda (np. TCPWRAP)
# login_access_sockets =
# Z proxy_maybe = tak, jeśli cel proxy pasuje do dowolnego z tych adresów IP, nie rób tego
# Proxying. To zwykle nie jest konieczne, ale może być przydatne, jeśli miejsce docelowe
# IP to np. IP wydziwiający obciążenie.
# auth_proxy_self =
# Pokaż bardziej pełne tytuły procesów (w PS). Obecnie pokazuje nazwę użytkownika i
# Adres IP. Przydatne do sprawdzania, kto faktycznie korzysta z procesów IMAP
# (np. Udostępnione skrzynki pocztowe lub jeśli ten sam UID jest używany dla wielu kont).
# Verbose_Proctitle = no
# Jeśli wszystkie procesy zostaną zabite, gdy proces Master dovecot wyłączy się.
# Ustawianie tego na „nie" oznacza, że Dovecot można zaktualizować bez
# zmuszanie istniejących połączeń klientów do zamknięcia (choć może to być również
# Problem, jeśli aktualizacja jest np. z powodu poprawki bezpieczeństwa).
# Shutdown_clients = Tak
# Jeśli niezerowe, uruchom polecenia pocztowe za pośrednictwem tych wielu połączeń z serwerem Doveadm,
# zamiast uruchamiać je bezpośrednio w tym samym procesie.
# DoveAdm_Worker_Count = 0
# Gniazdo UNIX lub host: port używany do łączenia z serwerem Doveadm
# Doveadm_socket_path = Doveadm-Server
# Oddzielona przestrzeń lista zmiennych środowiskowych, które są zachowane na Dovecot
# uruchamianie i przekazanie wszystkich procesów dziecka. Możesz także dać
# Key = Pary wartości, aby zawsze ustawić określone ustawienia.
# import_environment = tz
##
## Ustawienia serwera słownika
##
# Słownik może być używany do przechowywania list kluczowych = wartości. Jest to używane przez kilka
# wtyczki. Słownik można uzyskać bezpośrednio bezpośrednio lub choć
# Serwer słownika. Poniższe nazwy słowników blokowych mapy dla URI
# Gdy serwer jest używany. Można je następnie odwoływać za pomocą URI w formacie
# „Proxy :: <Nazwa>".
# limit = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
# Większość faktycznej konfiguracji jest zawarta poniżej. Nazwy plików są
# Najpierw posortowane według ich wartości ASCII i przeanalizowane w tej kolejności. 00-prefiks
# w nazwach plików mają ułatwić zrozumienie zamówienia.
# Plik konfiguracyjny może również zostać uwzględniony bez podania błędu, jeśli
# Nie znaleziono tego:
# Pozwala Dovecot słuchać wszystkich połączeń wejściowych (IPv4 / IPv6)
Dodaj hasło dla użytkownika dovecot:
nano config/etc_dovecot_passwd
Pierwszą częścią pliku przed okrętem jest nazwa użytkownika. Ostatnia część „YourPassword" oznacza hasło, które chcesz podać serwer poczty.
team:{plain}yourpassword
Następnie konfiguracja OpendKim
nano config/etc_opendkim.conf
I dodaj te linie:
# Jest to podstawowa konfiguracja podpisywania i weryfikacji. To może być łatwo
# dostosowany do podstawowej instalacji. Patrz Opendkim.conf (5) i
# /usr/share/doc/opendkim/examples/opendkim.conf.sample do pełnego
# Dokumentacja dostępnych parametrów konfiguracyjnych.
# Log, dlaczego nie
# Wspólne parametry podpisywania i weryfikacji. W Debian nagłówek „od" jest
# wyprzedzone, ponieważ często jest to klucz tożsamości używany przez systemy reputacji
# i w ten sposób wrażliwy na bezpieczeństwo.
# Podpisanie domeny, selektora i klucza (wymagane). Na przykład wykonuj podpisywanie
# dla domeny „example.com" z selektorem „2020" (2020._domainkey.example.com),
# Korzystanie z klucza prywatnego przechowywanego w /etc/dkimkeys/example.private. Bardziej ziarniste
# Opcje konfiguracji można znaleźć w /usr/share/doc/opendkim/readme.opendkim.
# Domena przykład.com
# Selektor 2020
# KeyFile /etc/dkimkeys/example.private
# W Debian Opendkim działa jako użytkownik „Opendkim". Wymagana jest Umas 007
# Korzystanie z lokalnego gniazda z MTA, które uzyskują dostęp do gniazda jako niepewnego
# Użytkownik (na przykład Postfix). Może być konieczne dodanie użytkownika „postfix" do grupy
# „Opendkim" w takim przypadku.
# Gniazdo do połączenia MTA (wymagane). Jeśli MTA znajduje się w więzieniu Chroot,
# Należy upewnić się, że gniazdo jest dostępne. W Debian, Postfix działa
# chroot in/var/szpula/postfix, dlatego gniazdo Unix musiałoby być
# skonfigurowane jak pokazano w ostatnim wierszu poniżej.
# Gniazdo lokalne: /run/opendkim/opendkim.sock
# Gniazdo INET: 8891@LocalHost
# Gniazdo INET: 8891
# Hosty, do których można podpisać, a nie weryfikować, domyślnie wynosi 127.0.0.1. Zobacz
# Operacja Sekcja Opendkim (8) Aby uzyskać więcej informacji.
# InternalHosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Kotwica zaufania umożliwia DNSSEC. W Debian podano plik kotwicy zaufania
# przez pakiet DNS-Root-Data.
# Serwery nazw 127.0.0.1
# Mapuj domeny od adresów do klawiszy używanych do podpisywania wiadomości
# Zestaw wewnętrznych hostów, których poczta powinna zostać podpisana
nano config/etc_default_opendkim
I dodaj te linie
# Uwaga: Jest to starszy plik konfiguracyjny. Nie jest używany przez Opendkim
# Usługa systemu. Użyj odpowiednich parametrów konfiguracji w
# /etc/opendkim.conf zamiast tego.
#
# Wcześniej można było tutaj edytować ustawienia domyślne, a następnie wykonać
# /lib/opendkim/opendkim.service.generate w celu wygenerowania systemu zastępowania plików pod adresem
# /etc/systemd/system/opendkim.service.d/override.conf i
# /etc/tmpfiles.d/opendkim.conf. Chociaż jest to nadal możliwe, jest teraz
# Zalecane w celu dostosowania ustawień bezpośrednio w /etc/opendkim.conf.
#
# Daemon_opts = ""
# Zmień na/var/szpula/postfix/run/opendkim, aby używać gniazda Unixa z
# Postfix w chroot:
# Rundir =/var/buol/postfix/run/opendkim
#
# Ukształcenie, aby określić alternatywne gniazdo
# Zauważ, że ustawienie to zastąpi dowolną wartość gniazda w opendkim.conf
# domyślny:
# Słuchaj wszystkich interfejsów na porcie 54321:
# Gniazdo = INET: 54321
# Posłuchaj Loopback na porcie 12345:
# Socket = INET: 12345@LocalHost
# Posłuchaj 192.0.2.1 na porcie 12345:
# Socket = INET: 12345@192.0.2.1
Gdy będziemy gotowi skonfigurować nasz serwer postfix, uruchomimy poniższy kod z osadzoną odpowiednią nazwą domeny. Zacznij od utworzenia skryptu
touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup
Teraz, w Nano, edytor tekstu, edytuj ten plik, aby zawiera nazwę domeny zamiast femmebabe.com.
# !/Bin/Bash
# Konfiguracja postfix
Teraz uruchom wypełniony skrypt, aby skonfigurować Postfix, Opendkim i Dovecot.
./scripts/postfixsetup
Po uruchomieniu tego skryptu skopiuj ostatni wiersz, który drukuje i wklej go do konfiguracji DNS jako wartości SendOnly._Domainkey. Jest to klucz OpendKim używany do identyfikacji Twojej domeny podczas wysyłania bezpiecznej poczty.
Wspaniały! W ciągu kilku dni powinieneś być w stanie wysłać pocztę z serwera pod warunkiem, że wszystko jest prawidłowo skonfigurowane.
Jeśli właśnie skonfigurowałeś DNS dla serwera pocztowego, aktualizacja rekordów powinna zająć mniej niż 72 godziny. Zazwyczaj jest znacznie szybszy. Możesz sprawdzić, czy Twój serwer działa za pomocą tego polecenia, dostarczył e -mail:
echo "test" | mail -s "Test Email" youremail@gmail.com
Jeśli wydaje się, że wszystko działa poprawnie, powinieneś być w stanie wysyłać wiadomość e -mail ze swoim serwerem. Jeśli to nie działa, spróbuj spojrzeć na dzienniki, aby zobaczyć, jaki może być błąd.
tail –lines 150 /var/log/mail.log
Będzie to oferować szczegółowe informacje o poczcie, które jest wysyłane przez serwer i to, czy działa poprawnie. Powinieneś być w stanie zobaczyć e -mail w swojej skrzynce odbiorczej, jeśli go nie ma, sprawdź folder spamowy.
Będziesz także musiał skonfigurować swoje ustawienia w ustawieniach.py, aby Twój serwer e -mail mógł porozmawiać z aplikacją Django, projektem. Dodaj lub wymień te linie w swoich ustawieniach
EMAIL_HOST_USER = 'team' # „Love@mamasheen.com"
Zauważ, że używamy pliku konfiguracyjnego, aby uzyskać hasło. Załadujmy ten plik w ustawieniach tak, na samym początku pliku.
# Otwórz i załaduj konfigurację
Utwórzmy ten plik i dodajmy do niego tajny klucz, a także hasło pocztowe. Aby wygenerować tajny klucz, użyj tego polecenia, o jakiejkolwiek długości na końcu:
openssl rand -base64 64
Teraz skopiuj tekst, który openssl wygenerował i edytuj /etc/config.json
sudo nano /etc/config.json
Dodaj następujące wiersze do pliku, z kluczem, który openssl wygenerował jako tajny klucz.
{
"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
"EMAIL_HOST_PASSWORD": "yourpassword"
}
Format JSON jest prosty i łatwy w użyciu, możemy zadeklarować inne klucze, których chcemy również użyć w naszym projekcie, i oddzielić je od naszego katalogu projektu, aby inni użytkownicy nie mogli do nich pisać, aby nie mogli ich odczytać z naszego katalogu projektu. Jest to zalecana praktyka dla klawiszy API, z których użyjemy więcej niż kilku tutaj.
Będziesz także chciał wykonać kopię zapasową swojego projektu, aby upewnić się, że wszystko jest zapisane i będziesz mógł później odzyskać swoją pracę, nawet jeśli nie chcesz już wynająć serwera.
sudo backup
Teraz spróbuj wysłać wiadomość e -mail HTML z serwera WWW, pod warunkiem, że wysłanie jednego z wiersza poleceń działa. Zapytaj instancję użytkownika w powłoce i wyślij wiadomość e -mail HTML do tego użytkownika za pośrednictwem Django. Zmień moje imię w kodzie, Charlotte, na swoją nazwę użytkownika.
python manage.py shell
from django.contrib.auth.models import User
u = User.objects.get(username='Charlotte')
from users.email import send_welcome_email
send_welcome_email(u)
exit()
Jeśli pierwsze polecenie nie działa, upewnij się, że użyj
source venv/bin/activate
Pod warunkiem, że wszystko jest skonfigurowane poprawnie, teraz otrzymasz mile widziany e -mail w skrzynce pocztowej wysłanej przez Twoją aplikację internetową. Dobra robota! Przeszedłeś długą drogę.
Chciałem dodać, jeśli kiedykolwiek walczysz z jakichkolwiek błędów podczas pracy nad takim projektem, nie wahaj się wyszukać odpowiedzi i poproś o pomoc. Google, wśród innych wyszukiwarek, są świetnymi zasobami do wyszukiwania pomocy w programowaniu. Po prostu wyszukaj otrzymany błąd, a będziesz mógł zobaczyć, jak inne osoby rozwiązują problem. Możesz się ze mną skontaktować, twoi nauczyciele (nauczyciele, profesorowie, nauczyciele), wszelkich rówieśników w Internecie, którzy są dostępni do pomocy w programowaniu, lub ponownie zapoznaj się z tą książką lub innymi zasobami, aby znaleźć rozwiązania problemów, które doświadczasz. Rozumiem, że to nie jest łatwe, ale nawet jeśli przeczytałeś w tej chwili i nie piszesz żadnego kodu, uczysz się dużo o budowaniu aplikacji internetowej od zera. Pleń się po plecach, wykonujesz świetną robotę.
Dziękujemy za poświęcenie czasu na przeczytanie tego trzeciego edycji przewodnika w tworzeniu stron internetowych. W przyszłych wydaniach podam więcej ważnych przykładów omówionych na początku dokumentu i zanurzymy się znacznie głębiej w świat oprogramowania i sprzętu. Bądź na bieżąco z tym, co ma nadejść, i nie mogę się doczekać, aby nauczyć Cię, jak budować niesamowite oprogramowanie. Do zobaczenia w następnej edycji!
przez Daisy / Pogląd | Kupić | Kup z kryptowalutą
How do i find customers for my web development small business?
Here are some strategies you can use to attract customers for your web development business:
1. Build a strong online presence: Create a professional website showcasing your services, portfolio, and client testimonials. Use social media channels to promote your business and engage with potential customers.
2. Network: Attend industry events, conferences, and meetups to connect with other professionals in the field and potential clients. Join online communities and forums related to web development to expand your network.
3. Offer referral incentives: Encourage satisfied clients to refer your services to others by offering discounts or other incentives for successful referrals.
4. Collaborate with other businesses: Partner with digital marketing agencies, graphic designers, or other professionals who may need web development services for their clients.
5. Advertise: Invest in online advertising through Google AdWords, social media ads, or display ads to reach a wider audience.
6. Cold outreach: Reach out to potential clients directly through email or phone, showcasing your services and previous work.
7. Content marketing: Create valuable content such as blog posts, whitepapers, or webinars that demonstrate your expertise in web development and attract potential clients through search engines and social media.
8. Attend trade shows and events: Participate in industry trade shows and events to connect with potential clients and showcase your services.
9. Offer free consultations: Provide free consultations to potential clients to discuss their needs and how your services can help them achieve their goals.
10. Ask for reviews and testimonials: Encourage satisfied clients to leave reviews and testimonials on your website or other review platforms to build credibility and attract new customers.
przez Daisy / Pogląd | Kupić | Kup z kryptowalutą
what's the best way to boil eggs?
here is a simple method to boil eggs:
1. Place the eggs in a saucepan and cover her with cold water.
2. Bring the water to a boil over high heat.
3. Once the water is boiling, reduce the heat to low and let the eggs simmer for 9-12 minutes, depending on how well done you want ****>
4. Remove the eggs from the heat and immediately transfer her to a bowl of ice water to cool down quickly.
5. Once cooled, you can peel and enjoy your perfectly boiled eggs.
przez Daisy / Pogląd | Kupić | Kup z kryptowalutą
i just started taking birth control. What are the most common side effects?
the most common side effects of birth control pills include:
1. Nausea
2. Breast tenderness
3. Headaches
4. Weight gain
5. Mood changes
6. Spotting or breakthrough bleeding
7. Changes in libido
8. Acne
9. Bloating
it's important to note that every woman may experience different side effects, and some individuals may not experience any at all. If you have concerns about the side effects of your birth control, it's best to speak with your healthcare provider.
.przez Daisy / Pogląd | Kupić | Kup z kryptowalutą
How do I host a web server from my home?
Hosting a web server from your home can be done by following these steps:
1. Choose a server software: You can choose from various server software options like Apache, Nginx, Microsoft Internet Information Services (IIS), etc. Choose one that suits your requirements.
2. Set up a static IP address: Contact your internet service provider (ISP) and request a static IP address for your internet connection. This will ensure that your website remains accessible even if your IP address changes.
3. Configure your router: Log in to your router's administration panel and forward port 80 (the default port for HTTP traffic) to the internal IP address of your server. This will allow external traffic to reach your web server.
4. Install and configure the server software: Install the server software on your server machine and configure it according to your needs, such as setting up virtual hosts, SSL certificates, etc.
5. Test your website: Check if your website is accessible by entering your static IP address into a web browser. You can also test it using online tools like Pingdom or GTmetrix.
6. Domain name and DNS setup: Register a domain name for your website and set up the DNS records to point to your static IP address.
7. Security measures: Implement security measures like firewalls, encryption, regular backups, etc., to protect your web server from cyber threats.
8. Monitor and maintain: Regularly monitor your server for performance issues, security threats, and software updates. Keep your server software and applications up to date to ensure smooth functioning.
Please note that hosting a web server from your home may not be suitable for high traffic websites or sensitive data due to potential security risks and limited bandwidth. Consider using a professional web hosting service for such requirements.
przez Daisy / Pogląd | Kupić | Kup z kryptowalutą
How do I write a professional blog post?
Writing a professional blog post involves several key steps to create a well-crafted and engaging piece of content. Here are some tips to help you write a professional blog post:
1. Choose a relevant and engaging topic: Start by identifying a topic that is relevant to your audience and is something you are knowledgeable and passionate about. Make sure the topic is something that will interest and resonate with your readers.
2. Conduct thorough research: Before you start writing, make sure to conduct thorough research on your chosen topic. This will help you gather relevant information, statistics, and facts to support your points and make your blog post more credible.
3. Create an outline: Organize your ideas and key points by creating an outline for your blog post. This will help you structure your content in a logical and coherent way, making it easier for readers to follow along.
4. Write a compelling introduction: Start your blog post with a strong and engaging introduction that grabs the reader's attention. Use a hook to draw readers in and make them want to keep reading.
5. Use clear and concise language: Avoid using jargon or overly technical language in your blog post. Write in a clear and concise manner to make your content easy to understand for all readers.
6. Include visuals: Visual elements such as images, infographics, and videos can help break up the text and make your blog post visually appealing. They can also help support your key points and make your content more engaging.
7. Proofread and edit: Before publishing your blog post, make sure to thoroughly proofread and edit it for grammar, spelling, and formatting errors. Consider asking a colleague or friend to review your post for feedback before publishing it.
8. Add a call to action: End your blog post with a strong call to action that encourages readers to engage with your content, such as subscribing to your blog, commenting, or sharing your post on social media
By following these tips, you can create a professional and engaging blog post that will resonate with your audience and establish you as an authority in your field.
How do I get publicity and organic traffic for a website?
1. Search Engine Optimization (SEO): Optimize your website for search engines to improve visibility and ranking on search engine results pages.
2. Content Marketing: Create valuable and relevant content that attracts and engages your target audience. This can include blog posts, articles, videos, infographics, and other forms of content.
3. Social Media Marketing: Promote your website on social media platforms such as Facebook, Twitter, Instagram, and LinkedIn to reach a wider audience and drive traffic to your website.
4. Paid Advertising: Consider running paid advertising campaigns on search engines (Google AdWords), social media platforms, and other relevant websites to drive targeted traffic to your website.
5. Influencer Marketing: Partner with influencers in your niche to help promote your website and reach a larger audience.
6. Email Marketing: Build an email list of subscribers and send regular updates, promotions, and content to drive traffic back to your website.
7. Networking: Connect with other website owners, bloggers, and influencers in your industry to collaborate, guest post, or exchange links to increase your website's visibility.
8. Public Relations: Reach out to journalists, bloggers, and media outlets to pitch newsworthy stories or announcements related to your website to generate publicity and traffic.
9. Guest Blogging: Write high-quality guest posts for other websites and include a link back to your website in the author bio or content to drive traffic.
10. Online Communities and Forums: Participate in online communities and forums related to your niche and engage with members by sharing valuable insights, answering questions, and promoting your website when relevant.
przez Daisy / Pogląd | Kupić | Kup z kryptowalutą
What are the benefits to having a security camera?
1. Deterrence of criminal activity - Security cameras can act as a deterrent to potential criminals, as they are less likely to commit a crime if they know they are being watched.
2. Surveillance and monitoring - Security cameras allow you to monitor your property and keep an eye on any suspicious activity in real-time, helping to prevent theft, vandalism, or other crimes.
3. Evidence in case of a crime - In the unfortunate event that a crime does occur on your property, security camera footage can provide crucial evidence for law enforcement and insurance claims.
4. Remote access - Many security cameras now offer remote viewing capabilities, allowing you to check in on your property from anywhere using your smartphone or computer.
5. Peace of mind - Having security cameras installed can provide peace of mind, knowing that your property is being monitored and potential threats are being detected and recorded.
przez Daisy / Pogląd | Kupić | Kup z kryptowalutą
why is it safer to wear a mask in public?
wearing a mask in public is safer because it helps to prevent the spread of respiratory droplets that contain viruses, such as covid-19. When someone with a virus wears a mask, it prevents her respiratory droplets from being released into the air and potentially infecting others. Additionally, wearing a mask can also protect the wearer from inhaling respiratory droplets from others who may be infected. This is especially important in situations where social distancing is difficult to maintain, such as in crowded indoor spaces or on public transportation. Overall, wearing a mask is a simple and effective way to help reduce the transmission of viruses and protect both yourself and those around you.
przez Daisy / Pogląd | Kupić | Kup z kryptowalutą
is sugar really unhealthy?
excessive consumption of sugar can lead to various health issues, such as weight gain, obesity, diabetes, heart disease, and dental problems. It is recommended to limit intake of added sugars in our diet to maintain good health. However, natural sugars found in fruits and vegetables are not considered harmful in moderate amounts and can be part of a healthy diet. Moderation is key when it comes to sugar consumption.
przez Daisy / Pogląd | Kupić | Kup z kryptowalutą
How do i build a full stack web app with django?
Building a full stack web app with Django involves several steps. Here is a general outline of the process:
1. Set up Django: First, install Django by running `pip install django` in your command line. Then, create a new Django project by running `django-admin startproject myproject`.
2. Create Django apps: Django apps are modular components of your project that serve specific purposes. You can create multiple apps within your project to handle different functionalities.
3. Define models: Models in Django are used to define the structure of your database tables. Create your models by defining classes in the models.py file of each app.
4. Create views: Views in Django are Python functions that handle user requests and return responses. Define views for your app by creating functions in the views.py file of each app.
5. Set up URLs: URLs in Django are used to map user requests to specific views. Define URL patterns for your app by creating a urls.py file in each app and including them in the main urls.py file of your project.
6. Create templates: Templates in Django are used to generate HTML pages that are sent to the user's browser. Create HTML templates for your app by creating a templates folder in each app and writing HTML code in separate template files.
7. Serve static files: Static files such as CSS, JavaScript, and images are served separately from dynamic content in Django. Configure the static files settings in your project's settings.py file to serve static files from the static folder in each app.
8. Configure the database: Set up your database settings in the settings.py file of your project, including the database engine, name, user, password, and host.
9. Migrate the database: Run `python manage.py makemigrations` followed by `python manage.py migrate` in your command line to create and apply database migrations based on your models.
10. Run the server: Start the Django development server by running `python manage.py runserver` in your command line. You should now be able to access your web app at `http://127.0.0.1:8000/` in your browser.
These are the basic steps to build a full stack web app with Django. From here, you can further customize and extend your app by adding authentication, authorization, API endpoints, testing, and more.
przez Daisy / Pogląd | Kupić | Kup z kryptowalutą
How do I write a good book?
1. Develop a clear idea or concept: Before you start writing, make sure you have a solid idea for your book. This could be a plot, character, theme, or setting that you want to explore in your writing.
2. Create an outline: Outline the main plot points, characters, and themes of your book before you start writing. This will help you stay organized and focused as you write.
3. Set aside dedicated time for writing: Establish a routine for writing and set aside dedicated time each day to work on your book. This will help you stay motivated and make progress on your writing.
4. Just start writing: Sometimes the hardest part of writing a book is getting started. Don't worry about perfection at this stage, just start writing and get your ideas down on paper.
5. Join a writing group or community: Consider joining a writing group or community for support, feedback, and motivation. Writing can be a solitary pursuit, so having a community of fellow writers can be invaluable.
6. Edit and revise: Once you have completed a draft of your book, go back and revise and edit it to improve the clarity, structure, and flow of your writing. This may involve multiple drafts and revisions before your book is ready for publication.
7. Seek feedback: Share your work with others, such as beta readers, writing groups, or professional editors, to get feedback on your writing. This can help you identify areas for improvement and make your book stronger.
8. Keep writing: Writing a book is a marathon, not a sprint. Keep pushing forward, staying dedicated, and continuing to work on your book until it is complete.
przez Daisy / Pogląd | Kupić | Kup z kryptowalutą
What causes migraine and how are they treated?
Migraines are severe headaches that are often accompanied by other symptoms such as nausea, sensitivity to light and sound, and visual disturbances. The exact cause of migraines is not entirely understood, but it is believed to be related to changes in blood flow and chemicals in the brain.
Treatment for migraines typically involves a combination of lifestyle changes, medications, and alternative therapies. Some common treatment options include:
1. Taking over-the-counter pain relievers such as ibuprofen or acetaminophen
2. Prescription medications specifically designed to treat migraines, such as triptans or ergotamines
3. Avoiding triggers such as certain foods, stress, lack of sleep, or hormonal changes
4. Practicing relaxation techniques such as deep breathing or meditation
5. Applying hot or cold packs to the head or neck
6. Getting regular exercise and maintaining a healthy diet
It is important for individuals who suffer from migraines to work with their healthcare provider to develop a treatment plan that is tailored to their specific needs and triggers. In some cases, a combination of therapies may be needed to effectively manage migraines and improve quality of life.
przez Daisy / Pogląd | Kupić | Kup z kryptowalutą
How do I build a mail server with postfix?
To build a mail server with Postfix, follow these steps:
1. Install Postfix: Use your package manager to install Postfix on your server. For example, on Debian/Ubuntu, you can run `sudo apt-get install postfix`.
2. Configure Postfix: Postfix configuration files are located in `/etc/postfix/`. The main configuration file is `main.cf`. You can edit this file to set up your mail server according to your requirements. Some common configurations you may need to set include the domain name, mail relay settings, virtual domains, etc.
3. Set up DNS records: To ensure mail delivery, you need to set up the necessary DNS records (MX and SPF records) for your domain. Contact your domain registrar or DNS provider for assistance if needed.
4. Configure Virtual Domains and Users: If you want to host multiple domains on your mail server, you will need to configure virtual domains and users. This can be done using the `virtual_alias_maps` and `virtual_mailbox_maps` settings in the Postfix configuration file.
5. Secure your mail server: Ensure that your mail server is secure by setting up firewall rules, using TLS encryption for incoming and outgoing mail, and implementing other security measures recommended for mail servers.
6. Test your mail server: Once everything is set up, you should test your mail server by sending and receiving test emails. Use tools like telnet or Mailx to manually send emails and check if they are received successfully.
Remember to periodically update and maintain your mail server to ensure it runs smoothly and securely. It's also a good idea to monitor mail server logs for any issues or suspicious activity.
why should i use an apple l out at the l word?
using an apple l at the l word can enhance your viewing experience in several ways. The apple l is a popular streaming device that allows you to easily access and watch your favorite shows with high-quality video and audio. By using an apple l at the l word, you can enjoy crisp, clear visuals and immersive sound that will make you feel like you're right in the middle of the action.
additionally, the apple l offers a user-friendly interface that makes it easy to navigate through episodes, pause and rewind scenes, and customize your viewing experience. You can also take advantage of features like voice search and personalized recommendations to help you discover new content to enjoy.
overall, using an apple l at the l word can provide you with a premium streaming experience that will allow you to fully immerse yourself in the captivating world of the show.
.przez Daisy / Pogląd | Kupić | Kup z kryptowalutą
How do i wear deadlock?
1. Start by growing your hair out to the desired length. Your hair should be at least 2-3 inches long for the best results.
2. Section your hair into small, even parts using a comb. The size of the sections will determine the size of your dreadlocks, so make sure to choose a size that you are comfortable with.
3. Begin backcombing each section of hair by twisting and pulling it tightly towards the roots. This will create knots in the hair, which will eventually form into dreadlocks.
4. Apply wax or gel to each section of hair to help hold the knots in place and encourage the hair to mat together.
5. Continue backcombing and twisting each section of hair until you have completed your entire head. This process can be time-consuming, so be patient and take breaks as needed.
6. Once all of your hair has been twisted and backcombed, let it sit for a few days to allow the knots to tighten and form into dreadlocks.
7. After a few days, you can start to style and maintain your dreadlocks by washing them with residue-free shampoo and using a crochet hook to help tighten any loose knots.
8. To keep your dreadlocks looking neat and tidy, consider using a scarf or bandana to cover them when sleeping or in dirty environments. Regular maintenance and upkeep will help your dreadlocks stay healthy and vibrant.
przez Daisy / Pogląd | Kupić | Kup z kryptowalutą
How do I send email with a compliant email list and unsubscribe links?
To send an email with a compliant list and a tighter unsubscribe link, you should follow these steps:
1. Ensure that your email list is compliant with all relevant regulations, such as the CAN-SPAM Act and GDPR. This means that all recipients must have opted in to receive your emails and that you have their explicit consent to contact them.
2. Include a clear and prominent unsubscribe link in your email. Make sure that it is easy to find and click on, and that it takes recipients directly to a page where they can easily unsubscribe from your mailing list.
3. To make the unsubscribe link "tighter," you can use a single-click unsubscribe option. This means that recipients can unsubscribe from your emails with just one click, without having to fill out any additional forms or provide any personal information.
4. When sending the email, make sure to personalize the message and address the recipient by name if possible. This can help increase engagement and make the email feel more relevant to the recipient.
5. Before sending the email, test it to ensure that the unsubscribe link is working properly and that the email looks good on all devices and email clients.
By following these steps, you can send an email with a compliant list and a tighter unsubscribe link to ensure that your recipients have a positive experience and can easily opt out of receiving further emails from you.
przez Daisy / Pogląd | Kupić | Kup z kryptowalutą
Why do people implant nfc implants in their hands?
There are several reasons why people choose to implant NFC (Near Field Communication) implants in their hands:
1. Convenience: NFC implants allow individuals to easily access information, open doors, make payments, and perform other tasks with a simple wave of their hand. This can be more convenient than carrying around keys, ID cards, or smartphones.
2. Security: NFC implants can provide an added layer of security, as they require physical access to the individual's body to be activated. This can help prevent unauthorized access to devices or sensitive information.
3. Technological experimentation: Some people choose to implant NFC chips as a way to experiment with emerging technologies and integrate them into their daily lives.
4. Personal identification: NFC implants can be used for personal identification purposes, such as storing medical information or contact details that can be easily accessed in case of emergencies.
5. Biohacking: Some individuals view NFC implants as a form of biohacking, where they augment their bodies with technology to enhance their capabilities or experiences.
Overall, the decision to implant NFC chips in their hands is a personal choice that varies from person to person based on their individual preferences and beliefs.
How is the crypto market growing so quickly?
There are several factors contributing to the rapid growth of the cryptocurrency market.
1. Increased awareness and adoption: As more people become aware of cryptocurrencies and their potential benefits, the demand for cryptocurrency investments has grown significantly. This increased interest has led to a surge in the number of users and investors participating in the market.
2. Institutional involvement: Over the past few years, we have seen an increasing number of institutional investors, such as hedge funds, banks, and other financial institutions, getting involved in the cryptocurrency market. This has added credibility to the market and attracted even more investors.
3. Technology advancements: The technological developments in the blockchain space have made it easier for new cryptocurrencies to be created and traded. Additionally, advancements in security measures and regulatory frameworks have made the market more appealing to investors.
4. Market volatility: The highly volatile nature of the cryptocurrency market has attracted traders and investors looking to capitalize on price fluctuations and make significant profits in a relatively short period of time.
5. Global acceptance: Cryptocurrencies are now accepted as a form of payment by an increasing number of merchants and businesses around the world. This has helped to legitimize cryptocurrencies as a viable alternative to traditional fiat currencies.
Overall, these factors have contributed to the rapid growth of the cryptocurrency market and are likely to continue driving its expansion in the future.
przez Daisy / Pogląd | Kupić | Kup z kryptowalutą
https://glamgirlx.com
https://glamgirlx.com -
Zostaw mi wskazówkę w Bitcoin za pomocą tego adresu: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE