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绘制简单折线图代码示例
Dec 19 Python
matplotlib subplots 调整子图间矩的实例
May 25 Python
解决csv.writer写入文件有多余的空行问题
Jul 06 Python
使用 Python 实现文件递归遍历的三种方式
Jul 18 Python
Django中使用Celery的方法示例
Nov 29 Python
浅谈Python的条件判断语句if/else语句
Mar 21 Python
Python应用领域和就业形势分析总结
May 14 Python
python3下载抖音视频的完整代码
Jun 05 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
Jul 12 Python
基于torch.where和布尔索引的速度比较
Jan 02 Python
python实现梯度下降算法的实例详解
Aug 17 Python
运行python提示no module named sklearn的解决方法
Nov 29 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开发中常用的8个小技巧
2008/08/27 PHP
PHP 编写大型网站问题集
2010/05/07 PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
2011/06/10 PHP
php在项目中寻找代码的坏味道(综艺命名)
2012/07/19 PHP
php多个字符串替换成同一个的解决方法
2013/06/18 PHP
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
2011/03/05 Javascript
jquery调用asp.net 页面后台的实现代码
2011/04/27 Javascript
以JSON形式将JS中Array对象数组传至后台的方法
2014/01/06 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
2016/01/08 Javascript
学习Javascript面向对象编程之封装
2016/02/23 Javascript
js判断某个字符出现的次数的简单实例
2016/06/03 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
2016/07/26 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
javascript iframe跨域详解
2016/10/26 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
2017/05/17 jQuery
react-router4 嵌套路由的使用方法
2017/07/24 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
vue 移动端记录页面浏览位置的方法
2020/03/11 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
2020/08/19 Javascript
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python比较2个xml内容的方法
2015/05/11 Python
浅谈Python对内存的使用(深浅拷贝)
2018/01/17 Python
python email smtplib模块发送邮件代码实例
2018/04/26 Python
Python+pandas计算数据相关系数的实例
2018/07/03 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
2019/07/23 Python
Python表达式的优先级详解
2020/02/18 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
linux下进程间通信的方式
2013/01/23 面试题
毕业生自荐信
2013/12/14 职场文书
幼师求职自荐信范文
2014/01/26 职场文书
售后服务质量承诺书
2015/04/29 职场文书
《用字母表示数》教学反思
2016/02/17 职场文书
创业计划书之便利店
2019/09/05 职场文书