django接入新浪微博OAuth的方法


Posted in Python onJune 29, 2015

本文实例讲述了django接入新浪微博OAuth的方法。分享给大家供大家参考。具体分析如下:

最近将网站和新浪微博进行了整合,思路很简单,就是将页面内容和新浪微博联系起来,一个独立内容的页面对于一条微博,自然评论系统只需要使用微博的评论即可。 然后,用户需要发表评论的话,肯定要接入oauth,不可能让用户登录你的网站来发评论吧?没有谁会将自己的账号和密码告诉你的。 查看了新浪微博的授权机制,然后下载了python版的sdk,就可以在django上接入oauth了。

对于oauth很陌生的同学,请先查看OAUTH协议简介

其实流程很简单:

① getrequesttoken ->
② createauthurl ->
③ [user_login: 跳转到新浪登录页面,用户登陆后会跳转回来] ->
④ getaccesstoken ->
⑤ done!

在django上结合python版的sdk的具体实现代码,已经有很详细的注释了:

oauth_views.py文件如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
基于django的新浪微博oauth views
需要django的session支持
"""
from django.http import HttpResponseRedirect
from weibopy import OAuthHandler, oauth, WeibopError
consumer_key = '' # 设置你申请的appkey
consumer_secret = '' # 设置你申请的appkey对于的secret
class WebOAuthHandler(OAuthHandler):
  def get_authorization_url_with_callback(self, callback, signin_with_twitter=False):
    """Get the authorization URL to redirect the user"""
    try:
      # get the request token
      self.request_token = self._get_request_token()
      # build auth request and return as url
      if signin_with_twitter:
        url = self._get_oauth_url('authenticate')
      else:
        url = self._get_oauth_url('authorize')
      request = oauth.OAuthRequest.from_token_and_callback(
        token=self.request_token, callback=callback, http_url=url
      )
      return request.to_url()
    except Exception, e:
      raise WeibopError(e)
def _get_referer_url(request):
  referer_url = request.META.get('HTTP_REFERER', '/')
  host = request.META['HTTP_HOST']
  if referer_url.startswith('http') and host not in referer_url:
    referer_url = '/' # 避免外站直接跳到登录页而发生跳转错误
  return referer_url
def _oauth():
  """获取oauth认证类"""
  return WebOAuthHandler(consumer_key, consumer_secret)
def login(request):
  # 保存最初的登录url,以便认证成功后跳转回来
  back_to_url = _get_referer_url(request)
  request.session['login_back_to_url'] = back_to_url
  # 获取oauth认证url
  login_backurl = request.build_absolute_uri('/login_check')
  auth_client = _oauth()
  auth_url = auth_client.get_authorization_url_with_callback(login_backurl)
  # 保存request_token,用户登录后需要使用它来获取access_token
  request.session['oauth_request_token'] = auth_client.request_token
  # 跳转到登录页面
  return HttpResponseRedirect(auth_url)
def login_check(request):
  """用户成功登录授权后,会回调此方法,获取access_token,完成授权"""
  # http://mk2.com/?oauth_token=c30fa6d693ae9c23dd0982dae6a1c5f9&oauth_verifier=603896
  verifier = request.GET.get('oauth_verifier', None)
  auth_client = _oauth()
  # 设置之前保存在session的request_token
  request_token = request.session['oauth_request_token']
  del request.session['oauth_request_token']
  auth_client.set_request_token(request_token.key, request_token.secret)
  access_token = auth_client.get_access_token(verifier)
  # 保存access_token,以后访问只需使用access_token即可
  request.session['oauth_access_token'] = access_token
  # 跳转回最初登录前的页面
  back_to_url = request.session.get('login_back_to_url', '/')
  return HttpResponseRedirect(back_to_url)
def logout(request):
  """用户登出,直接删除access_token"""
  del request.session['oauth_access_token']
  back_to_url = _get_referer_url(request)
  return HttpResponseRedirect(back_to_url)

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
浅谈python中的getattr函数 hasattr函数
Jun 14 Python
python将秒数转化为时间格式的实例
Sep 16 Python
Python修改文件往指定行插入内容的实例
Jan 30 Python
python基础知识(一)变量与简单数据类型详解
Apr 17 Python
Python3 tkinter 实现文件读取及保存功能
Sep 12 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
Sep 15 Python
3种python调用其他脚本的方法
Jan 06 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
Mar 30 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 16 Python
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
May 12 Python
关于Python使用turtle库画任意图的问题
Apr 01 Python
python+pytest接口自动化之token关联登录的实现
Apr 06 Python
python链接Oracle数据库的方法
Jun 28 #Python
python写日志封装类实例
Jun 28 #Python
Python实现的简单hangman游戏实例
Jun 28 #Python
python实现矩阵乘法的方法
Jun 28 #Python
python实现的用于搜索文件并进行内容替换的类实例
Jun 28 #Python
python实现简单ftp客户端的方法
Jun 28 #Python
基于进程内通讯的python聊天室实现方法
Jun 28 #Python
You might like
完美解决PHP中的Cannot modify header information 问题
2013/08/12 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
javascript EXCEL 操作类代码
2009/07/30 Javascript
javascript 触发事件列表 比较不错
2009/09/03 Javascript
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
jcarousellite.js 基于Jquery的图片无缝滚动插件
2010/12/30 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
jquery使用each方法遍历json格式数据实例
2015/05/18 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
JS自定义选项卡函数及用法实例分析
2015/09/02 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
使用store来优化React组件的方法
2017/10/23 Javascript
angularjs数组判断是否含有某个元素的实例
2018/02/27 Javascript
Django模板继承 extend标签实例代码详解
2019/05/16 Javascript
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
基于python中pygame模块的Linux下安装过程(详解)
2017/11/09 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
python 在sql语句中使用%s,%d,%f说明
2020/06/06 Python
浅析Python 字符编码与文件处理
2020/09/24 Python
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
移动端Html5中百度地图的点击事件
2019/01/31 HTML / CSS
Fanatics官网:运动服装、球衣、运动装备
2020/10/12 全球购物
String和StringBuffer的区别
2015/08/13 面试题
如何用Java实现列出某个目录下的所有子目录
2015/07/20 面试题
UNIX文件类型
2013/08/29 面试题
网络维护管理员的自我评价分享
2013/11/11 职场文书
汽车技术服务与营销专业推荐信
2013/11/29 职场文书
物业门卫岗位职责
2013/12/28 职场文书
抗洪抢险事迹材料
2014/05/06 职场文书
2014教师评职称工作总结
2014/11/10 职场文书