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 相关文章推荐
利用Django框架中select_related和prefetch_related函数对数据库查询优化
Apr 01 Python
python实现查找excel里某一列重复数据并且剔除后打印的方法
May 26 Python
python实现ping的方法
Jul 06 Python
Python中的命令行参数解析工具之docopt详解
Mar 27 Python
Python中is与==判断的区别
Mar 28 Python
在python中使用正则表达式查找可嵌套字符串组
Oct 24 Python
20个常用Python运维库和模块
Feb 12 Python
python实现windows下文件备份脚本
May 27 Python
Python箱型图绘制与特征值获取过程解析
Oct 22 Python
python自动生成model文件过程详解
Nov 02 Python
Python基于smtplib协议实现发送邮件
Jun 03 Python
粗暴解决CUDA out of memory的问题
May 22 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函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
微博短链接算法php版本实现代码
2012/09/15 PHP
php读取excel文件的简单实例
2013/08/26 PHP
PHP购物车类Cart.class.php定义与用法示例
2016/07/20 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
php微信公众号开发之图片回复
2018/10/20 PHP
学习YUI.Ext 第二天
2007/03/10 Javascript
javascript 自定义事件初探
2009/08/21 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
javascript避免数字计算精度误差的方法详解
2014/03/05 Javascript
百度移动版的url编码解码示例
2014/04/29 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
jquery实现公告翻滚效果
2015/02/27 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
2016/04/07 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
2016/06/17 Javascript
简单的JS轮播图代码
2016/07/18 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
2016/09/09 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
python实现SMTP邮件发送功能
2020/06/16 Python
Python全局变量与局部变量区别及用法分析
2018/09/03 Python
Python基础之条件控制操作示例【if语句】
2019/03/23 Python
python实现取余操作的简单实例
2020/08/16 Python
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
日本索尼音乐商店:Sony Music Shop
2018/07/17 全球购物
正隆泰信息技术有限公司上机题
2012/06/14 面试题
导游的职业规划书范文
2013/12/27 职场文书
校园创业策划书
2014/01/14 职场文书
买房委托公证书
2014/04/08 职场文书
远程网络教育毕业生自我鉴定
2014/04/14 职场文书
房产授权委托书范本
2014/09/22 职场文书
辞职信的写法
2015/02/27 职场文书
公司2015年终工作总结
2015/05/26 职场文书
青少年法制教育心得体会
2016/01/14 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript