Jinja: Jinja2 NativeEnvironment menjatuhkan tanda kutip tunggal di antara elemen dalam template untuk dirender

Dibuat pada 19 Jun 2019  ·  1Komentar  ·  Sumber: pallets/jinja

Perilaku yang Diharapkan

>>> from jinja2 import Template
>>> template = Template("'{{ foo }}', '{{ bar }}', '{{ baz }}'")
>>> template.render(foo='foobar', bar='barbaz', baz='bazfoo')
('foobar', 'barbaz', 'bazfoo')

Perilaku Sebenarnya

>>> from jinja2.nativetypes import NativeEnvironment
>>> e = NativeEnvironment()
>>> t = e.from_string("'{{ foo }}', '{{ bar }}', '{{ baz }}'")
>>> t.render(foo='foobar', bar='barbaz', baz='bazfoo')
'foobar, barbaz, bazfoo'

Lingkungan Anda

  • Versi Python: 2.7.5
  • Versi Jinja: 2.10, 2.10.1, master saat ini

Mencoba mencari penjelasan di atas. Menguji ini dalam penerjemah untuk mempersempitnya menjadi hanya Jinja2, dan tidak ada hal lain yang mungkin menyebutnya, seperti Ansible dengan jinja2_native disetel ke True.

Saat tidak menggunakan jinja2_native, kami mendapatkan perilaku yang diharapkan di atas bahwa tiga substitusi terjadi dengan tanda kutip tunggal di sekitar setiap nilai. Ketika jinja2_native disetel ke true (di NativeEnvironment seperti yang ditunjukkan di atas), tanda kutip tunggal dalam string diabaikan, dan satu string dikembalikan dengan tiga substitusi.

Ini juga terjadi bahkan dengan karakter tambahan di antara tanda kutip tunggal:

>>> e = NativeEnvironment()
>>> t = e.from_string("--foo='{{ foo }}' --bar='{{ bar }}'")
>>> t.render(foo='foobar', bar='barbaz')
u"--foo='foobar --bar=barbaz'"

Bantuan apa pun akan dihargai.

Komentar yang paling membantu

Untuk menambahkan sedikit catatan tentang mengapa ini (kurang lebih) terjadi: templat "--foo='{{ foo }}' --bar='{{ bar }}'" dipecah menjadi simpul-simpul berikut:

  1. --foo='
  2. {{ foo }}
  3. ' --bar='
  4. {{ bar }}
  5. '"

Masalah terjadi ketika native_concat memproses 3. ' --bar=' , literal_eval sana melihat sebuah string, menghapus tanda kutip dan mengembalikan hanya --bar= yang benar, hanya saja tidak masuk konteks ini :)

@davidisme ada pemikiran?

>Semua komentar

Untuk menambahkan sedikit catatan tentang mengapa ini (kurang lebih) terjadi: templat "--foo='{{ foo }}' --bar='{{ bar }}'" dipecah menjadi simpul-simpul berikut:

  1. --foo='
  2. {{ foo }}
  3. ' --bar='
  4. {{ bar }}
  5. '"

Masalah terjadi ketika native_concat memproses 3. ' --bar=' , literal_eval sana melihat sebuah string, menghapus tanda kutip dan mengembalikan hanya --bar= yang benar, hanya saja tidak masuk konteks ini :)

@davidisme ada pemikiran?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat