Flask 的一个问题,求教大佬

2018-04-15 23:38:37 +08:00
 charlescwj
我的问题是这样的:flask 新手 写了两个页面,一个用表单获取数据 比如输入 30 另外一个返回数据 比如显示 30 然后挂到服务器上,用 gunicon 开了三个进程,但是出现问题,我在两个不同的电脑上一个输入 30,一个输入 20,再到显示页面里刷新,有时候显示 30,有时候显示 20,请问这是什么原因啊?我获取浏览器信息作为 cookie 和 session (两台电脑的系统、浏览器不同) 依旧不能解决问题,焦头烂额中,求指教!
2972 次点击
所在节点    Python
13 条回复
John60676
2018-04-15 23:45:51 +08:00
上代码
charlescwj
2018-04-15 23:59:13 +08:00
@John60676 这是我 views 代码的一部分 觉得问题应该就在这里
from app import app
from flask import render_template,request,flash,session
from .models import CostForm,dowmlist
import numpy as np
from flask import make_response


# 全局基础数据
Salary_Increase = 0.02 #工资涨幅,
Rate_Insurance = 0.48 #五险一金占年薪的百分比
Rate_Welfare = 0.06 #其他福利占年薪的百分比
Rate_CommonRepair = 0.55
Rate_BigRepair = 0.45
Rate_LineRepair = 0.5
Rate_StructureRepair = 0.2
Rate_DeviceRepair = 0.3

TrainPower = 1150 #列车额定功率,1150kw
Rate_power = 0.8 #功率利用率

Rate_water = 0.07
Rate_gas = 0.05
Rate_heat = 0.06
Rate_transport = 0.14
Rate_accident = 0.34
Rate_ticket = 0.25
Rate_clean = 0.11
Rate_ManagerSalary = 0.35
Rate_Active = 0.25
Rate_Travel = 0.3
Rate_Education = 0.1
# 存放提交的基础数据
datum={}

# 存放计算后的数据
LineLength = []
Flow = []
TrainCount = []
StaffCount = []
TrainRunKM = []
Salary = []

Total_Salary = []
TrainRepair = []
OtherRepair = []
Train_electric = []
Lighting_electric = []
Total_electric = []
Operation = []
Management = []
TotalCost = []

@app.route('/')
def index():
k = request.remote_addr
m = request.user_agent
session['user'] = k+m.browser+m.platform+m.string+m.version
return render_template('Default.html')


@app.route('/base')
def base():
return render_template('base.html')

@app.route('/Input', methods=('GET', 'POST'))
def register():
form = CostForm()
if form.validate_on_submit():

flash("sucess")
# 其他数据
datum['Cal_year']=form.text_year.data
datum['Investment']=form.text_investment.data
datum['speed']=form.text_speed.data
datum['BaseSalary']=form.text_salary.data
datum['Price_TrainRepair']=form.text_trainRepair.data
datum['Price_OtherRepair']=form.text_repair.data
datum['Price_electric']=form.text_e_cost.data
datum['Price_Operation']=form.text_operation.data
datum['Rate_management']=form.text_management.data/100
for i in range(form.text_year.data):
if i<3:
LineLength.append(form.text_length1.data)
Flow.append((0.8 + i / 10)*form.text_flow1.data)
TrainCount.append((0.8 + i / 10) * form.text_train1.data)
StaffCount.append((0.8 + i / 10) * form.text_person1.data)
Lighting_electric.append(datum['Price_electric'] * (0.8 + i / 10) * form.text_e1.data)
elif 3<=i<10:
LineLength.append(form.text_length1.data)
Flow.append(form.text_flow1.data+(i - 2) * (form.text_flow2.data - form.text_flow1.data)/ 7)
TrainCount.append(form.text_train1.data+(i - 2) * (form.text_train2.data - form.text_train1.data)/ 7)
StaffCount.append(form.text_person1.data+(i - 2) * (form.text_person2.data - form.text_person1.data)/ 7)
Lighting_electric.append(datum['Price_electric'] *( form.text_e1.data + (i - 2) * (form.text_e2.data - form.text_e1.data) / 7))
elif 10<=i<25:
LineLength.append(form.text_length2.data)
Flow.append(form.text_flow2.data + (i - 9) * (form.text_flow3.data - form.text_flow2.data) /15)
TrainCount.append(form.text_train2.data + (i - 9) * (form.text_train3.data - form.text_train2.data)/15)
StaffCount.append(form.text_person2.data + (i - 9) * (form.text_person3.data - form.text_person2.data)/15)
Lighting_electric.append(datum['Price_electric']*(form.text_e2.data + (i - 9) * (form.text_e3.data - form.text_e2.data)/15))
else:
LineLength.append(form.text_length3.data)
Flow.append(form.text_flow3.data)
TrainCount.append(form.text_train3.data)
StaffCount.append(form.text_person3.data)
Lighting_electric.append(datum['Price_electric'] * form.text_e3.data)

TrainRunKM.append(LineLength[i] * TrainCount[i] * 2 * 365 * 1.1 / 10000)
Salary.append(LineLength[i] * StaffCount[i] * datum['BaseSalary'] * (1 + Salary_Increase)**i)
Total_Salary.append(round(Salary[i] * (1 + Rate_Insurance + Rate_Welfare),1))
TrainRepair.append(round(datum['Price_TrainRepair'] * TrainRunKM[i],1))
OtherRepair.append(round(datum['Price_OtherRepair'] * TrainRunKM[i],1))
# Train_electric[i] = datum['Price_electric'] * TrainPower * Rate_power * TrainRunKM[i] / datum['speed']
Train_electric.append(round(datum['Price_electric']* 5 * TrainRunKM[i],1))
Total_electric.append(round(Train_electric[i] + Lighting_electric[i],1))
Operation.append(round(datum['Price_Operation'] * TrainRunKM[i],1))

TotalCost.append(round((Total_Salary[i] + TrainRepair[i] + OtherRepair[i] + Total_electric[i] + Operation[
i]) / (1-datum['Rate_management']),1))
Management.append(round(datum['Rate_management'] * TotalCost[i],1))
# 添加跳转页面或者弹窗
return render_template('Input.html', form=form)


@app.route('/simple')
def simple():
year=datum['Cal_year']
all_total_salary = round(sum(Total_Salary),1)
all_trainrepair = round(sum(TrainRepair),1)
all_otherrepair = round(sum(OtherRepair),1)
all_total_electric = round(sum(Total_electric),1)
all_operation = round(sum(Operation),1)
all_management = round(sum(Management),1)
all_totalcost = round(sum(TotalCost),1)
return render_template('simple.html', all_total_salary=all_total_salary,all_trainrepair=all_trainrepair,all_otherrepair=all_otherrepair,all_total_electric=all_total_electric,all_operation=all_operation,all_management=all_management,all_totalcost=all_totalcost,year=year,Total_Salary=Total_Salary,TrainRepair=TrainRepair,OtherRepair=OtherRepair,Total_electric=Total_electric,Operation=Operation,TotalCost=TotalCost,Management=Management)
charlescwj
2018-04-16 00:01:03 +08:00
@John60676

@app.route('/')
def index():
k = request.remote_addr
m = request.user_agent
session['user'] = k+m.browser+m.platform+m.string+m.version
return render_template('Default.html')

是不是这里写错了 我没有写登录的页面 但是想获取浏览器的信息 作为 sessions 或者 cookie 的信息
John60676
2018-04-16 00:10:53 +08:00
你别把表单数据放在文件中
John60676
2018-04-16 00:16:42 +08:00
# 存放提交的基础数据
datum={}

# 存放计算后的数据
.
.
.
TotalCost = []


这段代码的问题,用户提交的数据都写在了全局变量中,所以会出现你所说的有时候显示 20,有时候显示 30。这是因为用户 A 提交表单后,计算后的数据放在了全局变量中,此时,所有用户访问看到的都是用户 A 的结果。用户 B 提交表单时同理
charlescwj
2018-04-16 00:27:01 +08:00
@John60676 奥 原来如此 感谢感谢 然后 我还想问一下 要是不使用全局变量 怎么在不同的请求直接传递数据? 存到数据库或者保存成 json 文件?
charlescwj
2018-04-16 00:31:04 +08:00
@John60676 这么晚了 还帮我解答问题 再来感谢一下 👍👍
John60676
2018-04-16 00:33:36 +08:00
看需求,全局变量也不是不可以用,把数据写成 dict 就好了,用以用户名或者其他标识用户的字符串作为 key 值。这样就不会复写了。不过最简单的还是用数据库吧
charlescwj
2018-04-16 00:36:19 +08:00
@John60676 👏 感谢 我明天改一下 晚安😊
kaneg
2018-04-16 09:09:32 +08:00
不能滥用全局变量,这在大多数编程语言都是大忌
charlescwj
2018-04-16 09:18:01 +08:00
@John60676 您好 我还想问一下 按照我的理解 各个进程之间是相互独立的,互不影响的 为什么这里会出现这样的问题呢? http://www.ziyoubaba.com/archives/585 这个人的说法让我有些迷糊了 请帮我解答一下(新手 ,在学习中~ 勿怪)
jimzhong
2018-04-16 09:41:06 +08:00
我猜 gunicorn 每个 worker 的全局变量是共享的。
John60676
2018-04-16 14:42:46 +08:00
@charlescwj @jimzhong 每个 worker 的全局变量是独立的。但是我们回到这个问题上看。楼主开了三个 worker,这就导致了每次访问的时候分配的 worker 不一定是上一次分配到的那个 worker。所以会出现这样的问题。你可以试试把 worker 改成一个,再试试,就能看到每次的结果都一样了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/447067

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX