2016-11-01 11 views
0

同じプロジェクトの別のDjangoアプリケーションから別のDjangoアプリケーションにPOST要求を送信する必要があります。要求は到着しますが、POSTデータはありません。Djangoアプリケーション間でPOSTデータを送信

なぜですか?そして、POSTデータを正しく送信する方法は?

送信者の一部、アプリ1つのビュー:

def get_project_data(request): 
    if request.method == "POST": 
     if request.is_ajax(): 
      response = etl_post('get_data', [request.user.project.id], request.POST) 

def etl_post(path, identifiers=None, post_data=None): 
    def date_handler(obj): 
     if hasattr(obj, 'isoformat'): 
      return obj.isoformat() 
     else: 
      raise TypeError 
    json_data = json.dumps(post_data, default=date_handler) if post_data else None 
    return _request(path, identifiers, json_data) 

def _request(path, identifiers=None, post_data=None, method=None): 
    data = None 
    try: 
     url = urlparse.urljoin(settings.ETL_WEB_API_URL, path) 
     if identifiers is not None: 
      for o in identifiers: 
       url += "/" + str(o) 
     if post_data: 
      url += "/" 
     request = urllib2.Request(url, data=post_data) 
     request.add_header("Content-Type", "application/json") 
     request.add_header("X-ETL-Authorization", settings.ETL_WEB_API_KEY) 
     if method: 
      request.get_method = lambda: method 
     result = urllib2.urlopen(request) 
     data_str = result.read() 
     if result.getcode() == 200: 
      data = json.loads(data_str) 
     else: 
      logger.error("Unexpected response %s" % result) 
    except Exception as e: 
     logger.exception(e.message) 
    return data 

はまた、私はresult = urllib2.urlopen(request, data=post_data)、ノー成功しようとしました。

post_data例: {"project_id": "nYhRTAmGkkHSlLr8BfPR", "project_name": "rocket-launch", "salt": "805b2892c16369275eerec4dd401f5f", ...}

(Pdb) type(post_data) 
<type 'str'> 

レシーバー部分、アプリ2ビュー:

@csrf_exempt 
def get_project_data(request, trust_id): 
    if request.method == 'POST': 
     pdb.set_trace() 

到着したメッセージ:あなたはJSONを送っている

(Pdb) request 
<WSGIRequest: POST '/pipeline/get_project_data/2/'> 

(Pdb) request.POST 
<QueryDict: {}> 

答えて

1

、n個フォームでエンコードされたデータです。それはrequest.bodyにあり、request.POSTでは見つからない。

しかし、これらの2つのアプリケーションが同じプロジェクトにある場合は、HTTPリクエストを行うよりも、それらの間でデータを送信する方が簡単です。

+0

はい、あなたは正しく 'request.body'です、ありがとうございます。 Djangoのアプリケーション間でデータをやりとりする代替データの例を教えてください。 – trex

関連する問題