简体   繁体   English

登录后,烧瓶重定向URL未重定向到主页

[英]Flask redirect url is not redirecting to home page after login

I have designed admin page in flask web framework using python. 我已经使用python在Flask Web框架中设计了管理页面。 And I deployed my admin app on a shared hosting server. 然后,我将管理应用程序部署在共享托管服务器上。 I am getting a problem with redirecting to next URL. 我在重定向到下一个URL时遇到问题。 That is when I click on login button it gives 404 URL not found error. 那就是当我单击登录按钮时,它显示404 URL not found错误。 Also on error page in URL window, it appends the previous URL. 同样在URL窗口的错误页面上,它会附加上一个URL。 But the thing is it works perfectly on my local machine. 但问题是,它在我的本地计算机上运行良好。 I don't know what's the problem. 我不知道出什么问题了。 EDIT: Basically it dont go to next page as it is redirected to "index" after clicking on Login This is my flask app code. 编辑:基本上,它不转到下一页,因为在单击“登录”后这被重定向到“索引”。这是我的烧瓶应用程序代码。

from flask import Flask, render_template, redirect, url_for, request
from flask_bootstrap import Bootstrap
from flask_wtf import FlaskForm 
from wtforms import StringField, PasswordField, BooleanField
from wtforms.validators import InputRequired, Email, Length
from flask_sqlalchemy  import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import LoginManager, UserMixin, login_user,  login_required, logout_user, current_user
from werkzeug import secure_filename
import sqlite3
import hashlib
import os
import models as dbHandler
import stringtolist as stol 

UPLOAD_FOLDER = 'static/images/project_img/'

adminapp = Flask(__name__)
application = adminapp
adminapp.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
adminapp.config['SECRET_KEY'] = 'Thisissupposedtobesecret!'
adminapp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
bootstrap = Bootstrap(adminapp)
db = SQLAlchemy(adminapp)
login_manager = LoginManager()
login_manager.init_app(adminapp)
login_manager.login_view = 'login'


class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(15), unique=True)
    email = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(80))

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

class LoginForm(FlaskForm):
    username = StringField('username', validators=[InputRequired(), Length(min=4, max=15)])
    password = PasswordField('password', validators=[InputRequired(), Length(min=8, max=80)])
    remember = BooleanField('remember me')

class RegisterForm(FlaskForm):
    email = StringField('email', validators=[InputRequired(), Email(message='Invalid email'), Length(max=50)])
    username = StringField('username', validators=[InputRequired(), Length(min=4, max=15)])
    password = PasswordField('password', validators=[InputRequired(), Length(min=8, max=80)])

@adminapp.route('/')
@login_required
def index1():
    return render_template('index1.html', name=current_user.username)

@adminapp.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()

    if form.validate_on_submit():
        user = User.query.filter_by(username=form.username.data).first()
        if user:
            if check_password_hash(user.password, form.password.data):
                login_user(user, remember=form.remember.data)
                return redirect(url_for('index1'))    #After Login successfully browser needs to redirect to index1 page which dashboard page.

        return '<h1>Invalid username or password</h1>'
        #return '<h1>' + form.username.data + ' ' + form.password.data + '</h1>'

    return render_template('login.html', form=form)


@adminapp.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('login'))

if __name__ == '__main__':
    adminapp.run(debug=True)

EDIT2: okay so here the minimal code for login user. EDIT2:好的,所以这里是登录用户的最小代码。 When I hit the Login button it appends the url from where it is redirecting. 当我点击“登录”按钮时,它将在重定向的位置附加网址。 Like this 像这样

domainname.com/login -> The URL in URL window before login domainname.com/login- >登录之前URL窗口中的URL

domainname.com/login -> When I hit login button it redirects to this URL again, domainname.com/login- >当我点击登录按钮时,它将再次重定向到该URL,

it should go to index1 like this 它应该像这样进入index1

domainname.com/index1 domainname.com/index1

This is my 这是我的

login.html login.html

 {% extends "bootstrap/base.html" %} {% import "bootstrap/wtf.html" as wtf %} {% block title %} Login {% endblock %} {% block styles %} {{super()}} <link rel="stylesheet" href="{{url_for('.static', filename='../static/css/signin.css')}}"> {% endblock %} {% block content %} <div class="container"> <form class="form-signin" method="POST" action="/login"> <h2 class="form-signin-heading">Please sign in</h2> {{ form.hidden_tag() }} {{ wtf.form_field(form.username) }} {{ wtf.form_field(form.password) }} {{ wtf.form_field(form.remember) }} <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button> <!-- <button class="btn btn-lg btn-primary btn-block" onclick="location.href='{{ url_for('signup') }}'" type="button">Sign Up</button> --> </form> </div> <!-- /container --> {% endblock %} 

Your code works for me when I go to your demo website. 当我访问您的演示网站时,您的代码对我有用。 I think the mistake you are making is understanding what url_for('index1') does. 我认为您所犯的错误是理解url_for('index1')作用。

You define a route like so: 您可以这样定义一条路线:

@adminapp.route('/')
@login_required
def index1():
    return render_template('index1.html', name=current_user.username)

In this case, the route is / . 在这种情况下,路由为/ The name of the method is index1 . 该方法的名称为index1 The route is not /index1 . 路由不是 /index1 So if you are trying to go to /index1 then it will give you a 404 error because that route does not exist. 因此,如果您尝试转到/index1则它将出现404错误,因为该路由不存在。

The url_for() takes a method name as input and returns a route as output. url_for()方法名称作为输入,并返回路由作为输出。 In this case, the name of the method is "index1", and the output is "/" because that is the actual HTTP route that you have defined. 在这种情况下,方法的名称为“ index1”,输出为“ /”,因为这是您定义的实际HTTP路由。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM