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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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