1

<script type="text/javascript" charset="UTF-8">仕事をしていないようです:(

私が探している解決策は私が求めているものではないかもしれないので、私は上から始めます。

だから私は単純なCRMを使っています。その「シンプルな」機能の1つは、まだCustomersデータベースにない顧客からのリクエストを登録することです。CRMが提供された名前と一致する名前の顧客を見つけられない場合、新しい顧客が登録されます。この非常に人気のある機能はCustomers、comany名以外のすべての属性が空である多くのエンティティにつながります。

後でユーザーは連絡先属性を追加しますが、ワークフローは非常に遅く、退屈です。それをスピードアップするために、私はローカルイエローページでその名前で顧客を検索し、HTMLを解析してそれをdict()に変換するPython関数を作成しました。かなり時間がかかるので、別のクエリページに配置しました。リクエストに応じてJavaScriptで赤になります。

クエリページは、辞書を次のような文字列としてレンダリングします。 [{'name': '"AG \xc4\x80bolti\xc5\x86a b\xc5\xabvuz\xc5\x86\xc4\x93mums", SIA', 'phone': '67244222'}] リテラルUTF-8コーディングに注意してください。

$.get('/zl?name=AG SIA ĀBOLTIŅA BŪVUZŅĒMUMS', function(data){... 上と同じように取得します。取得したdataStringをObjectに変換しますresult = eval(data)[0]。したがって、「 $('#zl').html(result.name)ĀBOLTIŅABŪVUZŅĒMUMS "AG ÄboltiÅa bÅ«vuzÅÄmums", SIA」は本来あるべきものではありません。

私は<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>ページヘッダーにあり、スクリプトはで始まりますが<script type="text/javascript" charset="UTF-8">、何も役に立ちません。

だから質問:

  1. JS出力の適切なエンコーディングを設定する方法は?のようなトリック方法はありstring.toProperUTF-8()ますか?
  2. .decode(UTF-8)サーバーエラーを発生させずにPython辞書にアクセスする方法はありますか?
  3. それを行うためのより問題の少ない方法はありますか?
4

1 に答える 1

3

JavascriptとPythonの文字エスケープセマンティクスが異なるため、これは機能しません

私がこれを正しくeval理解していれば、JavaScriptに到達したときにオブジェクトに変換するためのjsonを使用していることになります。

これをしないでください。

代わりに、Pythonの組み込みjsonモジュールを使用して、適切にフォーマットされたjsonでリクエストに応答しJSON.parse()、JavaScriptで使用して応答を読み取ります。これにより、解析が正しく行われるようになります。

Pythonから始めた簡単な例:

import json 

# lots of code...

@route("/my_page")
def my_page(request):
  return json.dumps({
    "siblings":["Eenie", "Meanie", "Meinie", "Mo"], 
    "ages":[1,2,3,4]
  })

# lots more code...

現在、Javascriptから呼び出されています。

$.getJSON('/my_page', function(data, textStatus, jqXHR) {
  /* Do stuff with the object */
});

jQueryビルトインを使用しgetJSON()てオブジェクトを取得する方法に注意してください。昔ながらのAJAXも使用できますJSON.parse()

なぜeval()悪い考えなのか

実際にコードを開く代わりにevalを使用JSON.parse()すると、多数のセキュリティの脆弱性が発生します。悪意のあるユーザー(または気が散っている開発者)がJavaScriptコードをリクエストに含めることができる場合、コードはページを自由に支配し、ユーザーのセキュリティを危険にさらし、バグを見つけるのが非常に困難になる可能性があります。実稼働ページはeval()、特に評価対象のデータがネットワークからのものである場合のように信頼できない場合は、いかなる状況でも使用しないでください。

mimeタイプに関するランダムなメモ

ほとんどの場合、これによって問題が発生することはありませんが、PythonコードがJSONの正しいmimeタイプを返すことを確認する必要があります。これを間違えると、デバッグが難しい奇妙な問題が発生する可能性があります。これを行う方法は、使用しているPythonフレームワークによって異なります。

于 2013-03-26T15:08:19.413 に答える