2017-12-02 1 views
-1

플라스크에있는 Miguel sir 님의 책을 팔로우하고 있습니다. 사용자에게 전자 메일 확인을 보내고 로그인을 요청한 링크를 클릭했지만 로그인 한 후 request.args.get ('next') 변수가 비어있는 로그인 기능이 작동하지 않습니다. 확인 기능이 실행되지 않습니다. 나는 이것이 before_app_request로 인한 것 같아. 나는 술병에 아주 익숙해졌으며 이틀을 보냈습니다. Miguels 버전은 잘 작동하고, 내 것은 저주받은 것 같습니다. 다른 사람의 견해가 정말로 필요합니다. 읽어 주셔서 감사합니다.플라스크에 request.args.get ('next') 값이 사라졌습니다.

view.py

@auth.before_app_request 
def before_request(): 
    print("\tREQUEST ENDPOINT ::"+str(request.endpoint)) 
    print("\tREQUEST ARGS ::"+str(request.args.get('next'))) 
    if current_user.is_authenticated \ 
      and not current_user.confirmed \ 
      and request.endpoint \ 
      and request.endpoint[:5] != 'auth.' \ 
      and request.endpoint != 'static': 
     return redirect(url_for('auth.unconfirmed')) 



@auth.route('/register', methods=['GET','POST']) 
def register(): 
    form=RegForm() 

    if form.validate_on_submit(): 

     user=User(fname=form.fname.data, 
     lname=form.lname.data, 
     email=form.email.data, 
     organization_name=form.username.data, 
     password=form.password.data) 
     db.session.add(user) 
     #db.session.commit() 
     token=user.generate_confirmation_token() 

     send_email(user.email,'Confirm your Account','email/auth/confirm',user=user,token=token) 
     flash('A confirmation Email has been sent, Please check your inbox','success') 
     return redirect(url_for('auth.login')) 
     #except Exception as e: 
     # print("LINE 48 EMAIL: "+str(e)) 
     # db.session.rollback() 
    return render_template('Landing/entry.html',form=form) 



@auth.route('/confirm/<token>') 
@login_required 
def confirm(token): 
    if current_user.confirmed: 
     return redirect(url_for('viewhome.home')) 
    if current_user.confirm(token): 
     print('\tENTERED') 
     flash('Account confirmed ','success') 
    else: 
     flash('Invalid Link or Link has expired','Warning') 
    return redirect(url_for('viewhome.home')) 

@auth.route('/confirm') 
@login_required 
def resend_confirmation(): 
    token=current_user.generate_confirmation_token() 
    send_email(current_user.email,'Confirm your account','email/auth/confirm',user=current_user,token=token) 
    flash("A new confirmation email has been sent","success") 
    return redirect(url_for('viewhome.home')) 



@auth.route('/unconfirmed') 
def unconfirmed(): 
    if current_user.is_anonymous or current_user.confirmed: 
     return redirect(url_for('viewhome.home')) 
    return render_template('Landing/unconfirmed.html') 

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

    if form.validate_on_submit(): 
     user=User.query.filter_by(email=form.email.data).first() 
     if user is not None and user.verify_password(form.password.data): 
      login_user(user,form.remember_me.data) 
      print("REQUEST ARGS "+str(request.args.get('next'))) 
      return redirect(request.args.get('next') or url_for('viewhome.home')) 
     flash('Invalid username or password') 
    return render_template('Landing/login.html',form=form) 
    #if form.validate_on_submit(): 
     #user=User.query.filter_by(email=form.email.data).first() 
     #if user is not None and User.verify_password(form.password.data) 
@auth.route('/logout') 
@login_required 
def logout(): 
    logout_user() 
    flash("You have been logged out","success") 
    return redirect(url_for("viewhome.home")) 

users.py

class User(UserMixin,db.Model): 
    __tablename__ = 'users' 
    id=db.Column(db.Integer,primary_key=True) 
    fname=db.Column(db.String(50),nullable=False,unique=False) 
    lname=db.Column(db.String(50),nullable=False,unique=False) 
    organization_name=db.Column(db.String(50),nullable=False,unique=True,index=True) 
    password_hash=db.Column(db.String(128),nullable=False) 
    email=db.Column(db.String(30),unique=True,nullable=False,index=True) 
    confirmed=db.Column(db.Boolean,default=False) 
    rel=db.relationship('Domains',backref='users',lazy=True) 


    #def __init__(self,fname,lname,password,email,organization_name): 
    # self.fname=fname 
    # self.lname=lname 

    # self.password=password 
    # self.email=email 
    # self.organization_name=organization_name 

    @property 
    def password(self): 
     raise AttributeError("password is readonly") 

    @password.setter 
    def password(self,password): 
     self.password_hash = generate_password_hash(password,method='pbkdf2:sha512',salt_length=64) 


    def verify_password(self,password): 
     return check_password_hash(self.password_hash, password) 

    def generate_confirmation_token(self,expiration=3600): 
     s=Serializer(current_app.config['SECRET_KEY'],expiration) 
     return s.dumps({'confirm':self.id}) 

    def confirm(self,token): 
     print("\tCONFIRM TOKEN FUNCTION") 
     s=Serializer(current_app.config['SECRET_KEY']) 
     try: 
      data=s.loads(token) 
     except: 
      print("\tERROR HERE IN LINE 48") 
      return False 
     if data.get('confirm') != self.id: 
      print("DEBUG:: " + int(self.id)) 
      return False 
     print('\t\tLINE 54 REACHED') 
     self.confirmed=True 
     db.session.add(self) 
     db.session.commit() 
     return True 



    def __repr__(self): 
     return "<Users %r >" % self.organization_name 

class Domains(db.Model): 
    __tablename__='domains' 
    id=db.Column(db.Integer,primary_key=True) 
    user_id=db.Column(db.Integer,db.ForeignKey('users.id'),nullable=False) 
    domains=db.Column(db.String(25),unique=True,nullable=False) 

    def __init__(self,user_id,domain): 
     self.user_id=user_id 
     self.domains=domain 

    def __repr__(self): 
     return "<Domains %r >" % self.domains 


@login_manager.user_loader 
def load_user(user_id): 
    print("FROM USERs :: "+user_id) 
    return User.query.get(int(user_id)) 

랜딩/Login.html

{% extends "base.html" %} 
{% from "_macro.html" import render_field %} 

    {% block title %}Login- Progressus Bootstrap template{% endblock title%} 
{% block css %} 
<link rel="stylesheet" href="{{url_for('static',filename='css/cust.css') }}" media="screen"> 



{{super()}} 
{% endblock css %} 



{% block page_content %} 

<!--<header id="head" class="secondary"></header>--> 

    <!-- container --> 
    <div class="container"> 

     <ol class="breadcrumb"> 
      <li><a href="index.html">Home</a></li> 
      <li class="active">Registration</li> 
     </ol> 

     <div class="row"> 

      <!-- Article main content --> 
      <article class="col-xs-12 maincontent"> 
      <header class="page-header"> 

       </header> 

       <div class="col-md-6 col-md-offset-3 col-sm-8 col-sm-offset-2"> 

        <div class="panel panel-default"> 
         <div class="panel-body tabs"> 

          <ul class="tab-links clearfix"> 
           <li class="active"><h3 class="thin">Login</h3></a></li> 
          </ul> 

          <!--<p class="text-center text-muted">Lorem ipsum dolor sit amet, <a href="signin.html">Login</a> adipisicing elit. Quo nulla quibusdam cum doloremque incidunt nemo sunt a tenetur omnis odio. </p> 
          --> 
          <hr> 

          <div class="tab-content"> 

         <div id="register-form" class="tab"> 
          <form action="{{url_for('auth.login')}}" method="post" name="register"> 
           {{form.csrf_token}} 
           <div class="top-margin"> 
            <label> Email</label> 
             {{ render_field(form.email,class="form-control") }} 
            </div> 
            <div class="top-margin"> 
             <label>Password</label> 
             {{ render_field(form.password,class="form-control") }} 
          </div> 


          <hr> 

          <div class="row"> 
           <div class="col-lg-8"> 
           <label class="checkbox"> 

             {{ form.remember_me }} 
             Keep me logged in 
            </label> 
           </div> 
           <div class="col-lg-4 text-right"> 

            <!--<button class="btn btn-action" type="submit" >Register</button>--> 

             {{ form.submit_log(class="btn btn-action") }} 

           </div> 
          </div> 
         </form> 
        </div> 

        </div> 

        </div><!-- panel body--> 

       </div><!-- panel --> 

      </article> 
      <!-- /Article --> 

     </div> 
    </div> 
</div> <!-- /container --> 


{% endblock page_content %} 
{% block script %} 
{{super()}} 


{% endblock script%} 
+0

* 코드 사진 *에 연결하지 마십시오. 텍스트 *로 여기에 * 게시하십시오. –

+0

정말 죄송합니다. –

+0

'Landing/login.html'도 추가 할 수 있습니까? http://flask.pocoo.org/docs/0.12/quickstart/#the-request-object에 따르면 'request.args'에는 페이지의 URL 매개 변수 만 들어 있습니다. 아마도 당신은'login.html'의 형태로 적절히 설정하지 않았을 것입니까? –

답변

0

내가 다음에하지 않은 한 가지는 우리가 형태로 동작 변수를 설정할 필요가 없다는이며, 책은 무슨 일 간단한 양식 옵션을 사용하기 때문에 나는 그것을 몰랐

<form action="" method="Post"> 

Flask-login not redirecting to previous page

나는 이틀 뒤 낭비했다. 이것이이 문제를 놓치지 않는 사람에게 도움이되기를 바랍니다.

관련 문제