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 相关文章推荐
Python3.0与2.X版本的区别实例分析
Aug 25 Python
Python的gevent框架的入门教程
Apr 29 Python
python自带的http模块详解
Nov 06 Python
详谈Python基础之内置函数和递归
Jun 21 Python
基于python时间处理方法(详解)
Aug 14 Python
python线程中同步锁详解
Apr 27 Python
python使用Plotly绘图工具绘制散点图、线形图
Apr 02 Python
Django为窗体加上防机器人的验证码功能过程解析
Aug 14 Python
Django REST framework 单元测试实例解析
Nov 07 Python
解决os.path.isdir() 判断文件夹却返回false的问题
Nov 29 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 Python
python工具——Mimesis的简单使用教程
Jan 16 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编译安装php-amq扩展简明教程
2016/06/25 PHP
PHP抽象类和接口用法实例详解
2019/07/20 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
window.location.hash 属性使用说明
2010/03/20 Javascript
循环 vs 递归浅谈
2013/02/28 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
2013/12/31 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
JS中正则表达式全局匹配模式 /g用法详解
2017/04/01 Javascript
老生常谈combobox和combotree模糊查询
2017/04/17 Javascript
页面间固定参数,通过cookie传值的实现方法
2017/05/31 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
详解Immutable及 React 中实践
2018/03/01 Javascript
深入理解javascript prototype的相关知识
2019/09/19 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
[01:34]2014DOTA2 TI预选赛预选赛 选手比赛房大揭秘!
2014/05/20 DOTA
用Python写冒泡排序代码
2016/04/12 Python
python实现画五角星和螺旋线的示例
2019/01/20 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
keras 多gpu并行运行案例
2020/06/10 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
python爬取抖音视频的实例分析
2021/01/19 Python
html5 拖拽及用 js 实现拖拽功能的示例代码
2020/10/23 HTML / CSS
Lentiamo丹麦:购买便宜的隐形眼镜
2021/01/13 全球购物
日语专业个人求职信范文
2014/02/02 职场文书
四年级语文教学反思
2014/02/05 职场文书
模具专业毕业推荐信
2014/03/08 职场文书
中学清明节活动总结
2014/07/04 职场文书
门市房租房协议书
2014/12/04 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
个人股份转让协议书范本
2015/01/28 职场文书
试用期辞职信范文
2015/03/02 职场文书
思想道德自我评价2015
2015/03/09 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
员工担保书范本
2015/09/22 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
详解Java实践之建造者模式
2021/06/18 Java/Android