Search code examples
httppostangular5cherrypy

Angular 5 to CherryPy POST


I am trying to send data to a cherrypy backend from an Angular 5 app. I am able to call the correct cherrypy function and get a 200 response, but none of my parameters are getting through.

One thing that caught my eye was that my payload, when I click view source in the chrome debugger looks like this {"username":"admin","password":"admin"}. Is this supposed to be formatted differently?

Here's my post:

  getUserDetails(username, password) {
    const _headers = new HttpHeaders();
    const headers = _headers.append('Content-Type', 'application/json');
    const options = {headers: headers };
    this.data = JSON.stringify({ username, password });
    return this.http.post(this.url1 + 'login', this.data, options )
    .subscribe(data => {
      console.log(data);
    });
  }

Again, this gets to the proper endpoint, just none of the data gets through.

Here's cherryPy:

Login Function:

class authServer(object):
    @cherrypy.expose
    def login(self,*args, **kwargs):
        print(type(args),args, kwargs)

I've tried various args, if I have username and password I get the error saying missing parameters.

Here's the cherrypy configuration.

def CORS():
"""Allow AngularJS apps not on the same server to use our API
"""
cherrypy.response.headers["Access-Control-Allow-Origin"] = "*" 
cherrypy.response.headers["Access-Control-Allow-Headers"] = \
"content-type, Authorization, X-Requested-With"
cherrypy.response.headers["Access-Control-Allow-Methods"] = 'GET, POST'

if __name__ == '__main__':

cherrypy.tools.CORS = cherrypy.Tool('before_handler', CORS)

cherrypy.log.error_log.propagate = False
cherrypy.log.access_log.propagate = False

cherrypy.config.update({'server.thread_pool': 30,
                        'tools.CORS.on': True,
                        'server.socket_host': '0.0.0.0',
                        'server.socket_port': 8081}) 

cherrypy.quickstart(authServer(), '/')

I've made countless posts to cherrypy before. The only difference here is the frontend I'm using. Any help would be greatly appreciated.

Thanks,


Solution

  • Turns out it was a CORS issue. I changed my CORS function from this:

    def CORS():
     cherrypy.response.headers["Access-Control-Allow-Origin"] = "*" 
     cherrypy.response.headers["Access-Control-Allow-Headers"] = \
     "content-type, Authorization, X-Requested-With"
     cherrypy.response.headers["Access-Control-Allow-Methods"] = 'GET, POST'
    

    to this:

    def CORS():
      if cherrypy.request.method == 'OPTIONS':
        cherrypy.response.headers['Access-Control-Allow-Methods'] = 'POST'
        cherrypy.response.headers['Access-Control-Allow-Headers'] = 'content-type'
        cherrypy.response.headers['Access-Control-Allow-Origin']  = '*'
        return True
      else:
        cherrypy.response.headers['Access-Control-Allow-Origin'] = '*'
    
    cherrypy.tools.CORS = cherrypy._cptools.HandlerTool(CORS)
    

    Above my main function I put this:

    @cherrypy.expose
    @cherrypy.config(**{'tools.CORS.on': True})
    @cherrypy.tools.json_in()
    @cherrypy.tools.json_out()