Server compact pentru aplicații Django. Metode de instalare Django

Ansamblul pachetului are crucial pentru implementarea cu succes a unui proiect open source. O parte cheie a construirii corecte este controlul versiunilor. Deoarece proiectul este open source, este posibil să doriți să publicați pachetul pentru a profita din plin de comunitatea open source. Diferite platforme sau limbi au mecanisme diferite de construire a pachetelor, dar acest articol se concentrează în mod special pe Python și ecosistemul său de construire a pachetelor. Articolul discută mecanismele de construire a pachetelor care oferă baza dezvoltării și oferă suficiente exemple pentru a începe imediat.

De ce este atât de important să construiți pachete?

Pe lângă faptul că este doar o formă bună, există alte trei motive practice pentru livrarea software-ului sub formă de pachete:

  • ușurință în utilizare;
  • stabilitate (cu control al versiunii);
  • răspândirea.

Atunci când alegeți o aplicație, ușurința instalării este unul dintre cele mai importante considerații pentru utilizatori, așa că acest proces ar trebui simplificat cât mai mult posibil. Construirea pachetelor face software-ul mai accesibil și mai ușor de instalat. Dacă instalarea este ușoară, va fi mai ușor pentru utilizatori să înceapă cu software-ul dvs. Puteți crește disponibilitatea pachetului dvs. atunci când îl publicați în Python Package Index (PyPI) folosind utilitare precum pip sau easy_install . (Vezi pentru Informații suplimentare conform acestor mijloace.)

În plus, versiunea pachetului permite utilizatorilor să-și „blocheze” proiectele care utilizează software-ul dvs. la o anumită versiune a acestuia. De exemplu, fixarea versiunii Pinax 0.9a2.dev1017 ar arăta astfel:

Pinax==0.9a2.dev1017

Acest lucru va forța proiectul să se conecteze la versiunea Pinax 0.9a2.dev1017.

Controlul versiunilor oferă o mai bună rezistență la modificările viitoare ale software-ului, care pot duce la conflicte de interfață. Drept urmare, utilizatorii dvs. știu exact ce primesc și le este mai ușor să țină evidența diferențelor dintre versiuni. În plus, dezvoltatorii de proiecte știu exact la ce lucrează.

Cea mai populară metodă de publicare a pachetelor pe PyPI (sau propriul server de distribuție) este crearea unei distribuții cod sursă pentru descărcare gratuită. Distribuția codului sursă este mod standard construirea codului proiectului dvs. ca modul redistribuibil. De asemenea, este posibil să se creeze distribuții binare, dar în scopuri utilizare deschisă are sens să distribuiți și codul dvs. Prin crearea de distribuții de cod sursă, le faceți mai ușor pentru utilizatori să găsească software pe Internet folosind instrumente automate, precum și să îl descarce și să îl instaleze. Acest proces ajută nu numai la dezvoltare sisteme locale, dar și în implementarea software-ului dvs.

Așadar, facilitând integrarea și instalarea software-ului pentru utilizatori, folosind un control eficient al versiunilor care oferă metode fiabile de fixare a versiunilor și publicând pachetele pentru o distribuție mai largă, creșteți șansele ca proiectul dvs. să aibă succes și să câștige o acceptare mai largă. Fă-ți codul disponibil mai pe scară largă poate duce la contribuția mai multor persoane la cod, care este obiectivul fiecărui dezvoltator open source.

Anatomia unui fișier setup.py

Unul dintre scopurile script-ului setup.py este să vă ambalați software-ul și să îl încărcați pe serverele dvs. de distribuție. Puteți găsi scripturi setup.py cu conținut variat în diferite depozite Python populare. Acest articol le discută pe cele principale. Consultați secțiunea pentru mai multe informații.

Fișierul setup.py poate fi folosit în diverse scopuri, dar mai jos vă oferim o variantă care vă permite să rulați următoarele comenzi:

python setup.py înregistrare python setup.py sdist încărcare

Prima comandă, register , preia informațiile date de funcția setup.py setup() și creează o intrare PyPI pentru pachetul dvs. Nu descarcă nimic, ci creează metadate despre proiectul tău, astfel încât ulterior să poți încărca și găzdui propriile versiuni ale software-ului. Următoarele două comenzi sunt legate: sdist upload creează o distribuție de cod sursă și apoi o încarcă în PyPI. Cu toate acestea, există mai multe conditiile necesare, cum ar fi configurarea propriului fișier de configurare.pypirc și scrierea de fapt a conținutului în fișierul setup.py.

În primul rând, configurați fișierul .pypirc. Ar trebui să fie localizat în directorul principal, care poate fi diferit în funcție de sistemul de operare pe care îl utilizați. În sălile de operație sisteme UNIX®, Linux® și Mac OS X, puteți accesa acest director tastând cd ~/ . Conținutul fișierului ar trebui să includă acreditările dvs. PyPI, așa cum se arată în.

Listare 1. Exemplu de fișier .pypirc
index-servers = nume utilizator pypi:xxxxxxxxxxxx parola:xxxxxxxxxxxxx

Apoi, mergeți la PyPI și înregistrați-vă pentru a crea un cont (nu vă faceți griji, este gratuit). Introduceți același nume de utilizator și parolă ca în fișierul .pypirc din directorul PyPI și asigurați-vă că fișierul este numit exact ~/.pypirc.

Acum, când scrieți scriptul setup.py, trebuie să decideți ce va fi afișat pe pagina de index PyPI și să decideți asupra unui nume de proiect. Să începem prin a copia șablonul pentru setup.py pe care îl folosesc pentru proiecte (vezi). Omite importurile și funcțiile, aruncă o privire în partea de jos a șablonului și gândește-te la ceea ce trebuie să schimbi în funcție de specificul proiectului tău. Consultați linkul către scriptul complet.

Lista 2. șablon setup.py
PACKAGE = "" NAME = "" DESCRIPTION = "" AUTHOR = "" AUTHOR_EMAIL = "" URL = "" VERSION = __import__(PACKAGE).__version__ setup(name=NAME, version=VERSION, description=DESCRIPTION, long_description=read( „README.rst”), autor=AUTHOR, author_email=AUTHOR_EMAIL, licență="BSD", url=URL, packages=find_packages(exclude=["teste.*", "teste"]), package_data=find_package_data(PACKAGE, only_in_packages=False), clasificatori=[ „Starea dezvoltării:: 3 - Alpha”, „Mediu:: Mediu web”, „Publicul vizat:: Dezvoltatori”, „Licență:: Aprobat OSI:: Licență BSD”, „Sistem de operare: : Independent OS”, „Limbaj de programare:: Python”, „Framework:: Django”, ], zip_safe=False,)

În primul rând, rețineți că acest șablon presupune că aveți două fișiere diferite în proiect. Primul este folosit pentru o descriere lungă (long_description). Citește conținutul fișierului README.rst, aflat în același director ca setup.py și transmite acest conținut ca șir la parametrul long_description. Acest fișier se umple pagina de destinațieîn PyPI, deci este indicat să cedezi în el scurtă descriere proiect și dați mai multe exemple de utilizare a acestuia. Al doilea fișier este fișierul pachet __init__.py. Nu intrăm în detaliu aici, dar când linia care definește variabila VERSION vă importă pachetul, Python necesită un fișier __init__.py, așa că ar trebui să definiți o variabilă numită __version__ în acest modul. Deocamdată este suficient să scriem asta ca o linie:

# __init__.py __version__ = „0.1”

Acum să aruncăm o privire la parametrii inițiali rămași.

  • PACHET- Asta Pachetul Pythonîn proiectul tău. Acesta este folderul de nivel superior care conține modulul __init__.py, care ar trebui să fie în același director cu fișierul setup.py, de exemplu: /- |- README.rst |- setup.py |- câini |- __init__.py |- catcher.py

    Deci, în în acest caz, pachetul tău va fi câini.

  • Parametru NUME este de obicei similar sau identic cu numele pachetului PACKAGE, dar puteți utiliza orice nume în funcție de preferințele dvs. NAME este parametrul prin care utilizatorii se vor referi la software-ul dvs., numele cu care software-ul dvs. va apărea în PyPI și, mai important, prin care utilizatorii îl vor instala (de exemplu, pip install NAME).
  • DESCRIERE— o scurtă descriere a proiectului dumneavoastră. O singură propoziție va fi suficientă.
  • AUTORŞi AUTHOR_EMAIL- acesta este respectiv: numele și adresa dvs. de e-mail. Aceste informații sunt opționale, dar este o bună practică să includeți adresa dvs. de e-mail pentru utilizatorii care doresc să vă contacteze cu întrebări despre proiect.
  • URL este adresa URL a proiectului. Acest parametru poate fi site-ul web al proiectului sau depozitul Github sau orice altă adresă URL. Aceste informații sunt, de asemenea, opționale.

Poate doriți să includeți termeni și calificative ale licenței. Pentru mai multe informații despre crearea fișierului setup.py, consultați documentația Python. (Cm. .)

Gestionarea versiunilor

Versiunea este un subiect larg în sine, dar trebuie menționat în contextul construirii pachetului, deoarece nu se poate face montaj corect pachete fără o versiune adecvată. Versiunea este o formă de comunicare cu utilizatorii dvs. și, de asemenea, poate ajuta utilizatorii să creeze aplicații mai stabile și mai fiabile. Cu controlul versiunilor, vă informați utilizatorii despre modificările efectuateși indicați domeniul exact în care au fost efectuate aceste modificări.

Standardul pentru versiunea pachetelor Python poate fi găsit în PEP-386 (Python Evolution Proposal) (vezi .) Acesta oferă reguli de bază. Chiar dacă nu ați citit, înțeles sau chiar nu ați fost de acord cu PEP, este totuși înțelept să respectați regulile acestuia, deoarece acestea sunt din ce în ce mai folosite de dezvoltatori atunci când creează aplicații Python.

În plus, versiunea nu este necesară doar pentru dezvoltarea versiunilor stabile încărcate în PyPI, ci este utilă și pentru dezvoltarea versiunilor cu sufixe. devNN. În general, este descurajat să găzduiți versiuni de dezvoltare pe PyPI, dar le puteți face disponibile public prin configurarea propriului server de distribuție public (sau privat). În acest caz, utilizatorii care doresc să utilizeze cea mai recentă versiune pot specifica acest lucru în fișierul pip requirements.txt. Mai jos sunt câteva exemple de versiuni:

1.0.1 # 1.0.1 versiunea finală 1.0.2a # 1.0.2 Alpha (pentru Alpha, după lansările Dev) 1.0.2a.dev5 # 1.0.2 Alpha, versiunea Dev #5

Publicare

Utilizatorii nu vor putea găsi și instala software-ul dvs. decât dacă îl publicați. De obicei, pachetele sunt publicate în PyPI. Configurați fișierul dvs. de configurare .pypirc și trecând comanda de încărcare la setup.py, veți împinge pachetul la PyPI. De regulă, această operație este efectuată împreună cu crearea unei distribuții de cod sursă:

python setup.py sdist upload

Dacă utilizați propriul dvs. server de distribuție, adăugați o secțiune de autorizare în fișierul dvs. .pypirc pentru această nouă locație și conectați-vă la acesta când încărcați:

python setup.py sdist upload -r mydist

Configurarea propriului server de distribuție

Motivul principal pentru a folosi propriul server de distribuție pentru proiecte open source este necesitatea de a publica versiuni de dezvoltare, deoarece PyPI poate conține doar aplicații stabile. De exemplu, ați putea dori să:

pip install MyPackage

Instalați cea mai recentă versiune stabilă în PyPI. Dar dacă mai târziu adăugați versiuni de dezvoltare, această comandă va opri execuția și va instala cea mai recentă versiune, adică versiunea de dezvoltare. Ca regulă generală, este o idee bună să atribuiți întotdeauna proiectele unei anumite versiuni, dar nu toți utilizatorii fac acest lucru. Prin urmare, ar trebui să vă asigurați că, dacă nu este specificat un număr de versiune, cea mai recentă versiune stabilă este returnată în mod implicit.

O modalitate de a ucide două păsări dintr-o singură piatră (furnizează doar versiuni stabile A utiliza pip în mod implicit și a permite utilizatorilor să instaleze pachete de dezvoltare) înseamnă să vă creați propriul server de distribuție. Proiectul Pinax folosește această tehnologie pentru toate versiunile sale de dezvoltare la http://dist.pinaxproject.com. (Cm. .)

Un server de distribuție este un director care rulează prin HTTP și oferă acces la fișierele de pe serverul dvs. Trebuie să aibă următoarele structura fișierului:

/index-name/package-name/package-name-version.tar.gz

În viitor, dacă se dorește, serverul poate fi privat prin configurarea Basic-Auth pe serverul dvs. Web. De asemenea, puteți adăuga alte mijloace pentru a descărca distribuțiile sursă. Pentru a face acest lucru, trebuie să adăugați codul de control al încărcării, să analizați numele fișierului și să creați căi de director care ar corespunde diagramei de mai sus. Această structură este adoptată pentru proiectele Pinax care utilizează mai multe depozite.

pip și virtualenv

Deși acest articol se concentrează în primul rând pe construirea de pachete, pentru a recunoaște beneficiile pe care construirea pachetelor și versiunea le oferă utilizatorilor dvs., această secțiune descrie utilizarea pachetelor.

Instrumentul pip poate fi instalat direct, totuși recomand să îl utilizați ca parte a funcționalității virtualenv. (Vezi .) De asemenea, recomand să folosești virtualenv ori de câte ori ai de-a face cu Python, deoarece păstrează mediul Python neaglomerat. Așa cum o mașină virtuală vă permite să rulați mai multe sisteme de operare în același timp, virtualenv vă permite să rulați mai multe medii Python în același timp. Nu instalez nimic pe sistemul meu Python, ci pur și simplu creez un nou mediu virtual pentru fiecare proiect sau utilitar nou la care lucrez.

Acum că instrumentul virtualenv este instalat, puteți juca puțin:

$ mkvirtualenv -no-site-packages testing $ pip install Pinax $ pip freeze|grep Pinax $ pip uninstall Pinax $ pip install -extra-index-url=http://dist.pinaxproject.com/fresh-start/ Pinax== 0.9a2.dev1017 $ pip freeze|grep Pinax

Vă rugăm să rețineți că prima instalare pip este descărcată și instalată din PyPI. Comanda pip freeze listează toate versiunile de pachete instalate în virtualenv actual. Comanda pip uninstall face exact ceea ce spune numele său: se îndepărtează singur din virtualenv. Apoi instalăm versiunea de dezvoltare din depozitul de repornire la http://dist.pinaxproject.com pentru a obține versiunea de dezvoltare a lui Pinax 0.9a2.dev1017.

Nu este nevoie să accesați site-ul web, să descărcați tarball-uri sau să creați coduri de link-uri simbolice către directorul site-packages. (Am mai făcut acest lucru și a cauzat o mulțime de probleme.) Utilizatorii dvs. obțin toate acestea de la ambalarea bună, publicarea și versiunea proiectului generat.

Concluzie

Sper că materialul prezentat în acest articol este suficient pentru a începe. Această secțiune oferă link-uri către documentație care vă poate ajuta să înțelegeți mai bine problemele menționate. Dacă aveți întrebări, accesați Freenode și căutați-mă în zonele de chat precum #pinax și #django-social (sub mâna „paltman”) sau pe Twitter (@paltman).

pip install Django==2.1.7

Opțiunea 2: obțineți candidatul pentru lansare pentru 2.2

pip install --pre django

Opțiunea 3: Obțineți cea mai recentă versiune de dezvoltare

Cea mai recentă și mai bună versiune Django este cea care se află în depozitul nostru Git (sistemul nostru de control al reviziilor). Acest lucru este doar pentru utilizatorii experimentați care doresc să încerce modificările primite și să ajute la identificarea erorilor înainte de o lansare oficială. Obțineți-l folosind această comandă shell, care necesită Git:

git clone https://github.com/django/django.git

Informații suplimentare

Pentru cei nerăbdători:

  • Ultima lansare:
    Sume de control:
    Note de lansare:
  • Previzualizarea lansării:
    Sume de control:
    Note de lansare:

Care versiune este mai buna?

Îmbunătățim Django aproape în fiecare zi și ne pricepem destul de bine la păstrarea stabilă a codului. Astfel, utilizarea celui mai recent cod de dezvoltare este o modalitate sigură și ușoară de a obține acces la funcții noi pe măsură ce sunt adăugate. Dacă alegeți să urmați versiunea de dezvoltare, rețineți că vor exista ocazional modificări incompatibile cu înapoi. Veți dori să acordați o atenție deosebită comitărilor urmărind Django pe GitHub sau abonându-vă la django-updates .

Dacă doar căutați o țintă stabilă de implementare și nu vă deranjează aşteptând la următoarea ediție, veți dori să rămâneți cu cea mai recentă versiune oficială (care va include întotdeauna note detaliate despre orice modificări pe care va trebui să le faceți în timp ce faceți upgrade).

Lansări anterioare

  • Django 2.0.13:
    Sume de control:
    Note de lansare:
  • Django 1.11.20 (LTS):
    Sume de control:
    Note de lansare:

Această notă este o continuare a articolului despre scrierea unui bot telegram, în care voi încerca să acopăr cât mai detaliat subiectul implementării unei aplicații Django cu drepturi depline, deși mici, într-un mediu de producție pe Linux OS, Ubuntu 14.04 LTS. Până la sfârșitul articolului, vom avea un robot telegram cu drepturi depline care se rotește pe web și va primi comenzi de la utilizatorii acestui messenger.

Ce veți învăța după ce citiți nota:

  • Implementați o aplicație Django (sau oricare WSGI aplicație) găzduită de Digital Ocean într-un mediu Linux
  • Lucrați cu servere web nginxși gunicorn
  • Gestionați procesele folosind utilitarul de supraveghere
  • Configurați virtualenv folosind pyenv
  • Lansați automat aplicația web chiar și după repornirea serverului

În septembrie 2015, am organizat o întâlnire Python în Almaty, unde am vorbit cu . În timpul discuției, am descris pe scurt ecosistemul web Python și am oferit o scurtă prezentare generală a instrumentelor populare. Din păcate, formatul de întâlnire nu prevedea o analiză detaliată a subiectului, așa că nou-veniți în această zonă trebuie de obicei să sape mai departe singuri. Astăzi voi încerca să umple acest gol și să aprofundez puțin mai mult în subiectul „fierbinte” al implementării aplicațiilor web în Python. În ciuda faptului că articolul se va concentra pe o aplicație Django, rețetele descrise vor fi relevante și pentru alte proiecte web dezvoltate în Python folosind cadre compatibile WSGI (Flask, Bottle, Pyramid, Falcon, web2py și așa mai departe).

În această notă, voi implementa găzduirea virtuală de la Digital Ocean. Dacă vă înregistrați folosind acest link, atunci după confirmarea detaliilor dvs. de plată, contul dvs. va fi reîncărcat imediat cu 10 USD, pe care îi puteți cheltui pentru crearea de mici picături (servere virtuale) și exersați implementarea proiectelor web în Python. Vă spun imediat că nu trebuie să faceți totul pe o mașină de la distanță și, în general, să utilizați un furnizor de găzduire, vă puteți descurca cu o mașină virtuală locală, de exemplu, folosind VirtualBox (dar în acest caz va fi imposibil pentru a instala un webhook).

Crearea unui server virtual

După cum am menționat mai devreme, vom realiza implementarea pe unul dintre serverele virtuale DigitalOcean cu API-ul său puternic :)

Creați o picătură făcând clic pe „Creare droplet” în colțul din dreapta sus al panoului de control:

Noi alegem cel mai mult tarif minim pentru 5 USD pe lună cu sala de operație sistem Ubuntu 04.14.4 LTS la bordul viitoarei mașini virtuale.

Aproape întotdeauna aleg Frankfurt ca centru de date, deoarece am cel mai bun ping la el. După completarea tuturor câmpurilor obligatorii, faceți clic pe butonul „Creați”. Picătura este creată în 60 de secunde, după care toate informațiile despre noua mașină virtuală necesare accesului sunt trimise la e-mail: adresa IP, login și parolă.

Configurare server

Actualizarea pachetelor:

# apt-get update # apt-get -y upgrade

# adduser django # adduser django sudo

Conectați-vă cu un utilizator nou django către server și toate celelalte comenzi sunt executate de sub acest utilizator.
Instalăm arsenalul necesar pentru configurarea unui mediu virtual prin Pyenv și asamblarea ultima versiune Python (2.7.11).

$ sudo apt-get install -y build-essential $ sudo apt-get install -y python-dev libreadline-dev libbz2-dev libssl-dev libsqlite3-dev libxslt1-dev libxml2-dev $ sudo apt-get install -y git

După aceea, instalăm Pyenv în sine. Puteți citi mai multe despre ce este Pyenv și despre cum să-l configurați:
Instalați cea mai recentă versiune de Python (Python 2.7.11):

$ pyenv install 2.7.11 Se descarcă Python-2.7.11.tgz... -> https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz Se instalează Python-2.7.11 ... Python-2.7.11 instalat pe /home/django/.pyenv/versions/2.7.11

Comanda va dura ceva timp pentru a se finaliza (scriptul va descărca Python și îl va compila din sursă). Instalând un interpret Python separat, nu afectăm în niciun fel funcționarea celui de sistem, în plus, cea mai recentă versiune LTS a Ubuntu (14.04) folosește versiunea 2.7.6, în care există o serie de vulnerabilități grave, inclusiv o eroare cu SSL și, de asemenea, nu are suport pentru TLS 1.2

Clonăm depozitul cu proiectul Django:

$ cd ~ $ git clone https://github.com/adilkhash/planetpython_telegrambot.git $ cd planetpython_telegrambot/

$ pyenv virtualenv 2.7.11 telegram_bot $ pyenv local telegram_bot

Instalăm dependențe folosind managerul de pachete pip.

Pip install -r requirements.txt

Aplicația Django scrisă în prima parte a suferit modificări minore. În special, am transferat părțile modificabile ale codului într-un fișier special .env folosind biblioteca django-environ. Puteți vizualiza modificările folosind acest link.

Creați un fișier .env din șablon și completați setările necesare.

$ cd blog_telegram && mv .env-template .env && vi .env

În special, trebuie să schimbați modul DEBUG în False, să înregistrați un token pentru Botul Telegramși specificați o gazdă suplimentară separată prin virgule în ALLOWED_HOSTS. În cazul meu, ALLOWED_HOSTS arată astfel:

ALLOWED_HOSTS=127.0.0.1,bot.site

Adică am creat un subdomeniu suplimentar pe care va rula botul Telegram.

Configurarea unui certificat SSL

În articolul anterior, am scris că atunci când folosești apelul API setWehook, gazda trebuie să aibă un certificat SSL valid (Telegram permite și utilizarea certificatelor autosemnate). Vom crea certificatul prin serviciul gratuit de emitere a certificatelor SSL Let's Encrypt.

$ cd ~ && git clone https://github.com/letsencrypt/letsencrypt $ cd letsencrypt/ $ ./letsencrypt-auto certonly --standalone -d bot.site

Va trebui să specificați unele setări și să fiți de acord cu termenii și condițiile. După executarea cu succes a comenzilor, certificatele vor fi localizate în /etc/letsencrypt/live/bot.site/

Configurarea Nginx

Acum este timpul să instalăm popularul server HTTP nginx, care în cazul nostru va acționa ca un proxy (primiți solicitări de la clienți și transmiteți-le în continuare urmând instrucțiunile din fișierul de configurare).

$ sudo apt-get install -y nginx $ cd /etc/nginx/sites-available/ $ sudo nano telegram_bot.conf

Completați fișier nou telegram_bot.conf cu următorul conținut:

Server ( ascultă 80; ascultă 443 ssl; nume_server bot..site/fullchain.pem; cheie_certificat ssl /etc/letsencrypt/live/bot..pem; locație / ( proxy_set_header Gazdă $http_host; proxy_redirect dezactivat; proxy_set_header X-Forwarded-Forwarded proxy_add_x_forwarded_for proxy_set_header X-Real-IP $remote_addr X-Scheme;

AVERTISMENT: Nu uitați să înlocuiți gazda bot.site pe cont propriu.

Înregistrăm noua noastră configurație în setările nginxși reporniți-l pentru ca modificările să aibă efect:

$ cd /etc/nginx/sites-enabled/ $ sudo ln -s ../sites-available/telegram_bot.conf telegram_bot.conf $ sudo service nginx restart

Ce tocmai am făcut?

  • Am înregistrat un certificat SSL valid pentru site-ul nostru web
  • Toate cererile care ajung la gazdă vor fi trimise prin proxy către viitoarea noastră aplicație Django, care, la rândul ei, ar trebui să ruleze pe portul 8001.
  • Transmitem anteturi HTTP suplimentare în fiecare solicitare (gazdă, adresa IP a clientului, schema https/http și așa mai departe). Puteți citi mai multe despre setările nginx.

Pentru a verifica succesul setărilor noastre, puteți rula aplicația django prin serverul de testare cu comanda runserver pe portul 8001 și mergeți la site:

$ cd ~/planetpython_telegrambot/ $ python manage.py runserver 8001

Deschide browserul și vezi (l-am deschis imediat prin https):

URL Nu a fost găsit acest lucru este normal, deoarece avem doar o adresă URL validă pentru munca directă din Telegram - /planet/bot/ / (fără a lua în calcul setările de administrator Django).

Configurarea Gunicorn prin Supervisor

Este timpul să începeți configurarea unui server HTTP pregătit pentru producție Gunicorn, care, de altfel, este scris în întregime în Limbajul Pythonși sa dovedit bine în luptă reală (apropo, în toate proiectele „live” folosesc această combinație specială: nginx+gunicorn)

Ce este Supervizorul?

Supraveghetor Acesta este un utilitar de gestionare a proceselor. „Monitorizează starea de sănătate” a proceselor tale demoni și, dacă acestea cad, încearcă să le ridice din nou. Dacă în timpul operațiunii Gunicorn „cade” ( eroare de sistem, faza greșită a lunii și așa mai departe), Supervizorul încearcă să o „ridică” din nou, astfel încât performanța site-ului să nu sufere. Apropo, am de gând să scriu o scurtă notă despre acest utilitar, ca să zic așa, Supervisor Advanced Usage. Este de remarcat faptul că toate procesele care rulează în Supervisor trebuie să ruleze în modul prim-plan, astfel încât utilitarul să înțeleagă când ceva nu merge conform planului.

Mai întâi, să creăm un fișier de configurare pentru a rula Gunicorn în Supervisor. Conținutul său arată astfel:

Command=/home/django/.pyenv/versions/telegram_bot/bin/gunicorn blog_telegram.wsgi:application -b 127.0.0.1:8001 -w 1 --timeout=60 --graceful-timeout=60 --max-requests= 1024 directory=/home/django/planetpython_telegrambot/ user=django redirect_stderr=True stdout_logfile=/tmp/gunicorn.log stderr_logfile=/tmp/gunicorn_err.log autostart=true autorestart=true startsecs=10 stopwaits=991 priority=s

Salvați fișierul sub numele gunicorn.conf ( ~/planetpython_telegrambot/gunicorn.conf). Apropo, Gunicorn este inclus în dependențele proiectului nostru ( cerințe.txt) și din moment ce l-am instalat deja în mediul nostru, atunci află calea fișier executabil puteți rula comanda în interiorul mediului virtual activat (activarea are loc automat când mergeți în directorul aplicației web din cauza prezenței unui fișier acolo .python-versiune creat prin pyenv local):

$pyenv care gunicorn

Conținutul fișierului de configurare pentru supervisord:

File=/tmp/telgram_bot_supervisord.sock logfile=/tmp/telgram_bot_supervisord.log logfile_maxbytes=50MB logfile_backups=10 loglevel=info pidfile=/tmp/telgram_bot_supervisord.pid nodaemon=false minfds=1024 minprocvisor_supervisors. : make_main_rpcinterface serverurl=unix:///tmp/telgram_bot_supervisord.sock files = /home/django/planetpython_telegrambot/gunicorn.conf

Salvați în ~/planetpython_telegrambot/supervisord.conf

$superd

Lansarea ar trebui să continue fără erori. Pentru a afla starea proceselor curente, rulați utilitarul supervisorctl:

$ supervisorctl gunicorn RUNNING pid 20901, uptime 0:04:18 supervisor>

Pentru a obține ajutor, puteți rula comanda help. Și pentru a obține informații despre comandă - ajutor. De exemplu:

Supraveghetor> ajuta la oprire Oprire oprire Oprire proces:* Opriți toate procesele dintr-un grup oprire Opriți procese multiple sau grupuri opri toate Opriți supervizorul tuturor proceselor>

După lansarea cu succes a Supervisor, site-ul ar trebui să fie disponibil online.

Pornire automată a aplicației web la repornire

Ce se va întâmpla dacă noastre server virtual reporniți brusc? (o defecțiune în centrul de date, probleme la mașina gazdă, un administrator strâmb încurcat etc.). În cazul unui astfel de scenariu, acum aplicația noastră nu va porni automat. Pentru a remedia acest lucru, trebuie să depunem un pic mai mult efort pentru a scrie un mic script, pe care îl vom plasa cu succes în mecanismul de pornire al sistemului de operare Ubuntu (distribuții asemănătoare Debian).

Ați auzit vreodată despre așa-numitele fișiere parvenite? Este scrierea unuia dintre ei pe care acum o vom face. Apropo, în acest moment Upstart este considerat învechit în noile versiuni ale sistemului de operare Bazat pe Linux planificat tranziție completă pe systemd.

Descriere „Supervizor Botul Telegram handler de pornire a aplicației django" pornire la nivelul de rulare oprire la nivelul de rulare [!2345] respawn setuid django setgid django chdir /home/django/planetpython_telegrambot/ exec /home/django/.pyenv/versions/telegram_bot/bin/supervisord

Dosarul trebuie introdus în /etc/init/(în cazul meu i-am dat numele telegram_bot.conf). Dacă anterior toate lansările nu au cauzat probleme, atunci după repornirea sistemului, aplicația va fi lansată automat:

$ sudo shutdown -r acum

Acum trebuie să ne înregistrăm adresa URL pe partea Telegram folosind apelul API setWebhook:

Import telepot bot_token = "BOT_TOKEN" bot = telepot.Bot(bot_token) bot.setWebhook ("https://bot..format(bot_token=bot_token))

Aceasta completează configurarea botului. Trimiterea comenzilor către botul nostru @PythonPlanetBotși obținem răspunsuri adecvate :)

  • înregistrarea cererilor de la utilizatori într-un fișier
  • a făcut setări modificabile (mod de depanare, simbol bot, cheie secretă) V variabile de mediu prin fișiere .env folosind django-environ
  • au adăugat șabloane de fișiere de configurare pentru gunicorn, nginx și supervizor

În acest ghid, ne vom uita la principalele greșeli pe care le fac dezvoltatorii Django și vom învăța cum să le evităm. Articolul poate fi chiar util dezvoltatori experimentați, pentru că fac și greșeli precum suportul fiind prea greu setări mari sau conflicte de nume în resurse statice.

Django - web gratuit sursă deschisă Un cadru Python care ajută la rezolvarea problemelor comune de dezvoltare. Vă permite să creați aplicații flexibile, bine structurate. Django are multe caracteristici moderne din cutie. De exemplu, pentru mine, funcții precum Admin, Object Relational Mapping (ORM), Routing și Templating fac din Django prima mea alegere atunci când aleg un set de instrumente de dezvoltare. Crearea unei aplicații necesită mult efort și, deși îmi place ceea ce fac, ca orice dezvoltator, vreau să petrec cât mai puțin timp posibil pe sarcini de rutină. Django ajută foarte mult în acest sens, fără a vă obliga să sacrificați flexibilitatea aplicației.

Caracteristica ucigașă a Django este o interfață de administrare puternică, configurabilă, care este generată automat (automagie?) pe baza schemei modelului și modelelor de administrare. Chiar te simți ca un vrăjitor. Folosind interfața Admin, utilizatorul poate configura multe lucruri, inclusiv o listă de control al accesului (ACL), permisiuni și acțiuni la nivel de rând, filtre, comenzi, widget-uri, formulare, asistență URL suplimentară și multe altele. Cred că fiecare aplicație are nevoie de un panou de administrare. Este doar o chestiune de timp până când aplicația dvs. principală are nevoie de un astfel de panou. În Django este creat rapid și convenabil.

Django are, de asemenea, un ORM puternic care funcționează cu toate bazele de date majore din cutie. Este „leneș”: spre deosebire de alte ORM-uri, accesează baza de date doar după cum este necesar. Are suport pentru instrucțiuni SQL de bază (și funcții) pe care le puteți utiliza din codul sursă Python, împreună cu toate celelalte caracteristici ale limbajului.
Django are un motor de șabloane foarte flexibil și puternic. Sunt disponibile multe filtre și etichete standard și, de asemenea, vă puteți crea propriile filtre. Django acceptă alte motoare precum șabloane personalizate, oferă un API pentru o integrare ușoară cu alte motoare prin funcții standard de comenzi rapide pentru procesarea șabloanelor.

Cadrul are multe alte caracteristici importante, cum ar fi un router URL, care analizează cererile primite și generează URL-uri noi pe baza schemei de rutare. În general, Django este o plăcere de utilizat și, atunci când aveți nevoie de ajutor, citiți documentația.

Greșeala #1: Utilizarea mediului global Python pentru dependențe de proiect

Nu utilizați mediul global Python pentru dependențele proiectului dvs. deoarece poate provoca conflicte de dependență. Python nu poate funcționa cu mai multe versiuni de pachete în același timp. Aceasta devine o problemă dacă proiecte diferite au nevoie de versiuni diferite, incompatibile ale aceluiași pachet.

De obicei, această greșeală este făcută de către nou-veniți la dezvoltarea Python și Django care nu sunt conștienți de caracteristicile de izolare ale mediului Python.

Există multe modalități de a izola mediul, cele mai comune sunt:

  • virtualenv: pachet Python care generează folderul de mediu. Conține un script pentru (de)activarea mediului și gestionarea pachetelor instalate în acesta. Aceasta este metoda mea preferată și cea mai ușoară. De obicei creez un mediu apropiat de folderul proiectului.
  • virtualenvwrapper: Un pachet Python care instalează global și oferă acces la un set de instrumente pentru crearea/ștergerea/activarea mediilor virtuale etc. Toate mediile sunt stocate într-un singur folder (pot fi suprascrise folosind variabila WORKON_HOME). Nu văd niciun avantaj în utilizarea virtualenvwrapper în loc de virtualenv .
  • Mașini virtuale: Nu există o izolare mai bună decât o întreagă mașină virtuală dedicată aplicației dvs. Există o mulțime de instrumente disponibile, cum ar fi VirtualBox (gratuit), VMware, Parallels și Proxmox (preferatul meu, există o versiune gratuită). Atunci când este combinată cu un instrument de automatizare a mașinii virtuale precum Vagrant, aceasta poate fi o soluție foarte puternică.
  • Containere: În ultimii ani, am folosit Docker în aproape fiecare proiect, mai ales în proiecte noi pornind de la zero. Docker este un instrument incredibil cu o mulțime de funcții. Există o mulțime de opțiuni disponibile pentru a-l automatiza. instrumente de la terți. Docker are stocarea în cache a straturilor, care permite recrearea extrem de rapidă a containerelor. În ele folosesc un mediu global Python deoarece fiecare container are propriul său sistem de fișiere și proiectele sunt izolate la un nivel înalt. Docker permite noilor membri ai echipei să înceapă mai repede un proiect, mai ales dacă au experiență cu tehnologia.

Greșeala #2: lipsesc legăturile de dependență în requirements.txt

Fiecare proiect Python nou trebuie să înceapă cu un fișier requirements.txt și un nou sandbox. De obicei, ați folosi pip/easy_install pentru a instala toate pachetele, fără a uita requirements.txt . De obicei mai ușor ( Pot fi, mai corect) implementează proiecte pe servere sau pe mașinile membrilor echipei.

De asemenea, este important să faceți în fișierul requirements.txt legare(pin) versiuni specifice ale dependențelor dvs. De obicei versiuni diferite pachetele oferă module, funcții și parametri de funcționare diferiți. Chiar și în versiunile minore, modificările dependenței pot fi de așa natură încât să vă distrugă pachetul. Aceasta este o problemă foarte serioasă dacă aveți un proiect live și intenționați să-l implementați în mod regulat, deoarece fără controlul versiunilor sistemul dvs. de compilare va instala întotdeauna cea mai recentă versiune disponibilă a pachetului.

În producție, executați întotdeauna legarea pachetelor! Folosesc un instrument foarte bun pentru asta, pip-tools. Oferă un set de comenzi pentru a ajuta la gestionarea dependențelor. Instrumentul generează automat requirements.txt , care conține nu doar dependențele dvs., ci întregul arbore, adică dependențele dependențelor dvs.

Uneori trebuie să actualizați unele pachete din lista de dependențe (de exemplu, doar un cadru sau un utilitar). Dacă recurgeți la pip freeze, nu știți ce dependențe sunt folosite de ce pachete și, prin urmare, nu le puteți actualiza. Instrumentul pip-tools conectează automat pachetele în funcție de dependențele pe care le legați și, astfel, decide automat ce pachete trebuie actualizate. Și datorită comentariilor folosite în requirements.txt, știți întotdeauna ce pachet provine din ce dependență.

Dacă ești și mai atent, poți face o copie de rezervă fișierele sursă dependențele tale. Stocați o copie în sistemul dvs. de fișiere, folderul Git, folderul S3, FTP, SFTP - oriunde o aveți la îndemână. Există situații în care eliminarea unui pachet relativ mic rupe un număr mare de pachete în npm. Pip vă permite să descărcați toate dependențele necesare ca fișiere sursă. Citiți mai multe despre acest lucru rulând pip help download .

Greșeala nr. 3: Folosirea funcțiilor Python de modă veche în loc de Vizualizări bazate pe clasă

Uneori este logic să utilizați funcții Python mici în fișierul views.py al aplicației dvs., în special pentru vizualizările de testare sau utilitare. Dar, de obicei, aplicațiile trebuie să utilizeze Vizualizări bazate pe clasă (CBV).

CBV-urile sunt vederi cu scop general care oferă clase abstracte care implementează sarcini comune de dezvoltare web. CBV-urile sunt create de profesioniști și acoperă cele mai căutate comportamente. Au un API frumos structurat, iar CBV vă va oferi oportunitatea de a vă bucura de toate beneficiile OOP. Codul dvs. va fi mai curat și mai lizibil. Uitați de necazul utilizării funcțiilor standard de vizualizare Django pentru crearea de liste, operațiuni CRUD, procesare formulare etc. Puteți pur și simplu să extindeți CBV-ul adecvat pentru vizualizarea dvs. și să suprascrieți funcțiile sau proprietățile clasei care configurează comportamentul vizualizării (de obicei, funcția returnează o proprietate și îi puteți adăuga orice logică care vă poate transforma codul în spaghete dacă utilizați funcții de vizualizare în loc de CBV).

De exemplu, puteți utiliza diferite mix-uri în proiectul dvs. care redefinesc principalele modele de comportament CBV: crearea de contexte de vizualizare, verificarea autorizației la nivel de rând, crearea automată a căilor de șablon pe baza structurilor aplicației, integrarea caching-ului inteligent și multe altele.

  • Tutorial

Introducere

Mulți dezvoltatori web începători se gândesc unde să-și plaseze creația. De obicei, mașinile care rulează sisteme de tip *NIX sunt utilizate în aceste scopuri. Alegerea mea s-a stabilit pe Raspberry PI deoarece raspberry:
  • rulează Linux cu drepturi depline,
  • Stă pe masă mult timp și adună praful.
Vreau să vorbesc despre cum să configurați un server care rulează într-o rețea cu o adresă IP externă dinamică. Această soluție nu este potrivită pentru lansarea de proiecte mari, dar pentru demonstrarea portofoliului și a utilizării personale este destul de potrivită.

Vom avea nevoie

  1. Raspberry PI model B, B+ sau Raspberry PI 2 (deoarece plăcile acestor modele au Ethernet) cu Raspbian instalat și un server SSH activat. Puteți citi despre configurare sau. Pe lângă Raspian, există un număr mare de distribuții alternative pentru Raspberry. Aici, după cum se spune, „există ceva pentru orice gust și culoare”.
  2. Aplicație Django funcțională.
  3. Router cu suport DDNS. Acest element nu este necesar, deoarece DDNS poate fi configurat pe zmeura în sine.
Voi lucra cu o zmeură model B+.

Pregătirea

Raspbian 7.8 este instalat pe zmeură.
Mai întâi trebuie să găsiți o zmeură în rețea pentru a vă conecta la ea prin ssh.
nmap -sP 192.168.1.1/24 | grep zmeura

În cazul meu, în rețea sunt două zmeură, dintre care una este a mea cu adresa IP 192.168.1.100. Pe unele rețele, nmap nu apare nume de rețele dispozitive.


În acest caz, puteți găsi raspberry pi după adresa MAC, care are prefixul B8:27:EB.
sudo nmap -sP -n 192.168.1.1/24 | grep -B 2 B8:27:EB


Opțiunea -B pentru grep specifică câte linii precedente trebuie tipărite.

Ne conectăm la Raspberry prin ssh.
ssh [email protected]


Mai întâi, să overclockăm zmeura la 1 GHz folosind raspi-config.
Instalarea managerului de pachete Python
sudo apt-get install python-pip

Să trecem la instalare pachetele necesare. Aplicația mea web folosește SGBD MySQL. Nginx și gunicorn sunt folosite ca Frontend și, respectiv, Backend.
sudo apt-get install nginx gunicorn mysql-client mysql-server python-mysqldb


În curs instalare mysql trebuie să introduceți date pentru utilizatorul root al SGBD. python-mysqldb- driver necesar atunci când lucrați cu modele în Django. Vom instala Django din depozitele Python.
sudo pip install django

La momentul scrierii, versiunile actuale de nginx și gunicorn din depozitele pentru Raspberry sunt 1.2.1 și, respectiv, 0.14.5. Versiunea MySQL pentru Raspberry 5.5. De asemenea, trebuie să instalați SciPy pentru a lucra cu Django.
sudo apt-get install python-scipy

Nginx 1.2.1 este învechit. Unul mai nou poate fi compilat din surse. Gunicorn proaspăt poate fi instalat din depozitele Python.

Configurare server

Am plasat aplicația web pe Raspberry (de exemplu, în /home/pi).
Dacă aveți configurații de lucru, atunci copiați-le în directoarele corespunzătoare:
  • pentru nginx /etc/nginx/sites-enabled/
  • pentru gunicorn /etc/gunicorn.d/
Nu este nimic complicat cu nginx. Aș dori să fiu atent la setările pentru gunicorn.
CONFIG = ( "mod": "wsgi", "working_dir": "/home/pi/project", #"working_dir": "/home/pi/project/project", "user": "www-data", "group": "www-data", "python": "/usr/bin/python", "args": ("--bind=127.0.0.1:8081", "--workers=5", # 5 suficient pentru zmeură "--graceful-timeout=60", "--timeout=60", #"--debug", #"wsgi:application", "project.wsgi",), )

Dacă working_dir (calea către fișierul wsgy.py) este specificată ca „/home/pi/project/project” și în args specificați „wsgi:application” , atunci pe Raspberry lucrătorii încep mai întâi, apoi mor fără a specifica un motiv ( sub Ubuntu, de exemplu, gunicorn funcționează cu ambele setări).

Migrare MySQL

O descărcare a unei baze de date existente poate fi făcută folosind utilitarul mysqldump.
mysqldump -u root -p dbname > dbname.sql

Fișierul rezultat constă dintr-un set de instrucțiuni SQL care restaurează structura, precum și informațiile stocate în baza de date.


Creăm o bază de date pe Malinka. Lansați shell-ul mysql.
mysql -u root -p

Adăuga noua baza date.
mysql> creați baza de date dbname set de caractere utf8 collate utf8_general_ci; mysql> acordă toate privilegiile pe dbname.* la someusr@localhost identificat prin „somepassword”;
Recuperarea datelor dintr-un depozit. Cu o dimensiune dump de 162 MB, timpul de recuperare a fost de aproximativ 10 minute.
mysql -u root -p dbname< dbname.sql

Trebuie remarcat faptul că este mai bine să stocați bazele de date pe stocare externă, altfel cardul micro SD poate deveni rapid inutilizabil din cauza operațiunilor frecvente de înregistrare. Puteți citi cum să faceți acest lucru. Configurația mysql se află la /etc/mysql/my.cnf

Examinare

Reporniți nginx și gunicorn. Dacă totul este configurat corect, puteți deschide pagina principală.


Să trecem la testarea încărcării. Să instalăm apache benchmark.
sudo apt-get install apache2-utils

Să testăm Raspberry PI model B+ în 4 fire cu 1000 de solicitări.
ab -c 4 -n 1000 http://192.168.1.100/

Vladislav@vladislav-N53SV:~$ ab -c 4 -n 1000 http://192.168.1.100/ Acesta este ApacheBench, Versiunea 2.3<$Revision: 1528965 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licențiat la Apache Software Foundation, http://www.apache.org/ Benchmarking 192.168.1.100 (aveți răbdare) S-au finalizat 100 de solicitări S-au finalizat 200 de solicitări S-au finalizat 300 de solicitări S-au finalizat 400 de solicitări S-au finalizat 500 de solicitări S-au finalizat 600 de solicitări S-au finalizat 700 de solicitări S-au finalizat 800 de solicitări S-au finalizat 900 de solicitări S-au finalizat 1000 de solicitări Terminat 1000 de solicitări Server Software: nginx/1.8.0 Server Hostname: 198.12..10 Document Server: 192..10. Lungime: 24839 octeți Nivel de concurență: 4 Timp necesar pentru teste: 1309,607 secunde Solicitări complete: 1000 Solicitări nereușite: 0 Total transferate: 25018000 octeți HTML transferat: 24839000 octeți Solicitări pe secundă: 0,76 [#an/sec] cerere 5238.429 (medie) Timp per solicitare: 1309.607 (medie, pentru toate solicitările concurente) Rata de transfer: 18,66 Timpi de conectare primite (ms) min mediu [+/-sd] median max Conectare: 0 1 0,1 1 1 Procesare: 4924 5237 291. 6419 În așteptare: 4919 5227 91,3 5217 6403 Total: 4925 5238 91,4 5228 6420 Procentul cererilor servite într-un anumit timp (ms) 50% 5228 66% 5245% 5245% 520% ​​5227 91.3 5335 98% 5382 99% 5667 100 % 6420 (cerere cea mai lungă)
Interogările sunt lente, deoarece cea mai mare parte a timpului de interogare este petrecut lucrând cu baza de date. Am primit recent un Raspberry PI 2 model B. Să vedem ce poate face cu aceleași setări și date.
vladislav@vladislav-N53SV:~$ ab -c 4 -n 1000 http://192.168.1.14/ Acesta este ApacheBench, Versiunea 2.3<$Revision: 1528965 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licențiat la Apache Software Foundation, http://www.apache.org/ Benchmarking 192.168.1.14 (aveți răbdare) S-au finalizat 100 de solicitări S-au finalizat 200 de solicitări S-au finalizat 300 de cereri S-au finalizat 400 de solicitări S-au finalizat 500 de solicitări S-au finalizat 600 de solicitări S-au finalizat 700 de solicitări S-au finalizat 800 de solicitări S-au finalizat 900 de solicitări S-au finalizat 1000 de solicitări S-au finalizat 1000 de cereri Server Software: nginx/1.8.0 Server Hostname: 192.1 Document Pa68.:1.8.1 Lungime: 24838 octeți Nivel de concurență: 4 Timp necesar pentru teste: 170,083 secunde Solicitări complete: 1000 Solicitări nereușite: 0 Total transferate: 25017000 octeți HTML transferat: 24838000 octeți Solicitări pe secundă: 5,88 [#/sec solicitare pe secundă] 680.330 (medie) Timp per solicitare: 170.083 (medie, pentru toate cererile simultane) Rata de transfer: 143,64 Timpi de conectare primite (ms) min mediu [+/-sd] median max Conectare: 0 1 0,1 1 1 Procesare: 569 678 104,6 1338 În așteptare: 567 676 104,1 647 1334 Total: 569 679 104,6 651 1338 Procentul cererilor servite într-un anumit timp (ms) 50% 651 66% 682 75% 90% 70% 90% 70% 98% 1045 99% 1138 100% 1338 (cea mai lungă solicitare)
Raspberry PI 2 procesează cererile în medie de 6,16 ori mai rapid. Dezvoltatorii Raspberry nu au înșelat.

Configurare DDNS

Puteți configura DDNS pe router sau pe zmeura în sine. Aleg No IP pentru că îl folosesc de câțiva ani. Luați în considerare utilizarea gratuită.

Înregistrarea gazdei

Dacă ai cont- trecem prin autorizatie, altfel ne inregistram. După autorizare ajungem aici.


Faceți clic pe AddHost și completați formularul.


Faceți clic pe butonul AddHost din partea de jos
Gazdă adăugată. În dreapta numelui gazdei, este afișată adresa IP externă a rețelei dvs.


Configurarea DDNS pe router
De exemplu, voi configura DDNS pe ASUS RT-N56U cu versiunea de firmware padavan 3.4.3.9-091. Deschideți pagina meniului routerului
(de exemplu 192.168.1.1). WAN->DDNS.


Selectăm serviciul no-ip.com, indicăm datele de înregistrare, precum și gazda noastră adăugată (technopark-test.ddns.net).
Restul parametrilor îi setăm la discreția noastră.


Acum, la schimbarea adresei IP externe, aplicația noastră rămâne accesibilă în rețea.
Configurarea redirecționării portului
Avem nevoie de zmeura pentru a trimite o aplicație web atunci când accesăm gazda. Routerul este angajat în redirecționarea pachetelor de intrare care au venit din exterior de la portul X la portul intern Y. În meniul routerului, accesați WAN->Port Forwarding. Este necesar să redirecționați portul extern 80 către portul 80 al zmeurului. Să adăugăm o nouă regulă și să aplicăm modificările.

Acum Raspberry procesează toate pachetele primite pe portul 80. Să verificăm introducând gazda primită în No IP în bara de adrese a browserului.


Acum, aplicația noastră web este disponibilă pentru utilizatorii de internet.
Configurarea DDNS pe Raspberry
Această opțiune nu este potrivită dacă zmeura are un IP privat, deoarece își va trimite adresa IP locală către serviciul No IP. Aceasta este o altă modalitate de a afla adresa IP a unei zmeură retea locala. Să instalăm clientul DDNS.
sudo apt-get install ddclient

În timpul instalării, trebuie să selectați un serviciu. Selectați altele și introduceți dynupdate.no-ip.com, protocol dyndns2, nume de utilizator, parolă, interfață - eth0, nume de gazdă.


Pentru a verifica, am setat intervalul de actualizare IP la 60 de secunde. În fișierul /etc/default/ddclient, trebuie să setați valoarea daemon_interval="60".

Desert

Zmeura mea stă întinsă pe masă de mult timp și adună praf, împreună cu tm1638 și, afișând citiri ale temperaturii și umidității în cameră și alte informații.
Totuși, am fost interesat să încerc să controlez Raspberry PI GPIO de la django. m-am dezvoltat web simplă o aplicație care a combinat munca mea timpurie. Vă permite să vizualizați temperatura și umiditatea măsurate folosind DHT11, unele informatii utile, controlează un modul cu 8 relee (care poate fi folosit pentru controlul aparatelor electrice) și trimite text către tm1638.

Pentru a gestiona GPIO, trebuie să rulați serverul cu drepturi root. Aceasta este o vulnerabilitate potențială.
Utilizarea completă a unei aplicații web implică rularea serverului fără drepturi de superutilizator, configurarea https, adăugarea capacității de a administra conturi, păstrarea jurnalelor, partajarea accesului la dispozitivele gestionate, rularea aparatelor electrice într-un program și multe altele.
Cu toate acestea, acesta este un articol cu ​​totul diferit.

Concluzie

Având un Raspberry PI modelele B, B+ sau Raspberry PI 2, un power bank, precum și o mufă Ethernet „deschisă”, obținem un server compact care poate fi folosit pentru a ne demonstra munca. Configurarea unui server pentru aplicațiile Django pe un Raspberry PI care rulează Raspbian nu este mult diferită de orice altă versiune Linux. Pachetele din depozite pot fi învechite. Pentru a lucra cu versiuni noi, puteți compila manual programe din sursă.
Adăugați etichete
  • Serghei Savenkov

    un fel de recenzie „scurtă”... de parcă s-ar grăbi undeva