django 1.7升级后无法通过pycurl连接到网站

时间:2014-12-19 20:59:39

标签: python django curl pycurl

enter image description here

我正在开发一个似乎与django 1.64合作的django网站(尽管只测试了一次)。在我的应用程序的视图中,我有一个功能联系人,当提交的表单应该向网站发送消息时(" mysite")。

def contact(request):

    if request.method == 'POST':
        import urllib
         f = { 'body': str(request.POST) }
        post_data = urllib.urlencode(f)
        curl_to_site(post_data)


def curl_to_site(post_data):

    import pycurl
    import cStringIO

    buf = cStringIO.StringIO()

    c = pycurl.Curl()
    c.setopt(c.URL, 'mysite.com')
    c.setopt(pycurl.SSL_VERIFYPEER, False)
    c.setopt(pycurl.SSL_VERIFYHOST, 0)
    c.setopt(pycurl.FOLLOWLOCATION, 1)
    c.setopt(pycurl.VERBOSE, 1)
    c.setopt(pycurl.COOKIEJAR, 'cookie.txt')
    c.setopt(pycurl.COOKIEFILE, 'cookie.txt')
    c.setopt(pycurl.USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:2.2) Gecko/20110201")
    c.setopt(pycurl.POST, 1)
    c.setopt(pycurl.TIMEOUT, 5)
    c.setopt(pycurl.CONNECTTIMEOUT, 6)
    c.setopt(c.WRITEFUNCTION, buf.write)
    c.perform()
    c.close()

    print buf.getvalue()
    buf.close()

    return

当我提交表单时请求永远挂起。请看截图。 Curl输出为:

* Hostname was NOT found in DNS cache
*   Trying xxx.xx.xx.xx...
* Connected to *****.com (xxx.xx.xx.xx) port 80 (#0)
> POST /index/e HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:2.2) Gecko/20110201
Host: to *****.com
Accept: */*
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue    

< HTTP/1.1 100 Continue

这确实有效。我添加了更多选项,但我不确定失败的原因是否是升级到django 1.7或者这是不相关的。我该如何解决这个问题并再次开始呢?

编辑:

我换了:

curl_to_site(post_data)

使用:

    import requests
    r = requests.post('mysite.com', data=post_data)

它立即起作用,所以我再也没有回到pycurl。我不得不继续前进到progect的下一阶段,所以我没有回到pycurl。然而,它绝对不是升级到django 1.7

1 个答案:

答案 0 :(得分:1)

我首先尝试打开python shell,导入pycurl然后手动运行curl命令。打开你的终端,运行python并输入:

import pycurl
import cStringIO

buf = cStringIO.StringIO()

c = pycurl.Curl()
c.setopt(c.URL, 'mysite.com')
c.setopt(pycurl.SSL_VERIFYPEER, False)
c.setopt(pycurl.SSL_VERIFYHOST, 0)
c.setopt(pycurl.FOLLOWLOCATION, 1)
c.setopt(pycurl.VERBOSE, 1)
c.setopt(pycurl.COOKIEJAR, 'cookie.txt')
c.setopt(pycurl.COOKIEFILE, 'cookie.txt')
c.setopt(pycurl.USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:2.2) Gecko/20110201")
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.TIMEOUT, 5)
c.setopt(pycurl.CONNECTTIMEOUT, 6)
c.setopt(c.WRITEFUNCTION, buf.write)
c.perform()
c.close()

有用吗?如果没有,我们现在知道Django升级不对您的问题负责。

接下来,我将检查失败请求的响应内容(POST / contact /),如果Django处于调试模式,那么您可能会获得请求被中止的完整堆栈跟踪。但是,中止请求可能根本没有任何内容。这仍然是你应该检查的东西。

所以,接下来我会确保你可以ping mysite.com,如果没有,请查看mysite.com的dns规则和web主机配置。您还应该进入发出curl调用的服务器,并确保它可以ping您的目标服务器(mysite.com)。

如果有任何帮助,请告诉我,我希望如此。