2016-05-03 11 views
0

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) 

Antwort

1

Ich denke, dass Ihr Problem auf der ersten Probe ist:

existingPerson = session.query(person_models.Player).filter(person_models.Player.Email == args['Email']).first() 

Versuchen mit kwargs statt args:

existingPerson = session.query(person_models.Player).filter(person_models.Player.Email == kwargs['Email']).first() 
+0

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

+1

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

Verwandte Themen