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.

205 lines
7.3 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 os
import django
import requests
os.chdir('D:/python/djangoProject/test_Bootstrap')
# 设置DJANGO_SETTINGS_MODULE环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_Bootstrap.settings')
# 初始化Django设置
django.setup()
# 初始化Django设置
django.setup()
import streamlit as st
from st_pages import add_page_title, add_indentation
from app_test.other_pages.test_research import search_fund_by_id
from app_test.models import Fund
from django.contrib.auth.models import User
from requests.cookies import RequestsCookieJar
# 获取 URL 参数并初始化 session state
# 在应用的最顶部获取 URL 参数并初始化 session state
# 从会话中获取token并存储到session state中
# 爬虫爬取token尝试
add_page_title()
add_indentation()
# 初始化 session state 中的键
if 'fund_list' not in st.session_state:
st.session_state['fund_list'] = ["国投瑞银医疗保健", "华宝医药生物混合", "中银医疗保健混合"]
if 'message' not in st.session_state:
st.session_state['message'] = ''
if 'temp_fund_input' not in st.session_state:
st.session_state['temp_fund_input'] = ''
if 'fund_input' not in st.session_state:
st.session_state['fund_input'] = ''
if 'trigger_rerun' not in st.session_state:
st.session_state['trigger_rerun'] = False
# 基金列表显示
# 使用 HTML 和内联CSS来增加字体大小
st.markdown("""
<div style='font-size: 34px; font-weight: bold;'>
我的基金
</div>
""", unsafe_allow_html=True)
st.markdown("#####")
for fund in st.session_state['fund_list']:
col1, col2 = st.columns([4, 1])
col1.write(fund)
if col2.button("×", key=f"remove_{fund}"):
st.session_state['fund_list'].remove(fund)
st.experimental_rerun()
# 添加自定义 CSS 样式
st.markdown("""
<style>
.placeholder {
color: rgba(0, 0, 0, 0.5); /* 半透明颜色 */
}
</style>
""", unsafe_allow_html=True)
# 基金选择列表
fund_all = ['cat', 'dog', 'rabbit', 'bird']
django.setup()
def validate_fund():
print('开始验证基金')
fund_code = st.session_state.get('fund_input', '')
print(f'fund_code: {fund_code}')
fund_list = ["国投瑞银医疗保健", "华宝医药生物混合", "中银医疗保健混合"]
fund_name = search_fund_by_id(fund_code) # 假设有这个函数来搜索基金代码
if fund_name:
if any(f['fund_code'] == fund_code for f in fund_list): # 检查基金是否已在列表中
st.session_state['message'] = '基金已存在'
else:
try:
csrf_token = get_csrf_token(token)
except ValueError as e:
st.session_state['message'] = str(e)
return
data = {'fund_id': fund_code, 'fund_name': fund_name}
headers = {
'Authorization': f'Token {token}', # 使用Token认证
'Content-Type': 'application/json',
'X-CSRFToken': csrf_token,
}
response = requests.post('http://localhost:8000/api/add-fund/', json=data, headers=headers)
if response.status_code == 201:
st.session_state['message'] = '添加成功'
else:
st.session_state['message'] = f'添加失败: {response.status_code} - {response.text}'
else:
st.session_state['message'] = '未发现该基金'
def get_csrf_token(token):
response = requests.get('http://localhost:8000/api/csrf-token/', headers={'Authorization': f'Token {token}'})
if response.status_code == 200:
return response.json()['csrfToken']
else:
raise ValueError("Could not fetch CSRF token")
# 验证基金函数
def validate_fund():
print('开始验证基金')
fund_code = st.session_state.get('fund_input', '')
print(f'基金代码: {fund_code}')
token = st.session_state.get('token')
print(f'token: {token}')
session = st.session_state.get('session')
if not token:
st.session_state['message'] = '请先登录'
return
fund_list = ["国投瑞银医疗保健", "华宝医药生物混合", "中银医疗保健混合"]
if fund_code:
fund_name = search_fund_by_id(fund_code) # 假设有这个函数来搜索基金代码
if fund_name:
if any(f['fund_code'] == fund_code for f in fund_list): # 检查基金是否已在列表中
st.session_state['message'] = '基金已存在'
else:
try:
csrf_token = get_csrf_token(token)
except ValueError as e:
st.session_state['message'] = str(e)
return
data = {'fund_id': fund_code, 'fund_name': fund_name}
headers = {
'Authorization': f'Token {token}', # 使用Token认证
'Content-Type': 'application/json',
'X-CSRFToken': csrf_token,
}
response = session.post('http://127.0.0.1:8000/api/add-fund/', json=data, headers=headers)
if response.status_code == 201:
st.session_state['message'] = '添加成功'
else:
st.session_state['message'] = f'添加失败: {response.status_code} - {response.text}'
else:
st.session_state['message'] = '未发现该基金'
else:
st.session_state['message'] = '请输入基金代码并确保已登录'
def get_csrf_token(token):
session = st.session_state.get('session')
response = session.get('http://127.0.0.1:8000/api/csrf-token/', headers={'Authorization': f'Token {token}'})
if response.status_code == 200:
return response.json()['csrfToken']
else:
raise ValueError("无法获取CSRF token")
def search_funds_of_user(user_id):
# 这里需要实现从数据库或API查询用户的基金列表
# 返回值应该是一个列表,每个元素都是一个包含 'fund_code' 和其他信息的字典
return requests.get(f'https://api.example.com/user/{user_id}/funds').json()
# 初始化 session state
# 初始化session state
if 'token' not in st.session_state:
st.session_state['token'] = None
if 'fund_input' not in st.session_state:
st.session_state['fund_input'] = ''
if 'message' not in st.session_state:
st.session_state['message'] = ''
if 'trigger_rerun' not in st.session_state:
st.session_state['trigger_rerun'] = False
# 基金代码输入框和反馈信息
col1, col2 = st.columns([4, 1])
with col1:
# 使用 HTML 和 CSS 来定制标题样式
st.markdown("""
<style>
.big-bold {
font-size: 24px; /* 设置字体大小 */
font-weight: bold; /* 字体加粗 */
}
</style>
<p class='big-bold'>添加基金</p>
""", unsafe_allow_html=True)
# 创建一个输入框,使用 placeholder 参数设置提示语
fund_code = st.text_input('基金代码', placeholder='请输入基金代码', key='fund_input', on_change=validate_fund,
label_visibility='collapsed')
# 显示反馈信息并在显示后重置
if st.session_state['message']:
st.write(st.session_state['message'])
st.session_state['message'] = '' # 重置消息以避免重复显示
# 页面刷新逻辑
if st.session_state['trigger_rerun']:
st.session_state['trigger_rerun'] = False
st.rerun()