I created a json object in jquery and sent it via ajax as a post request. I logged both the arrays and it has the correct format.
$('#submittt').on('click', function () {
var names = [];
var times = [];
$(".input-medium.name").each(function() {
names.push($(this).val());
});
$(".input-medium.time").each(function() {
times.push(parseInt($(this).val()));
});
console.log(JSON.stringify(names));
console.log(JSON.stringify(times));
var data = {"names":names, "times":times};
console.log(data);
$.ajax({
url: "/step/" + vid,
type: "POST",
data: 'data=' + JSON.stringify(data),
dataType: "json",
});
Now I am trying to get the json object in python (I am using GAE) and access its 2 arrays.
I believe I am supposed to do something like
json_raw = self.request.get('data')
jsonObj = json.loads(json_raw)
namelist = jsonObj[0]['names']
print namelist
But this isn't working, it says it can't decode the json object. Anyone know what I am doing wrong?
In your JavaScript, instead of
data: 'data=' + JSON.stringify(data),
do
data: JSON.stringify(data),
And in your Python remove the [0] when retrieving namelist.
Related
I'm struggling with the datatables reordering. I want when user reorder to update table in the database. For this to happen i need:
to configure the datatable to send request to the server.
send the information about reordered datatable to flask endpoint.
Process data on the backend and update database table.
I have read the documentation but it is not clear to me.
My code:
$(document).ready(function () {
var dt = $('#data').DataTable({
rowReorder: true,
dom: 'Bfrtip'
});
});
My own solution:
JavaScript code:
dt.on('row-reorder.dt', function (e, details, edit) {
var slownik = {};
for (var i = 0, ien = details.length; i < ien; i++) {
let id_asortymentu = details[i].node.id;
let nowa_pozycja = details[i].newPosition+1;
console.log(id_asortymentu);
console.log(nowa_pozycja);
slownik[id_asortymentu] = nowa_pozycja;
}
req = $.ajax({
url: 'asortymenty/tabela_reorder',
dataType: "json",
type: 'POST',
data : JSON.stringify(slownik)
});
req.done(function(data){
if (data.result == 1){
console.log('Table reordered.');
}
});
});
Flask backend code:
#admin.route('asortymenty/tabela_reorder', methods = ['GET','POST'])
def table_reorder():
slownik=request.get_json('data')
for key, value in slownik.items():
asort = Asortyment.query.get(key)
print(asort.pozycja)
asort.pozycja = value
db.session.add(asort)
db.session.commit()
return jsonify({'result' : '1'})
I'm looking for assistance with translating a piece of sample code written in javascript into something that will work with Python. The sample code is for the 'POST Authenticate' Endpoint of CCH Axcess' Open Integration Kit, which sends a response containing a Security Token
URL: https://api.cchaxcess.com/api/AuthServiceHelp/v1.0/help/operations/Authenticate
Sample Code:
var _restIntegratorKey = "{User Integrator Key}"; // Please use this variable as global variable as all subsequent call required this integrator key to pass
var _restHostUrl = "{host url}"; // i.e. "{Protocol}://{host name}/api"
var request = $.ajax({
url: _restHostUrl + "/AuthService/v1.0/Authenticate",
contentType: "application/json; charset=utf-8",
type: "GET",
dataType: "json"
});
var request = {
UserName: "{username}", // Specify Username
UserSid: "anyone",
Password: "{password}", // Specify Password
Realm: "{accountnumber}" // Specify Account number
};
var request = $.ajax({
url: _restHostUrl + "/AuthService/v1.0/Authenticate",
data: JSON.stringify(request),
beforeSend: _setHttpHeader,
contentType: "application/json",
type: "POST",
dataType: "json"
});
request.done(function (data, textStatus, jqXHR) {
// This method block will be executed on succefull execution of api and will return security token.
// Below statement will store returned security token into browser cookie named: "CchNGAuthToken". you can use any other way to persist this token.
// This security token we required to pass in header for other rest api calls
document.cookie = "CchNGAuthToken=" + data.Token;
});
request.fail(function (jqXHR, textStatus, err) {
// This method block will be executed if API returns any error.
});
// Please keep these below two methods, As both will be used in subsequent call, to get SSOToken from Cookie
// set Security token and integratorkey into request header
function _setHttpHeader(xhr) {
var ssoToken = _getSessionCookie("CchNGAuthToken"); // Read security token from document cookie which we set during authentication rest api call
xhr.setRequestHeader("Security", ssoToken);
xhr.setRequestHeader("IntegratorKey", _restIntegratorKey);
};
// Get session cookie
function _getSessionCookie(name) {
var key = name + "=";
var cookie = "";
if (document.cookie.length > 0) {
var begin = document.cookie.indexOf(key)
if (begin != -1) {
begin += key.length
var end = document.cookie.indexOf(";", begin);
if (end == -1)
end = document.cookie.length;
cookie = unescape(document.cookie.substring(begin, end))
}
}
return cookie;
};
I have an LIC file with the IntegratorKey stored in XML format, like:
<?xml version="1.0"?>
<IntegratorInfo>
<IntegratorKey>XXXXX-XXX-XXX-XXXX</IntegratorKey>
</IntegratorInfo>
I think my primary issue is identifying the values of the 'ssoToken' and '_restIntegratorKey' variables once they're assigned inside the '_setHttpHeader' function.
My attempt:
def getcchauth():
import requests
integratorkey = getintkey()
cookie = getcookie()
authheaders = {
'Security': cookie,
'IntegratorKey': integratorkey,
'content-type': 'application/json; charset=utf-8'
}
cchlogin = {
'UserName':"user",
"UserSid": 'anyone',
'Password': 'password',
'Realm' : '123456',
}
authattempt = requests.post(resthosturl+endpoint, data = cchlogin,
headers=authheaders)
print(authattempt.headers)
def getcookie():
import requests
import json
cookieresponse = requests.get(resthosturl+apiservdir,
headers = headers)
cookieresponse = json.dumps(cookieresponse.headers.__dict__['_store'])
cookieresponse = json.loads(cookieresponse)
cookie = 'CchNGAuthToken=' + cookieresponse['set-cookie'][1].split(';')[0].strip() + ';'
print(cookie)
return cookie
Thanks!
class StartAnalysis(BaseHandler):
def post(self):
playlist = self.request.get('playlist')
language = self.request.get('language')
If I make a POST request without this playlist field, then this happens:
>>> playlist
null
>>> type(playlist)
<type 'unicode'>
>>> playlist is None
False
>>> not playlist
False
>>> playlist == ''
False
>>> playlist == u''
False
How am I supposed to check that it's None? And why is it saying that it's null and not None?
I'm using AppEngine.
My javascript code making the POST request:
let params = new URLSearchParams(location.search);
let url_id = params.get('id');
let url_language = params.get('language');
const url = 'http://localhost:8080/start-analysis?playlist=' + url_id + '&language=' + url_language;
$.ajax({
url: url,
type: 'POST',
success: function(results) {
...
},
error: function(error) {
...
}
});
I changed to using application/json for the POST requests instead of the default application/x-www-form-urlencoded and that seemed to fix the problem of the request sending the string "null" instead of just an empty string when one of the parameters was empty or missing.
let params = new URLSearchParams(location.search);
let url_id = params.get('id');
let url_language = params.get('language');
const url = 'http://localhost:8080/start-analysis';
$.ajax({
url: url,
type: 'POST',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify({'playlist': url_id,'language': url_language}),
success: function(results) {
...
},
error: function(response, status, error) {
...
}
});
And the backend receives it like:
class StartAnalysis(BaseHandler):
def post(self):
data = json.loads(self.request.body)
playlist = data['playlist']
language = data['language']
I'm making a POST request from AngularJS to Python.
I started with an JavaScript example. It works properly returning all the values.
However, when I try to do it from AngularJS I'm not able to read the value of the variable posted.
JAVASCRIP EXAMPLE THAT WORKS PROPERLY (I'm able to get the value (Mike) back of Name):
JS code
<script language="Javascript">
function asyncChange()
{
var request;
if (window.XMLHttpRequest) {
request = new window.XMLHttpRequest();
} else {
// Versiones antiguas de Internet Explorer.
request = new window.ActiveXObject("Microsoft.XMLHTTP");
}
request.open("POST","nctest.py" , true);
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.send("Name=Mike");
request.onreadystatechange = function()
{
if (request.readyState == 4 && request.status == 200)
{
document.getElementById("myLabel").innerHTML = "Hello " + request.responseText + "!";
}
}
}
</script>
nctest.py
#!/usr/bin/python
import cgi
input = cgi.FieldStorage()
print "Content-type: text/html\n\n"
print "input[Pe].value: "
print input["Pe"].value
ANGULARJS DOESN'T WORK PROPERLY (I'm not able to get the value (Mike) back of Name):
Angularjs code:
(function(){
'use strict'
var sectest= {
controller:sectestCtrl,
templateUrl:'app/components/component_test/test.html',
}
angular
.module('myapp')
.component('secTest',sectest);
function sectestCtrl($http){
var prac= this;
prac.method = 'POST';
prac.url = 'nctest.py';
prac.data = {Name : 'Mike'};
prac.data_answer
prac.headers = { 'Content-Type': 'application/x-www-form-urlencoded' };
prac.sendHTML = send;
function send(){
prac.code = null;
prac.response = null;
$http({method: prac.method, headers: prac.headers, url: prac.url, data: $.param(prac.data)}).
then(function(response) {
prac.status = response.status;
prac.data_answer = response.data;
console.log("OK prac.data_answer: ", prac.data_answer)
}, function(response) {
prac.data_answer = response.data || 'Request failed';
prac.status = response.status;
});
};
}
})();
nctest.py code
#!/usr/bin/python
import json
import cgi
input = cgi.FieldStorage()
print "Content-type: text/html\n\n"
print input["Name"].value
The problem is that prac.data_answer prints blank value.
I have already try with different headers for both angularjs and python codes but none seems to work:
prac.headers = { 'Content-Type': 'application/json' };
prac.headers = { 'Content-Type': 'application/x-www-form-urlencoded' };
prac.headers = { 'Content-Type': 'text/html\n\n' };
Many thanks.
There are 2 separate issues you're trying to address. Server (CGI) & client(angularjs). First check to see that you are receiving the data over the network - using Chrome developer tools, under the Network tab. If so, there's no need to change the Content-Type to json, since angular by default assumes all http data is in json format.
I don't think you need all those attributes for a post request. Seems like an overkiller when it can be simpler. Try this:
$http.post(url, data).then(function(response){
console.log(response.data);
});
I am a new to Ajax/Python, I don't know how to POST a json value to my python server.
Python code:
#app.route('/ajouterContact', methods = ['POST'])
def ajouterContact():
data = json.loads(request.data)
#nom = request.form['nomContact'];
contact.append(data)
ajouter.make_response(json.dumps(contact), 201)
ajouter.headers['Content-Type'] = 'application/json'
JS code
$('#buttonAjouter').click(function() {
var nom = 'Tom';
var myObj = new Object();
myObj.nom = nom;
var jsonText = JSON.stringify(myObj);
var i = 0;
$.ajax({
url: '/ajouterContact',
data: jsonText,
type: 'POST',
dataType: "json",
success: function(response) {
console.log(response);
},
error: function(error) {
console.log(error);
}
});
});
I am getting this error on server side :
ValueError: No JSON object could be decoded
If anyone can help me on this..
Thank you!
You need to provide the contentType in your ajax request:
contentType: 'application/json;charset=UTF-8',
Then in your server try to debug something like this:
request.json