我想使用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)
这个方法有两个要点:
- 它需要安装一个中间件(正常的fanddjango生命周期需要安装
fandjango.middlewares.FacebookMiddleware
)。 - 它重定向到自定义
fandjango
视图,生成HTML重定向到facebook授权页面(使用401状态码)。
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
所以我将结束使用相同的装饰符。
但我需要这样的视图:
- 启动websocket通过HTTP升级启动它。这是因为我需要状态=101场景,或者状态=401场景。
以django方式启动它。这是因为我需要http请求(
request
)有facebook
和facebook.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(异常终止)。