You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

294 lines
12 KiB

6 months ago
import random
import string
from functools import wraps
import jwt
from django.conf import settings
# 导入user模型
from django.contrib.auth import get_user_model, login, logout
# views.py
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.contrib.sessions.models import Session
from django.core.mail import send_mail
# ajcx请求以json作为前后端交互
from django.http.response import JsonResponse
from django.middleware.csrf import get_token
from django.shortcuts import render, HttpResponse, redirect, reverse
# 注册界面
from django.views.decorators.http import require_http_methods
from rest_framework import status
from rest_framework.authtoken.models import Token
# User = get_user_model()
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from .forms import RegisterForm, LoginForm, FundForm
from .models import CaptchaModel, Fund
from .serializers import FundSerializer
from .utils import generate_jwt_token
# @require_http_methods(['GET'])
# def get_token(request):
# token = request.session.get('token')
# print('开始获取token')
# print(f'token{token}')
# print(f"会话数据2: {request.session.items()}")
# if token:
# return JsonResponse({'token': token})
# else:
# return JsonResponse({'error': 'No token found'}, status=400)
def get_csrf_token_view(request):
return JsonResponse({'csrfToken': get_token(request)})
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def add_fund(request):
print('开始调用')
serializer = FundSerializer(data=request.data)
if serializer.is_valid():
fund = serializer.save(user=request.user)
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@login_required
def delete_fund(request, fund_id):
fund = Fund.objects.get(id=fund_id, user=request.user) # 确保只能删除属于用户的基金
if fund:
fund.delete()
return redirect('funds_list')
return render(request, 'error.html', {'message': '无权进行此操作'})
def validate_session(request):
sessionid = request.GET.get('sessionid')
if not sessionid:
return JsonResponse({'error': 'No sessionid provided'}, status=400)
try:
session = Session.objects.get(session_key=sessionid)
user_id = session.get_decoded().get('_auth_user_id')
user = User.objects.get(pk=user_id)
return JsonResponse({'username': user.username})
except Session.DoesNotExist:
return JsonResponse({'error': 'Invalid sessionid'}, status=400)
except User.DoesNotExist:
return JsonResponse({'error': 'User not found'}, status=400)
# @login_required
# def get_current_user(request):
# # 从请求头中获取令牌
# token = request.headers.get('Authorization')
#
# if not token:
# return JsonResponse({'error': 'Authorization header is missing'}, status=401)
#
# try:
# # 验证令牌
# decoded_token = jwt.decode(token, settings.SECRET_KEY, algorithms=['HS256'])
# user_id = decoded_token.get('user_id')
# if user_id:
# # 如果令牌有效,返回用户数据
# user = User.objects.get(pk=user_id)
# return JsonResponse({
# 'user_id': user.id,
# 'username': user.username,
# 'email': user.email
# })
# else:
# return JsonResponse({'error': 'Invalid token'}, status=401)
# except jwt.ExpiredSignatureError:
# return JsonResponse({'error': 'Token has expired'}, status=401)
# except jwt.InvalidTokenError:
# return JsonResponse({'error': 'Invalid token'}, status=401)
# Create your views here.
@login_required
def get_current_user(request):
sessionid = request.COOKIES.get('sessionid')
print(f'sessionid2:{sessionid}')
if not sessionid:
return JsonResponse({'error': 'No sessionid provided'}, status=400)
try:
session = Session.objects.get(session_key=sessionid)
user_id = session.get_decoded().get('_auth_user_id')
user = User.objects.get(pk=user_id)
return JsonResponse({'user_id': user.id, 'username': user.username})
except Session.DoesNotExist:
return JsonResponse({'error': 'Invalid sessionid'}, status=400)
except User.DoesNotExist:
return JsonResponse({'error': 'User not found'}, status=400)
def index(request):
return render(request, '初始页面.html')
@login_required
def streamlit_test(request):
sessionid = request.GET.get('sessionid')
print(sessionid)
return render(request, 'stream_test.html', {'sessionid': sessionid})
# return render(request, 'stream_test.html')
# def login(request):
# print('开始登录')
# return render(request, '登录界面.html')
@require_http_methods(['GET', 'POST'])
def lg_login(request):
print('开始登录')
if request.method == 'GET':
return render(request, '登录界面.html')
else:
form = LoginForm(request.POST)
if form.is_valid():
email = form.cleaned_data.get('email')
password = form.cleaned_data.get('password')
remember = form.cleaned_data.get('remember')
user = User.objects.filter(email=email).first()
if user and user.check_password(password):
# 登录
login(request, user)
# 判断是否需要记住我
if not remember:
print('不记住')
# 如果没有点击记住我那么就要设置过期时间为0即浏览器关闭后就会过期
request.session.set_expiry(0)
else:
print('记住两周')
request.session.set_expiry(1209600) # 设置会话两周1209600秒过期
# 如果点击了那么就什么都不做使用默认的2周的过期时间
# return render(request, 'stream_test.html', {'form': form})
# return redirect('/streamlit')
print(f'session:{request.session.session_key}')
return redirect(f'/streamlit/?sessionid={request.session.session_key}')
else:
print('邮箱或密码错误!')
# form.add_error('email', '邮箱或者密码错误!')
# return render(request, 'login.html', context={"form": form})
return render(request, '登录界面.html', {'form': form})
else:
# 表单无效,返回表单错误
return render(request, '登录界面.html', {'form': form})
#
# @require_http_methods(['GET', 'POST'])
# def lg_login(request):
# if request.method == 'GET':
# return render(request, '登录界面.html', {'form': LoginForm()})
# else:
# form = LoginForm(request.POST)
# if form.is_valid():
# email = form.cleaned_data.get('email')
# password = form.cleaned_data.get('password')
# remember = form.cleaned_data.get('remember')
# user = User.objects.filter(email=email).first()
# if user and user.check_password(password):
# # 登录
# login(request, user)
# # 生成Token
# token, created = Token.objects.get_or_create(user=user)
# # 生成Token
# # 存储token到会话中
# print(f'token:{token.key}')
# request.session['token'] = token.key
# print(f"存储的token: {request.session['token']}")
# print(f"会话数据: {request.session.items()}")
# # 判断是否需要记住我
# if not remember:
# request.session.set_expiry(0) # 浏览器关闭后会话过期
# else:
# request.session.set_expiry(1209600) # 两周1209600秒过期
# # 返回Token到前端
# # return JsonResponse({'token': token.key})
# return redirect(f'/streamlit/?token={token.key}')
# else:
#
# return render(request, '登录界面.html', {'form': form, 'error': '邮箱或者密码错误!'})
# else:
# return render(request, '登录界面.html', {'form': form, 'error': '表单无效!'})
# @require_http_methods(['GET', 'POST'])
# def lg_login(request):
# print('开始登录')
# if request.method == 'GET':
# csrf_token = get_token(request)
# response = JsonResponse({'csrfToken': csrf_token})
# response.set_cookie('csrftoken', csrf_token)
# return response
# else:
# form = LoginForm(request.POST)
# if form.is_valid():
# print('表单有效')
# email = form.cleaned_data.get('email')
# password = form.cleaned_data.get('password')
# remember = form.cleaned_data.get('remember')
# user = User.objects.filter(email=email).first()
# if user and user.check_password(password):
# login(request, user)
# if not remember:
# request.session.set_expiry(0) # 浏览器关闭后会话过期
# else:
# request.session.set_expiry(1209600) # 两周1209600秒过期
# return JsonResponse({'sessionid': request.session.session_key, 'csrfToken': csrf_token})
# return render(request, '登录界面.html', {'form': form, 'error': '邮箱或者密码错误!'})
# else:
# return render(request, '登录界面.html', {'form': form, 'error': '表单无效!'})
def lg_logout(request):
logout(request)
return render(request, '登录界面.html')
# 装饰器
@require_http_methods(['GET', 'POST'])
def register(request):
print('开始注册')
if request.method == 'GET':
return render(request, '注册界面.html')
else:
form = RegisterForm(request.POST)
if form.is_valid():
print('注册成功')
email = form.cleaned_data.get('email')
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
User.objects.create_user(email=email, username=username, password=password)
return render(request, '登录界面.html', {'form': form})
else:
print('注册失败')
print(form.errors)
return render(request, '注册界面.html', {'form': form})
def sender_email_captcha(request):
email = request.GET.get('email')
if not email:
return JsonResponse({"code": 400, "message": "必须传递邮箱"})
captcha = "".join(random.sample(string.digits, k=4))
CaptchaModel.objects.update_or_create(email=email, defaults={'captcha': captcha})
send_mail("流感基金关联分析系统", message=f"您的注册验证码是{captcha}", recipient_list=[email], from_email=None)
return JsonResponse({"code": 200, "message": "邮箱验证码发送成功"})
# 生成验证码
# ee2
#更新数据
def update(request):
import os
print("Current working directory:", os.getcwd())
import sys
# print("\n".join(sys.path))
sys.path.append('D:\\python\\pythonProject\\流感预测集成系统django\\liugan_yuce')
# for item in os.listdir('.'):
# print(item)
from .liugan_zhoubao_spider import get_liuganzhoubao
from .beijing_zhoubao_spider import get_beijing_zhoubao
from .get_baidu_index import get_baidu_index
from .tiantian_jijin_spider import get_tiantian_jijin_data,get_fund_data_by_code
from .stock_data_spider import get_stock_data
get_liuganzhoubao()
get_beijing_zhoubao()
get_baidu_index()
get_tiantian_jijin_data()
get_stock_data()
# get_fund_data_by_code('000001')
return HttpResponse('数据更新成功')