Django facebook应用程序:缺少signed_request



受黑客新闻20分钟内编写一个facebook应用程序的启发,我正在编写一个脸书应用程序,主页运行良好:显示空的诗歌列表。但是,我在创建从一个视图到另一个视图的链接时遇到了问题。

我正在使用django,这里有一些代码:

来自urls.py

urlpatterns = patterns('',
    url(r'^$', 'crosswords.ugly.views.home', name='home'),
    url(r'^create/$', 'crosswords.ugly.views.create', name='create'),

来自views.py:

@canvas_only
def create(request):
    if request.method == 'GET':
        return render(request, 'create.html', {
            'form': PoemEntryForm(request.GET)
        })

发件人:templates:home.html

<p>Would you like to create a <a href="/create/">new poem</a>?</p>

请让我知道是否有任何特定的文件我可以发布来解决这个问题,我会这样做的。我尝试了urls.py和home.html中的链接中的/create/,/create,甚至create/的各种变体。

问题是我一直收到这样的消息:

400错误请求

缺少已签名的请求。

当试图点击home.html中的链接时。任何来自经验丰富的django、facebook或-开发者的帮助都将不胜感激。

我找到了问题的答案:

问题是我没有使用urls.py中定义的<a href="site{% url url_name %}">...。在这种情况下,<a href="site{% url create %}">...产生了奇迹:)

在花了几个小时试图弄清楚为什么我的应用程序页面会显示可怕的消息"400错误请求-缺少签名请求。"我偶然发现了这篇文章,终于开始解开这个谜了。

点击链接时缓慢加载facebook画布应用程序(如果目标位于顶部)

简而言之:您不需要在视图中使用任何装饰器(例如@canvas_only或@facebook_required)。相反,按照建议,在第一次获得信息(比如FB用户id和姓名)时,将信息保存在会话中。我在我的主页上做这件事(唯一用@canvas_only装饰的视图)。Nota Bene:为了能够在会话中存储一些内容,您需要在设置中启用它。py:它应该已经在MIDDLEWARE部分中可以了,但也可以通过取消注释条目"django.contrib.sessions"将其添加到INSTALLED_APPS中。
现在执行syncdb(python manage.py syncdb)以确保创建了相关的表(我假设会话存储在数据库中)。如果您需要它来进一步调用FB API,也可以存储access_token在会话中(request.session['signed_request']=access_token)

然而,真正导致问题的是重定向到视图末尾的页面,例如使用redirect()或HttpResponseRedirect()。这会触发GET请求,而不是POST
哦,顺便说一句,我有没有提到所有的GET请求都变成了POSTS?哈哈哈,这让人困惑,嘿?此外,还有一些严重的安全问题需要考虑。

我自己刚刚开始玩这些东西,所以请把现在的信息当作提示和线索,而不是戒律。

最新更新