使用没有Facebook中间件的Pyfacebook
facebook(3), pyfacebook(5), Django(72), 蟒蛇(59)最近我一直在尝试使用PyFacebook公司创建Facebook应用程序.在开发的早期阶段,我遇到了一点曲法:如何使用pyfacebookDjango公司,而不使用PyFacebook中间件?
这不是一个相关的问题,因为PyFacebook中间件对于加载的任何不直接与Facebook通信的视图来说都是膨胀的,对于一些直接与Facebook通信的视图(使用FBJSM Ajax对象发出的请求)来说甚至是不合适的。
所以,没有进一步的ADO,让我们看看我们如何使用Pyfacebook与Django,而无需使用中间件。
您需要将Pyfacebook库导入您的Views.py文件以使用下面的示例。如果将PyFacebook库安装到Python路径中,它将如下所示:
进口脸谱网.djangofb作为脸谱网
向请求添加Facebook实例
我们要做的第一件事是找出如何将Facebook实例添加到传递到视图的请求中。
定义添加\u fb \u实例(要求):#如果已经有facebook实例,请立即返回如果getattr.(要求,'脸书',没有)是不没有:返回要求#身份验证令牌是另一个重要的可能参数api\U密钥=设置.facebook_api_key.密钥=设置.FACEBOOK密码应用程序名称=getattr.(设置,'FACEBOOK应用程序名称',没有)callback_path.=getattr.(设置,'FACEBOOK\u回调\u路径',没有)内部的=getattr.(设置,'FACEBOOK\u内部',是的)要求.脸谱网=脸谱网.Facebook(api\U密钥=api\U密钥,密钥=密钥,应用程序名称=应用程序名称,callback_path.=callback_path.,内部的=内部的)
用法相当简单:
定义帆布(要求):添加\u fb \u实例(要求)fb公司=要求.脸谱网#做什么都行返回直接\u到\u模板(要求,“fb公司/画布.fbml',额外的上下文={'请求':要求})
add\u fb\u实例在请求中添加一个Facebook实例请求.facebook. 因为这是PyFacebook中间件所做的唯一事情,所以我们已经重新创建了它的大部分功能。不过,我们可能还需要一点,比如在访问视图之前强制用户登录。
需要登录
要求用户登录我们的应用程序也很简单。
定义需要登录(要求,下一个=没有):如果getattr.(要求,'脸书',没有)是没有:添加\u fb \u实例(要求)fb公司=要求.脸谱网如果不fb公司.检查\u会话(要求):返回fb公司.重定向(fb公司.get_login_url.(下一个=下一个))
使用require\u fb\u login函数的工作原理如下:
定义帆布(要求):重定向=需要登录(要求)如果重定向是不没有:返回重定向用户=获取\u fb \u用户(要求.脸谱网)返回直接\u到\u模板(要求,“fb公司/画布.fbml',额外的上下文={'请求':要求,'用户':用户})
如果用户尚未登录,这将重定向到应用程序登录页。请注意,如果一个Facebook实例还不存在,它将向我们的请求中添加一个Facebook实例。因此,显式地调用add\u fb\u instance(request)是没有必要的(但这可能是明智的,因为它使Facebook实例被添加到请求中更加显式)。
使用Facebook实例做某物
好的,所以现在我们有函件附加到我们的请求中的Facebook实例......但他们能为我们做些什么?好吧,让我们看看这一点。我们将制作一个存储有关我们登录用户的信息的模型,并且还使用Facebook实例填充我们模型中的一些数据。
让我们制作我们的型号:
班用户(模型.模型):facebook\u id=模型.积分场()名称=模型.查菲尔德(空白的=是的,空值=是的,最大长度=60)
好的,一个简单的模型。现在,让我们创建一个函数来获取一个Facebook实例并检索或创建它的用户模型,和用Facebook的数据填充name字段。
从django.com快捷方式进口获取\u对象\u或\u 404定义获取\u fb \u用户(脸谱网):用户,创造了=用户.物体.获取或创建(facebook\u id=㈡(脸谱网.uid编号))#如果新创建对象如果创造了是是的:#使用FQL获取名字和姓氏查询=从user WHERE uid中选择uid、first\u name、last\u name=%s码"%脸谱网.uid编号#FQL生成dict列表,检索第一个(也是唯一一个)dict结果=脸谱网.fql公司.查询(查询)[0]用户.名称="%s码%s码"%(结果[“名字”],结果[“姓”])用户.节约()返回用户
我们用的是Facebook查询语言检索信息。FQL的好处在于,您可以进行非常复杂的查询,而且这个示例足以让您了解如何通过PyFacebook检索其他数据:只需编写一个新的FQL查询并以相同的方式调用它。
打电话facebook.fql.query(您的\查询)返回字典列表。因为我们调用的查询只能返回一个实例(用户的用户id),所以我们只是获取第一个结果,但在其他查询中,您可能希望更具区分性(很可能是对结果进行迭代)。
现在,让我们看看如何使用get\u fb\u user函数:
定义我的观点(要求):添加\u fb \u实例(要求)用户=获取\u fb \u用户(要求.脸谱网)返回直接\u到\u模板(要求,“fb公司/画布.fbml',额外的上下文={'请求':要求,'用户':用户})
请注意,我们需要在请求使用请求的Facebook实例以获取我们的用户之前调用add_fb_instance(在我们调用add_fb_instance之前不存在)。
把它整合在一起。
好的,现在来看一个稍微复杂一点的例子,它使用了我们写的所有东西,还有一些其他的东西。
从django.com快捷方式进口获取\u对象\u或\u 404定义俱乐部(要求,身份证件):添加\u fb \u实例(要求)重定向=需要登录(要求)如果重定向是不没有:返回重定向用户=获取\u fb \u用户(要求.脸谱网)俱乐部=获取\u对象\u或\u 404(俱乐部,PK.=㈡(身份证件))如果用户在里面俱乐部.管理员.全部():是管理员吗=是的其他的:是管理员吗=假返回直接\u到\u模板(要求,'fb / club.fbml',额外的上下文={'用户':用户,'俱乐部':俱乐部,'是管理员':是管理员吗,})
所以,这个视图的视图也会给我们传递一个id。所以网址.py看起来像这样:
从django.conf.url文件。默认值进口*URL模式=模式('bookface.fb.视图',(r'^$','帆布'),(俱乐部/(?P\d+/$' ,'俱乐部'),)
因为URL中的正则表达式只允许数字,所以我们可以直接在id上调用int函数(但是忽略错误处理仍然不是一个好主意)。
因此,我们将Facebook实例添加到请求中,然后验证用户是否已登录到Facebook中。如果他们未登录,我们将它们重定向到您的应用程序的登录页面。然后我们检索与登录Facebook用户关联的用户实例。然后我们使用我们被传递的ID来检索或创建一个俱乐部。
然后我们检查用户是否是俱乐部的管理员之一。我们将一组额外的上下文传递给模板呈现器(用户、俱乐部,如果用户是俱乐部的管理员)。
这就是全部。
让我知道如果你有任何问题。