在 Django 应用程序之间发送 POST 数据
Sending POST data between Django apps
我需要将 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()
到达的消息:
(Pdb) request
<WSGIRequest: POST '/pipeline/get_project_data/2/'>
(Pdb) request.POST
<QueryDict: {}>
您发送的是 JSON,而不是表单编码数据。在 request.body
中找到,而不是 request.POST
。
不过我必须说,如果这两个应用程序在同一个项目中,那么在它们之间发送数据的方法比发出 HTTP 请求要容易得多。
我需要将 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()
到达的消息:
(Pdb) request
<WSGIRequest: POST '/pipeline/get_project_data/2/'>
(Pdb) request.POST
<QueryDict: {}>
您发送的是 JSON,而不是表单编码数据。在 request.body
中找到,而不是 request.POST
。
不过我必须说,如果这两个应用程序在同一个项目中,那么在它们之间发送数据的方法比发出 HTTP 请求要容易得多。