2016-07-08 3 views
0

장고를 사용하여 API를 설정하려고합니다. 내 views.py에서 나는이 종점이있다 :query_params를 사용할 때 장고 valueError

@api_view() 
def update_label(request): 
    user_id = request.query_params['user_id'] 
    date = datetime.strptime(request.query_params['date'], '%Y-%m-%dT%H:%M:%S.%f') 
    label_name = request.query_params['label_name'] 
    value = request.query_params['value'] 
    value = eval(value) 
    db_user_ctrl.update_label(date, user_id, label_name, value) 
    return Response({'status': 'SUCCESS'}) 

일부 사용자의 경우 데이터베이스의 일부 레이블을 업데이트한다. 이 끝점에서 여러 레이블을 업데이트 할 수 있으며 일부는 value의 정수로 연결되고 일부는 value의 작은 사전과 연결됩니다. {'item1':1,'item2':-1}. 자바 스크립트 쪽에서 나는 GET 요청을 통해 값을 보내기 전에 값을 포맷하기 위해 JSON.stringify(value)을 사용한다. Django 부분에서 디버깅 인터페이스를 통해 적절한 매개 변수가 수신 된 것을 볼 수 있습니다.

value = request.query_params['value'] 

여기에 무슨 일이 일어나고 무엇 : 내 코드에서이 줄을

invalid literal for int() with base 10: '{"item1":-1}' 

관련 : 그러나 나는 다음과 같은 오류가? 왜 문자열을 정수로 변환하려고합니까?

편집 1 :

스택 추적에 좀 더 정보 :

.../venv/lib/python3.4/site-packages/django/core/handlers/base.py in get_response 
.../venv/lib/python3.4/site-packages/django/core/handlers/base.py in get_response 
.../venv/lib/python3.4/site-packages/django/views/decorators/csrf.py in wrapped_view 
.../venv/lib/python3.4/site-packages/django/views/generic/base.py in view 
.../venv/lib/python3.4/site-packages/rest_framework/views.py in dispatch 
.../venv/lib/python3.4/site-packages/rest_framework/views.py in dispatch 
.../venv/lib/python3.4/site-packages/rest_framework/decorators.py in handler 
.../webapp/api/views.py in update_label 
    value = request.query_params['value'] 
+3

가능한 경우 전체 스택 추적을 게시하십시오. 내 첫 번째 추측은 실제로 문제가'eval (value)'이었을 것입니다. 그게 바로 원격 코드 실행 문제가 있기 때문에하지 말아야 할 일입니다. – dhke

+4

여기 왜 eval을 전혀 사용하지 않는지 잘 모르겠습니다. 불필요한 것일뿐만 아니라 유효하지 않은 사용자 입력에서 호출하는 것이 특히 바람직하지 않은 것처럼 보입니다. –

+0

나는 문자열을 파이썬 객체로 변환하기 위해 eval을 사용한다. 아마도이 방법을 사용하는 것이 더 안전한 방법 일 수는 있지만 문제가있는 곳이라고 생각하지는 않는다. 나는 eval 라인에 주석을 달아 보았고 같은 에러가 나왔다. 쿼리 매개 변수는 문자열로 해석되어야하고 다른 모든 매개 변수는! 어떤 이유로 django는 이것을 int로 변환하려고합니다. – user3091275

답변

1

당신이 문제는 아주 비열한했다

import json 
json.loads(<query string value>) 
0

시도 할 수 있습니다, 캐싱을 Gunicorn 예정이었다 일부 파일. views.py의 이전 버전에서 나는 value = int(request.query_params['value'])을 가졌습니다. 코드를 업데이트했을 때 Gunicorn은 오래된 캐시 된 파일을 사용하여 응답 했으므로 문자열을 int로 변환하지 못했습니다. 나는 Gunicorn을 다시 시작했고 지금은 작동 중입니다.

관련 문제