Mudah Mengelola Long-running Processes dengan supervisor

Anda memiliki banyak long-running process dalam satu mesin? Misal running beberapa aplikasi django? Gunakan supervisorctl kalau Anda tidak ingin repot. Setelah terpasang dan konfigurasi berjalan dengan baik, mengelola banyak aplikasi menjadi mudah, cukup dengan reread, stop, start…

reread

Perintah ini untuk membaca ulang isi dari supervisord.conf

update

Perintah ini untuk menambahkan proses baru kedalam supervisord

start/stop

Perintah ini untuk memulai/menghentikan sebuah proses

status

Perintah ini untuk melihat status dari masing-masing proses yang kita miliki.

Advertisements

Supervisord, Supervisorctl, Nginx, Gunicorn dan Django

Bingung mau ngasih judul apa, intinya saya mau setup django yang menggunakan gunicorn dan di run secara daemon menggunakan supervisor. Sebelumnya pastikan Anda sudah memasang supervisor di komputer (mengikuti tutorial dari sini):

pip install supervisor
echo_supervisord_conf > supervisord.conf

Jalankan supervisor

supervisor -c supervisord.conf

Jika tidak ada pesan kesalahan, sekarang tambahkan command gunicorn di bagian paling bawah dari file supervisord.conf tadi. Di saya berikut ini perintah untuk gunicorn:

[program:kesuwen]
command=/Users/macbookpro/git/kesuwen/bin/gunicorn --env DJANGO_SETTINGS_MODULE=/Users/macbookpro/git/kesuwen/app --pythonpath=/Users/macbookpro/git/kesuwen/ --bind=127.0.0.1:8000 app

Jalankan lagi supervisor, dan django + gunicorn sekarang sudah di run via supervisor. Anda dapat juga mencoba supervisorctl untuk fleksibilitas yang lebih, misalnya untuk start/stop program tertentu. Caranya adalah dengan sebelumnya masuk dulu ke console supervisorctl dengan mengetikkan perintah:

supervisorctl -c ~/supervisord.conf

Setelah masuk ke prompt, jalankan perintah berikut untuk start/stop program.

start kesuwen
stop kesuwen

Selamat mencoba

Melakukan Debug di Django Form

Pusing karena django form tidak valid? Apa yang salah? Bagaimana cara melakukan debug terhadap django form di template?

Cukup tambahkan dua baris berikut di template form HTML Anda:

{{ form.errors }}
{{ form.non_field_errors }}

Dan error di form Anda akan muncul… Selamat mencoba

Memilih option selected di Django Template

Bayangkan Anda memiliki HTML form berikut:

<select>
  <option>Madiun</option>
  <option>Sleman</option>
</select>

Tugas Anda sekarang adalah meng-assign Madiun sebagai selected tanpa harus menggunakan javascript, cukup dengan logic di views dan template django saja. Gimana caranya?

Pertama di views, kita sudah set variabel kota misal ke madiun dan pass variabel tersebut ke template:

# views.py
def awesome_city(request):
    kota = 'Madiun'
    return render(request, 'form.html', {'kota': kota})

Sekarang saatnya menambahkan logika if else sederhana di Django template untuk memilih kota sesuai dengan yang sudah ditentukan di views.py

<select>
  <option {% if kota == 'Madiun' %}selected{% endif %}>Madiun</option>
  <option {% if kota == 'Sleman' %}selected{% endif %}>Sleman</option>
</select>

Karena untuk memilih option select itu cukup dengan menambahkan parameter selected di belakang pembukaan option tag. Done! No JS needed!

Solusi CSRF verification failed di Django

Masalah ini muncul ketika saya mengubah web server dari uwsgi ke gunicorn dan menggunakan proxy_pass di nginx, solusinya:

Tambahkan baris berikut di nginx.conf:

location / {
    proxy_set_header Host $http_host;
    proxy_pass http://127.0.0.1:8000;
    # proxy_set_header X-Forwarded-Host $server_name;
}

Kemudian tambahkan baris berikut di settings.py:

USE_X_FORWARDED_HOST = True

Done!

Mengiris List di Django Template

Aneh ya, mengiris, ini terjemahan bebas versi saya untuk kata “slice”.. hehehe.. Bagaimana caranya?

{% for keyword in keywords|slice:"10" %}
{{ keyword }}
{% endfor %}

Atau, contoh lain, jika ingin dari urutan tertentu:

{% for keyword in keywords|slice:"11:" %}
{{ keyword }}
{% endfor %}

Siiip

 

Akses Variabel Di Dalam tag include di Django Template

Bagaimana mengakses sebuah variabel di dalam tag include? Misal, contoh kode berikut tidak akan jalan, karena diidentifikasi sebagai string:

{% include {{ TEMPLATE_DIR }}/home.html %}

Bagaimana solusinya?

Dengan menggunakan tag with, contohnya adalah sebagai berikut:

{% with template_name=TEMPLATE_DIR|add:"/home.html" %}
     {% include ""|add:template_name %}
{% endwith %}

Menambahkan Django Custom Template Filter Tanpa App

Bingung juga mau kasih judul, intinya sih aplikasi django saya ini tidak mengikuti pakem django-admin startproject maupun startapp, tapi hanya berupa 1 buah file tunggal, app.py. Kalau menggunakan startapp, untuk menambahkan custom filter cukup dengan membuat direktori templatetags yang isinya __init__.py dan module yang berisi dari custom filter kita. Nah, bagaimana kalau tanpa startapp?

Continue reading “Menambahkan Django Custom Template Filter Tanpa App”

Django + Nginx di Localhost

Prinsip utama yang harus dipahami adalah nginx disini menjadi proxy untuk port 8000 (port default django untuk dev), caranya dengan menambahkan di nginx.conf atau di sites-available/default baris berikut:

server {
    listen 80;
    server_name localhost;
    location / {
        proxy_pass 127.0.0.1:8000;
    }
}

Setelah itu jalankan perintah ./manage.py runserver dan buka localhost di browser, sekarang nginx menjadi web server di local development Anda, kalau mau lebih yakin lagi, buka tools chrome inspect -> network -> Server, localhost dilayani oleh:

Server: nginx/1.10.3

sedangkan URL localhost:8000 dilayani oleh:

Server: WSGIServer/0.2 CPython/3.6.1

Selamat mencoba!