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 相关文章推荐
11个并不被常用但对开发非常有帮助的Python库
Mar 31 Python
python抓取网页中图片并保存到本地
Dec 01 Python
Python3如何解决字符编码问题详解
Apr 23 Python
PyQt5实现简易计算器
May 30 Python
5款Python程序员高频使用开发工具推荐
Apr 10 Python
Python字符串处理的8招秘籍(小结)
Aug 13 Python
Python操作Mongodb数据库的方法小结
Sep 10 Python
Python实现序列化及csv文件读取
Jan 19 Python
利用Python实现某OA系统的自动定位功能
May 27 Python
使用keras实现Precise, Recall, F1-socre方式
Jun 15 Python
Python3爬虫关于代理池的维护详解
Jul 30 Python
python 检测nginx服务邮件报警的脚本
Dec 31 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中require和include路径问题详解
2014/12/25 PHP
php实现将数据做成json的格式给前端使用
2018/08/21 PHP
javascript类继承机制的原理分析
2009/09/12 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
JS基于面向对象实现的拖拽库实例
2015/09/24 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
2016/01/26 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
2016/08/17 Javascript
jQuery实现的tab标签切换效果示例
2016/09/05 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
jQuery validate 验证radio实例
2017/03/01 Javascript
微信小程序 动态传参实例详解
2017/04/27 Javascript
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
安装vue-cli报错 -4058 的解决方法
2017/10/19 Javascript
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
js中innerText/textContent和innerHTML与target和currentTarget的区别
2019/01/21 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
[47:20]DAC2018 4.4 淘汰赛 Optic vs Mineski 第一场
2018/04/05 DOTA
Python语言的12个基础知识点小结
2014/07/10 Python
python实现的正则表达式功能入门教程【经典】
2017/06/05 Python
python交互式图形编程实例(一)
2017/11/17 Python
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
python 实现登录网页的操作方法
2018/05/11 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
Python读取csv文件实例解析
2019/12/30 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
解决Python中报错TypeError: must be str, not bytes问题
2020/04/07 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
css3实现input输入框颜色渐变发光效果代码
2014/04/02 HTML / CSS
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
What is view? why do we have view?
2012/06/22 面试题
品牌服务方案
2014/06/03 职场文书
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js
Python使用pandas导入xlsx格式的excel文件内容操作代码
2022/12/24 Python