2017-08-30 108 views
0

最近我开始在我的应用程序中使用flask_session扩展,为安全起见,我还使用了flask_wtf.csrf扩展令牌。为什么我在应用程序中使用flask_session时会出现400错误?

现在,flask_session之前的应用程序完美工作,但是当我安装flask_session并配置它在我config.py参数,如果我试图登录或注册该应用程序让我400 Bad Request The CSRF session token is missing.,事实上,我包括我的所有请求中的csrf_token也包括ajax请求。

会话存储类型是sqlalchemy

SESSION_COOKIE_NAME = 'booking' 
SESSION_TYPE = 'sqlalchemy' 
PERMANENT_SESSION_LIFETIME = timedelta(seconds=120) 
SESSION_SQLALCHEMY_TABLE = 'sessions' 
SESSION_KEY_PREFIX = 'booking' 

我忘了提,我注意到如果我改变的类型的“文件系统”的错误没有显示出来。

这是flask_session documentation欲了解更多信息。

登录模板

<form class="login_form" role="form" action="{{url_for('client.login')}}" method="post"> 
    {{ login_form.hidden_tag() }} 

    {% if login_form.telephone.errors %} 
     {% for e in login_form.telephone.errors %} 
      <p class="text-error">{{e}}</p> 
     {% endfor %} 
    {% endif %} 
    {{login_form.telephone(class="_bit mat_input", id="form-phone-number", placeholder="You login")}} 

    {% if login_form.password.errors %} 
     {% for e in login_form.password.errors %} 
      <p class="text-error">{{e}}</p> 
     {% endfor %} 
    {% endif %} 
    {{login_form.password(class="_bit mat_input", id="form-password", placeholder="Your password")}} 

    <a href="" class="login_button"> 
     <button type="submit" class="mat_button _bib">Login</button> 
    </a> 

    <div class="_dis_b rfb"> 
     <div class="remember_row"> 
      <label for="remember" class="remember">remember me</label> 
      {{login_form.remember_me(id="remember", class="check")}} 
     </div> 
     <div class="forgot_row"> 
      <a href="javascript:void(0);" class="forgot">Forgot password?</a> 
     </div> 
    </div> 
</form> 

客户views.py

@client_route.route('/client/cat-<dir_code>/login', methods=['GET','POST']) 
def login(): 
    form_login = ClientLogin() 
    if request.method == 'GET' and request.args.get('next'): 
     session['next'] = request.args.get('next') 

    if form_login.validate_on_submit(): 
     user = Client.query.filter_by(
      tele = form_login.telephone.data 
     ).first() 

     if user: 
      if check_password_hash(user.password, form_login.password.data): 
       session['client_logged_in'] = user.name 
       session['client_family'] = user.family 
       session['client_image'] = user.image 
       session['client_phone'] = user.tele 
       if 'next' in session: 
        next = session.get('next') 
        session.pop('next') 
        return redirect(next+'?current_user='+session.get('client_logged_in')+'+'+session.get('client_family')) 
       else: 
        return redirect(url_for('client.lenta', dir_code=g.current_directory)+'?current_user='+session.get('client_logged_in')+'+'+session.get('client_family')) 
      else: 
       flash('Invalid credentials.', 'danger') 
       return redirect(url_for('client.login', dir_code=g.current_directory)) 
     else: 
      flash('Invalid credentials.', 'danger') 
      return redirect(url_for('client.login', dir_code=g.current_directory)) 
    return render_template('client/login.html', user=user, form_login=form_login) 
+0

用*表格*字段显示您的模板文件 – Nabin

+0

@Nabin,您可以在上面看到它,我更新了问题! – makmani

+0

任何建议家伙,为什么我不能使用** sqlalchemy **类型与csrf令牌保护?随着文件系统的应用程序工作正常,但我想将它们存储在数据库内! – makmani

回答

0

这是旧的文章,但对于同样的问题,下面的人行添加到您的设置。 cfg文件, 它为我工作:

SESSION_COOKIE_DOMAIN = "your_server_address" 
相关问题