2014-04-19 1 views
0

플라스크에 datatable을 사용하고 있습니다. 거대한 데이터베이스 때문에 서버 측을 사용하려고했지만 column_1 오류가 발생했습니다. 내 문제를 알아낼 수 없다. 나는 내 컬렉션을 보여줍니다 print self.result_data 때 여기 내 파이썬 코드플라스크를 사용하는 데이터 테이블의 키 오류 column_1

@app.route("/_retrieve_server_data") 
def get_server_data(): 
    columns = [ 'column_1', 'column_2', 'column_3', 'column_4'] 
    index_column = "_id" 
    collection = "AssetMapping" 
    results = DataTablesServer(request, columns, index_column, collection).output_result() 
    # return the results as a string for the datatable 
    print json.dumps(results) 
    return json.dumps(results) 

# translation for sorting between datatables and mongodb 
order_dict = {'asc': 1, 'desc': -1} 

class DataTablesServer(object): 
    def __init__(self, request, columns, index, collection): 
     self.columns = columns 
     self.index = index 
     self.collection = collection 
     # values specified by the datatable for filtering, sorting, paging 
     self.request_values = request.values 
     # connection to your mongodb (see pymongo docs). this is defaulted to localhost 
     self.dbh = MongoClient() 
     # results from the db 
     self.result_data = None 
     # total in the table after filtering 
     self.cardinality_filtered = 0 
     # total in the table unfiltered 
     self.cardinality = 0 
     self.run_queries() 

    def output_result(self): 
     output = {} 
     output['sEcho'] = str(int(self.request_values['sEcho'])) 
     output['iTotalRecords'] = str(self.cardinality) 
     output['iTotalDisplayRecords'] = str(self.cardinality_filtered) 
     aaData_rows = [] 
     for row in self.result_data: 
      aaData_row = [] 
      for i in range(len(self.columns)): 
       print self.columns[i] 
       print aaData_row.append(row[ 'column_1' ].replace('"','\\"')) 
       aaData_row.append(row[ self.columns[i] ].replace('"','\\"')) 
     # add additional rows here that are not represented in the database 
     # aaData_row.append(('''<input id='%s' type='checkbox'></input>''' % (str(row[ self.index ]))).replace('\\', '')) 
      aaData_rows.append(aaData_row) 
     output['aaData'] = aaData_rows 

     return output 

    def run_queries(self): 
     # 'mydb' is the actual name of your database 

     survey = self.dbh.survey 
     # pages has 'start' and 'length' attributes 
     pages = self.paging() 
     # the term you entered into the datatable search 
     _filter = self.filtering() 
     # the document field you chose to sort 
     sorting = self.sorting() 
     # get result from db to display on the current page 
     self.result_data = list(survey[self.collection].find(spec = _filter, 
      skip = pages.start, 
      limit = pages.length, 
      sort = sorting)) 

     # length of filtered set 
     self.cardinality_filtered = len(list(survey[self.collection].find(spec = _filter))) 
     # length of all results you wish to display in the datatable, unfiltered 
     self.cardinality = len(list(survey[self.collection].find())) 
    def filtering(self): 
     # build your filter spec 
     _filter = {} 
     if (self.request_values.has_key('sSearch')) and (self.request_values['sSearch'] != ""): 
     # the term put into search is logically concatenated with 'or' between all columns 
      or_filter_on_all_columns = [] 
      for i in range(len(self.columns)): 
       column_filter = {} 
       # case insensitive partial string matching pulled from user input 
       column_filter[self.columns[i]] = {'$regex': self.request_values['sSearch'], '$options': 'i'} 
       or_filter_on_all_columns.append(column_filter) 
       _filter['$or'] = or_filter_on_all_columns 
     # individual column filtering - uncomment if needed 
     #and_filter_individual_columns = [] 
     #for i in range(len(columns)): 
     # if (request_values.has_key('sSearch_%d' % i) and request_values['sSearch_%d' % i] != ''): 
     # individual_column_filter = {} 
     # individual_column_filter[columns[i]] = {'$regex': request_values['sSearch_%d' % i], '$options': 'i'} 
     # and_filter_individual_columns.append(individual_column_filter) 

     #if and_filter_individual_columns: 
     # _filter['$and'] = and_filter_individual_columns 
      return _filter 
    def sorting(self): 
     order = [] 
     # mongo translation for sorting order 
     if (self.request_values['iSortCol_0'] != "") and (self.request_values['iSortingCols'] > 0): 
      for i in range(int(self.request_values['iSortingCols'])): 
       # column number 
       column_number = int(self.request_values['iSortCol_'+str(i)]) 
     # sort direction 
       sort_direction = self.request_values['sSortDir_'+str(i)] 
       order.append((self.columns[column_number], order_dict[sort_direction])) 
      return order 
    def paging(self): 
     pages = namedtuple('pages', ['start', 'length']) 
     if (self.request_values['iDisplayStart'] != "") and (self.request_values['iDisplayLength'] != -1): 
      pages.start = int(self.request_values['iDisplayStart']) 
      pages.length = int(self.request_values['iDisplayLength']) 
     return pages 

입니다. 값을 추가 할 때 오류가 발생했습니다. 위의 코드를 실행할 때 나는 오류 다음있어 aaData_row.append(row[ self.columns[i] ].replace('"','\\"')) :

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "/home/bhim/remo/surveyApp_bibek/surveyApp.py", line 262, in get_server_data 
    results = DataTablesServer(request, columns, index_column, collection).output_result() 
    File "/home/bhim/remo/surveyApp_bibek/surveyApp.py", line 297, in output_result 
    aaData_row.append(row[ self.columns[i] ].replace('"','\\"')) 
KeyError: 'column_1' 
+0

'print (row)'의 결과를 게시하십시오. – unutbu

+0

@unutbu 인쇄 행 : {u'assetType ': u'Test', u'end ': datetime.datetime (2014, 4, 7, 6, 19, 31, 88000), u'name': u'AssetMapping ' , u'form : 'u'created_at': datetime.datetime (2014, 4, 7, 6, 22, 45, 672000), u'data_path, u'formetting ', u'picture': u'1396851566956.jpg ' ': u'./ data/assetmapping_/2014-04-07_12-03-45 ','u'whatFamousFor ': u'Trst', u'start ': datetime.datetime (2014, 4, 7, 6, 18, 45, 400000), u'didrict ': u'pokhara', u'deviceid : u'359435051262207 ', u'assetName': u'Rohan ', u'_id': ObjectId ('5342443695c190113b437e56'), u'is_complete ': True, u'gps': u'28.2283292 83.9887244 0.0 34.5 '} –

+0

'KeyError '가 의미가 있습니다. 'row' dict에는'column_1' 키가 없습니다. – unutbu

답변

0

KeyError은 "매핑 (사전) 키가 기존 키의 세트에 발견되지 않는 경우에 발생합니다"입니다. 이 오류는 회선에서 발생하는 것 같습니다.

aaData_row.append(row[ self.columns[i] ].replace('"','\\"')) 

이 줄은 디버깅에 약간 길고 복잡합니다. 따라서 다음과 같이 다시 쓸 수 있습니다.

이제는 동일한 오류가 발생하지만 실수를 더 잘 찾아 낼 수 있습니다.

코드의 복잡성을 낮추는 것이 좋습니다. 이는 모든 단일 코드 행의 복잡성에도 적용됩니다. 그런데

라인

print aaData_row.append(row[ 'column_1' ].replace('"','\\"')) 

aaData_row 문자열을 추가하는 부작용이있다. 그것이 당신이 원한 것인지 확실하지 않습니다.

+0

성공하지 못하는 코드를 디버깅하려고했습니다. 그러나 내가 총을 줘 보자. –

+0

내가 열 이름을 직접 건네 야한다는 것을 알아라. 정적으로 열 이름을 전달함으로써 작동하지만 다른 테이블을 가지고 있으므로 문제가 발생하는 곳에 동적으로 열 이름을 전달해야합니다. 보십시오 [여기] (http://stackoverflow.com/questions/23191671/get-columns-name-in-server-side-of-datatable-dynamically-using-flask) –

관련 문제