Я прочитал все сообщения здесь и понял, что нам может понадобиться пример реальной жизни. Почему на самом деле у нас есть @property? Итак, рассмотрите приложение Flask, в котором вы используете систему аутентификации. Вы объявляете модель User в models.py
:
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(64), unique=True, index=True)
username = db.Column(db.String(64), unique=True, index=True)
password_hash = db.Column(db.String(128))
...
@property
def password(self):
raise AttributeError('password is not a readable attribute')
@password.setter
def password(self, password):
self.password_hash = generate_password_hash(password)
def verify_password(self, password):
return check_password_hash(self.password_hash, password)
В этом коде у нас есть «скрытый» атрибут password
с помощью @property
, который запускает утверждение AttributeError
при попытке доступа к нему напрямую, в то время как мы использовали @ property.setter для установки фактической переменной экземпляра password_hash
.
Теперь в auth/views.py
мы можем создать экземпляр пользователя с помощью:
...
@auth.route('/register', methods=['GET', 'POST'])
def register():
form = RegisterForm()
if form.validate_on_submit():
user = User(email=form.email.data,
username=form.username.data,
password=form.password.data)
db.session.add(user)
db.session.commit()
...
Атрибут уведомления password
, который поступает из регистрационной формы, когда пользователь заполняет форму. [3]
Надеюсь, что этот пример будет полезен
Отличный ответ Фила, однако, поскольку название OP говорит
, отправьте json-объект из javascript (не jQuery) в php
blockquote>, вот как сделайте это с помощью (ванильного) javascript, если это поможет кому-то найти этот метод:
var jsondata; var flickr = {'action': 'Flickr', 'get':'getPublicPhotos'}; var data = JSON.stringify(flickr); var xhr = new XMLHttpRequest(); xhr.open("POST", "../phpincl/apiConnect.php", !0); xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); xhr.send(data); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { // in case we reply back from server jsondata = JSON.parse(xhr.responseText); console.log(jsondata); } }
Обратите внимание, что нам все равно нужно преобразовать ответ сервера в объект javascript , используя
JSON.parse()
Теперь, на стороне сервера (на основе ответа Фила), если вы отправляете ответ клиенту, вы можете сделать:
header('Content-type: application/json'); $json = file_get_contents('php://input'); $json_decode = json_decode($json, true); $json_encode = json_encode($json_decode); echo $json_encode;
ПРИМЕЧАНИЕ:
Причина, по которой сначала происходит декодирование, а затем кодирование обратного входного сигнала json, заключается в том, что escape сбрасывает (возможно) URL-адреса внутри данных, например
json_encode
преобразует этот URLhttp://example.com
в
http:\/\/example.com
... что не относится к OP, но полезно в некоторых других сценариях.
Использование:
makeFlickrCall( { data: JSON.stringify( flickr )} );
Вместо
makeFlickrCall(flickr);
Ваш сценарий на стороне сервера должен получить ваш JSON следующим образом:
data="{"action":"Flickr","get":"getPublicPhotos"}"
Стандартный метод jQuery .ajax()
использует свойство data
для создания строки x-www-form-urlencoded для передачи в тело запроса. Что-то вроде этого
action=Flickr&get=getPublicPhotos
Поэтому ваш PHP-скрипт не должен искать $_POST['data']
, а вместо этого $_POST['action']
и $_POST['get']
.
Если вы хотите отправить сырое JSON для PHP, затем сделайте следующее ...
Установите параметр AJAX contentType
на application/json
и отправьте строчную версию вашего объекта JSON в качестве data
, например
$.ajax({
url: '../phpincl/apiConnect.php',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify(flickrObj),
dataType: 'json'
})
Затем ваш PHP-скрипт будет считывать полезную нагрузку данных из потока php://input
, например
$json = file_get_contents('php://input');
. Затем вы можете разобрать это в PHP объект или массив ...
$dataObject = json_decode($json);
$dataArray = json_decode($json, true);
И, если вы просто хотите повторить его обратно клиенту ..
header('Content-type: application/json');
// unmodified
echo $json;
// or if you've made changes to say $dataArray
echo json_encode($dataArray);