2017-12-15 1 views
-2

파이썬을 사용하여 django 서버를 통해 뷰에서 JSON 파일을 반환 할 수 있어야합니다. url HTTP 요청에 callback이라는 매개 변수가 포함되어 있으면 'callback'매개 변수 다음에 이름이 지정된 javascript 함수 호출에서이를 감싸 야합니다. JSON 파일을 생성하여 서버로 전송할 수 있었고 가능한 콜백 매개 변수를 검색하는 방법을 알고있었습니다. 그러나 Javascript 함수 호출에 JSON 파일을 래핑하는 방법에 대해 혼란스러워합니다. 아무도 나에게 올바른 방법을 말할 수 있습니까? 다음은이다; "FUNCTION_CALL ({YYY XXX})"JSON을 자바 스크립트 함수 호출로 랩핑하는 방법

def function_json(request, param): 
    function_call = request.GET.get('callback', "") 
    json_stuff = Object.objects.all().filter(param=parameter) 
    if len(json_stuff) == 0: 
     return HttpResponse("page was not found",status=404) 
    data = {} 
    for x in range(0, len(countries)): 
     data[json_stuff[x].code] = json_stuff[x].name 
    my_json_data = json.dumps(data) 
    my_json_data_wrapped_in_a_function_call = ??? 
    return HttpResponse(my_json_data_wrapped_in_a_function_call, content_type="application/json") 

및 데이터 callback 가정

Function_call({json_stuff}) 
+0

너무 애매합니다. 코드를 보여주십시오. –

답변

0

로 서버에 표시해야 문자열 "Function_call"이며, 예상되는 결과는 문자열`이다 문자열 형식의 문제 :이 자바 스크립트 코드가 아닌 JSON, 그래서 응답의 콘텐츠 형식이 더 이상 "응용 프로그램/JSON"안 것을

my_json_data_wrapped_in_a_function_call = "{callback}(json);".format(
    callback=callback, 
    json=json_stuff 
    ) 

참고.

관련없는

하지만,이 :

json_stuff = Object.objects.all().filter(param=parameter) 
data = {} 
for x in range(0, len(json_stuff)): 
    data[json_stuff[x].code] = json_stuff[x].name 

심각하게 개선 될 수있다. 첫째, 파이썬의 for 루프는 실제로 'foreach'루프입니다. 반복 변수 ('x'는 for x in ...에 있음)가 시퀀스의 현재 항목으로 설정되어 있으므로 위의 for 루프는 다음과 같아야합니다.

data = {} 
for item in json_stuff: 
    data[item.code] = item.name 
사전인가 식을 사용하여 더 단순화 할 수

:

data = {item.code: item.name for item in json_stuff} 

또는

파이썬 버전은 발전기 표현과 dict 생성자 사용하여 너무 오래 경우 :

하지만 실제로 당신이 장고 ORM을 사용하고 있기 때문에,이 중 하나를 필요로하지 않는이, 당신은 이미, 백업 슬라이스 및 포장 얻을 수 있습니다

data = Object.objects.filter(param=parameter).values("code", "name") 

NB : Model.objects.all().filter() 또는 일반적인 Model.objects.filter().all() 변형은 중복됩니다. filter(), exclude(), values() 또는 호출 할 queryset 메서드 호출이 없으면 .all() 만 필요합니다.

관련 문제