Leute, ich habe diesen zufälligen Fehler auf meinem Projekt beim Versuch, Benutzer zu registrieren.Cherrypy mit Mysql Fehler: "Tuple-Indizes müssen Integer sein, nicht str" beim Versuch, Benutzer hinzuzufügen
Dies sind die Informationen, die vom Browser zurückgegeben werden.
{Gender: "M", ReEmail: "[email protected]", Birthday: "1/19/1980", Role: "Athlete",…}
Birthday: "1/19/1980"
Country: "United States"
Email: "[email protected]"
Gender: "M"
Password:"doesntwork123"
ReEmail:"[email protected]"
RePassword:"doesntwork123"
Role:"Athlete"
kwargs:{}
method:"POST"
results:{error: "tuple indices must be integers, not str"}
error: "tuple indices must be integers, not str"
Durch die Verwendung von PyCharm Debugger, ich habe das Problem auf diesen speziellen Teil zentralisiert
def addUser(self, session, *args, **kwargs):
try:
#existingPerson = session.query(person_models.Player).filter(person_models.Player.Email==args['Email']).first()
print person_models.Player
print person_models.Player.Email
existingPerson = session.query(person_models.Player).filter(person_models.Player.Email == args['Email']).first()
print existingPerson
if existingPerson is not None:
return {'error':"User already exists"}
person_model = getattr(person_models)
person = person_model(*args)
session.add(person)
session.commit()
return {"response": "User added"}
except Exception as e:
return {'error':str(e)}
Sobald es an bestehende Person erhält, schickt er mich direkt an die Ausnahme. Dies ist, wenn es gibt mir „Tupel Indizes müssen ganze Zahlen sein, nicht str“
Hier sind einige zusätzliche Code. Hier
ist ein Code:
webapi.py
import cherrypy
from api.restBase import jsonDbRest
from person.controllers import PersonController
class PersonAPI:
exposed = True
@jsonDbRest
def GET(self, email=False, **kwargs):
session = cherrypy.request.db
pc = PersonController()
if email in kwargs:
profile = pc.get(session, **kwargs)
return {"results":[profile], "count":'1'}
profile = pc.search(session, **kwargs)
return {"results":profile.to_dict(), "count":'1'}
@jsonDbRest
def POST(self, *args, **kwargs):
session = cherrypy.request.db
pc = PersonController()
response = pc.addUser(session, *args, **kwargs)
return {"results": response}
Es geht um Linie beschweren 15.
Hier ist eine andere Linie ist, die den Code verwendet:
restbase.py
import cherrypy
import json
from engine import create_session
def jsonDbRest(func):
def wrapper(self, *args, **kwargs):
cherrypy.request.db = create_session()
if 'Content-Length' in cherrypy.request.headers:
length = cherrypy.request.headers['Content-Length']
bodytext = cherrypy.request.body.fp.read(int(length))
else:
bodytext = ""
if bodytext != "":
jsonData = json.loads(bodytext)
else:
jsonData = None
cherrypy.request.json = jsonData
func_data = func(self, *args, **kwargs)
data = {"method":func.__name__, "input":jsonData,"kwargs":kwargs}
if func_data is not None:
data.update(func_data)
cherrypy.response.headers['Content-Type'] = 'application/json'
if "error" in data:
cherrypy.response.status = "400"
else:
cherrypy.response.status = "200"
cherrypy.request.db.close()
return json.dumps(data, indent=4)
Rückkehr Wrapper
Ein weiterer Code
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.declarative import AbstractConcreteBase
import datetime
import decimal
import netaddr
import sqlalchemy
from time import strftime
class Base(object):
def to_dict(self):
dict = {}
dict = self.__dict__
remove = '_sa_instance_state'
dict = {key: value for key, value in dict.items() if key is not remove}
dict['DateOfBirth'] = dict['DateOfBirth'].strftime('%m/%d/%Yi')
return dict
def from_dict(self, dict):
for col in dict:
setattr(self, col, dict[col])
def to_array(self, columns=[]):
if len(columns) < 1:
columns = self.__mapper__.columns.keys()
data = []
for col in columns:
data.append(getattr(self, col))
return data
def get_columns(self):
return self.__mapper__.columns.keys()
JsonBase = declarative_base(cls=Base)
Hey! Vielen Dank für Ihre Antwort, und ich habe das schon einmal gemacht und es so umgesetzt, wie Sie es empfohlen haben. Was passiert ist, dass es direkt zum Ausschließen geht und einen Fehler ausgibt. Ich habe versucht, den Fehler jetzt für eine Weile zu verfolgen, aber ich kann nicht herausfinden, was die Ursache ist! Was mit Kwargs gedruckt wird, ist 'E-Mail' – user3561871
Kennen Sie das integrierte JSON-Tool in CherryPy? Sie scheinen das Attribut 'cherrypy.request.json' ähnlich dem eingebauten Tool zu setzen. http://docs.cherrypy.org/en/latest/basics.html?#dealing-with-json – cyraxjoe