PostgREST: htmx ile HTML içerik sunma
(postgrest.org)- Bir PostgreSQL fonksiyonu doğrudan
text/htmldöndürürse, yalnızca PostgREST ve htmx ile AJAX isteğinin sonucunu alıp DOM’un bir bölümünü değiştiren bir to-do uygulaması yapılabilir - Örnekte kimlik doğrulama olmadan
web_anonkullanıcısınaapi.todosveapi.todos_id_seqyetkileri veriliyor;Accept: text/htmlisteklerini işlemek için özel medya türü ekleniyor - HTML birleştirmesini SQL fonksiyonları üstleniyor;
api.sanitize_html,api.html_todo,api.html_all_todosgiriş değerlerini escape etmeyi ve liste render etmeyi yönetiyor - Ekran davranışı
hx-post,hx-get,hx-target,hx-trigger,hx-vals,hx-headersile yapılandırılıyor; dönen HTML#todo-list-areaalanının ya da tekil düzenleme alanlarının yerini alıyor - Bu yapı daha çok bir kavram kanıtı niteliğinde; PostgREST tarafında HTML işlemeyi iyileştirmek için
plmustacheüzerinde çalışılıyor
PostgREST ve htmx’in rolleri
- PostgREST HTML içerik döndürüyor; htmx ise AJAX isteği sonucunda alınan HTML’i DOM içindeki öğeleri değiştirmek için kullanıyor
- htmx HTML yanıt beklediğinden, sunucunun JSON yerine HTML parçaları döndürdüğü akışla iyi uyuşuyor
- Örnek, iki teknoloji birlikte kullanıldığında mümkün olan bir yapılandırmayı gösteren bir kavram kanıtı
- PostgREST, HTML işleme tarafını daha da iyileştirmek için plmustache üzerinde çalışıyor
To-do uygulaması için hazırlık ayarları
- Örnek, Tutorial 0 - Get it Running temel alınarak yapılan bir to-do uygulaması
- Basitleştirmek için kimlik doğrulama kullanılmıyor ve
web_anonkullanıcısına gerekli yetkiler veriliyorapi.todostablosunagrant allapi.todos_id_seqsequence’ınagrant usage, select
- Tarayıcının
Accept: text/htmlisteğini PostgREST’in HTML olarak algılaması için medya türü işleyicisi eklenmesi gerekiyor"text/html"domain’itextolarak oluşturuluyor- Bu ayar sayesinde PostgREST ham HTML belgeleri döndürebiliyor
Temel HTML sayfasını döndürme
api.index()fonksiyonu"text/html"döndürür ve temel HTML belgesini oluşturur- Sayfada
PostgREST + HTMX To-Do Listbaşlığıyla birlikte şu kaynaklar yer alır - Tarayıcıda bu sayfa
http://localhost:3000/rpc/indexadresinden açılabilir
Liste render etme ve to-do ekleme
- Mevcut to-do listesini HTML’e dönüştürmek için üç SQL fonksiyonu kullanılır
api.sanitize_html(text):&,",>,<,'karakterlerini HTML entity’lerine dönüştürürapi.html_todo(api.todos): Tek bir to-do öğesini HTML parçası olarak formatlarapi.html_all_todos(): Tüm öğeleri tek bir HTML string’inde birleştirir; öğe yoksaThere is nothing else to do.mesajını döndürür
api.html_todoveapi.html_all_todos, liste şablonunu oluşturan dahili fonksiyonlardır; doğrudan PostgREST endpoint’i olarak kullanılmazapi.add_todo(_task text), yeni to-do’yuapi.todosiçine ekledikten sonra güncellenmiş tüm liste HTML’ini döndürür- Güncellenmiş
api.index()htmx’i ve giriş formunu içerir- Üst öğeye
hx-headers='{"Accept": "text/html"}'eklenerek alt htmx isteklerinin HTML yanıt istemesi sağlanır - Bu header olmazsa PostgREST isteği HTML olarak algılayamaz
- Üst öğeye
- To-do ekleme formu htmx öznitelikleriyle çalışır
hx-post="/rpc/add_todo":_taskgiriş değerini/rpc/add_todoadresine POST isteği olarak gönderirhx-target="#todo-list-area": Yanıt HTML’ini to-do listesi alanına yerleştirirhx-trigger="submit": Form gönderildiğinde isteği yollarhx-on="htmx:afterRequest: this.reset()": İstek tamamlandıktan sonra formu temizler
- Yeni fonksiyonların ve değişikliklerin yansıması için şema önbelleğinin yenilenmesi gerekir
- Ardından
http://localhost:3000/rpc/indexüzerinden liste gösterimi ve yeni to-do ekleme kontrol edilebilir
Düzenleme, silme ve tamamlanma durumunu değiştirme
api.html_todo, her öğeye tamamlanma durumunu değiştirme, düzenleme ve silme arayüzü içerecek şekilde genişletilir- Tamamlanma durumu değiştirme
<form>ve htmx öznitelikleriyle işlenirhx-post="/rpc/change_todo_state": İlgili endpoint’e AJAX POST isteği gönderirhx-vals='{"_id": ..., "_done": ...}': Gizli input yerine istek parametreleri eklerhx-trigger="click": Öğeye tıklanınca isteği çalıştırır
- Düzenleme düğmesi tekil görevi bir giriş alanına dönüştürür
hx-get="/rpc/html_editable_task": Düzenlenebilir HTML input döndüren endpoint’i çağırırhx-target="#todo-edit-area-...": Tüm liste yerine yalnızca tekil görev alanını değiştirirhx-vals, GET istek parametrelerini ekler; tablo kolonunu belirtirkeneq.operatörü gerekir
- Silme düğmesi, ilgili to-do’yu silmek için
hx-post="/rpc/delete_todo"isteği gönderir api.html_editable_task(_id int), belirli bir to-do’nun düzenlenmesini sağlayan input alanı HTML’ini döndürürhx-post="/rpc/change_todo_task"ile değiştirilen görev adını gönderirhx-trigger="submit,focusout"ile form gönderildiğinde veya odak dışına çıkıldığında güncellerhx-headers='{"Accept": "text/html"}'içerir
- Veri değiştiren endpoint’lerin tamamı değişiklikten sonra tüm liste HTML’ini döndürür
api.change_todo_state(_id int, _done boolean):donekolonunu güncellerapi.change_todo_task(_id int, _task text):taskkolonunu güncellerapi.delete_todo(_id int):_iddeğerine karşılık gelen to-do’yu siler
- Şema önbelleği yenilendikten sonra
http://localhost:3000/rpc/indexadresinden to-do düzenleme, silme ve tamamlandı işaretleme işlemleri yapılabilir
1 yorum
Hacker News yorumları
PostgREST, en sevdiğim açık kaynak projelerden biri. Supabase’in 1 milyar dolarlık bir şirket hâline gelmesinde PostgREST ve Postgres’in mükemmel tasarımının büyük payı olduğunu düşünüyorum
Supabase’in bu projeyi nasıl desteklediğini bilmiyorum ama bunun çok büyük ölçekte olmasını umuyorum. En az yüzlerce gelir üreten şirketin temel bağımlılık olarak kullandığı bir projenin yalnızca 12 ücretli destekçisi olduğunu görmek, açık kaynak finansmanının gerçekliğini üzücü kılıyor
https://www.patreon.com/postgrest/about
https://github.com/steve-chavez
Bu yüzden artık yalnızca AGPLv3 veya benzeri lisanslar kullanıyorum. Ticari olarak kullanmak istiyorsan brüt cironun %1’ini öde gibi
Kavram kanıtı olarak hoş ve uygulaması da övgüye değer, ama önemsiz olmayan bir web uygulamasında bakımını yapmak kâbus gibi görünüyor
https://sqitch.org/
Bu tür özelliklerin veya kodlama kalıplarının yeni ya da modern uygulamalarda da kullanılıp kullanılmadığını merak ediyorum
CouchDB adlı JSON belge veritabanı HTTP tabanlı bir API sunuyordu ve JavaScript yorumlayıcısı içinde oluşturulabilecek herhangi bir formatta yanıt döndürebilen yerleşik liste/detay yöntemleri vardı. Yani istemci doğrudan veritabanını çağırıp HTML veya JSON alabiliyor, sunucuya gerek kalmıyordu
Ama v1’den sonra bu yöndeki çalışmaları durdurdular, çünkü bakımı kâbusa dönüşüyordu. Eski PHP veya ASP dosyalarında SQL ifadeleriyle HTML’in iç içe olduğu güzel günleri hatırlayan çok kişi vardır; bu da pek farklı görünmüyor
Yaklaşık 13 yıl önce kişisel bir projede CouchDB’nin web ile ilgili özelliklerini gerçekten sevmiştim, ama ekip olarak çalışırken epey zahmetliydi
Üzerinde çalıştığım tek PostgREST uygulaması berbattı. Çünkü bu tür “basit” framework’lerin çoğunda olduğu gibi, yalnızca gereksinimler karmaşıklaşana kadar basit kalıyorlar
Asıl geliştiriciler istedikleri sonucu elde etmek için veritabanında bir sürü stored procedure kullanmak zorunda kaldılar, bu da ölçeklenebilirlik sorunlarına yol açtı. Her zamanki gibi çözüm SQL’e geri dönmek
PostgREST CRUD uygulamaları için tasarlandı ve karşılaştığım uygulamaların çoğu buna giriyor. Ara sıra gereken özel backend mantığı da ayrı bir sunucu veya edge function olarak çalıştırılıp ele alınabilir
Bu tür araçların hepsinde olduğu gibi, gerçek dünya gereksinimlerine gelince araca uyum sağlamanın maliyeti, yerine geçirmeye çalıştığı SQL + herhangi bir dil ve framework’ten daha kötü hâle geliyor. PostGREST zaten karmaşıklaşıyor; bu tür ek özellikler benim için cazibesini azaltıyor
Rails ortaya çıkıp herkesin iş mantığını yavaş sunucu tarafı dillerine koymanın iyi fikir olduğuna inanmasını sağlamadan önce, herkes uygulamaları böyle geliştiriyordu
Gerçekten temiz bir web geliştirme yığını. Yalnızca HTML ve veritabanı var; backend ve frontend’e gerek yok
https://github.com/omnigres/omnigres
HTMX’in parıltısı söndükten sonra o zamanki bakım sorumlusu, sonunda her şeyi baştan yazmak gerektiğini kabul edecek
Eski bir projede HTMX olmadan PostgREST kullanmıştım; ne kadar ileri götürülebileceği etkileyiciydi
HTMX de iyi uyuyor gibi görünüyor, ama SQL fonksiyonları içinde HTMX şablonlarını ne kadar sürdürmek isterim pek emin değilim
Kurcalayıp bir şeyler yapmak için iyi, ama sağlam bir şey inşa etmek için uygun değil
Haskell açısından bakınca PostgREST ilginç. Fazla bariz bir proje gibi göründüğü için
Ama tam da bu yüzden dâhice. Gerçekten Haskell’e özgü bir fikir olduğu için hoşuma gidiyor
Bu kavramı orta-büyük ölçekli uygulamalarda da iyi bir kullanıcı deneyimi sunan bakımı yapılabilir bir stack hâline getirmek için hangi ek araçların gerekli olduğunu düşünüyorsunuz?
Ben de SQL’in üzerine benzer bir şey yapmaya çalışmıştım; teknoloji stack’i Jinja şablon SQL ve YML ile uygulanmış bir OpenAPI katmanıydı, ama yine de bunu iç araçlar kapsamıyla sınırlı tutacağımı düşünüyorum. Burada: https://jinj.at
İlgili Show HN: pg_render ile SQL’den HTML render etmek
https://news.ycombinator.com/item?id=38677852
Unutmamak için bu uygulamaya bir görev yazmak istiyorum. Benim görevim şu:
Bu durumda task sütunu hiçbir yerde temizleniyor gibi görünmüyor
Ama şimdi veritabanı view olduğuna göre XSS geri mi geldi? Bu önlenebilir bir sorun
HTML, bunu yapan herhangi bir template diliyle render edilebilir