Postavljanje Django aplikacije na internet

Lekcija 9 od 9 · Python web: Django projekat

Aplikacija radi na tvom računaru; sada je postavljamo na server da bi je svi koristili. Pokazujemo dva besplatna načina – Render (PostgreSQL, automatsko ažuriranje sa GitHub-a) i PythonAnywhere (najjednostavniji, SQLite) – i šta mora da se promeni u projektu pre objave.

Pre nego što počneš: potrebno predznanje – čuvanje logoa, objavljivanje statičkog sajta.
Kako da učiš: radi u svom projektu korak po korak i posle svake lekcije proveri da li server radi; zadatak na kraju prvo uradi sam/a. Kod je za Django 5.2 (LTS) i Python 3.12+; svaki deo upiši u fajl naveden u komentaru na vrhu primera.

Šta je drugačije na serveru

Razvoj (tvoj računar)Server
pokreće aplikacijurunserverGunicorn (WSGI server)
statički fajloviDjango ih sam služicollectstatic + WhiteNoise
bazaSQLite fajlPostgreSQL (Render) ili SQLite (PythonAnywhere)
DEBUGTrueFalse
tajneu settings.pypromenljive okruženja
Heroku: prva verzija projekta je postavljena na Heroku. Heroku od novembra 2022. nema besplatan paket, pa za školske projekte koristimo platforme ispod. Uslovi besplatnih paketa se menjaju – pre početka proveri ih na sajtu platforme.

Priprema projekta

pip install gunicorn whitenoise dj-database-url "psycopg[binary]"
pip freeze > requirements.txt
# logo_kreator/settings.py – podešavanja za rad na internetu
# dodaj NA KRAJ fajla; postojeće SECRET_KEY, DEBUG, ALLOWED_HOSTS i DATABASES iz gornjeg dela obriši
import os
import dj_database_url

SECRET_KEY = os.environ.get("SECRET_KEY", "samo-za-razvoj-promeni-me")   # na serveru: promenljiva okruženja
DEBUG = os.environ.get("DEBUG", "0") == "1"                              # na serveru isključeno

ALLOWED_HOSTS = ["localhost", "127.0.0.1"]
RENDER_HOST = os.environ.get("RENDER_EXTERNAL_HOSTNAME")                 # Render ga sam postavlja
if RENDER_HOST:
    ALLOWED_HOSTS.append(RENDER_HOST)
    CSRF_TRUSTED_ORIGINS = [f"https://{RENDER_HOST}"]

# WhiteNoise služi statičke fajlove (CSS, JS, slike) bez posebnog servera
MIDDLEWARE.insert(1, "whitenoise.middleware.WhiteNoiseMiddleware")      # odmah posle SecurityMiddleware
STATIC_ROOT = BASE_DIR / "staticfiles"
STORAGES = {
    "default": {"BACKEND": "django.core.files.storage.FileSystemStorage"},
    "staticfiles": {"BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage"},
}

# baza: na serveru iz DATABASE_URL (PostgreSQL), kod kuće SQLite
DATABASES = {
    "default": dj_database_url.config(default=f"sqlite:///{BASE_DIR / 'db.sqlite3'}", conn_max_age=600)
}

Napravi i fajl build.sh u korenu projekta – komande koje Render izvrši pri svakom postavljanju:

#!/usr/bin/env bash
# build.sh – Render ga pokreće pri svakom postavljanju
set -o errexit                       # prekini na prvoj grešci
pip install -r requirements.txt
python manage.py collectstatic --no-input
python manage.py migrate

collectstatic skupi CSS, JS i slike svih aplikacija (i admin panela) u folder staticfiles, odakle ih služi WhiteNoise. Proveri lokalno: python manage.py check --deploy nabraja bezbednosna podešavanja koja nedostaju.

Render korak po korak

  1. Postavi projekat na GitHub (bez .venv i db.sqlite3 – vidi .gitignore iz lekcije 2).
  2. Na render.com napravi nalog i New → PostgreSQL → ime logo-kreator-baza → Free. Kopiraj Internal Database URL.
  3. New → Web Service → poveži GitHub repozitorijum.
  4. Runtime: Python, Build Command: bash build.sh, Start Command: gunicorn logo_kreator.wsgi.
  5. Environment → dodaj promenljive: DATABASE_URL (adresa baze iz koraka 2), SECRET_KEY (dugačak slučajan niz – Render ima dugme Generate), PYTHON_VERSION (npr. 3.13.1).
  6. Create Web Service – posle nekoliko minuta aplikacija je na https://logo-kreator.onrender.com (ime zavisi od tvog servisa).
  7. Administrator na serveru: u kartici Shell servisa pokreni python manage.py createsuperuser.

Svaki novi git push na GitHub automatski ponovo postavlja aplikaciju. Besplatan servis „zaspi“ posle neaktivnosti, pa prvo otvaranje traje i do minut.

PythonAnywhere – najjednostavnije

PythonAnywhere je dobar izbor za prvi put: ima besplatan nalog, Python je već instaliran, a baza može ostati SQLite.

  1. Napravi besplatan nalog (Beginner).
  2. U Consoles → Bash: git clone tvog repozitorijuma, napravi .venv i pip install -r requirements.txt.
  3. Web → Add a new web app → Manual configuration → izaberi verziju Python-a; u podešavanju upiši putanju do .venv i izmeni WSGI fajl da učitava logo_kreator.settings.
  4. U Static files poveži /static/ sa folderom staticfiles i pokreni python manage.py collectstatic i migrate.
  5. U ALLOWED_HOSTS dodaj korisnicko-ime.pythonanywhere.com i klikni Reload.

Detaljno uputstvo za Django je u njihovoj dokumentaciji.

Najčešće greške posle postavljanja

SimptomUzrok i rešenje
DisallowedHost / Bad Request (400)domen nije u ALLOWED_HOSTS
strana bez CSS-a, admin bez stilanije pokrenut collectstatic ili nije dodat WhiteNoise
CSRF verification failed pri prijavinedostaje CSRF_TRUSTED_ORIGINS sa https:// adresom
Server Error (500)pogledaj Logs na platformi; često zaboravljena migracija ili promenljiva okruženja
no such table / relation does not existna serveru nije pokrenut migrate

Video: postavljanje na Heroku (prva verzija)

Napomena uz video: Heroku više nema besplatan paket. Video pokazuje isti tok (GitHub → platforma → promenljive okruženja → baza), pa pomaže da razumeš korake, ali za projekat prati uputstvo za Render ili PythonAnywhere sa ove strane.

Zadaci za vežbu

Za svaki zadatak postoji primer, uputstvo i rešenje.

ZADATAK 01Težina: lako

Lista pre objave

Pre postavljanja proveri projekat: python manage.py check --deploy, python manage.py test, da li je requirements.txt ažuran i da li .gitignore isključuje .venv, db.sqlite3 i staticfiles. Zapiši šta si morao/la da ispraviš.

Česte greške i saveti
  • Nikad ne postavljaj projekat sa DEBUG = True i tajnim ključem u kodu.
  • Posle izmene modela, migracije moraju biti u repozitorijumu – server ih samo primenjuje (migrate), ne pravi ih.
  • Fajlove koje korisnici otpremaju (slike) besplatni servisi ne čuvaju trajno – Logo kreator zato čuva podatke o logou u bazi, a sliku crta iz njih.

Proveri znanje

Otvori kviz

Postavljanje na internet

1. Koji program pokreće Django aplikaciju na serveru umesto runserver-a?




2. Šta radi python manage.py collectstatic?




3. Gde se na serveru čuva SECRET_KEY?