Я бы также подумал об использовании bindParam из привычки .. Мое понимание заключается в том, что PDO будет выполнять проверку типа (не то, что это важно для PARAM_STR), что может спасти вас от некоторых других векторов атаки.
(и добавьте в XSS, дезинфицирующее Скатокс, Райан и Иоанн упоминание.)
$name = isset($_POST['name']) ? htmlspecialchars($_POST['name']) : NULL;
$email = isset($_POST['email']) ? htmlspecialchars($_POST['email']) : NULL;
stmt = bindParam(':name',$name, PDO::PARAM_STR);
stmt = bindParam(':email',$email, PDO::PARAM_STR);
$stmt->execute();
Для межъязыковых проектов я узнал, что представляет в виде строки содержащий , даты RFC 3339 являются лучшим способом пойти. Дата RFC 3339 похожа на это:
1985-04-12T23:20:50.52Z
я думаю, что большая часть формата очевидна. Единственной несколько необычной вещью может быть "Z" в конце. Это обозначает GMT/UTC. Вы могли также добавить смещение часового пояса как +02:00 для ПОЯСА (Германия летом). Я лично предпочитаю сохранять все в UTC, пока он не отображен.
Для отображения, сравнений и устройства хранения данных можно оставить его в формате строки через все языки. Если Вам нужна дата вычислений, легких преобразовать его назад в собственный объект даты на большей части языка.
Так генерируют JSON как это:
json.dump(datetime.now().strftime('%Y-%m-%dT%H:%M:%SZ'))
, К сожалению, Конструктор Date JavaScript не принимает строки RFC 3339, но существуют многие синтаксические анализаторы доступны в Интернете.
huTools.hujson пытается обработать наиболее распространенные проблемы кодирования, с которыми Вы могли бы столкнуться в коде Python включая объекты даты/даты и времени при обработке часовых поясов правильно.
Если Вы уверены, что только JavaScript будет использовать JSON, я предпочитаю передавать объекты Javascript Date
непосредственно.
ctime()
метод на datetime
объекты возвратят строку, которую может понять объект Даты JavaScript.
import datetime
date = datetime.datetime.today()
json = '{"mydate":new Date("%s")}' % date.ctime()
JavaScript будет счастливо использовать это в качестве литерала объектов, и у Вас есть свой объект Даты, созданный прямо в.
Вы можете добавить параметр 'default' в файл json.dumps, чтобы справиться с этим:
date_handler = lambda obj: (
obj.isoformat()
if isinstance(obj, (datetime.datetime, datetime.date))
else None
)
json.dumps(datetime.datetime.now(), default=date_handler)
'"2010-04-20T20:08:21.634121"'
Более полная функция обработчика по умолчанию:
def handler(obj):
if hasattr(obj, 'isoformat'):
return obj.isoformat()
elif isinstance(obj, ...):
return ...
else:
raise TypeError, 'Object of type %s with value of %s is not JSON serializable' % (type(obj), repr(obj))
Обновление: добавлен вывод типа, а также значения.
Обновление: также обрабатывать дату
Используя json
, вы можете создать подкласс JSONEncoder и переопределить метод default (), чтобы предоставить свои собственные сериализаторы:
import json
import datetime
class DateTimeJSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.datetime):
return obj.isoformat()
else:
return super(DateTimeJSONEncoder, self).default(obj)
Затем вы можете вызвать его следующим образом:
>>> DateTimeJSONEncoder().encode([datetime.datetime.now()])
'["2010-06-15T14:42:28"]'
Вот довольно полное решение для рекурсивного кодирования и декодирования объектов datetime.datetime и datetime.date с использованием модуля стандартной библиотеки json
. Для этого требуется Python> = 2.6, поскольку с тех пор код формата % f
в строке формата datetime.datetime.strptime () поддерживается только в. Для поддержки Python 2.5 удалите % f
и удалите микросекунды из строки даты ISO, прежде чем пытаться преобразовать ее, но, конечно, вы потеряете точность в микросекундах. Для взаимодействия со строками даты ISO из других источников, которые могут включать имя часового пояса или смещение UTC, вам также может потребоваться удалить некоторые части строки даты перед преобразованием. Полный синтаксический анализатор строк даты ISO (и многих других форматов даты) см. В стороннем модуле dateutil .
Декодирование работает, только если строки даты ISO являются значениями в JavaScript. буквальное обозначение объекта или во вложенных структурах внутри объекта. Дата ISO строки, которые являются элементами массива верхнего уровня, не декодируются.
Т.е. это работает:
date = datetime.datetime.now()
>>> json = dumps(dict(foo='bar', innerdict=dict(date=date)))
>>> json
'{"innerdict": {"date": "2010-07-15T13:16:38.365579"}, "foo": "bar"}'
>>> loads(json)
{u'innerdict': {u'date': datetime.datetime(2010, 7, 15, 13, 16, 38, 365579)},
u'foo': u'bar'}
И это тоже:
>>> json = dumps(['foo', 'bar', dict(date=date)])
>>> json
'["foo", "bar", {"date": "2010-07-15T13:16:38.365579"}]'
>>> loads(json)
[u'foo', u'bar', {u'date': datetime.datetime(2010, 7, 15, 13, 16, 38, 365579)}]
Но это работает не так, как ожидалось:
>>> json = dumps(['foo', 'bar', date])
>>> json
'["foo", "bar", "2010-07-15T13:16:38.365579"]'
>>> loads(json)
[u'foo', u'bar', u'2010-07-15T13:16:38.365579']
Вот код:
__all__ = ['dumps', 'loads']
import datetime
try:
import json
except ImportError:
import simplejson as json
class JSONDateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, (datetime.date, datetime.datetime)):
return obj.isoformat()
else:
return json.JSONEncoder.default(self, obj)
def datetime_decoder(d):
if isinstance(d, list):
pairs = enumerate(d)
elif isinstance(d, dict):
pairs = d.items()
result = []
for k,v in pairs:
if isinstance(v, basestring):
try:
# The %f format code is only supported in Python >= 2.6.
# For Python <= 2.5 strip off microseconds
# v = datetime.datetime.strptime(v.rsplit('.', 1)[0],
# '%Y-%m-%dT%H:%M:%S')
v = datetime.datetime.strptime(v, '%Y-%m-%dT%H:%M:%S.%f')
except ValueError:
try:
v = datetime.datetime.strptime(v, '%Y-%m-%d').date()
except ValueError:
pass
elif isinstance(v, (dict, list)):
v = datetime_decoder(v)
result.append((k, v))
if isinstance(d, list):
return [x[1] for x in result]
elif isinstance(d, dict):
return dict(result)
def dumps(obj):
return json.dumps(obj, cls=JSONDateTimeEncoder)
def loads(obj):
return json.loads(obj, object_hook=datetime_decoder)
if __name__ == '__main__':
mytimestamp = datetime.datetime.utcnow()
mydate = datetime.date.today()
data = dict(
foo = 42,
bar = [mytimestamp, mydate],
date = mydate,
timestamp = mytimestamp,
struct = dict(
date2 = mydate,
timestamp2 = mytimestamp
)
)
print repr(data)
jsonstring = dumps(data)
print jsonstring
print repr(loads(jsonstring))
HEAD
вместоGET
в вызове кconn.request
, было бы более эффективным, с тех пор you' ре, только проверяющее, чтобы видеть, существует ли это. – Daniel Roseman 21 March 2010 в 10:58