Websockets和Fandjango

时间:2014-07-26 17:07:33

标签: django facebook websocket

我想使用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. 需要安装中间件(正常Fandjango生命周期需要fandjango.middlewares.FacebookMiddleware才能安装)。
  2. 重定向到自定义fandjango视图,该视图生成重定向到Facebook授权页面的HTML(使用401状态代码)。
  3. 因此,对于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入口点。

    捕获的是什么?:我需要使用Facebook验证websocket。这意味着:我需要相同的逻辑。我需要这个逻辑:

    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升级启动它。这是因为我需要status = 101场景,或者status = 401场景。
    2. 以django方式启动它。这是因为我需要http请求(request)存在facebookfacebook.user,并且已在fandjango.middlewares.FacebookMiddleware(fandjango)中完成。这排除了基于tornadio的websocket实现,因为:

      一个。这样的websockets在facebook之外,所以他们不会通过中间件。  湾我不希望被允许暴露两个不同的服务器。

    3. 问题:我怎么能完成它?我可以使用哪个库,它在正常的django视图中集成Websockets?

1 个答案:

答案 0 :(得分:0)

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

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

你根本不必返回任何类型的回复。协议中禁止使用。如果要终止连接,请使用:

websocket.close(integerCode, textMessage)

根据the docs。如果没有显式调用close(),将使用整数代码1006(异常终止)调用close()。

但是,这个库存在一些问题。