2014-02-13 59 views
0

我是Django的新手,我试图发送数据(表单)到外部服务器,但到目前为止我还没有成功。在django发送数据到外部服务器

这是我的观点的简化版本:

def pay(request):  
if request.method == 'POST': 
    form = PaymentForm(post_values) 
if form.is_valid():  
     return render_to_response('http://externalserver/pay/', RequestContext({'form': form})) 

,但它给了我下面的错误:

AttributeError at /pay/ 'dict' object has no attribute 'META'

我真的不知道我是否应该/可以选择render_to_response使用。任何人都可以帮助我吗?

回答

1

这是没有意义的:

render_to_response('http://externalserver/pay/'...)

这种方法需要一个相对路径在项目中HTML模板,您的服务器上
https://docs.djangoproject.com/en/1.6/topics/http/shortcuts/#django.shortcuts.render_to_response

你需要想想会发生什么:

在表单标签的action,在HTML,决定了数据发布到,如<form action="" method="post">手段“后这种形式的网址页面我已经在......“换句话说,浏览器将数据发布到用于呈现表单的Django视图。这是最常见的情况。

你可以直接发布表单数据到外部网址:

<form action="http://externalserver/pay/" method="post"> 

也许这是你想要的吗?但是,你的Django视图根本看不到数据。

如果您需要在Django中处理数据,然后将处理后的数据从服务器发布到外部URL,则需要在视图中执行一些不同的操作。我建议使用the Requests library作为一种很好的方式来在Python中发送请求。

0

不幸的是,你的问题并没有使你的意图清晰。如果您的意思是在客户端和第三方服务器之间转发表单数据,然后将服务器的响应转发回客户端,则称为代理。

使用请求库很容易实现。您可能会发现使用 django-proxy而不是编写自己的方法会更容易,因为它会考虑在两个方向上重写 请求标头(也称为浏览器签名)。

另一方面,如果您只希望将表单的内容传输给第三方服务器而不中继服务器的响应,则可以简单地依赖请求库,然后使用客户端响应一个本地模板。

这里是一个小例子:

def pay(request): 
    if request.method == 'POST': 
     form = PaymentForm(request.post) 
    if form.is_valid(): 
     response = requests.post(third_party_url, data=request.post) 
     'process response' 
     render_to_response(success_or_failure_template) 
    else: 
     render_to_response(bad_data_template)