Cherrypy-接收JSON数据404,“缺少参数" [英] Cherrypy - reciving JSON data 404, 'Missing parameters'

查看:110
本文介绍了Cherrypy-接收JSON数据404,“缺少参数"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Cherrypy Postgresql从头开始创建自己的网站.我是初学者使用Python和Javascript,但我非常热衷于学习这两种编程语言.

I'm making my own site from scratch using Cherrypy Postgresql. I am a beginner with Python and Javascript but I am very enthusiastic about learning those two programming languages.

我现在要实现的目标是fill up HTML form-> Send data using

What I am trying to achieve right now is to fill up HTML form -> Send data using JSON by AJAX -> Define Rights for a visitor -> and redirect to index after its all done.

几天来我一直在与这个错误作斗争,因为我无法在互联网上找到一个示例,说明如何使用JSON通过AJAX在python中发送数据

I am fighting with this error for days because I cannot find an example on the internet how to send data in python by AJAX using JSON

正如我所说的,我是一个初学者,所以请指出我正在编写的代码中的所有不良行为:)

As I said I am a beginner so point all bad behaviours in code I am making, please :)

Traceback (most recent call last):
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\cherrypy\_cpdispatch.py", line 60, in __call__
    return self.callable(*self.args, **self.kwargs)
TypeError: login() missing 1 required positional argument: 'dataString'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\cherrypy\_cprequest.py", line 670, in respond
    response.body = self.handler()
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\cherrypy\lib\encoding.py", line 221, in __call__
    self.body = self.oldhandler(*args, **kwargs)
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\cherrypy\_cpdispatch.py", line 66, in __call__
    raise sys.exc_info()[1]
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\cherrypy\_cpdispatch.py", line 64, in __call__
    test_callable_spec(self.callable, self.args, self.kwargs)
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\cherrypy\_cpdispatch.py", line 163, in test_callable_spec
    raise cherrypy.HTTPError(404, message=message)
cherrypy._cperror.HTTPError: (404, 'Missing parameters: dataString')


Cherrypy引擎打印输出


Cherrypy engine printout

[12/Jun/2017:13:44:03]  Testing database is disabled, deleting test users... skipping...
[12/Jun/2017:13:44:03]  ====== INIT SQL ======
[12/Jun/2017:13:44:03]  Connecting to PostgreSQL database...
[12/Jun/2017:13:44:03]  Testing engine is enabled, adding record...
[12/Jun/2017:13:44:03]  ====== INIT SRV ======
[12/Jun/2017:13:44:03] ENGINE Bus STARTING
CherryPy Checker:
The Application mounted at '' has an empty config.

[12/Jun/2017:13:44:03] ENGINE Started monitor thread 'Autoreloader'.
[12/Jun/2017:13:44:03] ENGINE Started monitor thread '_TimeoutMonitor'.
C:\Program Files (x86)\Python36-32\lib\site-packages\cherrypy\process\servers.py:411: UserWarning: Unable to verify that the server is bound on 8080
  warnings.warn(msg)
[12/Jun/2017:13:44:08] ENGINE Serving on http://0.0.0.0:8080
[12/Jun/2017:13:44:08] ENGINE Bus STARTED


Python登录方法

class Root(object):
    exposed = True

    @cherrypy.expose
    # @cherrypy.tools.json_out()
    @cherrypy.tools.json_in()
    @cherrypy.tools.accept(media='application/json')
    def login(self, dataString):
        # cherrypy.request.method == "POST":
        self.addHeader()
        db = config()
        conn = psycopg2.connect(**db)
        cur = conn.cursor()
        is_logged_in = None
        bad_username = None
        bad_password = None
        json.load(dataString)
        # input_json = cherrypy.request.json()
        # dataString = input_json["dataString"]
        # - Login
        username_input = dataString[0]
        if username_input == cur.execute("SELECT username FROM users WHERE username = %s;", (username_input)):
            username_password = dataString[1]
            if username_password == cur.execute("SELECT password FROM users WHERE password = %s;", (username_password)):
                return is_logged_in
            else:
                return bad_password
        else:
            return bad_username

    @cherrypy.expose
    def index(self):
        self.addHeader()
        return "ok"


Javascript .js覆盖提交功能

$("#myForm").submit(function(){
    var dataString = [];
    dataString.login = $("#login").val();
    dataString.password = $("#password").val();

    $.ajax({
      type: 'POST',
      url: 'http://0.0.0.0:8080/login',
      data: JSON.stringify(dataString),
      contentType: 'application/json',
      dataType: 'json',
      success: function(response) {
          console.log(response);
      },
      error: function(response) {
          console.log(response);
      }
    });
});


HTML文件

<!DOCTYPE html>
<html>
  <head>
    <link href="style.css" rel="stylesheet">
    <script src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
    <script src="example.js"></script>
  </head>
<body>
<div class="login-page">
  <div class="form">
      <form action="/process_form/" method="post">
      <!-- id="myForm" class="login-form"> -->
        <input type="text" name="login" id="login" placeholder="login"/>
        <input type="password" name="password" id="password" placeholder="password"/>
        <button form="myForm" type="submit">Login</button>
        <p class="message">Not registered? <a href="#">Create an account</a></p>
      </form>
  </div>
</div>
</body>
</html>

推荐答案

login函数中将接收的AJAX数据不包含在参数dataString中(实际上,您将不会获得任何参数)但在cherrypy.request.json中.

The AJAX data you'll receive in in your login function is not contained in the parameter dataString (actually, you will not get any parameter) but in cherrypy.request.json.

因此,您应该按以下步骤更改登录功能:

Thus you should change your login function as follows:

@cherrypy.expose
@cherrypy.tools.json_in()
def login(self):
    json_obj = cherrypy.request.json
    ...

请注意,您将收到基于AJAX参数而不是字符串的实际对象(字典/列表).

Note that you will receive an actual object (dict / list) based on the AJAX parameters, not a string.

另一个注意事项:cherrypy.request.json仅在您已经设置装饰器@cherrypy.tools.json_in()时才填充(如您已经做过的那样).

Another note: cherrypy.request.json is only filled if you've set the decorator @cherrypy.tools.json_in() (as you already did).

这篇关于Cherrypy-接收JSON数据404,“缺少参数"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆