Вход в систему с перенаправлением Flask

#javascript #python #css #flask #wtforms

#язык JavaScript #питон #CSS #колба #формы wt

Вопрос:

Я новичок в колбе и учусь колбе у twt. Я пытаюсь создать очень простую страницу входа в систему без CSS. Я хочу, чтобы каждый раз, когда пользователь входит в систему, он не мог снова перейти на страницу входа в систему или на любую другую веб-страницу моего сайта. Есть ли какое-нибудь решение? Вот код:

 from flask import Flask,redirect,url_for,render_template,request,session,flash from flask_sqlalchemy import SQLAlchemy from flask_login import UserMixin,LoginManager,login_user,login_required,logout_user,current_user from flask_wtf import FlaskForm from wtforms import StringField,PasswordField from wtforms.validators import InputRequired,Length from werkzeug.security import generate_password_hash,check_password_hash import requests app = Flask(__name__) db = SQLAlchemy(app) login_manager = LoginManager() login_manager.init_app(app) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users1.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SECRET_KEY'] = 'abc' class users(UserMixin,db.Model):  id = db.Column(db.Integer,primary_key=True)  name = db.Column(db.String(200),unique=True,nullable=False)  password = db.Column(db.String(200),unique=False,nullable=False)  db.create_all() class RegisterForm(FlaskForm):  name = StringField('Username',validators=[InputRequired(),Length(min=2,max=30,message='Name must be from 2 to 30')])  password = PasswordField("Password",validators=[InputRequired(),Length(min=1,max=30,message='Password must be from 1 to 30')])  class LoginForm(FlaskForm):  name = StringField('Username',validators=[InputRequired(),Length(min=2,max=30,message='Name must be from 2 to 30')])  password = PasswordField("Password",validators=[InputRequired(),Length(min=1,max=30,message='Password must be from 1 to 30')]) @login_manager.user_loader def user_loader(user_id):  return users.query.get(user_id)  @app.route('/',methods=['POST','GET']) def home():  form = RegisterForm()  try:  if form.validate_on_submit():  user = users(name=form.name.data,password=generate_password_hash(form.password.data,method='sha256'))  db.session.add(user)  db.session.commit()  return redirect('/login')  except:  return 'Name does exist'  return render_template("register.html",form=form)  @app.route('/login',methods=['POST','GET']) def login():  form1 = LoginForm()  if current_user.is_authenticated:  return redirect(request.referrer)  if form1.validate_on_submit():  user1 = users.query.filter_by(name=form1.name.data).first()  if user1:  if check_password_hash(user1.password,form1.password.data):  login_user(user1)  return redirect('/home')  else:  return 'Password is incorrect'  else:  return 'Name does not exist'  return render_template("login.html",form=form1)  @app.route("/home") @login_required def home1():  return 'asd'  @app.route("/logout") @login_required def logout():  logout_user()  return 'You logged out' if __name__ == '__main__':  app.run()  

И это кодекс register.html и login.html:

 lt;!DOCTYPE htmlgt; lt;htmlgt;  lt;bodygt;  lt;form action='' method='post'gt;  {{form.csrf_token}}  {{form.name.label}}  {{form.name}}  {%for i in form.name.errors%}  lt;p style='color:red;'gt;{{i}}lt;/pgt;  {%endfor%}  {{form.password.label}}  {{form.password}}  {%for b in form.name.errors%}  lt;p style="color:red;"gt;{{b}}lt;/pgt;  {%endfor%}  lt;buttongt;Registerlt;/buttongt;  lt;/formgt;  lt;/bodygt; lt;/htmlgt;  

Спасибо.

Ответ №1:

Вы можете сделать это с помощью колб-сеансов. Во время входа в систему пользователя и проверки его пароля и электронной почты создайте переменные сеанса. Пример:

 session['loggedIn']= True  

И, когда пользователь выйдет из системы, удалите эти переменные сеанса:

 session.pop('loggedIn',None)  

Теперь, если вы хотите запретить пользователю посещать определенный маршрут, используйте условие if, чтобы проверить, входит ли он в систему:

 @main.route('/myLink') def myLink():  if session['loggedIn'] is True:  return render_template('thisPage.html')  else:  return("You are not logged in")