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

Mengganti IP Address Ubuntu Server 16.04

Seringkali jika kita order dedicated server, kita akan dapat IP address lebih dari satu, dan kadang karena pertimbangan tertentu, kita ingin mengganti IP ke IP lain. Bagaimana caranya?

Sunting berkas /etc/network/interfaces, sesuaikan IP address dengan yang baru kemudian jalankan perintah:

ifdown eth0; ifup eth0

Kalau sedang login via ssh, maka terminal session pasti nge-freeze, karena koneksi terputus, tidak apa-apa, tunggu beberapa saat kemudian lakukan login kembali menggunakan IP yang baru.

Jangan lupa untuk melakukan restart service2 yang terkait dengan IP lama, misal nginx, dan lain sebagainya.

Reference: Configure Networking on Ubuntu

Auto-restart Gunicorn Setiap Menerima Request

Tentu ini bukan untuk production ya, hanya trik untuk level development sehingga tidak perlu capek2 Ctrl+c kemudian running ulang si gunicorn. Caranya adalah dengan menambahkan parameter:

--max-request 1

Jadi perintah utuhnya adalah

bin/gunicorn --log-file=-1 --max-request 1

Atau kalau cuma ingin melakukan restart sesekali, gunakan perintah ini:

pkill -HUP -f gunicorn

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!

Setup mysql di MacOS

Dengan menggunakan brew, mari kita install mysql di macos:

brew install mysql

Kemudian, jalankan service dengan:

brew services start mysql

Setelah itu, coba masuk ke mysql cli (by default tanpa password):

mysql -uroot

Jika tidak ada pesan kesalahan, berarti mysql sudah terpasang dengan benar di macos…

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 %}