2016-08-27 4 views
2

나는 플라스크 응용 프로그램에서 작업 중이며 인증을 위해 플라스크 - 로그인을 사용 중입니다. 모든 것이 설정되어 실행 중입니다. 그러나 사용자가 로그인하여 로그인이 필요한 페이지를 방문하려고 시도하면 로그인 페이지로 리디렉션됩니다.파이썬 플라스크 로그인 login_required 리디렉션

콘솔을 볼 때 GET 로그인 페이지의 경우 200, 로그인의 POST의 경우 200, 로그인 페이지에서 홈 페이지의 302, 그리고 홈페이지의 302에서 다시 로그인 할 때까지 얻을 수 있습니다.

아래 코드를 참조하십시오. 여기

from flask import (Flask, render_template, g, flash, redirect, url_for, 
        request) 
from flask_bcrypt import check_password_hash 
from flask_login import (LoginManager, UserMixin, login_required, login_user, 
         logout_user, current_user) 

import models 
import forms 

application = Flask(__name__) 
application.secret_key = "xxx-xxx-xxx-xxx" 
login_manager = LoginManager() 
login_manager.init_app(application) 
login_manager.login_view = "login" 

@application.before_request 
def before_request(): 
    g.db = models.DATABASE 
    g.db.connect() 
    g.user = current_user 

@application.after_request 
def after_request(response): 
    g.db.close() 
    return response 

@login_manager.user_loader 
def load_user(email): 
    try: 
     return models.User.select().where(
           models.User.email == email).get() 
    except models.DoesNotExist: 
     return None 

@application.route("/register", methods=['GET', 'POST']) 
def register(): 
    form = forms.RegisterForm() 
    if form.validate_on_submit(): 
     flash("Yay! You registered!", "success") 
     models.User.create_user(
      email = form.email.data, 
      password = form.password.data 
     ) 
     return redirect(url_for('home')) 
    return render_template('register.html',form=form) 

@application.route("/login", methods=['GET', 'POST']) 
def login(): 
    form = forms.LoginForm() 
    if form.validate_on_submit(): 
     next = request.args.get('next') 
     try: 
      user = models.User.get(models.User.email == form.email.data) 
     except models.DoesNotExist: 
      flash("Your email or password doesn't match!", "error") 
     else: 
      if check_password_hash(user.password, form.password.data): 
       login_user(user, remember=True) 
       flash("Welcome back!", "success") 
       return redirect(next or url_for("home")) 
      else: 
       flash("Your email or password doesn't match!", "error") 
    return render_template("login.html", form=form) 

@application.route("/logout") 
@login_required 
def logout(): 
    logout_user() 
    flash("You've been logged out!", "success") 
    return redirect(url_for("home")) 

@application.route("/") 
@login_required 
def home(): 
    return render_template("home.html") 

if __name__ == "__main__": 
    models.initialize() 
    application.run(host='0.0.0.0') 

는 모델 :

import datetime 

from flask_login import UserMixin 
from flask_bcrypt import generate_password_hash, check_password_hash 
from peewee import * 

DATABASE = MySQLDatabase("fakedatabasename", host="fakehostname", user="fakeusername", password="fakepassword") 


class BaseModel(Model): 
    class Meta: 
     database = DATABASE 


class Preachers(BaseModel): 
    preacher_id = PrimaryKeyField() 
    preacher_first_name = CharField(max_length=27) 
    preacher_last_name = CharField(max_length=27) 
    preacher_email = CharField() 


class Sermons(BaseModel): 
    sermon_id = PrimaryKeyField() 
    sermon_title = CharField(max_length=27) 
    sermon_description = CharField(max_length=140) 
    sermon_date = DateTimeField(default=datetime.datetime.now()) 
    sermon_preacher_id = IntegerField() 
    sermon_video_uri = CharField(max_length=255) 


class User(UserMixin,BaseModel): 
    user_id = PrimaryKeyField() 
    email = CharField(index=True, unique=True) 
    password = CharField() 
    date_created = DateTimeField(default=datetime.datetime.now()) 

    @classmethod 
    def create_user(cls, email, password): 
     try: 
      cls.create(
       email = email, 
       password = generate_password_hash(password) 
      ) 
     except IntegrityError: 
      raise ValueError("User already exists") 


def initialize(): 
    DATABASE.connect() 
    DATABASE.create_tables([Preachers, Sermons, User], safe=True) 
    DATABASE.close() 
+2

로컬에서는 실행 중이지만 비밀 키는 공유하지 마십시오 – glls

+0

이제 비밀 키를 변경해야합니다. 이것은 거대한 보안 취약점입니다. –

+0

'User' 모델은 어떻게 생겼습니까? 'User.get_id'에서'self.email'을 돌려 주시겠습니까? – dirn

답변

1

그래서 Peewee와 플라스 크 - 로그인 작업을 할 때, 당신은 Peewee가 사용하는 사용자 모델에 대한 기본 기본 키를 대신 제공 할 필요가 있다고 밝혀 관습 하나. user_id = PrimaryKeyField()을 제거하고 테이블을 삭제 한 다음 고정 된 테이블을 다시 시작하십시오.

관련 문제