Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: KurtisОтветов: 4

У меня очень простая страница, которую я пытаюсь просмотреть в 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 "-" "-"
  • "Вот ссылка на приложение: apps.facebook.com/fireflietest - это просто приводит к ошибке 404. Сообщение из ФБ. Пожалуйста, отредактируйте свой вопрос и дайте нам правильный URL. CBroe 15.06.2012
  • Спасибо, СиБро! Сейчас редактирую. Kurtis 16.06.2012
  • Firebug показывает, что на ваш сайт поступает один запрос, на www.fireflie.com/facebook/, но на него нет каких-либо данных. Поэтому проверьте журналы своего сервера и отладьте свое приложение, чтобы выяснить, почему оно не передает никаких данных при вызове внутри iframe Facebook. CBroe 20.06.2012
  • Cbro, еще раз спасибо за ответ. Я действительно сделал это прямо перед тем, как увидел ваше сообщение. В журналах происходят некоторые странные вещи (которые я собираюсь добавить в свой пост) Kurtis 21.06.2012

djangonginxiframeuwsgifacebook-canvas

Ответы

Ответ 1 · рейтинг 2 · Kurtis

Решение

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

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

<pep3333-input/>
<post-buffering>4096</post-buffering>
<buffer-size>32768</buffer-size>

Ответ 2 · рейтинг 1 · sbaechler

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

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

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

Ответ 3 · рейтинг 1 · Jurie Horneman

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

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

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

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

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

Ответ 4 · Drewness

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы