def post(self, request): # post --- 注册处理 # 1, 接收用户数据 username = request.POST.get('user_name') password = request.POST.get('pwd') cpwd = request.POST.get('cpwd') email = request.POST.get('email') allow = request.POST.get("allow") # 2, 检验数据真实性 if not all([username, password, email]): return render(request, 'register.html', {'errmsg': "数据不完整...."}) # 检验两侧密码是否一致 if password != cpwd: return render(request, 'register.html', {'errmsg': "两次密码不一致....."}) # 校验邮箱合法性 if not re.findall(r'^[a-zA-Z0-9][a-zA-Z0-9_]+@[A-Za-z0-9]+\.com$', email): return render(request, 'register.html', {'errmsg': '邮箱格式不正确....'}) # 校验是否同意了协议 if allow != 'on': return render(request, 'register.html', {'errmsg': '使用本网站,需要同意网站协议!'}) # 校验用户是否存在 try: user = User.objects.get(username=username) # get查找不到会报错 except User.DoesNotExist: user = None # 报错表示用户名不存在 if user: # 表示用户已存在 return render(request, 'register.html', {'errmsg': '用户名已存在'}) # 3, 进行业务处理: 注册 # 利用create_users函数创建新的用户 user = User.objects.create_user(username, email, password) # 激活标志 user.is_active = 0 # 提交数据库 user.save() # 发送邮件进行用户激活: http:127.0.0.1:8000/user/activate/user_id # 加密用户的身份信息 secret_key = settings.SECRET_KEY serial = Serial(secret_key, 3600) info = {"confirm": user.id} token = serial.dumps( info) # bytes 类型 需要解码成str,不然运行会报错:bytes no Json serizable..... token = token.decode() send_activating_mail.delay(email, username, token) # celery 异步处理发送激活邮件 # 最终返回到首页 return redirect(reverse('goods:index'))
def correct_token(token): s = Serial("secret_key") #Since loads breaks if the token is expired we throw this in a try block try: user_id = s.loads(token)['user_id'] except: return None #if we get here the token was valid and we can return the user associated with said token return User.query.get(user_id)
def get(self, request, token): serial = Serial(settings.SECRET_KEY, 3600) try: info = serial.loads(token) uid = info.get('confirm') user = User.objects.get(id=uid) user.is_active = 1 user.save() return redirect(reverse('user:login')) except SignatureExpired: return HttpResponse("链接已过期....")
def verify_auth_token(token): s = Serial(current_app.config['SECRET_KEY']) try: data = s.loads(token) except BadSignature: raise AuthFailed(msg='非法身份,请重新登录', error_code=1002) except SignatureExpired: raise AuthFailed(msg='身份过期,请重新登录', error_code=1003) uid = data['uid'] ac_type = data['type'] auth = data['auth'] return User(uid, ac_type, auth, '')
def processing_single(url, expire=10000): """ :param expire: default value :param url """ s = Serial(os.environ.get('SECRET_KEY'), expire) try: res = pytube.YouTube(url) videos = res.streams.filter( file_extension="mp4", progressive=True).order_by('resolution').asc().all() meta = [] for v in videos: mb1 = math.pow(10, 6) mb_size = math.ceil(v.filesize / mb1) mime_type = v.mime_type encrypt_url = s.dumps({ 'url': v.url, 'mime_type': mime_type, 'title': res.title }).decode('utf-8') _ = { 'url': encrypt_url, 'resolution': v.resolution, 'size': mb_size } meta.append(_) return jsonify( meta=meta, title=res.title, thumbnail_url=res.thumbnail_url, length=math.ceil(int(res.length) / 60), descp=res.description, views=res.views, rating=res.rating, restricted=res.age_restricted, ) except Exception as e: if "regex" in e.__str__(): return jsonify( error="Youtube Url doesnt not match any known format") elif "unavailable" in e.__str__(): return jsonify(error="No Youtube video found. Please check URL") else: return jsonify(error=e.__str__())
def processing_playlist(url, expires=1000000): """ :param expires: default value :param url """ s = Serial(os.environ.get('SECRET_KEY'), expires) try: res = pytube.Playlist(url) res.populate_video_urls() meta = [] for video_url in res.video_urls: res = pytube.YouTube(video_url) videos = res.streams.filter( file_extension="mp4", progressive=True, res="720p").order_by('resolution').asc().all() for v in videos: mb1 = math.pow(10, 6) mb_size = math.ceil(v.filesize / mb1) mime_type = v.mime_type encrypt_url = s.dumps({ 'url': v.url, 'mime_type': mime_type, 'title': res.title }).decode('utf-8') _ = { 'url': encrypt_url, 'url_un': v.url, 'resolution': v.resolution, 'size': mb_size, 'title': res.title, 'thumbnail_url': res.thumbnail_url, 'length': math.ceil(int(res.length) / 60), 'descp': res.description, 'views': res.views, 'rating': res.rating, 'restricted': res.age_restricted, } meta.append(_) return jsonify(meta=meta) except Exception as e: return jsonify(error=e.__str__())
def process_request(self, request): # 获取url后缀 url_path = request.path_info # 是否登录 if url_path == '/api/private/v1/login' or url_path == '/api/private/v1/register' or '/admin': return None try: token = request.META.get('HTTP_AUTHORIZATION', '') if not token: raise Exception('没有token') serial = Serial(secret_key=settings.SECRET_KEY) userinfo = serial.loads(token) user = Manager.objects.filter(username=userinfo['username'], id=userinfo['id']) if not user: raise Exception('token错误') request.user = userinfo except: return JsonResponse({'meta': {'msg': '认证失败', 'status': 401}}) return None
def create_token(self, seconds=600): s = Serial("secret_key", seconds) return s.dumps({'user_id': self.id}).decode('utf-8')
def generate_auth_token(uid, auth, ac_type, scope=None, expiration=7200): s = Serial(current_app.config['SECRET_KEY'], expires_in=expiration) return s.dumps({'uid': uid, 'auth': auth, 'type': ac_type.value})