#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")