#視圖函數層
class Login(APIView):
authentication_classes = []
permission_classes = []
parser_classes = [JSONParser]
def post(self,request):
response={'status':100,'msg':None}
name=request.data.get('name')
pwd=request.data.get('pwd')
#去數據庫校驗該用戶是否存在
user=User.objects.filter(name=name,pwd=pwd).first()
if user:
#正常用戶登錄成功
#返回一個唯一的隨機字符串
token=pickle.dumps(user.name)
print(token,type(token))
conn = get_redis_connection()
conn.set('token', token)
conn.expire('token', 40)
# ensure_ascii = False
#把生成的隨機字符串存到數據庫中
# 這樣不行,因為每次登錄都會新插入一條
# models.UserToken.objects.create(user=user,token=token)
# 先去數據庫中查詢,如果當前用戶存在記錄,更新token,如果不存在,新增一條
# 根據user取查詢,如果查到數據,更新defaults中的數據,如果查不到,新增一條數據
request.user=user
#返回前台
# ret=UserToken.objects.update_or_create(user=user,defaults={'token':token})
response['msg']='登錄成功'
response['token']='zzf'
else:
#用戶名或密碼錯誤
response['status'] = 101
response['msg'] = '用戶名或密碼錯誤'
return Response(response)
class Books(ModelViewSet,):
authentication_classes = [Myauthentication]
queryset = Book.objects.all()
serializer_class = MySerializer.BookSerializer
class Authors(ViewSetMixin,APIView):
authentication_classes = [Myauthentication]
permission_classes=[]
queryset = Book.objects.all()
serializer_class = MySerializer.BookSerializer
def aa(self,request):
print(request.user.name)
# print(request.META.get('token',None))
author = Author.objects.filter().all()
# page_pagination=PageNumberPagination()
# page_pagination.page_query_param='pages'
# page_pagination.page_size_query_param='max'
# page_pagination.max_page_size=7
# page_pagination = LimitOffsetPagination()
# page_pagination.default_limit = 4
# page_pagination.max_limit = 6
# page_pagination.page_size=4
page_pagination=CursorPagination()
page_pagination.ordering='id'
page_pagination.page_size=4
# page_pagination.page_size_query_param=#不需要動
response = {'statue': 1, 'msg': '獲取成功'}
ret=page_pagination.paginate_queryset(author,request,self)
response['data']=MySerializer.AuthorSerializer(ret,many=True).data
return page_pagination.get_paginated_response(response['data'])
自定義認證,權限頻率組件
from app.models import *
from rest_framework import exceptions
from rest_framework.permissions import BasePermission
from rest_framework.authentication import BaseAuthentication
from rest_framework.throttling import BaseThrottle
from django_redis import get_redis_connection
import pickle
class Myauthentication(BaseAuthentication):
def authenticate(self,request):
# print(request.user)
token=request.GET.get('token')
# print(token.encode('utf-8','ignore'))
conn=get_redis_connection()
ret=pickle.loads(conn.get('token',None))
print(ret)
print(conn.get('token'))
user=User.objects.filter(name=ret).first()
if ret==token:
return user,token#源碼將其返回后台,視圖函數可以調用
else:
raise exceptions.AuthenticationFailed('未通過驗證')
# def authenticate_header(self, xx):
# print(xx.GET)
# pass
class Mypermission(BasePermission):
def has_permission(self, request, view):
print(request.user)
# user=User.objects.filter(name=request.POST.get('name')).first()
if request.user.user_type!=0:
return 'success'
else:
return False
import time
class Mythrottle(BaseThrottle):
VISIT_RECORD = {}
def __init__(self):
self.history=None
def allow_request(self, request, view):
create_time=time.time()
ip = request.META.get('REMOTE_ADDR')
if ip not in self.VISIT_RECORD:
self.VISIT_RECORD[ip]=[create_time,]
return True
self.history=self.VISIT_RECORD.get(ip)
while create_time-self.history[-1]>60:
self.history.pop()
if len(self.history)<4:
self.history.insert(0,create_time)
return True
else:
return False
def wait(self):
create_time=time.time()
return 60-create_time+self.history[0]
支付寶沙盒測試
1,配置前端頁面可以向支付寶測試服務器發起請求,並提供對應的信息(根據螞蟻金服開放平台配置 app_id等,注意支付寶公鑰是應用鑰匙配完后發出請求根據用戶公鑰得到)
# 沙箱環境地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info
app_id = "2016092500594669"
# 支付寶收到用戶的支付,會向商戶發兩個請求,一個get請求,一個post請求
# POST請求,用於最后的檢測
notify_url = "http://42.56.89.12:80/page2/"
# GET請求,用於頁面的跳轉展示
return_url = "http://42.56.89.12:80/page2/"
# 用戶私鑰
merchant_private_key_path = "keys/app_private_2048.txt"
# 支付寶公鑰
alipay_public_key_path = "keys/alipay_public_2048.txt"
# 生成一個AliPay的對象
alipay = AliPay(
appid=app_id,
app_notify_url=notify_url,
return_url=return_url,
app_private_key_path=merchant_private_key_path,
alipay_public_key_path=alipay_public_key_path, # 支付寶的公鑰,驗證支付寶回傳消息使用,不是你自己的公鑰
debug=True, # 默認False,
)
return alipay
2,
-2 調用對象的direct_pay()方法,傳入商品描述,商品訂單號,商品價格,返回一堆字符串,拼接到支付寶網關的后面
-3 向支付寶網關發送get請求,看到支付頁面,用戶付款
-4 付款成功,支付寶會有一個get回調,一個post回調(需要對回調內容進行驗簽,alipay.verify)
-一般get回調用於顯示頁面
-post回調用於修改訂單狀態,驗簽等
-如何接入支付寶支付
-商戶號:需要跟支付寶申請,需要有公司的營業執照
-開發人員在開發之前就拿到了
-appid,開發用的,商戶唯一的id(沙箱環境的appid:2016092000554611)
-開發人員需要去支付寶官方文檔按照步驟一步一步做(有人幫你封裝好了)
-沙箱環境(測試環境)
-三種密鑰(非對稱加密)
-應用私鑰(商戶私鑰):不能外泄
-應用公鑰:可以給別人
上面這兩個是:用https://alipay.open.taobao.com/docs/doc.htm?treeId=291&articleId=105971&docType=1生成
-支付寶公鑰:在支付寶開發平台配置上應用公鑰,自動生成的
-在項目中配置兩個密鑰:
-應用私鑰
-支付寶公鑰(不是應用公鑰)
-支付寶支付流程****************************:
-1 生成一個AliPay對象,傳入,appid,get回調地址,post回調地址,商戶私鑰,支付寶公鑰
-商戶公鑰和私鑰是支付寶提供的軟件生成的
-支付寶的公鑰:在網站上通過商戶公鑰生成的
-2 調用對象的direct_pay()方法,傳入商品描述,商品訂單號,商品價格,返回一堆字符串,拼接到支付寶網關的后面
-3 向支付寶網關發送get請求,看到支付頁面,用戶付款
-4 付款成功,支付寶會有一個get回調,一個post回調(需要對回調內容進行驗簽,alipay.verify)
-一般get回調用於顯示頁面
-post回調用於修改訂單狀態
微信推送
-推送
-郵件推送
-短信推送(花錢買短信接口)
-微信推送
-微信推送:
-公眾號(不能主動跟粉絲聊天)
-未認證公眾號
-一天只能推送一條文章
-已認證公眾號
-一天能推送多條
-服務號(推送,前提是關注服務號)
-注冊服務號需要企業資質(營業執照)
-主動推送消息
-沙箱環境
-企業號
-企業里來用
-企業中溝通的
-所有的二維碼其實都是一個url地址:
-url地址可以轉成二維碼
-二維碼也能解析成url地址
-微信推送的流程:
-1 需要用戶關注我的服務號(掃描一下二維碼)
-2 想讓用戶把微信唯一id添加到咱們的數據庫中
-2.1 用url(微信的)地址生成了一個二維碼,讓用戶去掃描(包含回調地址,包含用戶唯一id)
-2.2 當用戶掃描二維碼,向微信服務器發送get請求,用戶點確認,微信會回調到咱們的/callback/
-2.3 回調該地址,只攜帶用戶的唯一id回來,並沒有用戶微信id
-2.4 向微信一個地址發送請求,去請求用戶的微信id,請求回來
-2.5 根據用戶唯一id,去修改用戶的微信id,完成后,咱們數據庫就會用用戶的微信id
-3 發送消息
-用用戶微信id推送消息(普通消息和模板消息)
-3.1 需要獲取token,
-3.2 調用發送消息接口,按照數據格式發送過去,就能給用戶推送消息了
WECHAT_CONFIG = {
'app_id': 'wx20d174effe1375c3',
'appsecret': 'e679b86b37688423556027f6c0aa4e88',
'redirect_uri': 'http://42.56.89.12/callback/',
}
需要修改app_id 和 appsecret
'redirect_uri' 配置上線域名
