【发布时间】: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。