添加oauth验证,完善菜单功能

车亮亮 9 years ago
parent 407fe823b3
commit 605761db13

@ -39,8 +39,8 @@ INSTALLED_APPS = [
'pagedown',
'blog',
'accounts',
'comments'
'comments',
'oauth'
]
MIDDLEWARE_CLASSES = [
@ -165,3 +165,11 @@ CACHES = {
}
}
"""
OAHUTH = {
'sina': {
'appkey':'3161614143',
'appsecret':'ee17c099317f872eeddb25204ea46721',
'callbackurl':'http://blog.lylinux.org/oauth/weibo'
}
}

@ -21,5 +21,6 @@ urlpatterns = [
url(r'', include('blog.urls', namespace='blog', app_name='blog')),
url(r'', include('comments.urls', namespace='comment', app_name='comments')),
url(r'', include('accounts.urls', namespace='account', app_name='accounts'))
url(r'', include('accounts.urls', namespace='account', app_name='accounts')),
url(r'', include('oauth.urls', namespace='oauth', app_name='oauth'))
]

@ -5,7 +5,7 @@ DJANGODIR=//var/www/DjangoBlog # Django project directory
SOCKFILE=/var/www/DjangoBlog/run/gunicorn.sock # we will communicte using this unix socket
USER=www-data # the user to run as
GROUP=www-data # the group to run as
NUM_WORKERS=2 # how many worker processes should Gunicorn spawn
NUM_WORKERS=3 # how many worker processes should Gunicorn spawn
DJANGO_SETTINGS_MODULE=DjangoBlog.settings # which settings file should Django use
DJANGO_WSGI_MODULE=DjangoBlog.wsgi # WSGI module name

@ -20,5 +20,6 @@ def seo_processor(requests):
return {
'SITE_NAME': settings.SITE_NAME,
'SITE_DESCRIPTION': settings.SITE_DESCRIPTION,
'SITE_BASE_URL':'http://'+ requests.get_host() + '/',
'SITE_BASE_URL': 'http://' + requests.get_host() + '/',
'nav_category_list': Category.objects.all()
}

@ -115,6 +115,15 @@ def load_article_metas(article):
}
"""
@register.inclusion_tag('nav.html')
def load_nav_info():
category_list = Category.objects.all()
return {
'nav_category_list': category_list
}
"""
@register.inclusion_tag('blog/tags/article_info.html')
def load_article_detail(article, isindex):
return {
@ -156,8 +165,6 @@ def query(qs, **kwargs):
return qs.filter(**kwargs)
"""
article = Article.objects.get(pk=4)
comments = Comment.objects.filter(article=article)

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

@ -0,0 +1,5 @@
from django.apps import AppConfig
class OauthConfig(AppConfig):
name = 'oauth'

@ -0,0 +1,29 @@
from django.db import models
# Create your models here.
from django.conf import settings
class BaseModel(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='用户')
openid = models.CharField(max_length=50)
nikename = models.CharField(max_length=50, verbose_name='昵称')
token = models.CharField(max_length=50)
def __str__(self):
return self.nikename
class Meta:
abstract = True
class SinaWBUserInfo(BaseModel):
class Meta:
verbose_name = "新浪微博"
verbose_name_plural = verbose_name
class QQUserInfo(BaseModel):
class Meta:
verbose_name = "QQ"
verbose_name_plural = verbose_name

@ -0,0 +1,117 @@
#!/usr/bin/env python
# encoding: utf-8
"""
@version: ??
@author: liangliangyy
@license: MIT Licence
@contact: liangliangyy@gmail.com
@site: https://www.lylinux.org/
@software: PyCharm
@file: oauthmanager.py
@time: 2016/11/26 下午5:09
"""
from abc import ABCMeta, abstractmethod, abstractproperty
import requests
import json
import urllib.parse
class BaseManager(metaclass=ABCMeta):
"""获取用户授权"""
AUTH_URL = None
"""获取token"""
TOKEN_URL = None
"""获取用户信息"""
API_URL = None
def __init__(self, client_id, client_secret, callback_url, access_token=None, openid=None):
self.client_id = client_id
self.client_secret = client_secret
self.callback_url = callback_url
self.access_token = access_token
self.openid = openid
@property
def is_access_token_set(self):
return self.access_token != None
@property
def is_authorized(self):
return self.is_access_token_set and self.access_token != None and self.openid != None
@abstractmethod
def get_authorization_url(self):
pass
@abstractmethod
def get_access_token_by_code(self, code):
pass
@abstractmethod
def get_oauth_userinfo(self):
pass
def do_get(self, url, params):
rsp = requests.get(url=url, params=params)
return rsp.text
def do_post(self, url, params):
rsp = requests.post(url, params)
return rsp.text
class WBOauthManager(BaseManager):
AUTH_URL = 'https://api.weibo.com/oauth2/authorize'
TOKEN_URL = 'https://api.weibo.com/oauth2/access_token'
API_URL = 'https://api.weibo.com/2/users/show.json'
def __init__(self, client_id, client_secret, callback_url, access_token=None, openid=None):
super(WBOauthManager, self).__init__(client_id=client_id, client_secret=client_secret,
callback_url=callback_url, access_token=access_token, openid=openid)
def get_authorization_url(self):
params = {
'client_id': self.client_id,
'response_type': 'code',
'redirect_uri': self.callback_url
}
url = self.AUTH_URL + "?" + urllib.parse.urlencode(params)
return url
def get_access_token_by_code(self, code):
print(code)
params = {
'client_id': self.client_id,
'client_secret': self.client_secret,
'grant_type': 'authorization_code',
'code': code,
'redirect_uri': self.callback_url
}
rsp = self.do_post(self.TOKEN_URL, params)
print(rsp)
# return rsp
obj = json.loads(rsp)
self.access_token = str(obj['access_token'])
self.openid = str(obj['uid'])
return self.get_oauth_userinfo()
try:
self.access_token = str(obj['access_token'])
self.openid = str(obj['uid'])
return self.get_oauth_userinfo()
except:
return None
def get_oauth_userinfo(self):
if not self.is_authorized:
return None
params = {
'uid': self.openid,
'access_token': self.access_token
}
rsp = self.do_get(self.API_URL, params)
print(rsp)

@ -0,0 +1,13 @@
from django.test import TestCase
# Create your tests here.
class OAuthTet(TestCase):
def setUp(self):
pass
from oauth.oauthmanager import WBOauthManager
from django.conf import settings
settings.OAHUTH['sina']
manager=WBOauthManager(client_id=settings.OAHUTH['sina']['appkey'],client_secret=settings.OAHUTH['sina']['appsecret'],callback_url=settings.OAHUTH['sina']['callbackurl'])

@ -0,0 +1,24 @@
#!/usr/bin/env python
# encoding: utf-8
"""
@version: ??
@author: liangliangyy
@license: MIT Licence
@contact: liangliangyy@gmail.com
@site: https://www.lylinux.org/
@software: PyCharm
@file: urls.py
@time: 2016/11/26 下午5:25
"""
from django.conf.urls import url
from django.views.decorators.cache import cache_page
from . import views
urlpatterns = [
url(r'^oauth/wbauthorize/(?P<sitename>\w+)$', views.wbauthorize),
url(r'^oauth/wboauthurl$', views.wboauthurl),
]

@ -0,0 +1,24 @@
from django.shortcuts import render
# Create your views here.
from .oauthmanager import WBOauthManager
from django.conf import settings
from django.http import HttpResponse
def wbauthorize(request, sitename):
manager = WBOauthManager(client_id=settings.OAHUTH['sina']['appkey'],
client_secret=settings.OAHUTH['sina']['appsecret'],
callback_url=settings.OAHUTH['sina']['callbackurl'])
code = request.GET.get('code', None)
rsp = manager.get_access_token_by_code(code)
print(rsp)
return HttpResponse(rsp)
def wboauthurl(request):
manager = WBOauthManager(client_id=settings.OAHUTH['sina']['appkey'],
client_secret=settings.OAHUTH['sina']['appsecret'],
callback_url=settings.OAHUTH['sina']['callbackurl'])
url = manager.get_authorization_url()
return HttpResponse(url)

@ -18,7 +18,7 @@
<!--[if lt IE 9]>
<script src="{% static 'blog/js/html5.js' %}" type="text/javascript"></script>
<![endif]-->
<meta property="wb:webmaster" content="fdb053e76bf865f3"/>
<link rel='dns-prefetch' href='//fonts.googleapis.com'/>
<link rel='dns-prefetch' href='//s.w.org'/>
@ -52,64 +52,8 @@
<h2 class="site-description">大巧无工,重剑无锋</h2>
</hgroup>
<nav id="site-navigation" class="main-navigation" role="navigation">
<button class="menu-toggle">菜单</button>
<a class="assistive-text" href="#content" title="跳至正文">跳至正文</a>
<div class="menu-%e8%8f%9c%e5%8d%95-container">
<ul id="menu-%e8%8f%9c%e5%8d%95" class="nav-menu">
<li id="menu-item-3498"
class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-home menu-item-3498">
<a href="http://www.lylinux.org">首页</a></li>
<li id="menu-item-7"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-7"><a
href="https://www.lylinux.org/category/linux">linux</a></li>
<li id="menu-item-606"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-606">
<a href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af">程序猿之路</a>
<ul class="sub-menu">
<li id="menu-item-607"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-607"><a
href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/python">python</a>
</li>
<li id="menu-item-608"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-608"><a
href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/c">c++</a>
</li>
<li id="menu-item-3181"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3181"><a
href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/csharp">csharp</a>
</li>
<li id="menu-item-12"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-12">
<a href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/javaweb/ssh%e6%a1%86%e6%9e%b6">ssh框架</a>
<ul class="sub-menu">
<li id="menu-item-11"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-11">
<a href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/javaweb/jspservlet">jsp/servlet</a>
</li>
</ul>
</li>
</ul>
</li>
<li id="menu-item-8"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-8"><a
href="https://www.lylinux.org/category/wordpress">wordpress</a></li>
<li id="menu-item-9"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-9"><a
href="https://www.lylinux.org/category/%e9%9a%8f%e7%ac%94%e6%9d%82%e8%b0%88">随笔杂谈</a></li>
<li id="menu-item-603"
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-603"><a
href="https://www.lylinux.org/link">友情链接</a></li>
<li id="menu-item-604"
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-604"><a
href="https://www.lylinux.org/%e7%95%99%e8%a8%80%e6%9d%bf">留言板</a></li>
<li id="menu-item-605"
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-605"><a
href="https://www.lylinux.org/%e5%85%b3%e4%ba%8e">关于</a></li>
</ul>
</div>
</nav><!-- #site-navigation -->
{% include 'nav.html' %}
</header><!-- #masthead -->
<div id="main" class="wrapper">
{% block content %}

@ -0,0 +1,77 @@
{% comment %}{% load blog_tags %}
{% query nav_category_list parent_category=None as root_categorys %}
{% for root in root_categorys %}
<li id="menu-item-{{ root.pk }}"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-7"><a
href="{{ root.get_absolute_url }}">{{ root.name }}</a></li>
{% query nav_category_list parent_category=root as chind_categorys %}
{% if chind_categorys %}
{% endif %}
{% endfor %}{% endcomment %}
<nav id="site-navigation" class="main-navigation" role="navigation">
<button class="menu-toggle">菜单</button>
<a class="assistive-text" href="#content" title="跳至正文">跳至正文</a>
<div class="menu-%e8%8f%9c%e5%8d%95-container">
<ul id="menu-%e8%8f%9c%e5%8d%95" class="nav-menu">
<li id="menu-item-3498"
class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-home menu-item-3498">
<a href="{{ SITE_BASE_URL }}">首页</a></li>
{% load blog_tags %}
{% query nav_category_list parent_category=None as root_categorys %}
{% for node in root_categorys %}
{% include 'nav_node.html' %}
{% endfor %}
{% comment %}
<li id="menu-item-7"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-7"><a
href="https://www.lylinux.org/category/linux">linux</a></li>
<li id="menu-item-606"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-606">
<a href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af">程序猿之路</a>
<ul class="sub-menu">
<li id="menu-item-607"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-607"><a
href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/python">python</a>
</li>
<li id="menu-item-608"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-608"><a
href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/c">c++</a>
</li>
<li id="menu-item-3181"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3181"><a
href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/csharp">csharp</a>
</li>
<li id="menu-item-12"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-12">
<a href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/javaweb/ssh%e6%a1%86%e6%9e%b6">ssh框架</a>
<ul class="sub-menu">
<li id="menu-item-11"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-11">
<a href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/javaweb/jspservlet">jsp/servlet</a>
</li>
</ul>
</li>
</ul>
</li>
<li id="menu-item-8"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-8"><a
href="https://www.lylinux.org/category/wordpress">wordpress</a></li>
<li id="menu-item-9"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-9"><a
href="https://www.lylinux.org/category/%e9%9a%8f%e7%ac%94%e6%9d%82%e8%b0%88">随笔杂谈</a></li>
<li id="menu-item-603"
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-603"><a
href="https://www.lylinux.org/link">友情链接</a></li>
<li id="menu-item-604"
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-604"><a
href="https://www.lylinux.org/%e7%95%99%e8%a8%80%e6%9d%bf">留言板</a></li>
<li id="menu-item-605"
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-605"><a
href="https://www.lylinux.org/%e5%85%b3%e4%ba%8e">关于</a></li>{% endcomment %}
</ul>
</div>
</nav><!-- #site-navigation -->

@ -0,0 +1,40 @@
<li id="menu-item-{{ node.pk }}"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-{{ node.pk }}">
<a href="{{ node.get_absolute_url }}">{{ node.name }}</a>
{% load blog_tags %}
{% query nav_category_list parent_category=node as child_categorys %}
{% if child_categorys %}
<ul class="sub-menu">
{% for child in child_categorys %}
{% with node=child template_name="nav_node.html" %}
{% include template_name %}
{% endwith %}
{% endfor %}
{% comment %} <li id="menu-item-607"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-607"><a
href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/python">python</a>
</li>
<li id="menu-item-608"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-608"><a
href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/c">c++</a>
</li>
<li id="menu-item-3181"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3181"><a
href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/csharp">csharp</a>
</li>
<li id="menu-item-12"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-12">
<a href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/javaweb/ssh%e6%a1%86%e6%9e%b6">ssh框架</a>
<ul class="sub-menu">
<li id="menu-item-11"
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-11">
<a href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/javaweb/jspservlet">jsp/servlet</a>
</li>
</ul>
</li>{% endcomment %}
</ul>
{% endif %}
</li>
Loading…
Cancel
Save