如何在Flask中执行非用户登录?

时间:2015-07-26 21:02:54

标签: python session flask

我将Flask应用程序部署到生产环境中,并且我遇到了运行问题。几次使用该应用程序后,我开始收到内部500错误。根据追溯,看起来我遇到了会话问题:

[Sun Jul 26 19:20:53.476076 2015] [:error] [pid 11281:tid 140153993467648] ERROR:Routing:Request failed: Session is not logged in.
[Sun Jul 26 19:20:53.476356 2015] [:error] [pid 11281:tid 140153993467648]      ERROR:routes:Exception on /bank [POST]
[Sun Jul 26 19:20:53.476367 2015] [:error] [pid 11281:tid 140153993467648] Traceback (most recent call last):
[Sun Jul 26 19:20:53.476370 2015] [:error] [pid 11281:tid 140153993467648]   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app
[Sun Jul 26 19:20:53.476373 2015] [:error] [pid 11281:tid 140153993467648]     response = self.full_dispatch_request()
[Sun Jul 26 19:20:53.476376 2015] [:error] [pid 11281:tid 140153993467648]   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1478, in full_dispatch_request
[Sun Jul 26 19:20:53.476380 2015] [:error] [pid 11281:tid 140153993467648]     response = self.make_response(rv)
[Sun Jul 26 19:20:53.476382 2015] [:error] [pid 11281:tid 140153993467648]   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1566, in make_response
[Sun Jul 26 19:20:53.476385 2015] [:error] [pid 11281:tid 140153993467648]     raise ValueError('View function did not return a response')
[Sun Jul 26 19:20:53.476388 2015] [:error] [pid 11281:tid 140153993467648] ValueError: View function did not return a response

对于此应用程序,我使用会话从用户的输入中捕获数据。用户实际上并未登录该应用。因此,当用户第一次点击我的应用主页(/)时,功能"存储"被执行。我保留整个会话的该功能的结果,并使用它来存储用户的输入:store = session.get(' store')。如果用户再次点击主页(/)或5分钟结束,则会话结束。实际上,当用户点击主页时,再次执行功能存储。我错过了什么吗?我怎么能让Flask知道我的会话已经开始(登录)和结束(退出)?

from flask import Flask, render_template,redirect,request,url_for, flash,  session
from Index_generator import index_generator
from Yelp_api import request_yelp
from plaid import auth
from search_results import search,search1
from Options import return_data
from datetime import timedelta
import os
import time
from path import path_data
import logging
from logging_path import log_dir
logger = logging.getLogger("Routing")
logger.setLevel(logging.INFO)
foodie_log = log_dir()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %  (message)s')
foodie_log.setFormatter(formatter)
logger.addHandler(foodie_log)
app = Flask(__name__)
app.secret_key = 'mykeysoooooooooolong24char'
go = path_data()
@app.before_request
def make_session_permanent():
    session.permanent = True
    app.permanent_session_lifetime = timedelta(seconds=300)
@app.route('/')
def home():
    store = index_generator()
    session['store'] = store
    return render_template('home.html')
@app.route('/about')
def about():
  return render_template('about.html')
@app.route('/home_city',methods = ['POST'])
def home_city():
    try:
        CITY=request.form['city']
        store = session.get('store')
        request_yelp(DEFAULT_LOCATION=CITY,data_store=store)
        return render_template('bank.html')
    except Exception as e:
        logger.error(e)
        error = 'Sorry, no results. Is' + ' ' +CITY + ' '+ 'your hometown? If not, try again and if so, we have been made aware of the issue and is working to resolve it'
    return render_template('home.html',error=error)
@app.route('/traveling',methods = ['POST'])
def travel():
    store = session.get('store')
    answer=request.form['Travel']
    if answer == 'yes':
        #time.sleep(2)
        return render_template('destination.html')
    else:
        results_home = search(index=store)
    time.sleep(2)
    return return_data(results_home)
@app.route('/dest_city',methods = ['POST'])
def dest_city():
    store = session.get('store')
    try:
        DESTINATION=request.form['dest_city']
        request_yelp(DEFAULT_LOCATION=DESTINATION, data_store=store,sourcetype='dest_city')
        results_dest = search1(index=store)
        time.sleep(2)
        return return_data(results_dest)
 except urllib2.HTTPError:
    error = 'Sorry, no results. Is your destination city? If not, try again and if so, we have been made aware of the issue and is working to resolve it'
   return render_template('destination.html',error=error)

@app.route('/bank',methods = ['POST'])
def bank():
   try:
        store = session.get('store')
        print store
        Bank=request.form['Fin_Bank']
        Username=request.form['username']
        Password=request.form['password']
        Test =  auth(account=Bank,username=Username,password=Password,data_store=store)
        if Test == 402 or Test ==401:
            error = 'Invalid credentials'
            return render_template('bank.html',error=error)
        else:
            return render_template('travel.html')
    except:
        logger.error(e)
if __name__ == '__main__':
  app.run(debug=True)
  app.secret_key='shhhhhhhhhhhhhhhhhhhh'

1 个答案:

答案 0 :(得分:0)

错误消息指出URL /bank的视图函数未返回值,因此Flask不知道响应Web客户端的内容。

查看函数bank表明确实存在一个不返回值的代码路径。也就是说,如果函数遇到异常,它会尝试记录异常(logger.error(e)),但不会返回值。在Flask中,视图函数应始终返回响应。在您的情况下,您可以使用与home_city遇到错误时所做的相似的方法 - 返回带有错误消息的相同模板。

实际上'除了' bank()中的行应更改为except Exception as e:(就像在home_city中一样),因为如果您没有捕获该异常,则无法记录该异常。

一旦您知道bank函数遇到的实际异常是什么,您就可以相应地修复它。