Websockets and Fandjango



我想使用Django==1.6和Fandjando==4.2开发一个Facebook应用程序。

我的游戏必须有一个实时入口点,因为它将是一款实时应用(将是一款MMO游戏)。

由于我使用的是Fandjango,所以通常的方法是:

@facebook_authorization_required
def my_view(request, *args, **kwargs):
    #processing and return
    return HttpResponse(bla, bla, bla)

这个方法有两个要点:

  1. 它需要安装一个中间件(正常的fanddjango生命周期需要安装fandjango.middlewares.FacebookMiddleware)。
  2. 它重定向到自定义fandjango视图,生成HTML重定向到facebook授权页面(使用401状态码)。
因此,对于JSON (ajax)入口点,我创建了一个自定义装饰器,它基本上创建了一个包装视图,如下所示:
def fb_auth_ajax(view):
    def wrapper(request, *args, **kwargs):
        if (getattr(request, 'facebook', False) and getattr(request.facebook, 'user', False)):
            return view(request, *args, **kwargs)
        else:
            return JSONResponse(content={'error': 'Must authorize'}, status=401)
    return wrapper

并像这样使用:

@fb_auth_ajax
def view(request):
    return JSONResponse({'hello':'world'})

目前,这种方法效果很好。

我需要什么来这里:我想要一个Websocket入口点。

有什么问题?:我需要websocket被Facebook认证。这意味着:我需要相同的逻辑。我需要这个逻辑:

Given a normal HTTP request.
if request.facebook exists and request.facebook.user:
    start a websocket (via protocol switch / upgrade)
else:
    return a 401

所以我将结束使用相同的装饰符。

但我需要这样的视图:

  1. 启动websocket通过HTTP升级启动它。这是因为我需要状态=101场景,或者状态=401场景。
  2. 以django方式启动它。这是因为我需要http请求(request)有facebookfacebook.user存在,这是在fandjango.middlewares.FacebookMiddleware (fandjango)中完成的。这不包括基于tornadio的websocket实现,因为:

    。这样的websockets在facebook之外,所以它们不需要经过中间件。b.我不希望被允许暴露两个不同的服务器

问题:我怎样才能完成它?我可以使用什么库,它集成了Websockets在正常的django视图?

这个库实际上在django视图中创建了一个websocket,尽管根据文档,视图是通过另一个服务器实例到达的。文档在库存储库本身中。它要求你声明:

@websocket
def view(request, websocket, ...):
    pass

而且你根本不需要返回任何类型的响应。这在协议中是禁止的。如果要终止连接,请使用:

websocket.close(integerCode, textMessage)

根据文档。如果不显式调用close(),则调用close()时将使用整数代码1006(异常终止)。

相关内容

  • 没有找到相关文章

最新更新