2017-05-21 11 views
3

Djangoの私のプロジェクトでは、何らかの条件が満たされていれば特定のペイロードのURLをpingする簡単なwebhookロジックを書いています。ここでは、コードがあります:DjangoビューでAttributeErrorを診断する

@csrf_exempt 
def webhook_event(request,*args,**kwargs): 
    if request.method == 'POST': 
     data = json.loads(request.body) 
     event_type = data['event'] 
     # use CDN URL from webhook payload 
     if event_type == 'project.datafile_updated': 
      url = data['data']['cdn_url'] 
      config_manager.set_obj(url) 
      return json.dumps({'success':True}), 200, {'ContentType':'application/json'} 
     return json.dumps({'success':False}), 400, {'ContentType':'application/json'} 
    else: 
     return render(request,"404.html",{}) 

私はそれをテストするには、次を使用しています:

import requests 
import json 

# Update project_id 
project_id = "<some_id>" 

data = {"timestamp": 1463602412, "project_id": project_id, "data": {"cdn_url": "https://cdn.example.com/json/{0}.json".format(project_id), "origin_url": "https://example.s3.amazonaws.com/json/{0}.json".format(project_id), "revision": 15}, "event": "project.datafile_updated"} 

r = requests.post("http://127.0.0.1:8000/ohook/", data=json.dumps(data), headers={'Content-Type': 'application/json'}) 
print r 

それはすべて完璧に動作しますが、webhook_eventで返されるタプルは私に次のエラーを与えている:

Internal Server Error: /ohook/ 
Traceback (most recent call last): 
    File "/home/hassan/.virtualenvs/myenv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in get_response 
    response = middleware_method(request, response) 
    File "/home/hassan/.virtualenvs/myenv/local/lib/python2.7/site-packages/newrelic-2.56.0.42/newrelic/hooks/framework_django.py", line 328, in wrapper 
    return wrapped(*args, **kwargs) 
    File "/home/hassan/.virtualenvs/myenv/local/lib/python2.7/site-packages/django/middleware/clickjacking.py", line 30, in process_response 
    if response.get('X-Frame-Options', None) is not None: 
AttributeError: 'tuple' object has no attribute 'get' 

誰でも私の診断に役立つことができますか?

答えて

4

エラーが示すように、JSON、整数(おそらく状態コード)、およびdict(おそらくヘッダー)というタプルが返されます。

これを修正しても、ビューからJSONを戻すことはできません。 HttpResponseまたはそのサブクラスのインスタンスを返す必要があります。

POSTブロックでreturn json.dumps(...)を実行する代わりに、JsonResponseを使用してください。これは、Pythonデータ構造を受け入れ、シリアル化されたJSONを含むレスポンスを返します。ボーナスとして、コンテンツタイプも適切に設定します。

if event_type == 'project.datafile_updated': 
    ... 
    return JsonResponse({'success':True}) 
return JsonResponse({'success':False}, status=400) 

renderが明示的にテンプレートをレンダリングとのHttpResponseとして返すショートカットであることに注意してください。これはjson.dumps()とそうではない)

関連する問題