Server harus sering-sering ditengok

Awalnya sih tidak ada rasa curiga babarblas, karena memang ketika diakses, si website ya keliatan normal-normal saja. Dan semalam saya coba untuk upload sebuah file, dan hasilnya error 524 timeout (cloudflare). Dugaan saya langsung ke redis, karena memang beberapa saat terakhir ini yang sering bermasalah ada di redisnya.

Sudah coba restart, ternyata tidak ada masalah dengan redis, rqworker juga sudah direstart, bahkan timeout di rq_queues juga sudah ditambah, dari 360 ke 3600. Entaah kenapa, saya coba restart gunicorn dan gunicorn failed to start, katanya failed import module autocomplete_light, padahal si module itu ada di sana, nongkrong dengan manisnya.

Coba uninstall dan install, tetep saja, dan entah setelah restart gunicorn yang keberapa, kok tiba2 saja si aplikasi mau jalan lagi…. what the heck???

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

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!

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”