【问题标题】:Cannot connect to website via pycurl after django 1.7 upgradedjango 1.7升级后无法通过pycurl连接到网站
【发布时间】:2015-02-18 20:21:15
【问题描述】:

我正在一个 django 网站上工作,该网站似乎正在使用 django 1.64(尽管只测试过一次)。在我的应用程序视图中,我有一个函数联系人,当提交的表单应该向网站(“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

当我提交表单时,请求永远挂起。请看截图。卷曲输出是:

* 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。我不得不进入项目的下一阶段,所以我没有回到 pycurl。然而,它肯定不是升级到 django 1.7

【问题讨论】:

  • FWIW 使用 requests 而不是 pycurl 会容易得多
  • 您将哪个站点升级到 Django 1.7 - mysite.com 还是发出 pycurl 请求的站点?没有理由在请求站点上升级 Django 会将 pycurl 请求中断到第三方站点
  • 发出 pycurl 请求的人。也许我应该使用请求,但我试图从使用 Curl 的 php 传输代码
  • 你能从命令行 curl 到 mysite.com 吗?你还试过什么?我看不出有任何理由怀疑 Django
  • 我不是说它是 django。

标签: python django curl pycurl


【解决方案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 规则和虚拟主机配置。您还应该通过 ssh 进入进行 curl 调用的服务器,并确保它可以 ping 您的目标服务器 (mysite.com)。

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

【讨论】:

  • 感谢您的帮助。我会尝试你的方向并回复你。
  • 你有机会尝试一下@user61629吗?
  • 不错的电话,我也厌倦了使用 pycurl,对系统的许多外部依赖,即 curl ;)
猜你喜欢
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 2016-02-20
  • 1970-01-01
  • 2015-09-23
  • 2015-06-19
  • 2017-06-05
相关资源
最近更新 更多