# Getting Started Flask Py

Flask adalah framework ringan (microframework) untuk Python yang digunakan untuk membangun aplikasi dengan cepat dan sederhana.

### 1. **Instalasi Flask**

Sebelum memulai, pastikan kamu sudah menginstal Python. Kemudian, instal Flask menggunakan pip:

```
pip install flask
```

<figure><img src="https://1537830120-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fwx2jsHS2MYXinLjkOHv9%2Fuploads%2FRr82DksSX5rZOZG1kfRW%2Fimage.png?alt=media&#x26;token=3bf14df9-9640-4f12-bcba-64e8891ad29b" alt=""><figcaption></figcaption></figure>

### 2. **Membuat Aplikasi Flask Sederhana**

Buat file Python baru, misalnya `app.py`, lalu tuliskan kode berikut:

<figure><img src="https://1537830120-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fwx2jsHS2MYXinLjkOHv9%2Fuploads%2F68Ju7aQhQVHdOffHJfoE%2Fimage.png?alt=media&#x26;token=60a1612b-30fb-4837-b11d-23cba0277ec7" alt=""><figcaption></figcaption></figure>

* `Flask(__name__)` membuat instance aplikasi Flask.
* `@app.route("/")` mendefinisikan rute untuk halaman utama.
* `app.run(debug=True)` menjalankan server Flask dengan mode debug aktif.

Jalankan aplikasi dengan:

`python app.py`

Lalu buka browser dan akses `http://127.0.0.1:5000/`.

<figure><img src="https://1537830120-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fwx2jsHS2MYXinLjkOHv9%2Fuploads%2F2EQNZtTrBFHYYAnsiADI%2Fimage.png?alt=media&#x26;token=295cd9d8-6516-4d24-9004-a1405dd52fb5" alt=""><figcaption></figcaption></figure>

## 3. Routing (Menentukan Halaman)&#x20;

Tambahkan lebih banyak rute ke aplikasi:

```
@app.route('/about')
def about():
    return "Ini halaman About"
```

### 3.1 Mengatur halaman khusus untuk /about

Untuk membuat halaman khusus menggunakan HTML di Flask..

Buat Folder `templates`

Flask mencari file HTML di dalam folder `templates`, jadi buat folder ini jika belum ada.

Buat File `about.html`

Di dalam folder `templates`, buat file **`about.html`** dengan konten berikut:

```
<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>About</title>
</head>
<body>
    <h1>Ini Halaman About</h1>
    <p>Selamat datang di halaman About!</p>
</body>
</html>

```

Untuk appnya

```python
from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def home():
    return "Hello, Flask!"
    
@app.route('/about')
def about():
    return render_template('about.html')

if __name__ == "__main__":
    app.run(debug=False)

```

## 4. Static File Flask

<figure><img src="https://1537830120-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fwx2jsHS2MYXinLjkOHv9%2Fuploads%2F4tqUVdk2ZQgPX9ObikY1%2Fimage.png?alt=media&#x26;token=431bbb23-add5-4d18-8f89-26d9fae947b2" alt=""><figcaption></figcaption></figure>

***

#### **1. Buat Folder `static`**

Flask mencari file CSS di dalam folder `static`, jadi buat folder ini jika belum ada.

***

#### **2. Buat File `style.css`**

Di dalam folder `static`, buat file **`style.css`** dan tambahkan kode berikut:

```css
body {
    font-family: Arial, sans-serif;
    background-color: #f4f4f4;
    text-align: center;
    padding: 50px;
}

h1 {
    color: #333;
}

p {
    font-size: 18px;
    color: #666;
}
```

***

#### **3. Hubungkan CSS ke `about.html`**

Ubah file **`about.html`** agar menggunakan **CSS**:

```html
<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>About</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
    <h1>Ini Halaman About</h1>
    <p>Selamat datang di halaman About!</p>
</body>
</html>
```

***

#### **4. Jalankan Flask**

Jalankan aplikasi Flask seperti biasa:

```sh
python app.py
```

Kemudian buka **`http://127.0.0.1:5000/about`** dan lihat tampilan barunya dengan **CSS**.

***

💡 **Catatan:** Flask secara otomatis mencari file di dalam folder `static`, jadi gunakan `url_for('static', filename='style.css')` untuk memastikan CSS termuat dengan benar.

## 5. Routing Dinamis

Kita juga membuat route dinamis berdasarkan input dari user yang dikenal dengan **`variable-name`**

Kita tambahkan parameter dengan tipe data tertentu seperti `string, integer` dan lainnya

Misalnya kita ingin menambah nama yang dinamis maka tambahkan `route('/nama/<string:nama>')` dengan fungsi *`getnama()`* yang menggunakan parameter *`nama`*

```python
@app.route('/nama/<string:nama>')
def getnama(nama):
    return "nama anda adalah {}".format(nama)
```

&#x20;&#x20;

Tambahkan nama anda disetelah parameter `nama` dan jalankan kembali aplikasinya

<figure><img src="https://ngodingdata.com/wp-content/uploads/2021/10/image-3-1024x104.png" alt="" height="104" width="1024"><figcaption></figcaption></figure>

## 6. Variabel dalam Python Flask Framework

Di Flask, variabel dapat digunakan untuk menyimpan dan mengelola data dalam aplikasi. Variabel bisa digunakan dalam **routing**, **template HTML**, dan **view functions**. Berikut beberapa cara penggunaan variabel di Flask:

***

### **6.1. Variabel dalam Routing**

Kita bisa meneruskan variabel dalam URL dan menggunakannya di fungsi view.

#### **Contoh: Menampilkan Nama dari URL**

```python
from flask import Flask

app = Flask(__name__)

@app.route('/user/<name>')  # Variabel name diambil dari URL
def user(name):
    return f"Hello, {name}!"

if __name__ == '__main__':
    app.run(debug=True)
```

📝 **Penjelasan:**

* `<name>` adalah variabel dalam URL.
* Flask otomatis menangkap nilainya dan mengirimkan ke fungsi `user(name)`.
* Coba akses **`http://127.0.0.1:5000/user/Ali`**, maka tampil: **"Hello, Ali!"**

***

### **6.2. Variabel dengan Tipe Data dalam Routing**

Flask bisa menangani tipe data lain selain **string**, seperti **int, float, path**.

#### **Contoh: ID Angka**

```python
@app.route('/user/<int:user_id>')  # Hanya menerima angka
def user_id(user_id):
    return f"User ID: {user_id}"
```

* **`<int:user_id>`** memastikan hanya angka yang diterima.
* Coba akses **`http://127.0.0.1:5000/user/10`**, akan menampilkan: **"User ID: 10"**.

***

### **6.3. Mengirim Variabel ke Template HTML**

Variabel bisa diteruskan ke halaman HTML menggunakan `render_template()`.

#### **Contoh: Mengirim Nama ke Template**

**Kode Flask (`app.py`)**

```python
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/profile/<name>')
def profile(name):
    return render_template('profile.html', username=name)

if __name__ == '__main__':
    app.run(debug=True)
```

**Kode Template (`templates/profile.html`)**

```html
<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <title>Profile</title>
</head>
<body>
    <h1>Selamat datang, {{ username }}!</h1>
</body>
</html>
```

🔹 Coba akses **`http://127.0.0.1:5000/profile/Ali`**, maka tampil: **"Selamat datang, Ali!"**

***

### **6.4. Variabel Global dalam Flask**

Kita bisa menggunakan variabel global yang dapat diakses di semua fungsi.

```python
app_name = "My Flask App"  # Variabel global

@app.route('/')
def home():
    return f"Welcome to {app_name}!"
```

* Setiap kali halaman diakses, `app_name` akan digunakan.

***

### **6.5. Variabel dalam Dictionary**

Kita juga bisa menyimpan data dalam dictionary dan mengirimnya ke template.

```python
@app.route('/data')
def data():
    user = {"name": "Ali", "age": 25, "city": "Jakarta"}
    return render_template('data.html', user=user)
```

**Kode Template (`templates/data.html`)**

```html
<h1>Nama: {{ user.name }}</h1>
<p>Umur: {{ user.age }}</p>
<p>Kota: {{ user.city }}</p>
```

***

### 7. FOR dan IF Statement

Dalam Flask, kita bisa menggunakan **statement `for` dan `if`** di dalam template HTML menggunakan **Jinja2**, templating engine bawaan Flask.

***

### **7.1. `for` Statement dalam Template Flask**

Kita bisa menggunakan **`for` loop** untuk menampilkan data secara berulang dalam HTML.

#### **Contoh: Menampilkan List Nama di HTML**

**Kode Flask (`app.py`)**

```python
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/users')
def users():
    user_list = ["Ali", "Budi", "Citra", "Dewi"]
    return render_template('users.html', users=user_list)

if __name__ == '__main__':
    app.run(debug=True)
```

**Kode Template (`templates/users.html`)**

```html
<!DOCTYPE html>
<html>
<head>
    <title>Daftar Pengguna</title>
</head>
<body>
    <h1>Daftar Pengguna</h1>
    <ul>
        {% for user in users %}
            <li>{{ user }}</li>
        {% endfor %}
    </ul>
</body>
</html>
```

✅ **Hasilnya di Browser:**

```
Daftar Pengguna:
- Ali
- Budi
- Citra
- Dewi
```

***

### **7.2. `if` Statement dalam Template Flask**

Kita bisa menggunakan **`if` statement** untuk menampilkan kondisi tertentu di dalam HTML.

#### **Contoh: Menampilkan Pesan Jika Tidak Ada Data**

```html
<ul>
    {% if users %}
        {% for user in users %}
            <li>{{ user }}</li>
        {% endfor %}
    {% else %}
        <p>Tidak ada pengguna.</p>
    {% endif %}
</ul>
```

✅ **Jika `users` ada isinya**, daftar pengguna akan ditampilkan.\
✅ **Jika `users` kosong**, akan muncul pesan: **"Tidak ada pengguna."**

***

### **7.3. `for` dan `if` dalam Satu Loop**

Kita bisa menggabungkan **`for` dan `if`** untuk memberikan tanda atau format khusus pada elemen tertentu.

#### **Contoh: Menandai Admin dalam Daftar User**

**Kode Flask (`app.py`)**

```python
@app.route('/users')
def users():
    user_list = [
        {"name": "Ali", "role": "admin"},
        {"name": "Budi", "role": "user"},
        {"name": "Citra", "role": "admin"},
        {"name": "Dewi", "role": "user"},
    ]
    return render_template('users.html', users=user_list)
```

**Kode Template (`templates/users.html`)**

```html
<ul>
    {% for user in users %}
        {% if user.role == "admin" %}
            <li><strong>{{ user.name }} (Admin)</strong></li>
        {% else %}
            <li>{{ user.name }}</li>
        {% endif %}
    {% endfor %}
</ul>
```

✅ **Hasilnya di Browser:**

```
- Ali (Admin)
- Budi
- Citra (Admin)
- Dewi
```

***

### **7.4. `loop.index` dalam `for`**

Flask menyediakan **`loop.index`** untuk menampilkan nomor urut dalam `for` loop.

#### **Contoh: Menampilkan Nomor Urut**

```html
<ul>
    {% for user in users %}
        <li>{{ loop.index }}. {{ user }}</li>
    {% endfor %}
</ul>
```

✅ **Hasilnya di Browser:**

```
1. Ali
2. Budi
3. Citra
4. Dewi
```

***

## 8. If Elif and Else

Dalam Flask, **`elif` (else if)** juga bisa digunakan dalam template HTML menggunakan **Jinja2**. Ini berguna untuk membuat kondisi lebih kompleks dalam tampilan HTML.

***

### **1. `if`, `elif`, dan `else` dalam Template Flask**

Kita bisa menggunakan **`elif`** untuk menangani berbagai kondisi.

#### **Contoh: Menampilkan Pesan Berdasarkan Skor**

**Kode Flask (`app.py`)**

```python
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/nilai/<int:score>')
def nilai(score):
    return render_template('nilai.html', score=score)

if __name__ == '__main__':
    app.run(debug=True)
```

**Kode Template (`templates/nilai.html`)**

```html
<!DOCTYPE html>
<html>
<head>
    <title>Penilaian</title>
</head>
<body>
    <h1>Hasil Penilaian</h1>
    {% if score >= 90 %}
        <p>Nilai Anda: {{ score }} - Sangat Baik! 🎉</p>
    {% elif score >= 75 %}
        <p>Nilai Anda: {{ score }} - Baik 👍</p>
    {% elif score >= 60 %}
        <p>Nilai Anda: {{ score }} - Cukup 😊</p>
    {% else %}
        <p>Nilai Anda: {{ score }} - Perlu Perbaikan 😢</p>
    {% endif %}
</body>
</html>
```

✅ **Jika diakses dengan `http://127.0.0.1:5000/nilai/95`**, maka tampil:\
\&#xNAN;**"Nilai Anda: 95 - Sangat Baik! 🎉"**\
✅ **Jika diakses dengan `http://127.0.0.1:5000/nilai/70`**, maka tampil:\
\&#xNAN;**"Nilai Anda: 70 - Cukup 😊"**

***

### **2. `for` dengan `if-elif-else`**

Kita juga bisa menggabungkan **loop** dengan **if-elif-else**.

#### **Contoh: Menampilkan Status Mahasiswa**

**Kode Flask (`app.py`)**

```python
@app.route('/mahasiswa')
def mahasiswa():
    daftar_mahasiswa = [
        {"nama": "Ali", "nilai": 92},
        {"nama": "Budi", "nilai": 80},
        {"nama": "Citra", "nilai": 65},
        {"nama": "Dewi", "nilai": 55},
    ]
    return render_template('mahasiswa.html', mahasiswa=daftar_mahasiswa)
```

**Kode Template (`templates/mahasiswa.html`)**

```html
<!DOCTYPE html>
<html>
<head>
    <title>Daftar Mahasiswa</title>
</head>
<body>
    <h1>Daftar Mahasiswa</h1>
    <ul>
        {% for mhs in mahasiswa %}
            <li>
                {{ mhs.nama }} - Nilai: {{ mhs.nilai }} - 
                {% if mhs.nilai >= 90 %}
                    Lulus dengan Pujian 🎓
                {% elif mhs.nilai >= 75 %}
                    Lulus 👍
                {% elif mhs.nilai >= 60 %}
                    Lulus Bersyarat 😊
                {% else %}
                    Tidak Lulus 😢
                {% endif %}
            </li>
        {% endfor %}
    </ul>
</body>
</html>
```

✅ **Hasilnya di Browser:**

```
Daftar Mahasiswa:
- Ali - Nilai: 92 - Lulus dengan Pujian 🎓
- Budi - Nilai: 80 - Lulus 👍
- Citra - Nilai: 65 - Lulus Bersyarat 😊
- Dewi - Nilai: 55 - Tidak Lulus 😢
```

***

{% hint style="success" %}

## Simple Interest App Program

{% endhint %}

<figure><img src="https://1537830120-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fwx2jsHS2MYXinLjkOHv9%2Fuploads%2FuoAPANouAg1xYrAuJ8VS%2Fimage.png?alt=media&#x26;token=521fbd83-bf94-4299-8884-538ea06985c4" alt=""><figcaption></figcaption></figure>

#### 1️⃣ **Menentukan Fitur Kalkulator**

Misalnya, kalkulator bisa menghitung:

* **Bunga tabungan** (bunga sederhana/majemuk)
* **Cicilan pinjaman** (menggunakan rumus anuitas)
* **Return investasi** (menghitung pertumbuhan investasi)

#### 2️⃣ **Membuat Struktur Flask Project**

Struktur proyek sederhana bisa seperti ini:

```
flaskb/
│── app.py               # File utama Flask
│── templates/
│   ├── index.html       # Halaman utama
│   ├── result.html      # Halaman hasil perhitungan
│── static/
│   ├── style.css        # CSS untuk tampilan
│── requirements.txt     # Paket yang dibutuhkan
│── venv/                # Virtual environment (opsional)
```

#### 3️⃣ **Mengembangkan `app.py`**

Contoh Flask sederhana untuk kalkulator bunga:

<figure><img src="https://1537830120-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fwx2jsHS2MYXinLjkOHv9%2Fuploads%2Fwmh4DBd1kKUu8jP96Vrr%2Fimage.png?alt=media&#x26;token=e468b87d-1b25-491c-b444-6f102c432a54" alt=""><figcaption></figcaption></figure>

#### 4️⃣ **Membuat Halaman `index.html`**

<figure><img src="https://1537830120-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fwx2jsHS2MYXinLjkOHv9%2Fuploads%2FfpOD28xnww8yePf0NtF8%2Fimage.png?alt=media&#x26;token=52c4d913-6da8-48e9-a1c8-306035dec969" alt=""><figcaption></figcaption></figure>

#### 5️⃣ **Membuat Halaman `result.html`**

<figure><img src="https://1537830120-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fwx2jsHS2MYXinLjkOHv9%2Fuploads%2FMnoiof3Kx0jt9sjlBCIL%2Fimage.png?alt=media&#x26;token=38930fba-b41a-4114-a4ed-2d3c560d2e29" alt=""><figcaption></figcaption></figure>

***

{% hint style="success" %}

## Kalkulator Engagement Rate

{% endhint %}

<figure><img src="https://1537830120-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fwx2jsHS2MYXinLjkOHv9%2Fuploads%2F3xSJ3IWWd9QrXzRmYCYE%2Fimage.png?alt=media&#x26;token=165bee00-8a3e-4491-a305-bf6d5ac6da3f" alt=""><figcaption></figcaption></figure>

***

#### **1️⃣ Struktur Proyek Flask**

```
flaskb/
│── app.py               # File utama Flask
│── templates/
│   ├── index.html       # Form input & hasil kalkulasi
│── static/
│   ├── style.css        # CSS styling
│── requirements.txt     # (Opsional) Paket Flask
```

***

#### **2️⃣ `app.py` - Logika Flask**

Buat file `app.py`:

<figure><img src="https://1537830120-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fwx2jsHS2MYXinLjkOHv9%2Fuploads%2Fvwk90LYgBzMF5ZiO7aVF%2Fimage.png?alt=media&#x26;token=09018f11-3b46-4b53-bc04-c0eed175d9df" alt=""><figcaption></figcaption></figure>

***

#### **3️⃣ `index.html` - Tampilan Form Input & Hasil**

Buat file `templates/index.html`:

```html
<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Kalkulator Engagement Rate</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
    <div class="container">
        <h2>Kalkulator Engagement Rate</h2>
        <form method="POST">
            <label>Jumlah Likes:</label>
            <input type="number" name="likes" required>

            <label>Jumlah Comments:</label>
            <input type="number" name="comments" required>

            <label>Jumlah Shares:</label>
            <input type="number" name="shares" required>

            <label>Total Followers:</label>
            <input type="number" name="followers" required>

            <button type="submit">Hitung</button>
        </form>

        {% if er is defined and er is not none %}
            <h3>Engagement Rate: {{ er }}%</h3>
        {% endif %}
    </div>
</body>
</html>

```

***

#### **4️⃣ `style.css` - CSS untuk Tampilan**

Buat file `static/style.css`:

```css
body {
    font-family: Arial, sans-serif;
    background-color: #f8f9fa;
    text-align: center;
}

.container {
    max-width: 400px;
    margin: 50px auto;
    background: white;
    padding: 20px;
    border-radius: 10px;
    box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);
}

h2 {
    color: #007bff;
}

form {
    display: flex;
    flex-direction: column;
}

label {
    margin: 10px 0 5px;
    font-weight: bold;
}

input {
    padding: 8px;
    border: 1px solid #ccc;
    border-radius: 5px;
}

button {
    margin-top: 20px;
    padding: 10px;
    background-color: #007bff;
    color: white;
    border: none;
    border-radius: 5px;
    cursor: pointer;
}

button:hover {
    background-color: #0056b3;
}

h3 {
    margin-top: 20px;
    color: #28a745;
}
```

***

#### **5️⃣ Cara Menjalankan Proyek**

1. **Jalankan server Flask**

   ```sh
   python app.py
   ```
2. **Buka browser** dan akses:

   ```
   http://127.0.0.1:5000/
   ```

***

<figure><img src="https://1537830120-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fwx2jsHS2MYXinLjkOHv9%2Fuploads%2Fratdlve0YsUCHvMnykh1%2Fimage.png?alt=media&#x26;token=92821bde-10b8-4127-ba18-358fb5d6200d" alt=""><figcaption></figcaption></figure>
