廣告小程序後端開發(5.安裝配置django-rest-framework,編寫後臺登錄邏輯)
阿新 • • 發佈:2019-05-10
document pre lbs admin ade shortcuts uid ssa and
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,編寫後臺登錄邏輯)