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

5 months ago
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()