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基于queue和threading实现多线程下载实例
Oct 08 Python
python计算列表内各元素的个数实例
Jun 29 Python
python得到电脑的开机时间方法
Oct 15 Python
浅谈Python 列表字典赋值的陷阱
Jan 20 Python
Python对象与引用的介绍
Jan 24 Python
python实现微信每日一句自动发送给喜欢的人
Apr 29 Python
Pycharm 2019 破解激活方法图文详解
Oct 11 Python
Python TKinter如何自动关闭主窗口
Feb 26 Python
浅谈keras中loss与val_loss的关系
Jun 22 Python
keras自动编码器实现系列之卷积自动编码器操作
Jul 03 Python
Python2手动安装更新pip过程实例解析
Jul 16 Python
Qt自定义Plot实现曲线绘制的详细过程
Nov 02 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
第十四节 命名空间 [14]
2006/10/09 PHP
让PHP支持页面回退的两种方法
2008/01/10 PHP
使用php批量删除数据库下所有前缀为prefix_的表
2014/06/09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(五)
2014/06/23 PHP
在Laravel 的 Blade 模版中实现定义变量
2019/10/14 PHP
JS中动态添加事件(绑定事件)的代码
2011/01/09 Javascript
js 利用className得到对象的实现代码
2011/11/15 Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
2012/02/10 Javascript
jquery根据锚点offset值实现动画切换
2014/09/11 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
2015/06/01 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
javascript实现input file上传图片预览效果
2015/12/31 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
2016/11/07 Javascript
详解js前端代码异常监控
2017/01/11 Javascript
微信小程序 监听手势滑动切换页面实例详解
2017/06/15 Javascript
NodeJs搭建本地服务器之使用手机访问的实例讲解
2018/05/12 NodeJs
Vuex入门到上手教程
2018/06/20 Javascript
Vue2 监听属性改变watch的实例代码
2018/08/27 Javascript
手动下载Chrome并解决puppeteer无法使用问题
2018/11/12 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
2019/07/29 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
2020/12/30 Vue.js
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
Python中Continue语句的用法的举例详解
2015/05/14 Python
python友情链接检查方法
2015/07/08 Python
轻松实现python搭建微信公众平台
2016/02/16 Python
python字典多键值及重复键值的使用方法(详解)
2016/10/31 Python
深入理解python对json的操作总结
2017/01/05 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
css3 按钮 利用css3实现超酷下载按钮
2013/03/18 HTML / CSS
生产副总岗位职责
2013/11/28 职场文书
行为习惯主题班会
2015/08/14 职场文书
中国梦宣传标语口号
2015/12/26 职场文书