【问题标题】:Keyerror when using sessions in flask在烧瓶中使用会话时出现键错误
【发布时间】:2020-12-11 10:42:26
【问题描述】:

我一直在尝试制作一个烧瓶应用程序,但即使我已经声明了会话变量,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)

提前感谢您回答我的问题:)

编辑:解决了,在下面接受的答案上检查 cmets

【问题讨论】:

  • 你确定你在调用post之前已经调用了get endpoint吗?
  • 错误。消息确实看起来对session['text_only_transcript]. Are you positive the session has such a field? You might try session.get('text_only_transcript', )` 不满意,因此如果缺少此字段,您的程序不会失败。

标签: python session flask


【解决方案1】:

您已在 GET 方法中将 text_only_transcript 添加到会话中。

你在 POST 方法中遇到了这个错误。

这是一些可能的原因。

  1. 会话中没有添加text_only_transcript 键,因为您忘记通过 GET 方法调用 URL。所以你必须先用 GET 方法调用 URL,然后用 POST 方法。
  2. 可能会话已被删除。请验证您的会话是否拥有所有密钥。

【讨论】:

  • 我确实尝试过这种方法,但这引发了另一个错误 werkzeug.routing.BuildError werkzeug.routing.BuildError: 无法使用值 ['raw_transcript'] 为端点 'give_transcript' 构建 url。您是否忘记指定值 ['raw_trascript']?
  • 我认为错误出在这个函数重定向(url_for('give_transcript'))中。它无法为此构建端点。你有没有为give_transcript函数添加任何参数?
  • 我终于找到了问题所在,因为我的会话数据太大(超过 4KB),我的浏览器会忽略这些数据,因此在访问该数据时出现了 keyerror。所以,我从客户端会话切换到服务器端会话,它现在就像一个魅力
猜你喜欢
  • 2021-01-01
  • 1970-01-01
  • 2015-04-09
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 2018-08-18
相关资源
最近更新 更多