我有一个非常简单的页面,我试图在Facebook iframe中查看。这是一个Django视图,但它不依赖于请求是通过POST还是GET提交的。它所做的就是返回一些简单的HTML。
如果我们直接点击链接,它会正确显示。如果在Firefox中,我右键单击iframe并选择仅显示该帧的选项 - 然后它会正确显示。但是,在查看Facebook应用程序时,没有任何内容显示出来。
以下是应用链接:http://apps.facebook.com/fireflietest/ 哪个指向http://www.fireflie.com/facebook/
以下是我非常简单的观点的代码:
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt, csrf_protect
@csrf_exempt
def facebook(request):
body = """
<html>
<head><title>Fireflie on Facebook</title></head>
<body>Hello, Facebook!</body>
</html>
"""
return HttpResponse(body)
出于测试目的,我创建了一个小的HTML表单,该表单将POST到该页面。它工作正常。我还运行了Facebook调试工具,“刮刀”显示它正在正确地拉动我们的内容。
这是服务器日志,显示它两次都返回200 OK:
24.210.144.32 - - [15/Jun/2012:18:27:18 +0000] "POST /facebook/ HTTP/1.1" 200 31 "http://apps.facebook.com/fireflietest/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/12.04 Chromium/18.0.1025.151 Chrome/18.0.1025.151 Safari/535.19"
24.210.144.32 - - [15/Jun/2012:18:27:26 +0000] "GET /facebook/ HTTP/1.1" 200 67 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/12.04 Chromium/18.0.1025.151 Chrome/18.0.1025.151 Safari/535.19"
最后,我尝试使用Chrome的开发人员工具深入研究响应对象,但在查看iframe版本时,看起来所有返回的内容都是内容标题。
有没有人知道这里发生了什么?或者有关如何进一步调试此问题的任何想法?感谢。
编辑:我将Facebook App的URL复制并粘贴到同一位置。我将在这里再次复制它,以防万一我做错了。我不确定为什么要扔404。
直接从地址栏复制并粘贴:http://apps.facebook.com/fireflietest/
更新:原来我必须转向沙盒模式。应该没有更多404.当然,我仍然遇到原来的问题,这是我的iFrame显示为空。谢谢!
更新2:(从我的Django用户组thead复制并粘贴)
我一直在努力诊断这个问题。我不知道发生了什么事。
我尝试在Nginx上提供一个简单的.html页面,看看问题出在哪里。它没有正确提供(通过错误),但确实显示错误。问题是,你不能在NGINX中POST到静态页面。没什么大不了的,我不是试图加载静态页面。
我查看了我的日志文件。事实证明,我的申请已超时。它没有任何意义,因为它不会在其他任何地方超时。
这是一些显示特殊情况的日志。我不知道如何调试这个问题。从我正在阅读的内容 - 这是我正在拍摄的照片。
Nginx正确接收请求。 Nginx将请求推送到uWSGI应用程序(django)。 Django成功获得了请求。 Django试图回应,但这必须是它破坏的地方。
我不确定问题是什么 - 但它与在facebook iframe中有关。 (我还没有检查远程iframe,我接下来会这样做)
uWSGI Logs:
[pid: 11059|app: 0|req: 3/4] 24.210.144.32 () {52 vars in 1170 bytes} [Tue Jun 19 14:24:03 2012] POST /facebook/ => generated 0 bytes in 444 msecs (HTTP/1.1 500) 0 headers in 0 bytes (0 switches on core 0)
[pid: 11345|app: 0|req: 1/1] 24.210.144.32 () {52 vars in 1170 bytes} [Tue Jun 19 14:24:31 2012] POST /facebook/ => generated 2970 bytes in 333 msecs (HTTP/1.1 200) 4 headers in 128 bytes (1 switches on core 0)
[pid: 11353|app: 0|req: 3/31] 24.210.144.32 () {52 vars in 1172 bytes} [Tue Jun 19 14:31:04 2012] POST /facebook/ => generated 2970 bytes in 3 msecs (HTTP/1.1 200) 4 headers in 128 bytes (1 switches on core 0)
[pid: 11954|app: 0|req: 1/14] 24.210.144.32 () {52 vars in 1216 bytes} [Tue Jun 19 14:35:04 2012] POST /facebook/ => generated 2970 bytes in 343 msecs (HTTP/1.1 200) 4 headers in 128 bytes (1 switches on core 0)
[pid: 11950|app: 0|req: 2/31] 24.210.144.32 () {52 vars in 1211 bytes} [Tue Jun 19 14:48:57 2012] POST /facebook/ => generated 2970 bytes in 3 msecs (HTTP/1.1 200) 4 headers in 128 bytes (1 switches on core 0)
[pid: 11962|app: 0|req: 4/57] 24.210.144.32 () {52 vars in 1216 bytes} [Tue Jun 19 14:53:43 2012] POST /facebook/ => generated 2970 bytes in 2 msecs (HTTP/1.1 200) 4 headers in 128 bytes (1 switches on core 0)
Nginx Error Logs:
2012/06/19 20:02:30 [error] 11164#0: *29617 readv() failed (104: Connection reset by peer) while reading upstream, client: 24.210.144.32, server: fireflie.com, request: "POST /facebook/ HTTP/1.1", upstream: "uwsgi://<commented out for security>", host: "www.fireflie.com", referrer: "http://apps.facebook.com/253156011452899/"
Nginx Access Log:
24.210.144.32 - - [19/Jun/2012:20:02:30 +0000] "POST /facebook/ HTTP/1.1" 200 31 "http://apps.facebook.com/253156011452899/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/12.04 Chromium/18.0.1025.151 Chrome/18.0.1025.151 Safari/535.19"
24.210.144.32 - - [19/Jun/2012:20:03:29 +0000] "-" 408 0 "-" "-"
24.210.144.32 - - [19/Jun/2012:20:03:29 +0000] "-" 408 0 "-" "-"
答案 0 :(得分:2)
<强>解决方案强>
问题在于uWSGI。我不确定为什么它不起作用 - 但我相信这可能与Facebook的Canvas App发布过少的数据有关。无论如何,这是对我有用的修复。
我修改了uWSGI配置选项。我添加了以下三个选项,即使第一个可能是无操作,最后一个可能只是为了安全性良好(它可以在没有它的临时站点上运行)。
<pep3333-input/>
<post-buffering>4096</post-buffering>
<buffer-size>32768</buffer-size>
答案 1 :(得分:1)
在没有安装闪存的IE上曾经存在问题。我不知道他们是否修好了。
CSRF也是候选人。尝试删除csrf装饰器并停用csrf视图中间件。
您也可以在本地计算机上试用。在Facebook App设置中将站点URL设置为localhost.local:8000,或使用这些设置创建新应用程序)并将localhost.local添加到hosts文件中。这允许你有DEBUG = True并记录。
答案 2 :(得分:1)
我使用Flask遇到了我认为今天同样的问题。 GET工作正常,POST失败但Flask没有报告任何错误,Firebug / Chrome开发工具没有报告任何内容,除了'连接被重置'。
然后我发现Flask创建者Armin Ronacher的这个片段:
http://flask.pocoo.org/snippets/47/
解释了这个问题并包含了一个对我有用的修复程序。鉴于你摆弄缓冲参数,我怀疑这可能是同样的问题。
希望它能帮助你找出问题的原因至少。
答案 3 :(得分:0)
看起来这是一个已知问题。 This解决方法将是一个良好的开端。