python django json.dumps () и куки javascript [дубликат]

is является оператором равенства идентичности (функционирующим как id(a) == id(b)); просто два одинаковых числа не обязательно являются одним и тем же объектом. По соображениям производительности некоторые маленькие целые числа являются memoized , поэтому они будут иметь тенденцию быть одинаковыми (это можно сделать, поскольку они являются неизменяемыми).

PHP ===, с другой стороны, описывается как проверка равенства и типа: x == y and type(x) == type(y) в соответствии с комментарием Пауло Фрейтаса. Этого достаточно для общих чисел, но отличается от is для классов, которые определяют __eq__ абсурдным образом:

class Unequal:
    def __eq__(self, other):
        return False

PHP, по-видимому, допускает то же самое для «встроенных» классов (что Я подразумеваю реализацию на уровне C, а не в PHP). Немного менее абсурдным использованием может быть объект таймера, который имеет различное значение каждый раз, когда он используется как число. Весьма почему вы хотели бы эмулировать Visual Basic Now, а не показывать, что это оценка с time.time(), которую я не знаю.

Грег Хьюджилл (OP) сделал один пояснительный комментарий «Моя цель это сравнение идентичности объекта, а не равенства стоимости. За исключением чисел, где я хочу рассматривать идентичность объекта так же, как равенство стоимости. "

У этого был бы еще один ответ, поскольку мы должны классифицировать вещи как числа или нет, чтобы выбрать, сравнивать ли мы с == или is. CPython определяет протокол number , включая PyNumber_Check, но это не доступно из самого Python.

Мы могли бы попытаться использовать isinstance со всеми которые мы знаем, но это неизбежно было бы неполным. Модуль типов содержит список StringTypes, но не NumberTypes. Начиная с Python 2.6, встроенные числовые классы имеют базовый класс numbers.Number , но он имеет ту же проблему:

import numpy, numbers
assert not issubclass(numpy.int16,numbers.Number)
assert issubclass(int,numbers.Number)

Кстати, NumPy будет производить отдельные экземпляры с низкими номерами.

На самом деле я не знаю ответа на этот вариант вопроса. Я предполагаю, что теоретически можно использовать ctypes для вызова PyNumber_Check, но даже эту функцию обсуждали , и это, конечно, не переносимо. Мы просто должны быть менее конкретными в отношении того, что мы тестируем сейчас.

В конце концов, эта проблема связана с тем, что Python первоначально не имел дерева типов с предикатами, такими как Scheme number? или класса Haskell Num . is проверяет идентификацию объекта, а не равенство значения. PHP также имеет красочную историю, где ===, по-видимому, ведет себя как is только на объектах в PHP5, но не на PHP4 . Таковы растущие трудности перемещения по языкам (включая версии одного).

4
задан marclar 19 April 2012 в 00:30
поделиться

3 ответа

Я также хотел прочитать файл cookie (который был установлен на сервере) на клиенте. Я работал над проблемой с помощью base64, кодирующего JSON String, но есть и несколько небольших ошибок, связанных с этим подходом.

1: строки Base64 заканчиваются знаками равными 0-2, и они были преобразованы в строку \ 075. Мой подход состоит в том, чтобы вернуть эти символы в равные символы на клиенте.

2: Строка base64 заключена в символы двойной кавычки в файле cookie. Я удаляю их на клиенте.

Сервер:

nav_json = json.dumps(nav_data)
nav_b64=base64.b64encode(nav_json)
self.response.set_cookie('nav_data', nav_b64)

Клиент:

var user_data_base64= $.cookie('nav_data');
// remove quotes from around the string
user_data_base64 = user_data_base64.replace(/"/g,"");
// replace \075 with =
user_data_base64 = user_data_base64.replace(/\\075/g,"=");
var user_data_encoded=$.base64.decode( user_data_base64 );
var user_data = $.parseJSON(user_data_encoded);

Я использую 2 плагина jquery: https : //github.com/carlo/jquery-base64 и https://github.com/carhartl/jquery-cookie

Примечание: я считаю это a hack: Было бы лучше повторить реализацию кода python, который кодирует cookie в javascript, однако это также имеет недостаток, который вам нужно будет заметить, и порт и изменения этого кода.

У меня теперь есть переместился в решение, где я использую небольшой файл html, чтобы установить cookie на стороне клиента, а затем перенаправить на запрашиваемую страницу. Вот фрагмент из шаблона JINJA2, который я использую:

<script type="text/javascript">
var nav_data='{% autoescape false %}{{nav_data}}{% endautoescape %}';
$.cookie('nav_data', nav_data, { path: '/' });
window.location.replace("{{next}}")
</script>

Примечание 2: Cookies не идеальны для моего варианта использования, и я, вероятно, перейду к сеансу или локальному хранилищу, чтобы уменьшить накладные расходы сети ( хотя моя nav_data довольно мала - дюжина символов или около того.)

2
ответ дан Hamish Currie 18 August 2018 в 06:32
поделиться
  • 1
    Ах, очень умный (и хороший ответ, спасибо). В настоящее время я просто заменяю запятые '|' а затем восстановить запятые позже, так как кажется, что запятые вызывают проблему. Это также взломанно, но достаточно сейчас. Я думаю, что ваш подход может быть лучшим долгосрочным взломом, хотя;) – marclar 25 April 2012 в 16:26

не уверен, что cookie - лучший способ сделать это? см. руководство по началу работы для информации, передающей данные клиенту

0
ответ дан Gwyn Howell 18 August 2018 в 06:32
поделиться

На стороне Python :

  1. json.dumps строка
  2. экранирует пробелы - просто вызовите .replace(' ', '%20')
  3. Вызовите urllib.quote_plus(), затем напишите строку в файл cookie

На стороне JavaScript :

  1. прочитайте файл cookie
  2. передают его через decodeURIComponent()
  3. JSON.parse it

Это кажется самым чистым способом, который я нашел.

0
ответ дан Shane H 18 August 2018 в 06:32
поделиться
  • 1
    Удаление пробелов может изменить значение файла cookie. например {1: «Привет, мир!»} - & gt; {1: «Привет, мир!»} – yndolok 19 August 2014 в 14:49
  • 2
    Это так старо, но вы правы, у меня была небольшая ошибка в моем ответе, теперь она исправлена. (Экранирование пробелов, а не замена) – Shane H 27 January 2017 в 18:56
Другие вопросы по тегам:

Похожие вопросы: