专栏首页雪胖纸的玩蛇日常广告小程序后端开发(5.安装配置django-rest-framework,编写后台登录逻辑)

广告小程序后端开发(5.安装配置django-rest-framework,编写后台登录逻辑)

1.安装djangorestframework

1.安装djangorestframework及其依赖包markdown、django-filter。

pip install djangorestframework markdown django-filter

2.在settings中注册,如下:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'users.apps.UsersConfig',
    'ad.apps.AdConfig',
    'trade.apps.TradeConfig',
    'user_operation.apps.UserOperationConfig',
    'crispy_forms',
    'xadmin','rest_framework'  
]

2.编写登录逻辑

1.在apps/users目录下新建序列化文件:serializers.py

from rest_framework import serializers
from .models import UserProfile,Area


class UserProfileModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserProfile
        fields="__all__"


class AreaModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Area
        fields="__all__"

2.在settings.py中写入APPID和SECRET(从微信开发者公众平台后台内获得):

APPID="……"
SECRET="……"

 3.在settings.py中配置对接百度地图api的AK:

AK="......"

百度地图开发者文档地址:

http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding

百度地图的开发者AK查看页面:

http://lbsyun.baidu.com/apiconsole/key

4.在apps/users/views.py中编写登录视图:

from django.shortcuts import render,HttpResponse
from gg.settings import APPID,SECRET,AK
import urllib.request
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
from .serializers import UserProfileModelSerializer
from .models import UserProfile,Area
import hashlib,time,json
from datetime import datetime

# Create your views here.


class LoginView(APIView):
    """登录"""
    renderer_classes = [JSONRenderer]  # 渲染器
    def get(self, request):
        code = request.GET.get('code')
        aurl=request.GET.get('avatarUrl')
        nickname=request.GET.get('nickname')
        gender=request.GET.get('gender')
        longitude=request.GET.get('longitude')
        latitude=request.GET.get('latitude')
        # print(code, nickname, gender, latitude, longitude)
        if code and nickname and longitude and latitude:
            # print(code, nickname,aurl, gender, latitude, longitude)
            # 用前端发过来的code把openid和session_key兑换过来
            url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + APPID + "&secret=" + SECRET + "&js_code=" + code + "&grant_type=authorization_code"
            res = urllib.request.urlopen(url)
            content = res.read().decode()
            obj = json.loads(content)
            openid = obj["openid"]
            # print(openid)
            if openid:
                # 生成token,加密
                i = int(time.time())
                s = str(i)
                sha = hashlib.sha1()
                sha.update((openid + s).encode('utf-8'))
                token = sha.hexdigest()
                # print(token)
                # 查看以前此用户是否登陆过
                wxuser = UserProfile.objects.filter(open_id=openid).first()
                if wxuser:
                    # 如果登录过,就将token值更新
                    wxuser.token = token
                    wxuser.nickName=nickname
                    wxuser.avatarUrl=aurl
                    wxuser.gender=gender
                    wxuser.longitude=longitude
                    wxuser.latitude=latitude
                    # 更新最后登录时间
                    wxuser.last_login = datetime.now()
                    wxuser.save()
                else:
                    # 如果没登录过,就生成用户,并且赋值token
                    wxuser = UserProfile()
                    wxuser.open_id = openid
                    wxuser.token = token
                    wxuser.nickName = nickname
                    wxuser.avatarUrl = aurl
                    wxuser.gender = gender
                    wxuser.longitude = longitude
                    wxuser.latitude = latitude
                    wxuser.save()
            else:
                return HttpResponse(404)
            # 根据经纬度,获取用户地理位置,并将省、市、区并且返回
            try:
                areaurl='http://api.map.baidu.com/geocoder/v2/?callback=renderReverse&location=' + latitude + ',' + longitude + '&output=json&pois=1&ak=' + AK
                ree = urllib.request.urlopen(areaurl)
                # print(ree.read().decode('utf-8'))
                ree=ree.read().decode('utf-8')
                adcode=ree[ree.find("adcode")+9:ree.find("adcode")+15]
                # print(adcode)
                adcode=int(adcode)
                xian=Area.objects.filter(num=adcode).first()
                shi=Area.objects.filter(id=xian.parent_category.id).first()
                sheng=Area.objects.filter(id=shi.parent_category.id).first()
                # print(xian.name,shi.name,sheng.name)
                result = {"status": "200", "data": {'token': token,'nickname':nickname, 'xian': xian.name, 'shi': shi.name,'sheng':sheng.name}}
                # print(result)
                return HttpResponse(json.dumps(result, ensure_ascii=False),
                                    content_type="application/json,charset=utf-8")
            except Exception as e:
                print('获取地区时错误,请检查代码或百度开发者平台相关配置。')
                return HttpResponse(403)
        else:
            return HttpResponse(404)

5.配置路由urls.py:

1.在gg/urls.py中:

from django.contrib import admin
from django.urls import path,include
from django.views.static import serve
from gg.settings import MEDIA_ROOT

import xadmin

urlpatterns = [
    #path('admin/', admin.site.urls),
    path('media/<path:path>',serve,{'document_root':MEDIA_ROOT}),
    path('xadmin/', xadmin.site.urls),
    path('users/',include('users.urls'))
]

2.在apps/users/目录下新建urls.py:

from django.urls import path
from .views import LoginView

urlpatterns = [
    path('login/',LoginView.as_view())
]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Vue+Django2.0 REST framework 打造前后端分离的生鲜电商项目(五)商品列表页

    玩蛇的胖纸
  • 17.编程式导航(js驱动跳转)和路由的hash模式与History模式

    玩蛇的胖纸
  • Vue+Django2.0 restframework打造前后端分离的生鲜电商项目(3)

    玩蛇的胖纸
  • Django2.1集成xadmin管理后台所遇到的错误解决办法

    django默认是有一个admin的后台管理模块,但是丑,功能也不齐全,但是大神给我们已经集成好了xadmin后台,我们拿来用即可,但是呢,django已经升级...

    菲宇
  • Django实战-番外篇-tinymce富文本编辑器

    富文本编辑器在 web应用中使用广泛,比如 markdown、ueditor 等,像这些编辑器都有集成在 python 和 django 的第三方包。

    小团子
  • Python import同级目录报错

    参考:http://blog.csdn.net/geekleee/article/details/52505233

    用户2398817
  • Springboot 系列(二)Spring Boot 配置文件

    不管是通过官方提供的方式获取 Spring Boot 项目,还是通过 IDEA 快速的创建 Spring Boot 项目,我们都会发现在 resource 有一...

    未读代码
  • Linux的ps命令

    Linux中的ps命令是Process Status的缩写,ps命令用来列出系统中当前运行的那些进程。ps命令可以列出当前进程的运行情况(状态、时间等信息)。在...

    Tyan
  • python并发编程之多进程理论部分

    一 并发与并行   无论是并行还是并发,在用户看来都是'同时'运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cp...

    用户1214487
  • leaflet的小搭档leaflet.minicharts来了,从此动态地图又多了一些乐趣~~~

    本文内容取材自leaflet.minicharts包官方主页的案例介绍,本篇案例虽然是关于leaflet在线地图的辅助包,但是该包的出现对于leaflet生态系...

    数据小磨坊

扫码关注云+社区

领取腾讯云代金券