版权声明:本文为博主原创文章,如若转载请注明出处 https://blog.csdn.net/tonydz0523/article/details/82683862
接上一篇,这篇要实现搜索功能:
创建搜索页面:
在templates文件夹内新建main.html文件,内容如下:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<link rel="icon" href="{{ url_for('static', filename='favicon.ico') }}">
<title>stock-graph</title>
<!--引入 Bootstrap core CSS -->
<link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet">
<!--引入Bootstrap core js-->
<script src="{{ url_for('static', filename='js/bootstrap.min.js') }}"></script>
</head>
<body>
<div class="container-fluid">
<!--建立一个搜索的form-->
<form style="padding-top: 70px" method="post">
<div class="form-row justify-content-center">
<div class="col-7">
<input class="form-control" type="search" placeholder="输入股票代码.." name="search" id="search1">
</div>
<div class="col-1">
<button class="btn btn-outline-success" type="submit">搜索</button>
</div>
</div>
</form>
<div class="row justify-content-center">
<div class="col-8">
<div class="alert alert-light" role="alert">
<strong>{{sign}}</strong>
</div>
</div>
</div>
</div>
</body>
</html>
这里要用到bootstrap 的 css,js 可以到官网下载, 然后放static文件夹中,连接:https://getbootstrap.com/docs/4.1/getting-started/download/
项目结构如下:
实现搜索后页面跳转
修改view.py 文件,
from flask import render_template, Flask, request
app = Flask(__name__)
# 接收方式为post和get
@app.route('/', methods=["POST", "GET"])
def homepage():
try:
if request.method == 'POST': #接收post数据
search = request.form['search'] # 获取name为search的表单数据
print(search)
if search == 'stock': # 这里只是做个试验,判断是否为stock,是的话 返回stock.html网页
return render_template("stock.html")
else:
return render_template('main.html')
except Exception as e:
return render_template("main.html", error=e)
这是我们运行 run 文件:
打开页面是:
在搜索栏里输入stock,实现跳转。。:
提取股票名和股票代码
这里我们提取mysql中存储的所有股票的股票名和股票代码存入另一个表中方便搜索:
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
import pandas as pd
from sqlalchemy.types import NVARCHAR, Float, Integer
engine = create_engine('mysql+pymysql://ffzs:666@localhost:3306/stock')
BaseModel = declarative_base()
# 获取database 的 所有table
BaseModel.metadata.reflect(engine)
tables = BaseModel.metadata.tables
# 获取所有table名称
tables_names = list(tables.keys())
df = pd.DataFrame()
# 写入名称列
df['名称'] = tables_names
# 写入代码列
df['代码'] = list(map(lambda x: x.split('(')[1].split(')')[0], tables_names))
con = engine.connect()
def map_types(df):
dtypedict = {}
for i, j in zip(df.columns, df.dtypes):
if "object" in str(j):
dtypedict.update({i: NVARCHAR(length=255)})
if "float" in str(j):
dtypedict.update({i: Float(precision=2, asdecimal=True)})
if "int" in str(j):
dtypedict.update({i: Integer()})
return dtypedict
df.to_sql(name='股票代码', con=con, if_exists='replace', index=False, dtype=map_types(df))
con.close()
成功导入:
搜索关联数据库
这里的逻辑是,根据search获得的股票代码,找到相应的股票名称,进而找到股票的table,然后将其写入pandas.Dataframe 中然后使用 plotly做可视化,将可视化文件存储为stock.html,网页加载。。
这里改写了一下之前画图的脚本:
get_graph_html.py
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
import pandas as pd
import plotly.offline as po
import plotly.graph_objs as go
def get_graph(search):
try:
# 创建基础类
engine = create_engine('mysql+pymysql://ffzs:666@localhost:3306/stock')
BaseModel = declarative_base()
# 初始话数据库记过,与数据库连接
BaseModel.metadata.create_all(engine)
# 实例化一个会话,之后通过session进行操作
con = engine.connect()
df_stock_name = pd.read_sql("select 名称 from `股票代码` where 代码={}".format(search), con=con)
stock_name = df_stock_name.values[0][0]
df = pd.read_sql('select * from `{}`'.format(stock_name), con=con)
trace = go.Candlestick(x=df['日期'],
open=df['开盘价'],
high=df['最高价'],
low=df['最低价'],
close=df['收盘价'])
data = [trace]
layout = {
'title': stock_name}
fig = dict(data=data, layout=layout)
po.plot(fig, filename='templates/stock.html', auto_open=False)
con.close()
return True
except:
return False
更改view.py文件:
from flask import render_template, Flask, request
from stockapp.get_graph_html import get_graph
app = Flask(__name__)
# 接收方式为post和get
@app.route('/', methods=["POST", "GET"])
def homepage():
try:
if request.method == 'POST': #接收post数据
search = request.form['search'] # 获取name为search的表单数据
result = get_graph(search) #
if result == True:
return render_template("stock.html")
else:
return render_template('main.html', sign='没有查到')
else:
return render_template('main.html')
except Exception as e:
return render_template("main.html", sign=e)
这是再运行run文件:
找一个你数据库内的股票代码试一下:
成功跳转:
试试查找别的:
本篇到处为止,下一篇使用js,多图画在同一网页上,以及传递数据方法。。。。