#postgresql #flask
#postgresql #flask
Вопрос:
app = Flask(__name__)
app.secret_key= os.urandom(16)
conn=psycopg2.connect( database="one",user="postgres",password="0000",host="localhost",port="5432" )
cur = conn.cursor()
cursor = conn.cursor()
cursor.execute("select username from use")
us=cursor.fetchall()
cursor.execute("select password from use")
psw= cursor.fetchall()
cursor.execute("select type from use")
ty= cursor.fetchall()
cursor.execute("select page from use")
page=cursor.fetchall()
@app.route('/',methods=['GET','POST'])
def index():
if request.method=='POST':
global user_name
user_name=request.form['username'] # make it global
print(user_name)
pass_word=request.form['password']
for i in range(len(us)):
if user_name in us[i][0]:
new=psw[i][0]
type=ty[i][0]
page_access=page[i][0]
print(page_access)
global page_ac
page_ac=page_access
page_ac=page_access.split(',')
print(page_ac)
global x
x=type
print("type:" x)
if new==pass_word:
#session['user'] = 'True'
session['user']= request.form['username']
print("now u are logged in:" session.get('user'))
now = session.get('user')
print(now)
cursor.execute("select page from use where username='" str(session['user']) "'")
page_access=cursor.fetchall()[0][0]
global page_ac
session['page_access']=page_access
print(session.get('page_access'))
page_ac=page_access.split(',')
return render_template('analyse.html')
else:
return render_template('login.html',info="invalid user")
return render_template('login.html')
@app.route('/analyse',methods=['POST','GET'])
def analyse():
global page_ac,x
pagename="analyse"
global user_name
if g.user:
print(request.method)
if request.method=='POST':
shift = request.form.get('shift1')
farm_chosen= request.form['Farm_chosen']
turbine_chosen= request.form['Turbine_chosen']
timezone_chosen= request.form['Timezone']
zoom_level= request.form['zoom_level']
gap= request.form['gap']
data_set= request.form['Data_Set']
map = request.form.get('Map')
meta= request.form.get('meta')
live = request.form.get('Live farm Performance')
status= request.form.get('Status Overview')
anamolies= request.form.get('Anamolies Overview')
turbine= request.form.get('Turbine Status Overview')
associate=user_name
dt = datetime.utcnow()
dt=dt.strftime("%Y/%m/%d %I:%M:%S %p")
fname = request.files ['file']
name = fname.filename
print(name)
data = open(name, 'rb')
cur.execute("select max(id) 1 from monitor")
id=cur.fetchone()
id=id[0]
cur.execute("INSERT INTO public.analysing(shift,farm_chosen,turbine_chosen,timezone_chosen,zoom_level,gap,data_set,map,meta,live,status,anamolies,turbine,associate,time_posted,name,id)values('" str(shift) "','" str(farm_chosen) "','" str(turbine_chosen) "','" str(timezone_chosen) "','" str(zoom_level) "','" str(gap) "','" str(data_set) "','" str(map) "','" str(meta) "','" str(live) "','" str(status) "','" str(anamolies) "','" str(turbine) "','" str(associate) "','" str(dt) "','" str(name) "','" str(id) "')")
print("done")
cur.execute('commit')
cur.execute("SELECT * from public.analysing")
f1=cur.fetchall()
print(f1)
return render_template("analyse.html",name=fname.filename,type=x)
else:
if pagename in session['page_access']:
print ("welcome")
for z in range(len(page_ac)):
if pagename == page_ac[z]:
return render_template('analyse.html',type=x)
else:
return render_template("analyse.html")
else:
return render_template('login.html',info='login to traverse')
@app.route('/logout', methods=['GET', 'POST'])
def logout():
if g.user:
if request.method == 'GET':
#print(session['user'][0])
session.pop('user',None)
return render_template("login.html")
else:
return redirect("monitor.html")
@app.before_request
def before_request():
g.user=None
if 'user' in session:
g.user = session['user']
if __name__ == '__main__':
app.run(debug=True)
когда пользователь входит в систему, аутентифицируйте их через db (postges) и извлеките им страницу.когда другой пользователь входит в систему, например, если ему не разрешено видеть analyse.html страница (внутри таблицы БД я дал имя пользователя каждому пользователю, имеющему доступ к разным страницам, каждый раз, когда приходит пользователь, я возвращаю эти данные и отфильтровываю страницы, которые им разрешено видеть)
все это работает по мере необходимости, включая удаление имен пользователей после выхода пользователя из системы.Проблема, с которой я сталкиваюсь, заключается в одновременном входе двух пользователей.допустим, у пользователя one нет доступа к странице 2, и пользователь two входит в систему, которому разрешено просматривать страницу 2, а пользователь1 обновляет свою страницу, он может видеть, что может пользователь 2. чего не должно произойти, как мне не допустить этого?
Ответ №1:
Информация о пользователе не должна храниться как глобальная переменная. Оно должно храниться в сеансе пользователя, чтобы к нему можно было обращаться по-разному при каждом запросе. Вы также можете использовать что-то вроде Flask-login для управления загрузкой пользователей и управлением сеансами.
Комментарии:
1. когда я сохранял пользовательские данные в сеансе, он перегружался при входе нового пользователя, поскольку я использовал этот сеанс для доступа к их page_access из БД, функциональность не работала. вместо этого я использовал комбинацию файлов cookie и сеанса, который работал. хотя спасибо за flask-login.