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("""
我的基金
""", 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(""" """, 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("""

添加基金

""", 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()