我想使用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)
这种方法有两点:
fandjango.middlewares.FacebookMiddleware
才能安装)。fandjango
视图,该视图生成重定向到Facebook授权页面的HTML(使用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入口点。
捕获的是什么?:我需要使用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
所以我将使用相同的装饰器结束。
但我需要这样的观点:
以django方式启动它。这是因为我需要http请求(request
)存在facebook
和facebook.user
,并且已在fandjango.middlewares.FacebookMiddleware
(fandjango)中完成。这排除了基于tornadio的websocket实现,因为:
一个。这样的websockets在facebook之外,所以他们不会通过中间件。 湾我不希望被允许暴露两个不同的服务器。
问题:我怎么能完成它?我可以使用哪个库,它在正常的django视图中集成Websockets?
答案 0 :(得分:0)
This library实际上在django视图中创建了一个websocket,但是根据文档,该视图是通过另一个服务器实例到达的。文档位于库存储库本身。它要求你声明:
@websocket
def view(request, websocket, ...):
pass
你根本不必返回任何类型的回复。协议中禁止使用。如果要终止连接,请使用:
websocket.close(integerCode, textMessage)
根据the docs。如果没有显式调用close(),将使用整数代码1006(异常终止)调用close()。
但是,这个库存在一些问题。