Werkzeug: Izinkan menonaktifkan menambahkan garis miring?

Dibuat pada 31 Jan 2018  ·  7Komentar  ·  Sumber: pallets/werkzeug

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?

routing

Komentar yang paling membantu

app.url_map.strict_slashes = False adalah semua yang Anda butuhkan untuk menghindari ini.

Semua 7 komentar

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat