Django-rest-framework: 閲覧可能なAPIURLでのエスケープ(アンパサンド)。

作成日 2014年06月20日  ·  26コメント  ·  ソース: encode/django-rest-framework

エスケープ文字(特に私の場合はアンパサンド)を含むURLが閲覧可能なAPIでレンダリングされると、hrefでは不適切にエスケープ解除されます。 これは、アンパサンドにのみ適用される場合があります。

たとえば、次のURLは次のとおりです。
http:// localhost :8000 / endpoint /?param1 = Yes +%26 + No&param2 = something

次のようにレンダリングされます:
http:// localhost :8000 / endpoint /?param1 = Yes +&+ No&param2 = something

URLは要素の値で正しくレンダリングされます...これはhrefにのみ適用されます。

Bug

最も参考になるコメント

私はそれが今働いていることを確認したいだけです:)

このライブラリが大好きです。すでにうまく機能していますが、それでもさらに良くなっています。 👍

全てのコメント26件

応答が遅いことをお詫びします。
異なるのはレンダリングだけですか、それともソースHTML自体がエスケープされていませんか?

こんにちはトム、HTMLでは次のようになりました。

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

お奨めの感謝-これについて失敗したテストケースを書いてみる価値があるかもしれません。
理想的には、それはBrowsableAPIRenderererを実行するだけですが、完全な統合テストでも問題ないでしょう。

確かに、私は喜んでいるでしょう。 今すぐテストスイートを見てみましょう...適切な場所はtest_renderers.pyのRendererEndToEndTestsにありますか?

大丈夫ですね。

これは、 DRFのurlize_quoted_linksによって呼び出されるDjangoのsmart_urlquoteと関係があります。これは、閲覧可能なAPI内で変換を処理するものです。 リンクテキストとリンク自体の違いはDjangoから逃れるものかもしれないと私は思いますが、正直なところわかりません。

smart_urlquoteunquote前にquote unquote smart_urlquote呼び出します。これは、元のquote削除するものです。 これはhttps://github.com/django/django/commit/b70c371fc1f18ea0c43b503122df3f311afc7105で追加され、Django1.5以降にバックポートされました。

それで、これがクライアントに表示されるものではないことを気にしますか、それとも単にこれを閉じますか?
意味的にはそれはまだ正しいです。

これは境界線であるため、バグからクリーンアップにプッシュします。

DjangoConガイダンス-このチケットの一般的なレビュー-動作はどのようになると思いますか、それはそのまま受け入れられますか?

私はdjango-consprintsにいて、これに取り組むことができます。 私はこれまで貢献したことがないので、最初のガイダンスが必要になるかもしれません。 私は現在、DRFの寄稿者ガイドラインを読んでおり、ローカルでテストを実行した後、誰かに直接またはircでバグを報告する可能性があります。

ガッチャ-IRCで私にpingを送信するか、応答がない場合はTwitterで気軽に連絡してください。

優先度が低く、進捗がないため閉鎖。
誰かがこれを再び取り上げる動機があるかどうかを再考して幸せです。

@tomchristieマイナーな問題だと理解していますが、それでもバグです。 リンクをクリックすると、間違ったURLに移動します。 有効な問題をクローズするよりも、優先度の低いタグを付ける方が適切と思われます。

時間があるときに調べます。

申し訳ありませんが、これは別の方法で理解していました。URLが間違っていなかっただけで、リンクがエスケープされていないスタイルでレンダリングされただけです。誤解していませんか?

つまり。 cleanupタグの理由は、これが表面的な問題であると理解しましたか?

ああなるほど。 それは正解です。 基本的に、表示値だけでなく、href値とdisplay値の両方がエスケープされています。

ところで、このような素晴らしいライブラリをありがとう!

すみません、もう一度:)

それは正解です。

外観上の問題であると訂正しますか、それとも私が誤解していてバグであると訂正しますか? :)

バグであることを修正してください。 :)

https://code.djangoproject.com/ticket/22267で修正されているため、終了し

これはまだ見ていませんが、「urlize」を複製することを考えると、他に何かをプルする必要がありますか? また、これはどのバージョンで解決されますか? また、素晴らしいです! わーい!

これは1.7.1で修正されていないようですが、1.7.2または1.8ですか? これは、django1.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'

..そして現在のdjangoマスターブランチの責任者:

>>> 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'

urlize_quoted_links元々 django.utils.html.urlize変更されたコピーhttps://github.com/django/django/blob/master/django/utils/html.py#L255 -L352は大きく異なり

はい、コピーされました。元のリンクは、一重引用符または二重引用符で囲まれた「 http://example.org 」スタイルのリンクでは機能せず、簡単にオーバーライドして許可することはできません。 私たちのバージョンが同じままである間に、djangoバージョンが徐々に変更されたために、多くの違いがある可能性があります。

これを再開して、これに対処するためのプレースホルダーチケットがあることを確認します。

優先度の高い3.0.1アイテムがあるため、マイルストーンを削除します。

失敗したテストケースを#2014から引き出すことは可能かどうか疑問に思います

このコメントhttps://github.com/tomchristie/django-rest-framework/pull/2014#issuecomment-61525348は、その問題がアップストリームDjangoで修正されたことを意味し

私はそれが今働いていることを確認したいだけです:)

このライブラリが大好きです。すでにうまく機能していますが、それでもさらに良くなっています。 👍

このページは役に立ちましたか?
0 / 5 - 0 評価