在烧瓶中使用会话时出现键盘错误
Keyerror when using sessions in flask
我一直在尝试制作一个 flask 应用程序,但即使我已经声明了会话变量,python 在访问该会话变量时也会引发 Keyerror。确切的回溯也在下面给出。如果您需要更多帮助,请在下方评论。我也时常收到一些关于会话溢出的警告
Traceback (most recent call last):
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 2450, in wsgi_app
response = self.handle_exception(e)
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\Ratan\Documents\GitHub\smart-recorder\main.py", line 58, in give_transcript
transcript = session['text_only_transcript']
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\werkzeug\local.py", line 377, in <lambda>
__getitem__ = lambda x, i: x._get_current_object()[i]
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\sessions.py", line 84, in __getitem__
return super(SecureCookieSession, self).__getitem__(key)
KeyError: 'text_only_transcript'
这是代码
import other_functions
from flask import Flask
from flask import render_template
from flask import request
from flask import redirect
from flask import url_for
from flask import session
## Imports ##
app = Flask(__name__)
app.secret_key = other_functions.get_secret_key()
## app config ##
# functions
@app.route('/home/')
@app.route('/')
def main_page():
return render_template('index.html')
@app.route('/from-yt-link', methods=['POST', 'GET'])
def youtube_link_page():
if request.method == 'GET':
return render_template('give_link_page.html')
elif request.method == 'POST':
video_url = request.form['url-enter']
video_id = other_functions.get_video_id(video_url)
session['video_id'] = video_id
return redirect(url_for('give_transcript'))
@app.route('/upload_page/')
@app.route('/upload/')
def upload():
return render_template('upload_page.html')
'''
The error originates here in the get_transcript() function
'''
@app.route('/get-transcript/', methods=['POST', 'GET'])
@app.route('/transcript/', methods=['POST', 'GET'])
def give_transcript():
if request.method == 'GET':
try:
transcript = other_functions.return_transcript(session["video_id"])
session['transcript'] = transcript
text_only_transcript = ''
for i in transcript:
text_only_transcript = text_only_transcript + i['text'] + ' '
session['text_only_transcript'] = text_only_transcript
return render_template('transcript.html', transcript=transcript, raw_text=text_only_transcript)
except KeyError:
return '<p>No YT Url Provided</p>'
elif request.method == 'POST':
search_query = request.form['search-query']
print(f"we obtained {search_query} form js with ajax")
transcript = session['text_only_transcript']
list_of_words = transcript.split(' ')
where_is_the_word_present = other_functions.a_small_engine_for_finding_words(
transcript, search_query)
print(f'the word is present in places {where_is_the_word_present}')
if where_is_the_word_present != []:
for i in where_is_the_word_present:
list_of_words.insert(i, '<mark>')
list_of_words.insert(i+2, '</mark>')
print(list_of_words)
else:
print('lol, word not found')
return '', 204
if __name__ == "__main__":
app.run(debug=True)
提前感谢您回答我的问题:)
编辑:解决了,查看下面接受的答案的评论
您已将 text_only_transcript
添加到 GET 方法中的会话。
你在 POST 方法中遇到了这个错误。
以下是一些可能的原因。
text_only_transcript
密钥未添加到会话中,因为您忘记通过 GET 方法调用 URL。所以你必须先用 GET 方法调用 URL,然后用 POST 方法。
- 可能会话被删除了。请验证您的会话是否拥有所有密钥。
我一直在尝试制作一个 flask 应用程序,但即使我已经声明了会话变量,python 在访问该会话变量时也会引发 Keyerror。确切的回溯也在下面给出。如果您需要更多帮助,请在下方评论。我也时常收到一些关于会话溢出的警告
Traceback (most recent call last):
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 2450, in wsgi_app
response = self.handle_exception(e)
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\Ratan\Documents\GitHub\smart-recorder\main.py", line 58, in give_transcript
transcript = session['text_only_transcript']
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\werkzeug\local.py", line 377, in <lambda>
__getitem__ = lambda x, i: x._get_current_object()[i]
File "C:\Users\Ratan\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\sessions.py", line 84, in __getitem__
return super(SecureCookieSession, self).__getitem__(key)
KeyError: 'text_only_transcript'
这是代码
import other_functions
from flask import Flask
from flask import render_template
from flask import request
from flask import redirect
from flask import url_for
from flask import session
## Imports ##
app = Flask(__name__)
app.secret_key = other_functions.get_secret_key()
## app config ##
# functions
@app.route('/home/')
@app.route('/')
def main_page():
return render_template('index.html')
@app.route('/from-yt-link', methods=['POST', 'GET'])
def youtube_link_page():
if request.method == 'GET':
return render_template('give_link_page.html')
elif request.method == 'POST':
video_url = request.form['url-enter']
video_id = other_functions.get_video_id(video_url)
session['video_id'] = video_id
return redirect(url_for('give_transcript'))
@app.route('/upload_page/')
@app.route('/upload/')
def upload():
return render_template('upload_page.html')
'''
The error originates here in the get_transcript() function
'''
@app.route('/get-transcript/', methods=['POST', 'GET'])
@app.route('/transcript/', methods=['POST', 'GET'])
def give_transcript():
if request.method == 'GET':
try:
transcript = other_functions.return_transcript(session["video_id"])
session['transcript'] = transcript
text_only_transcript = ''
for i in transcript:
text_only_transcript = text_only_transcript + i['text'] + ' '
session['text_only_transcript'] = text_only_transcript
return render_template('transcript.html', transcript=transcript, raw_text=text_only_transcript)
except KeyError:
return '<p>No YT Url Provided</p>'
elif request.method == 'POST':
search_query = request.form['search-query']
print(f"we obtained {search_query} form js with ajax")
transcript = session['text_only_transcript']
list_of_words = transcript.split(' ')
where_is_the_word_present = other_functions.a_small_engine_for_finding_words(
transcript, search_query)
print(f'the word is present in places {where_is_the_word_present}')
if where_is_the_word_present != []:
for i in where_is_the_word_present:
list_of_words.insert(i, '<mark>')
list_of_words.insert(i+2, '</mark>')
print(list_of_words)
else:
print('lol, word not found')
return '', 204
if __name__ == "__main__":
app.run(debug=True)
提前感谢您回答我的问题:)
编辑:解决了,查看下面接受的答案的评论
您已将 text_only_transcript
添加到 GET 方法中的会话。
你在 POST 方法中遇到了这个错误。
以下是一些可能的原因。
text_only_transcript
密钥未添加到会话中,因为您忘记通过 GET 方法调用 URL。所以你必须先用 GET 方法调用 URL,然后用 POST 方法。- 可能会话被删除了。请验证您的会话是否拥有所有密钥。