广告小程序后端开发(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())
]

 

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

上一篇:html2canvas 轮播保存每个图片内容


下一篇:CSS学习13-产品模块