Kami menggunakan Werkzeug dan Flask untuk membangun REST API. Dalam konteks ini, kami tidak ingin perilaku otomatis menambahkan garis miring, karena ini mengarah ke asimetri antara GET dan permintaan lainnya, dan ketat di sini dapat diterima.
Saat ini kita perlu menggunakan kelas aturan khusus yang terhubung ke internal ( Rule.match
dan RequestSlash
) untuk melakukan ini.
Apakah masuk akal untuk menambahkan ini sebagai opsi konfigurasi orde pertama? Sesuatu seperti append_slash
(untuk memparalelkan opsi Django yang setara) pada peta URL?
app.url_map.strict_slashes = False
adalah semua yang Anda butuhkan untuk menghindari ini.
Itu benar-benar membuat rute cocok ketika garis miring hilang. Saya ingin 404.
Perilaku saat ini adalah:
| Aturan memiliki garis miring | Path memiliki garis miring | strict_slashes
| Hasil |
|-|-|-|-|
| T | T | True
| (pertandingan) |
| T | T | False
| (pertandingan) |
| T | Y | True
| 404 |
| T | Y | False
| 404 |
| Y | T | True
| 301 |
| Y | T | False
| (pertandingan) |
| Y | Y | True
| (pertandingan) |
| Y | Y | False
| (pertandingan) |
Saya ingin 404 ketika aturan memiliki garis miring tetapi jalurnya tidak. Saat ini saya melakukan ini melalui:
class StrictRule(Rule):
def match(self, path, method=None):
try:
result = super(StrictRule, self).match(path, method)
except RequestSlash:
return None
return result
Tapi saya lebih suka tidak menjangkau internal.
Menggunakan aturan khusus akan menjadi cara yang benar untuk melakukan ini di Flask. Kami telah memutuskan secara internal untuk tidak mencoba dan menciptakan segalanya untuk semua orang dalam aturan. Jika Anda menginginkan aturan di luar apa yang ditawarkan sebagai standar, Anda perlu menentukannya. Untuk Flash, Anda akan mengatur url_rule_class
ke kelas baru. Lihat dokumen Flask untuk informasi lebih lanjut. http://flask.pocoo.org/docs/1.0/api/?highlight=rule#flask.Flask.url_rule_class
@aenglander
Per https://github.com/pallets/werkzeug/issues/1246#issuecomment -362099342 , masalahnya di sini adalah dengan penerapan aturan khusus. RequestSlash
secara eksplisit ditandai sebagai pengecualian internal per https://github.com/pallets/werkzeug/blob/a220671d66755a94630a212378754bb432811158/src/werkzeug/routing.py#L259 -L260, jadi cukup canggung untuk menangani ini di kode pengguna.
Dan sementara saya tentu setuju bahwa aturan dasar tidak boleh mendukung setiap kasus penggunaan yang mungkin, tidak mencocokkan garis miring yang tidak ada adalah kasus penggunaan yang sangat umum. Untuk karya sebelumnya, pola ini adalah salah satu dari sedikit yang secara eksplisit diekspos dalam konfigurasi Django melalui APPEND_SLASH
: https://docs.djangoproject.com/en/dev/ref/settings/#append -slash.
"Internal" dalam hal ini berarti "ditangani secara internal", bukan "untuk "penggunaan internal saja." Kode yang Anda tunjukkan boleh digunakan.
@davidism Terima kasih atas klarifikasinya. Aku akan pergi ke depan dan pergi dengan ini, kemudian.
Komentar yang paling membantu
app.url_map.strict_slashes = False
adalah semua yang Anda butuhkan untuk menghindari ini.