Python 为什么在我的烧瓶应用程序中调用csrf_token()会抛出一个;can';t concat tuple to bytes“;错误?

Python 为什么在我的烧瓶应用程序中调用csrf_token()会抛出一个;can';t concat tuple to bytes“;错误?,python,flask,flask-wtforms,csrf-token,Python,Flask,Flask Wtforms,Csrf Token,我试图在fetch()调用中包含X-CSRFToken头,根据Flask WTF,从模板调用csrf_token()将在代码中返回令牌。但是,当我调用csrf\u token()时,我的应用程序会抛出一个错误 错误状态为:“无法将元组合并到字节。”回溯包括在下面。这是通过render\u template() 这里是init.py文件,其中在app和csrf中实例化了对象 from flask import Flask, render_template from flask_wtf.csrf i

我试图在
fetch()
调用中包含X-CSRFToken头,根据Flask WTF,从模板调用csrf_token()将在代码中返回令牌。但是,当我调用
csrf\u token()
时,我的应用程序会抛出一个错误

错误状态为:“无法将元组合并到字节。”回溯包括在下面。这是通过
render\u template()

这里是init.py文件,其中在
app
csrf
中实例化了对象

from flask import Flask, render_template
from flask_wtf.csrf import CSRFProtect, CSRFError
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

csrf = CSRFProtect()

def create_app():
    app = Flask(__name__, instance_relative_config=False)

    app.config.from_object('application.appsettings')

    db.init_app(app)

    csrf.init_app(app)

    @app.errorhandler(404)
    def page_not_found(e):
        return render_template('404err.htm', reason=e.description), 404

    @app.errorhandler(CSRFError)
    def handle_csrf_error(e):
        return render_template('400err.htm', reason=e.description), 400

    with app.app_context():
        from exercises.bp import bp as bp_exercise
        from main.bp import bp as bp_main
        from application.models import Exercise

        app.register_blueprint(bp_main, url_prefix="/")
        app.register_blueprint(bp_exercise, url_prefix="/exercises")

        return app
以下是回溯:

Traceback (most recent call last):
  File "C:\pyeip\venv\Lib\site-packages\flask_wtf\csrf.py", line 49, in generate_csrf
    token = s.dumps(session[field_name])
  File "C:\pyeip\venv\Lib\site-packages\itsdangerous\serializer.py", line 167, in dumps
    rv = self.make_signer(salt).sign(payload)
  File "C:\pyeip\venv\Lib\site-packages\itsdangerous\timed.py", line 42, in sign
    return value + sep + self.get_signature(value)
  File "C:\pyeip\venv\Lib\site-packages\itsdangerous\signer.py", line 143, in get_signature
    key = self.derive_key()
  File "C:\pyeip\venv\Lib\site-packages\itsdangerous\signer.py", line 130, in derive_key
    return self.digest_method(salt + b"signer" + self.secret_key).digest()
TypeError: can't concat tuple to bytes

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\pyeip\venv\Lib\site-packages\flask\app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\pyeip\venv\Lib\site-packages\flask\app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "C:\pyeip\venv\Lib\site-packages\flask\app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\pyeip\venv\Lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\pyeip\venv\Lib\site-packages\flask\app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\pyeip\venv\Lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\pyeip\venv\Lib\site-packages\flask\app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\pyeip\venv\Lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\pyeip\venv\Lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\pyeip\venv\Lib\site-packages\flask\app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\pyeip\main\bp.py", line 14, in apitester
    return render_template("apitester.htm")
  File "C:\pyeip\venv\Lib\site-packages\flask\templating.py", line 137, in render_template
    return _render(
  File "C:\pyeip\venv\Lib\site-packages\flask\templating.py", line 120, in _render
    rv = template.render(context)
  File "C:\pyeip\venv\Lib\site-packages\jinja2\environment.py", line 1090, in render
    self.environment.handle_exception()
  File "C:\pyeip\venv\Lib\site-packages\jinja2\environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
  File "C:\pyeip\venv\Lib\site-packages\jinja2\_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
  File "C:\pyeip\main\templates\apitester.htm", line 36, in top-level template code
    const token = {{ csrf_token() }};
  File "C:\pyeip\venv\Lib\site-packages\flask_wtf\csrf.py", line 52, in generate_csrf
    token = s.dumps(session[field_name])
  File "C:\pyeip\venv\Lib\site-packages\itsdangerous\serializer.py", line 167, in dumps
    rv = self.make_signer(salt).sign(payload)
  File "C:\pyeip\venv\Lib\site-packages\itsdangerous\timed.py", line 42, in sign
    return value + sep + self.get_signature(value)
  File "C:\pyeip\venv\Lib\site-packages\itsdangerous\signer.py", line 143, in get_signature
    key = self.derive_key()
  File "C:\pyeip\venv\Lib\site-packages\itsdangerous\signer.py", line 130, in derive_key
    return self.digest_method(salt + b"signer" + self.secret_key).digest()
TypeError: can't concat tuple to bytes

您的javascript在这里需要一个字符串。尝试:

const token = "{{ csrf_token() }}";

要证明这一点,请在浏览器中查看页面的源代码,查看当前的
const-token=
声明。

阅读回溯的最后一部分


谢谢你的关注;但是,错误依然存在。我认为您指出的只是客户端语法错误,而不是服务器错误。如果您将csrf令牌作为未定义的对象发送,它将使服务器上的验证功能崩溃。令牌中的任何破折号都会变成负号,等等。你现在可以显示你的
csrf\u令牌的源代码了吗?
?我已经更新了我的帖子来显示代码,但不确定你所说的“源代码…用于你的csrf\u令牌”是Flask WTF csrf保护的一部分,所以它不是我写的源代码。我的意思是,在你的浏览器中,开发者>查看源代码。这将准确显示页面上呈现的内容。锁定它。非常感谢。
Traceback (most recent call last):
  File "C:\pyeip\venv\Lib\site-packages\flask_wtf\csrf.py", line 49, in generate_csrf
    token = s.dumps(session[field_name])
  File "C:\pyeip\venv\Lib\site-packages\itsdangerous\serializer.py", line 167, in dumps
    rv = self.make_signer(salt).sign(payload)
  File "C:\pyeip\venv\Lib\site-packages\itsdangerous\timed.py", line 42, in sign
    return value + sep + self.get_signature(value)
  File "C:\pyeip\venv\Lib\site-packages\itsdangerous\signer.py", line 143, in get_signature
    key = self.derive_key()
  File "C:\pyeip\venv\Lib\site-packages\itsdangerous\signer.py", line 130, in derive_key
    return self.digest_method(salt + b"signer" + self.secret_key).digest()
TypeError: can't concat tuple to bytes

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\pyeip\venv\Lib\site-packages\flask\app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\pyeip\venv\Lib\site-packages\flask\app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "C:\pyeip\venv\Lib\site-packages\flask\app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\pyeip\venv\Lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\pyeip\venv\Lib\site-packages\flask\app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\pyeip\venv\Lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\pyeip\venv\Lib\site-packages\flask\app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\pyeip\venv\Lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\pyeip\venv\Lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\pyeip\venv\Lib\site-packages\flask\app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\pyeip\main\bp.py", line 14, in apitester
    return render_template("apitester.htm")
  File "C:\pyeip\venv\Lib\site-packages\flask\templating.py", line 137, in render_template
    return _render(
  File "C:\pyeip\venv\Lib\site-packages\flask\templating.py", line 120, in _render
    rv = template.render(context)
  File "C:\pyeip\venv\Lib\site-packages\jinja2\environment.py", line 1090, in render
    self.environment.handle_exception()
  File "C:\pyeip\venv\Lib\site-packages\jinja2\environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
  File "C:\pyeip\venv\Lib\site-packages\jinja2\_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
  File "C:\pyeip\main\templates\apitester.htm", line 36, in top-level template code
    const token = {{ csrf_token() }};
  File "C:\pyeip\venv\Lib\site-packages\flask_wtf\csrf.py", line 52, in generate_csrf
    token = s.dumps(session[field_name])
  File "C:\pyeip\venv\Lib\site-packages\itsdangerous\serializer.py", line 167, in dumps
    rv = self.make_signer(salt).sign(payload)
  File "C:\pyeip\venv\Lib\site-packages\itsdangerous\timed.py", line 42, in sign
    return value + sep + self.get_signature(value)
  File "C:\pyeip\venv\Lib\site-packages\itsdangerous\signer.py", line 143, in get_signature
    key = self.derive_key()
  File "C:\pyeip\venv\Lib\site-packages\itsdangerous\signer.py", line 130, in derive_key
    return self.digest_method(salt + b"signer" + self.secret_key).digest()
TypeError: can't concat tuple to bytes
const token = "{{ csrf_token() }}";
return self.digest_method(salt + b"signer" + >self.secret_key<).digest()