zoukankan      html  css  js  c++  java
  • 我用Django搭网站(1)-新浪微博登录

    新浪微博第三方登录使用的是OAuth2.0,开发前提已经注册开发者帐号,是开发者。

    OAuth简介

    OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。

    具体开发步骤

    第一步:准备阶段

    打开微博开发平台,并登录你的新浪微博账号。再点击导航上的“微链接”--> “网站接入”。
    网站接入
    立即接入
    创建应用
    创建完应用后再基本信息里就可以拿到App Key和App Secret。在开发阶段可以直接拿来使用,如果网站上线需要完善等级信息。
    App Key和App Secret
    填写授权回调地址
    微博第三方登录的大体步骤:先跳转到用户登录界面,同意后回调到填写的回调页面,获得code码,通过code码获取access_token,其中包含用户的唯一表示uid。

    第一步:具体开发

    登录界面

    • 创建web应用
      创建完成之后,打开models.py文件,编写模型:
    class Users(models.Model):
        uid = models.CharField(max_length=64, null=True)  # 微博的关联uid
        nickname = models.CharField(max_length=30, null=True)  # 用户昵称
        head = models.CharField(max_length=100, null=True)  # 用户头像
        sex = models.CharField(max_length=2, null=True)  # 性别
        register_time = models.DateTimeField('保存日期')  # 注册时间
        register_ip = models.CharField(max_length=30, null=True)  # 注册ip
        last_time = models.DateTimeField('最后修改日期')  # 最后一次登录时间
    

    模型用于存储微博登录返回的uid值。这个uid是与微博一一对应。
    在总的urls路由中,加入对应应用路由。

    from django.contrib import admin
    from django.urls import include, path
    
    urlpatterns = [
        path('login/', include('login.urls')),  # 登录模块
    ]
    

    打开对应应用目录下urls.py文件,填写对用的路由:

    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('oauth/weibo/login', views.weibo_login),  # 微博授权页面
        path('weibo/connect/callback.php', views.weibo_get_code),  # 微博回调页面
    ]
    

    oauth/weibo/login和weibo/connect/callback.php,分别是打开授权页面和回调地址。
    大致步骤是授权之后,得到uid。判断这个uid是否存在数据库中。若存在,则直接登录对应的用户即可;若不存在,则获取调取获取用户信息的新浪接口,获取用户信息。

    • 开发登录模块
      1.在工程目录settings.py中设置常量
    '''微博登录常量'''
    WEIBO_APP_ID = "App Key"
    WEIBO_APP_KEY = "App Secret"
    WEIBO_REDIRECT_URI = "回调地址"
    

    2.在对应应用的文件夹下创建wb_oauth.py文件,编辑wb_oauth.py文件:

    import requests
    import json
    
    
    class OAuthWB:
        def __init__(self, client_id, client_key, redirect_uri):
            self.client_id = client_id
            self.client_key = client_key
            self.redirect_uri = redirect_uri
    
        def get_access_token(self, code):  # 获取用户token和uid
            url = "https://api.weibo.com/oauth2/access_token"
    
            querystring = {
                "client_id": self.client_id,
                "client_secret": self.client_key,
                "grant_type": "authorization_code",
                "code": code,
                "redirect_uri": self.redirect_uri
            }
    
            response = requests.request("POST", url, params=querystring)
    
            return json.loads(response.text)
    
        def get_user_info(self, access_token_data):
            url = "https://api.weibo.com/2/users/show.json"
    
            querystring = {
                "uid": access_token_data['uid'],
                "access_token": access_token_data['access_token']
            }
    
            response = requests.request("GET", url, params=querystring)
    
            return json.loads(response.text)
    

    3.编辑对应应用的文件夹下views.py文件:

    from .wb_oauth import OAuthWB
    from django.conf import settings  # 引入常量
    def weibo_login(request):# 跳转授权页面
        return HttpResponseRedirect(
            'https://api.weibo.com/oauth2/authorize?client_id=' + settings.WEIBO_APP_ID + '&redirect_uri=' + settings.WEIBO_REDIRECT_URI)
    
    
    def weibo_get_code(request):
        """登录之后,会跳转到这里。需要判断code和state"""
        code = request.GET.get('code', None)
        sina = OAuthWB(settings.WEIBO_APP_ID,
                       settings.WEIBO_APP_KEY,
                       settings.WEIBO_REDIRECT_URI)
        user_info = sina.get_access_token(code)
        time.sleep(0.1)  # 防止还没请求到token就进行下一步
        # 通过uid查询出是否是新用户,新用户则注册登录
        is_user_exist = models.Users.objects.filter(uid=user_info['uid']).first()
        if is_user_exist is not None:
            # 存在直接登录
            pass
        else:
            #不存在获取用户信息
            new_user_info = sina.get_user_info(user_info)
            users_dict = {
                "uid": new_user_info['id'],
                'description': new_user_info['description'],
                "head": new_user_info['profile_image_url'],
                "nickname": new_user_info['name'],
            }
            users_table_obj = models.Users.objects.create(**users_dict).id   
    

    注:获取邮箱地址的接口是属于高级权限,需要先通过审核,然后在我的应用中的接口管理中申请。新浪提供的API测试页面

  • 相关阅读:
    WCF Server Console
    Restart IIS With Powershell
    RestartService (recursively)
    Copy Files
    Stopping and Starting Dependent Services
    多线程同步控制 ManualResetEvent AutoResetEvent MSDN
    DTD 简介
    Using Powershell to Copy Files to Remote Computers
    Starting and Stopping Services (IIS 6.0)
    java中的NAN和INFINITY
  • 原文地址:https://www.cnblogs.com/caiji/p/9460900.html
Copyright © 2011-2022 走看看