|
|
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('数据更新成功') |