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基础教程之面向对象的一些概念
Aug 29 Python
python中import学习备忘笔记
Jan 24 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
Aug 08 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
Apr 02 Python
python 计算数据偏差和峰度的方法
Jun 29 Python
FFT快速傅里叶变换的python实现过程解析
Oct 21 Python
python 五子棋如何获得鼠标点击坐标
Nov 04 Python
pandas dataframe 中的explode函数用法详解
May 18 Python
详解Python设计模式之策略模式
Jun 15 Python
python pip如何手动安装二进制包
Sep 30 Python
python爬取新闻门户网站的示例
Apr 25 Python
Python 统计序列中元素的出现频度
Apr 26 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 验证码制作(网树注释思想)
2009/07/20 PHP
PHP 飞信好友免费短信API接口开源版
2010/07/22 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
Yii使用migrate命令执行sql语句的方法
2016/03/15 PHP
Yii Framework框架开发微信公众平台示例
2020/04/26 PHP
列表内容的选择
2006/06/30 Javascript
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
jquery清空textarea等输入框实现代码
2013/04/22 Javascript
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
js中的事件捕捉模型与冒泡模型实例分析
2015/01/10 Javascript
React组件中的this的具体使用
2018/02/28 Javascript
node.js利用socket.io实现多人在线匹配联机五子棋
2018/05/31 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
2019/04/10 Javascript
nodejs搭建本地服务器并访问文件操作示例
2019/05/11 NodeJs
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
python中通过selenium简单操作及元素定位知识点总结
2019/09/10 Python
Python读取YAML文件过程详解
2019/12/30 Python
TensorFlow实现指数衰减学习率的方法
2020/02/05 Python
基于Python共轭梯度法与最速下降法之间的对比
2020/04/02 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
2020/06/03 Python
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
database面试题
2013/03/28 面试题
解释一下钝化(Swap out)
2016/12/26 面试题
室内设计专业学生的自我评价分享
2013/11/27 职场文书
劳动实践课感言
2014/02/01 职场文书
临床专业自荐信
2014/06/22 职场文书
政工例会汇报材料
2014/08/26 职场文书
大学生党员自我批评思想汇报
2014/10/10 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
酒店工程部经理岗位职责
2015/04/09 职场文书
来探秘“德国中小企业”的成功之道
2019/07/26 职场文书
Redis Stream类型的使用详解
2021/11/11 Redis
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers
MySQL数据库查询之多表查询总结
2022/08/05 MySQL