iFrame отображается пустым в приложении Facebook Canvas

У меня очень простая страница, которую я пытаюсь просмотреть в iframe Facebook. Это представление 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-форму, которая будет отправлять сообщения на эту страницу. Это работает нормально. Я также запустил инструмент отладки 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, — это заголовки содержимого.

Кто-нибудь знает, что здесь происходит? Или какие-либо идеи о том, как дальше отлаживать эту проблему? Спасибо.

Редактировать: я скопировал и вставил URL-адрес приложения Facebook в то же место. Я собираюсь продублировать это здесь снова на случай, если я сделал что-то не так. Я не уверен, почему он выдал 404.

Скопировано и вставлено прямо из адресной строки: http://apps.facebook.com/fireflietest/

Обновление: оказалось, что мне пришлось отключить режим песочницы. 404 больше не должно быть. Конечно, я все еще сталкиваюсь с исходной проблемой, заключающейся в том, что мой iFrame отображается пустым. Спасибо!

Обновление 2: (скопировано и вставлено из объявления моей группы пользователей Django)

Я пытался диагностировать эту проблему. Хотя я понятия не имею, что происходит.

  1. Я попытался просто обслуживать простую .html-страницу на Nginx, чтобы увидеть, не в этом ли проблема. Он не работал должным образом (из-за ошибки), но на самом деле отображал ошибку. Проблема была в том, что вы не можете POST на статические страницы в NGINX. Ничего страшного, я все равно не пытаюсь загрузить статическую страницу.

  2. Я посмотрел в своих лог-файлах. Оказывается, у моего приложения истекает время ожидания. Это не имеет никакого смысла, так как больше нигде не истекает время ожидания.

  3. Вот несколько журналов, которые показывают, что происходит что-то странное. Я не уверен, как отладить проблему. Однако из того, что я читаю, я представляю, что происходит.

Nginx правильно получает запрос. Nginx отправляет запрос в приложение uWSGI (django). Django успешно получает запрос. Джанго пытается ответить, но тут, должно быть, что-то ломается.

Я не уверен, в чем проблема, но это как-то связано с нахождением внутри iframe facebook. (Мне еще предстоит проверить удаленные 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 "-" "-"

person Kurtis    schedule 15.06.2012    source источник
comment
«Вот ссылка на приложение: apps.facebook.com/fireflietest – это просто приводит к ошибке 404. Сообщение из ФБ. Пожалуйста, отредактируйте свой вопрос и дайте нам правильный URL.   -  person CBroe    schedule 15.06.2012
comment
Спасибо, СиБро! Сейчас редактирую.   -  person Kurtis    schedule 16.06.2012
comment
Firebug показывает, что на ваш сайт поступает один запрос, на www.fireflie.com/facebook/, но на него нет каких-либо данных. Поэтому проверьте журналы своего сервера и отладьте свое приложение, чтобы выяснить, почему оно не передает никаких данных при вызове внутри iframe Facebook.   -  person CBroe    schedule 20.06.2012
comment
Cbro, еще раз спасибо за ответ. Я действительно сделал это прямо перед тем, как увидел ваше сообщение. В журналах происходят некоторые странные вещи (которые я собираюсь добавить в свой пост)   -  person Kurtis    schedule 21.06.2012


Ответы (4)


Решение

Проблема была с uWSGI. Я не совсем уверен, почему это не сработало, но я полагаю, что это могло быть связано с тем, что приложение Facebook Canvas отправляло слишком мало данных. В любом случае, вот исправление, которое сработало для меня.

Я изменил параметры конфигурации uWSGI. Я добавил следующие три параметра, несмотря на то, что первый может быть бесполезным, а последний, вероятно, просто для обеспечения безопасности (он работает на моем промежуточном сайте без него).

<pep3333-input/>
<post-buffering>4096</post-buffering>
<buffer-size>32768</buffer-size>
person Kurtis    schedule 21.06.2012

Раньше была проблема в IE без установленной флешки. Я не знаю, исправили ли они это еще.

CSRF также является кандидатом. Попробуйте удалить декоратор csrf и деактивировать промежуточное программное обеспечение представления csrf.

Вы также можете попробовать это на своей локальной машине. Установите URL-адрес сайта на localhost.local:8000 в настройках приложения Facebook или создайте новое приложение с этими настройками) и добавьте localhost.local в файл hosts. Это позволяет вам иметь DEBUG=True и ведение журнала.

person sbaechler    schedule 20.06.2012
comment
Спасибо за предложение! Я на самом деле дал этому шанс. Первое, что я сделал, это использовал локальный хост (через /etc/hosts и домен dyndns). Это сработало отлично. Затем я попробовал вашу идею, удалив промежуточное ПО csrf и исключение для этого представления. Теперь он возвращает 200 OK, но содержимого тела нет. Однако, если вы просматриваете страницу напрямую - все работает нормально. Для этого я перешел на наш промежуточный сайт: fireflie.org/facebook/ - person Kurtis; 21.06.2012

Сегодня я столкнулся с той же проблемой, используя Flask. GET работали нормально, POST не удавалось, но Flask не сообщал об ошибках, а Firebug/Chrome Dev Tools не сообщали ни о чем, кроме «соединение было сброшено».

Затем я нашел этот фрагмент от создателя Flask Армина Ронахера:

http://flask.pocoo.org/snippets/47/

который объясняет проблему и содержит исправление, которое сработало для меня. Учитывая, что вы возились с параметрами буфера, я подозреваю, что это может быть та же проблема.

Надеюсь, это поможет вам хотя бы выяснить причину проблемы.

person Jurie Horneman    schedule 09.10.2012

Похоже, это известная проблема. Этот обходной путь будет хорошим началом.

person Drewness    schedule 15.06.2012
comment
Эй, спасибо за ответ. К сожалению, я не уверен, видели ли вы настоящую проблему. Из отчета об ошибке, который я видел, видно, что эти люди получают 404 ошибки. В моем случае эта ошибка 404 была бы вызвана включением режима песочницы. Мы отключили его, чтобы он больше не выдавал ошибку. Если вы считаете, что эта ошибка по-прежнему связана с моей проблемой (iFrame пуст), сообщите мне об этом. - person Kurtis; 16.06.2012
comment
Хммм, я согласен с вами, это не применимо, если вы отключили режим песочницы. Однако нахождение в песочнице не позволит вашему пространству имен быть внешним, это сомнительно... - person Drewness; 19.06.2012