我正在开发一个似乎与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
答案 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)。
如果有任何帮助,请告诉我,我希望如此。