尝试在烧瓶上插入时无法解码 json 对象
failed to decode json object when tried to do insertion on flask
我尝试在我的 flask 应用程序上向本地数据库注册新用户,并使用 psycopg2
进行数据库交互。我了解到使用 mogrify
会在数据库上插入数据,但我在服务器端点出现以下错误:
{
"message": "Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)"
}
我可以从本地数据库检索现有用户,但我无法将新用户注册到与 psycopg2
相同的数据库 table。谁能指出我如何进行这项工作?无论如何,我可以 register/put 将新用户添加到本地数据库 table 吗?有什么想法吗?谢谢
我在烧瓶中的尝试:
这是我尝试 register/put 新用户到本地数据库 table:
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)
更新:数据库table:
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');
用于向数据库 table 插入新条目,我使用了 this post and second post,但我仍然无法将新用户注册到本地数据库 table。
更新:错误持续存在:
我试过发布答案,但我仍然无法将新用户插入数据库。如何使发布的答案正确?任何的想法?
objective:
我只是想验证用户是否存在于数据库中,如果不存在,我想先在本地数据库中注册它们,然后将它们设置为经过身份验证的用户可以访问 Flask 应用程序。我怎样才能使这项工作?任何可能的想法?谢谢
这段代码工作正常。特别是,它使用 psycopg2.sql 中提供的工具构建 INSERT 语句,然后 执行 结果。 cursor.mogrify
returns 语句作为字节串,但不执行它。
此代码假定字典保留插入顺序。 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)
我尝试在我的 flask 应用程序上向本地数据库注册新用户,并使用 psycopg2
进行数据库交互。我了解到使用 mogrify
会在数据库上插入数据,但我在服务器端点出现以下错误:
{
"message": "Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)"
}
我可以从本地数据库检索现有用户,但我无法将新用户注册到与 psycopg2
相同的数据库 table。谁能指出我如何进行这项工作?无论如何,我可以 register/put 将新用户添加到本地数据库 table 吗?有什么想法吗?谢谢
我在烧瓶中的尝试:
这是我尝试 register/put 新用户到本地数据库 table:
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)
更新:数据库table:
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');
用于向数据库 table 插入新条目,我使用了 this post and second post,但我仍然无法将新用户注册到本地数据库 table。
更新:错误持续存在:
我试过发布答案,但我仍然无法将新用户插入数据库。如何使发布的答案正确?任何的想法?
objective:
我只是想验证用户是否存在于数据库中,如果不存在,我想先在本地数据库中注册它们,然后将它们设置为经过身份验证的用户可以访问 Flask 应用程序。我怎样才能使这项工作?任何可能的想法?谢谢
这段代码工作正常。特别是,它使用 psycopg2.sql 中提供的工具构建 INSERT 语句,然后 执行 结果。 cursor.mogrify
returns 语句作为字节串,但不执行它。
此代码假定字典保留插入顺序。 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)