Django-rest-framework: Escaping (ampersand) di URL API yang dapat dijelajahi.

Dibuat pada 20 Jun 2014  ·  26Komentar  ·  Sumber: encode/django-rest-framework

Ketika URL dengan karakter yang lolos (khususnya dalam kasus saya, dan ampersand) dirender dalam API yang dapat dijelajahi, di href, URL tersebut tidak dapat di-escape dengan benar. Ini hanya berlaku untuk ampersand.

Misalnya, URL ini:
http: // localhost : 8000 / endpoint /? param1 = Ya +% 26 + Tidak & param2 = sesuatu

Akan dirender sebagai:
http: // localhost : 8000 / endpoint /? param1 = Ya + & + Tidak & param2 = sesuatu

URL dirender dalam nilai elemen dengan benar ... ini hanya berlaku untuk href.

Bug

Komentar yang paling membantu

Saya hanya ingin mengonfirmasi bahwa ini berfungsi sekarang :)

Cintai perpustakaan ini, ini sudah berfungsi dengan baik, tetapi bahkan masih menjadi lebih baik! 👍

Semua 26 komentar

Maaf atas respons yang lambat.
Apakah hanya rendering yang berbeda atau apakah HTML sumber itu sendiri tidak lolos?

Hai Tom, di HTML terlihat seperti ini:

<a href="http://localhost:8000/endpoint/?param1=Yes+&+No&param2=something">http://localhost:8000/endpoint/?param1=Yes+%26+No&param2=something</a>

Gotcha terima kasih - mungkin ada baiknya mencoba menulis kasus uji yang gagal untuk ini.
Idealnya itu hanya akan melatih BrowsableAPIRendererer , tetapi mungkin juga akan baik-baik saja dengan uji integrasi penuh.

Tentu, dengan senang hati. Melihat melalui rangkaian pengujian sekarang ... akankah tempat yang sesuai ada di RendererEndToEndTests di test_renderers.py?

Kedengarannya oke.

Ini ada hubungannya dengan smart_urlquote Django yang dipanggil oleh DRF urlize_quoted_links , yang menangani konversi dalam API yang dapat dijelajahi. Saya _memikirkan_ perbedaan antara teks tautan dan tautan itu sendiri mungkin merupakan hal melarikan diri dari Django, tapi sejujurnya saya tidak yakin di sana.

smart_urlquote memanggil unquote sebelum quote , yang menghilangkan yang asli. Ini ditambahkan di https://github.com/django/django/commit/b70c371fc1f18ea0c43b503122df3f311afc7105 dan di-backport untuk Django 1.5+.

Jadi apakah kita peduli bahwa ini bukan _strictly_ yang akan dilihat klien, atau apakah kita menutupnya begitu saja?
Secara semantik masih benar.

Mendorong ini dari bug ke pembersihan, karena batasnya.

Panduan DjangoCon - tinjauan umum tiket ini - perilaku apa yang Anda harapkan, apakah dapat diterima sebagaimana adanya?

Saya berada di sprint django-con dan dapat mengerjakan ini. Saya belum pernah berkontribusi sebelumnya, jadi saya mungkin membutuhkan beberapa panduan awal. Saat ini saya membaca pedoman kontributor untuk DRF dan setelah saya menjalankan tes secara lokal, saya mungkin akan mengganggu seseorang secara langsung atau di irc.

Gotcha - silakan ping saya di IRC, atau twitter jika saya tidak responsif di sana.

Penutupan karena prioritas rendah dan kurangnya kemajuan.
Senang untuk mempertimbangkan kembali jika seseorang termotivasi untuk melakukan ini lagi.

@tomchristie Saya mengerti bahwa ini adalah masalah kecil, tetapi masih bug. Jika Anda mengklik link tersebut, itu mengarah ke URL yang salah. Tampaknya lebih tepat untuk memberi tag sebagai prioritas rendah daripada menutup masalah yang valid.

Saya akan memeriksanya ketika saya punya waktu.

Maaf, saya telah memahami hal ini secara berbeda - bahwa URL-nya tidak salah, hanya saja itu membuat tautan dalam gaya tanpa konversi karakter, apakah saya salah paham?

Yaitu. alasan untuk tag cleanup , apakah ini masalah kosmetik?

Oh begitu. Ya benar. Pada dasarnya, nilai href dan tampilan akan di-escape, bukan hanya nilai tampilan.

Terima kasih untuk perpustakaan yang luar biasa, btw!

Maaf, sekali lagi :)

Ya benar.

Benar bahwa ini masalah kosmetik, atau mengoreksi bahwa saya salah paham dan ini bug? :)

Benar bahwa itu bug. :)

Menutup, karena ini diperbaiki oleh https://code.djangoproject.com/ticket/22267

Belum melihat ini tetapi apakah kita perlu menarik yang lain karena kita menduplikasi 'urlize'? Juga versi apa ini diselesaikan? Juga, bagus! Yay!

Ini tampaknya tidak diperbaiki di 1.7.1, jadi 1.7.2 atau 1.8? Ini adalah perilaku yang saya lihat dengan django 1.7.1:

>>> from django.utils.html import smart_urlquote, escape
>>> escape(smart_urlquote('http://qwerty.com'))
u'http://qwerty.com'
>>> escape(smart_urlquote('http://qwerty.com?blah=Yes+%26+No'))
u'http://qwerty.com?blah=Yes+&amp;+No'

.. dan kepala cabang master django saat ini:

>>> from django.utils.html import smart_urlquote, escape
>>> escape(smart_urlquote('http://qwerty.com?blah=Yes+%26+No'))
u'http://qwerty.com?blah=Yes+%26+No'

Apakah urlize_quoted_links aslinya merupakan salinan modifikasi dari django.utils.html.urlize ? https://github.com/django/django/blob/master/django/utils/html.py#L255 -L352 sangat berbeda, tetapi saya tidak dapat menjelaskan alasan untuk versi terpisah tersebut. Sepertinya itu perlu disalin ulang.

Ya, itu telah disalin, karena yang asli tidak akan berfungsi untuk tautan gaya " http://example.org " yang memiliki tanda kutip tunggal atau ganda yang melingkupinya, dan tidak ada penggantian yang mudah untuk mengizinkannya. Jika ada banyak perbedaan yang mungkin terjadi karena perubahan bertahap dari versi django sementara versi kami tetap sama.

Akan membuka kembali ini untuk memastikan kami memiliki tiket placeholder untuk memastikan ini ditangani.

Menurunkan tonggak sejarah ini karena ada item 3.0.1 prioritas yang lebih tinggi.

Saya bertanya-tanya apakah mungkin untuk menarik kasus uji yang gagal dari # 2014

Komentar ini https://github.com/tomchristie/django-rest-framework/pull/2014#issuecomment -61525348 menyiratkan bahwa masalah itu telah diperbaiki di hulu Django. Menutup ini, tetapi akan dibuka kembali jika ada yang mengonfirmasi bahwa ini tetap menjadi masalah.

Saya hanya ingin mengonfirmasi bahwa ini berfungsi sekarang :)

Cintai perpustakaan ini, ini sudah berfungsi dengan baik, tetapi bahkan masih menjadi lebih baik! 👍

Apakah halaman ini membantu?
0 / 5 - 0 peringkat