【问题标题】:failed to decode json object when tried to do insertion on flask尝试在烧瓶上插入时无法解码 json 对象
【发布时间】:2020-05-11 14:44:56
【问题描述】:

我尝试在我的烧瓶应用程序上将新用户注册到本地数据库,并使用psycopg2 进行数据库交互。我了解到使用 mogrify 会在 db 上插入数据,但在服务器端点出现以下错误:

{
  "message": "Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)"
}

我可以从本地数据库中检索现有用户,但我无法使用psycopg2 将新用户注册到同一个数据库表中。谁能指出我如何使这项工作?无论如何我可以将新用户注册/放入本地数据库表?有什么想法吗?谢谢

我在烧瓶中的尝试

这是我尝试将新用户注册/放入本地数据库表:

from flask_restplus import reqparse, fields, abort
from psycopg2.extensions import AsIs
from flask_restplus import Api, Namespace, Resource, fields, reqparse
from flask import Flask, request, jsonify
import psycopg2, json

app = Flask(__name__)
api = Api(app) 

credential_model = api.model('credential', {
    'username': fields.String(required=True),
    'password': fields.String(required=True)
})

credential_parser = reqparse.RequestParser()
credential_parser.add_argument('username', type=str)
credential_parser.add_argument('password', type=str)

@api.route('/token')
class Token(Resource):
    @api.expect(credential_parser, validate=True)
    def post(self):
        args = credential_parser.parse_args()

        username = args.get('username')
        password = args.get('password')
        user = {'_id':username,
                'password': password 
        }
        columns = user.keys()
        values = [user[column] for column in columns]
        insert_statement = 'insert into authorized_user_table (%s) values %s'
        try:
            cursor = db.cursor()
            cursor.mogrify(insert_statement, (AsIs(','.join(columns)), tuple(values)))
        except:
            return {"message" : "{} has already been signed".format(username)}, 400
        return { 
            "message" : "{} Register Successfully".format(username), 
            "prediction_id" : username
            }, 200

if __name__ == '__main__':
    db = psycopg2.connect(database='test_api', user='postgres', password='password', host='localhost', port="5432")
    app.run(debug=True)

更新:数据库表

 CREATE TABLE authorized_user_table (
   user_id bigint(20) NOT NULL AUTO_INCREMENT,
   user_name varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
   user_email varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
   user_password varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
   PRIMARY KEY (`user_id`)

insert  into authorized_user_table(user_id,username,email,password) values 
(4,'Jen hardy','jhardy@gmail.com','password4');

为了向数据库表插入新条目,我使用了this postsecond post,但我仍然无法将新用户注册到本地数据库表。

更新:错误持续存在

我尝试发布答案,但我仍然无法将新用户插入数据库。如何使发布的答案正确?任何的想法?

目标

我只是想验证用户是否存在于数据库中,如果不存在,我想先在本地数据库中注册它们,然后设置它们经过身份验证的用户可以访问烧瓶应用程序。我怎样才能使这项工作?任何可能的想法?谢谢

【问题讨论】:

  • 你想要像cursor.execute(my_sql_statement, values) 这样的东西。 mogrify 将要执行的语句生成为字符串,但它不执行它。
  • @snakecharmerb 我相信你发布的答案应该可以,但我仍然有同样的错误,我认为插入仍然失败,为什么?
  • @snakecharmerb 我用同样的错误信息编辑了我的帖子。看来你的尝试应该没问题,为什么我仍然有同样的错误。我们如何找出问题的根源?谢谢
  • @snakecharmerb 我实际上是在 Windows 机器上运行的。
  • @snakecharmerb 我使用了flask-restplus,我填写了usernamepassword之类的参数,然后点击try out将这些:curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' 'http://127.0.0.1:5000/token?username=foo&password=bar'发送到服务器,但我仍然无法t 摆脱错误。

标签: python postgresql flask error-handling psycopg2


【解决方案1】:

此代码可以正常工作。特别是,它使用psycopg2.sql 中提供的工具构建 INSERT 语句,然后执行结果。 cursor.mogrify 将语句作为字节串返回,但不执行。

此代码假定字典保留插入顺序。这适用于 CPython 3.6 和 Python 3.7 的所有实现。如果您使用的是早期版本,则需要确保在生成列和值时键和值是同步的。

import sys
import traceback

from flask_restplus import reqparse, fields
from psycopg2 import sql
from flask_restplus import Api, Resource
from flask import Flask
import psycopg2

app = Flask(__name__)
api = Api(app)

credential_model = api.model(
    "credential",
    {
        "username": fields.String(required=True),
        "password": fields.String(required=True),
    },
)

credential_parser = reqparse.RequestParser()
credential_parser.add_argument("username", type=str)
credential_parser.add_argument("password", type=str)


@api.route("/token")
class Token(Resource):
    @api.expect(credential_parser, validate=True)
    def post(self):
        args = credential_parser.parse_args()

        username = args.get("username")
        password = args.get("password")
        user = {"user_name": username, "user_password": password}

        insert_statement = "insert into authorized_user_table ({}) values ({})"
        cols = sql.SQL(", ").join([sql.Identifier(x) for x in user.keys()])
        vals = sql.SQL(", ").join([sql.Placeholder() for _ in user.values()])
        insert_statement = sql.SQL(insert_statement).format(cols, vals)

        try:
            cursor = db.cursor()
            cursor.execute(insert_statement, tuple(user.values()))
            # Commit/rollback added to make this work locally 
            # perhaps you are already doing this in your code
            db.commit()
        except: 
            # Print exception traceback if there's an error
            tb = sys.exc_info()
            traceback.print_exception(*tb)
            db.rollback()
            return {"message": "{} has already been signed".format(username)}, 400
        return (
            {
                "message": "{} Register Successfully".format(username),
                "prediction_id": username,
            },
            200,
        )


if __name__ == "__main__":
    db = psycopg2.connect(database="test")
    app.run(debug=True)

【讨论】:

  • 非常感谢,感谢您宝贵的时间提供帮助。
猜你喜欢
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
相关资源
最近更新 更多