приложение flask с системой входа пользователя, но не может обрабатывать двух пользователей одновременно

#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.