Python kombu.exceptions.EncodeError:<;烧瓶';src&x27&燃气轮机;JSON不可序列化

Python kombu.exceptions.EncodeError:<;烧瓶';src&x27&燃气轮机;JSON不可序列化,python,flask,celery,Python,Flask,Celery,我正在尝试使用芹菜和RabbitMQ异步发送电子邮件。这是我第一次用芹菜,所以我对一些错误不太熟悉。我意识到回溯来自一个名为kombu的包,我知道这是对芹菜的依赖。我只是无法调试这个 每当我尝试发送电子邮件时,就会发生回溯 回溯: [2017-05-14 12:35:08,093] ERROR in app: Exception on /home [POST] Traceback (most recent call last): File "/Users/kai/github-project

我正在尝试使用芹菜和RabbitMQ异步发送电子邮件。这是我第一次用芹菜,所以我对一些错误不太熟悉。我意识到回溯来自一个名为
kombu
的包,我知道这是对芹菜的依赖。我只是无法调试这个

每当我尝试发送电子邮件时,就会发生回溯

回溯:

[2017-05-14 12:35:08,093] ERROR in app: Exception on /home [POST]
Traceback (most recent call last):
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/serialization.py", line 50, in _reraise_errors
    yield
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/serialization.py", line 221, in dumps
    payload = encoder(data)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/utils/json.py", line 72, in dumps
    **dict(default_kwargs, **kwargs))
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 237, in dumps
    **kw).encode(obj)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/encoder.py", line 198, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/encoder.py", line 256, in iterencode
    return _iterencode(o, 0)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/utils/json.py", line 62, in default
    return super(JSONEncoder, self).default(o)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/encoder.py", line 179, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <Flask 'src'> is not JSON serializable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/kai/github-projects/Ticket-System/src/views.py", line 139, in home
    email_notification(cust_f_name, cust_email, tix_num)
  File "/Users/kai/github-projects/Ticket-System/src/notifications.py", line 71, in email_notification
    c_name=cust_name, tix=tix))
  File "/Users/kai/github-projects/Ticket-System/src/notifications.py", line 54, in send_email
    send_async_email.delay(app, msg)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/celery/app/task.py", line 412, in delay
    return self.apply_async(args, kwargs)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/celery/app/task.py", line 535, in apply_async
    **options
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/celery/app/base.py", line 737, in send_task
    amqp.send_task_message(P, name, message, **options)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/celery/app/amqp.py", line 558, in send_task_message
    **properties
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/messaging.py", line 169, in publish
    compression, headers)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/messaging.py", line 252, in _prepare
    body) = dumps(body, serializer=serializer)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/serialization.py", line 221, in dumps
    payload = encoder(data)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/serialization.py", line 54, in _reraise_errors
    reraise(wrapper, wrapper(exc), sys.exc_info()[2])
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/vine/five.py", line 175, in reraise
    raise value.with_traceback(tb)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/serialization.py", line 50, in _reraise_errors
    yield
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/serialization.py", line 221, in dumps
    payload = encoder(data)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/utils/json.py", line 72, in dumps
    **dict(default_kwargs, **kwargs))
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 237, in dumps
    **kw).encode(obj)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/encoder.py", line 198, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/encoder.py", line 256, in iterencode
    return _iterencode(o, 0)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/utils/json.py", line 62, in default
    return super(JSONEncoder, self).default(o)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/encoder.py", line 179, in default
    raise TypeError(repr(o) + " is not JSON serializable")
kombu.exceptions.EncodeError: <Flask 'src'> is not JSON serializable
要初始化电子邮件,我使用
views.py
文件中的
email\u通知功能

视图.py

import json

from flask import render_template
from flask_mail import Message

from src import app
from src.config import mail

from celery import Celery

with open('src/config_values.json') as f:
    config_f = json.load(f)

celery = Celery('tasks', broker='amqp://localhost//')

@celery.task()
def send_async_email(app, msg):

    with app.app_context():
        mail.send(msg)


def send_email(subject, sender, recipients, html_body):

    msg = Message(subject, sender=sender, recipients=recipients)
    msg.html = html_body
    send_async_email.delay(app, msg)


def email_notification(cust_name, cust_email, tix):

    send_email("[Support Ticket #{tix}]!".format(tix=tix),
               config_f['MAIL_USERNAME'],
               [cust_email],
               render_template("ticket_email.html",
                               c_name=cust_name, tix=tix))
from src.notifications import email_notification

@app.route('/')
def home():
    form = TicketForm()

    if form.validate_on_submit() and request.method == 'POST':

        # Handle form here ....

        email_notification(cust_f_name, cust_email, tix_num)
import json
import os
import sys

from flask_admin import Admin
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_socketio import SocketIO
from flask_sqlalchemy import SQLAlchemy

from src import app

# JSON config file
with open('src/config_values.json') as f:
    config_f = json.load(f)
def db_uri(system):
    """
    Check system type for database URI setup

    :param system: `sys.platform()` will be passed in
    :return: system type
    """
    # Mac
    if system == 'darwin':
        uri = 'sqlite:////' + os.getcwd() + '/ticket_system.sqlite'
    # Windows
    elif system == 'win32':
        uri = r'sqlite:///' + os.getcwd() + '\ticket_system.sqlite'
    # Linux
    elif system == 'linux':
        uri = 'sqlite:////' + os.getcwd() + '/ticket_system.sqlite'
    # Linux2
    elif system == 'linux2':
        uri = 'sqlite:////' + os.getcwd() + '/ticket_system.sqlite'
    # If system could not be determined
    else:
        raise FileNotFoundError('SQLite File was not able to be found')
    # Return system type
    return uri


# All configuration needed for Flask
app.secret_key = os.urandom(24)
app.config['SQLALCHEMY_DATABASE_URI'] = db_uri(sys.platform)
app.config['DATABASE_FILE'] = config_f['DATABASE_FILE']
app.config['SQLALCHEMY_ECHO'] = config_f['SQLALCHEMY_ECHO']
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = config_f['SQLALCHEMY_TRACK_MODIFICATIONS']
app.config['MAIL_SERVER'] = config_f['MAIL_SERVER']
app.config['MAIL_PORT'] = config_f['MAIL_PORT']
app.config['MAIL_USERNAME'] = config_f['MAIL_USERNAME']
app.config['MAIL_PASSWORD'] = config_f['MAIL_PASSWORD']
app.config['MAIL_USE_TLS'] = config_f['MAIL_USE_TLS']
app.config['MAIL_USE_SSL'] = config_f['MAIL_USE_SSL']
app.config['RECAPTCHA_PUBLIC_KEY'] = config_f['cap_pub']
app.config['RECAPTCHA_PRIVATE_KEY'] = config_f['cap_sec']

Bootstrap(app)
db = SQLAlchemy(app)
mail = Mail(app)
admin = Admin(app, name='Tickets', template_mode='bootstrap3')
socketio = SocketIO(app)
from flask import Flask

app = Flask(__name__)
from src.views import app
from src.notifications import email_notification
@app.route('/')
def home():
    form = TicketForm()

    if form.validate_on_submit() and request.method == 'POST':

        # Handle form here ....

        email_notification.delay(cust_f_name, cust_email, tix_num)
编辑:

[2017-05-14 12:35:08,093] ERROR in app: Exception on /home [POST]
Traceback (most recent call last):
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/serialization.py", line 50, in _reraise_errors
    yield
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/serialization.py", line 221, in dumps
    payload = encoder(data)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/utils/json.py", line 72, in dumps
    **dict(default_kwargs, **kwargs))
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 237, in dumps
    **kw).encode(obj)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/encoder.py", line 198, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/encoder.py", line 256, in iterencode
    return _iterencode(o, 0)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/utils/json.py", line 62, in default
    return super(JSONEncoder, self).default(o)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/encoder.py", line 179, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <Flask 'src'> is not JSON serializable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/kai/github-projects/Ticket-System/src/views.py", line 139, in home
    email_notification(cust_f_name, cust_email, tix_num)
  File "/Users/kai/github-projects/Ticket-System/src/notifications.py", line 71, in email_notification
    c_name=cust_name, tix=tix))
  File "/Users/kai/github-projects/Ticket-System/src/notifications.py", line 54, in send_email
    send_async_email.delay(app, msg)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/celery/app/task.py", line 412, in delay
    return self.apply_async(args, kwargs)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/celery/app/task.py", line 535, in apply_async
    **options
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/celery/app/base.py", line 737, in send_task
    amqp.send_task_message(P, name, message, **options)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/celery/app/amqp.py", line 558, in send_task_message
    **properties
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/messaging.py", line 169, in publish
    compression, headers)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/messaging.py", line 252, in _prepare
    body) = dumps(body, serializer=serializer)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/serialization.py", line 221, in dumps
    payload = encoder(data)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/serialization.py", line 54, in _reraise_errors
    reraise(wrapper, wrapper(exc), sys.exc_info()[2])
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/vine/five.py", line 175, in reraise
    raise value.with_traceback(tb)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/serialization.py", line 50, in _reraise_errors
    yield
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/serialization.py", line 221, in dumps
    payload = encoder(data)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/utils/json.py", line 72, in dumps
    **dict(default_kwargs, **kwargs))
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 237, in dumps
    **kw).encode(obj)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/encoder.py", line 198, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/encoder.py", line 256, in iterencode
    return _iterencode(o, 0)
  File "/Users/kai/github-projects/Ticket-System/venv/lib/python3.5/site-packages/kombu/utils/json.py", line 62, in default
    return super(JSONEncoder, self).default(o)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/encoder.py", line 179, in default
    raise TypeError(repr(o) + " is not JSON serializable")
kombu.exceptions.EncodeError: <Flask 'src'> is not JSON serializable
这是我的
config.py
文件,其中包含我所有的
app
配置,
\uuuuuuu init\uuuuuuuuuupy
文件是我“创建”app
的地方:

config.py

import json

from flask import render_template
from flask_mail import Message

from src import app
from src.config import mail

from celery import Celery

with open('src/config_values.json') as f:
    config_f = json.load(f)

celery = Celery('tasks', broker='amqp://localhost//')

@celery.task()
def send_async_email(app, msg):

    with app.app_context():
        mail.send(msg)


def send_email(subject, sender, recipients, html_body):

    msg = Message(subject, sender=sender, recipients=recipients)
    msg.html = html_body
    send_async_email.delay(app, msg)


def email_notification(cust_name, cust_email, tix):

    send_email("[Support Ticket #{tix}]!".format(tix=tix),
               config_f['MAIL_USERNAME'],
               [cust_email],
               render_template("ticket_email.html",
                               c_name=cust_name, tix=tix))
from src.notifications import email_notification

@app.route('/')
def home():
    form = TicketForm()

    if form.validate_on_submit() and request.method == 'POST':

        # Handle form here ....

        email_notification(cust_f_name, cust_email, tix_num)
import json
import os
import sys

from flask_admin import Admin
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_socketio import SocketIO
from flask_sqlalchemy import SQLAlchemy

from src import app

# JSON config file
with open('src/config_values.json') as f:
    config_f = json.load(f)
def db_uri(system):
    """
    Check system type for database URI setup

    :param system: `sys.platform()` will be passed in
    :return: system type
    """
    # Mac
    if system == 'darwin':
        uri = 'sqlite:////' + os.getcwd() + '/ticket_system.sqlite'
    # Windows
    elif system == 'win32':
        uri = r'sqlite:///' + os.getcwd() + '\ticket_system.sqlite'
    # Linux
    elif system == 'linux':
        uri = 'sqlite:////' + os.getcwd() + '/ticket_system.sqlite'
    # Linux2
    elif system == 'linux2':
        uri = 'sqlite:////' + os.getcwd() + '/ticket_system.sqlite'
    # If system could not be determined
    else:
        raise FileNotFoundError('SQLite File was not able to be found')
    # Return system type
    return uri


# All configuration needed for Flask
app.secret_key = os.urandom(24)
app.config['SQLALCHEMY_DATABASE_URI'] = db_uri(sys.platform)
app.config['DATABASE_FILE'] = config_f['DATABASE_FILE']
app.config['SQLALCHEMY_ECHO'] = config_f['SQLALCHEMY_ECHO']
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = config_f['SQLALCHEMY_TRACK_MODIFICATIONS']
app.config['MAIL_SERVER'] = config_f['MAIL_SERVER']
app.config['MAIL_PORT'] = config_f['MAIL_PORT']
app.config['MAIL_USERNAME'] = config_f['MAIL_USERNAME']
app.config['MAIL_PASSWORD'] = config_f['MAIL_PASSWORD']
app.config['MAIL_USE_TLS'] = config_f['MAIL_USE_TLS']
app.config['MAIL_USE_SSL'] = config_f['MAIL_USE_SSL']
app.config['RECAPTCHA_PUBLIC_KEY'] = config_f['cap_pub']
app.config['RECAPTCHA_PRIVATE_KEY'] = config_f['cap_sec']

Bootstrap(app)
db = SQLAlchemy(app)
mail = Mail(app)
admin = Admin(app, name='Tickets', template_mode='bootstrap3')
socketio = SocketIO(app)
from flask import Flask

app = Flask(__name__)
from src.views import app
from src.notifications import email_notification
@app.route('/')
def home():
    form = TicketForm()

    if form.validate_on_submit() and request.method == 'POST':

        # Handle form here ....

        email_notification.delay(cust_f_name, cust_email, tix_num)
\uuuu init\uuuuu.py

import json

from flask import render_template
from flask_mail import Message

from src import app
from src.config import mail

from celery import Celery

with open('src/config_values.json') as f:
    config_f = json.load(f)

celery = Celery('tasks', broker='amqp://localhost//')

@celery.task()
def send_async_email(app, msg):

    with app.app_context():
        mail.send(msg)


def send_email(subject, sender, recipients, html_body):

    msg = Message(subject, sender=sender, recipients=recipients)
    msg.html = html_body
    send_async_email.delay(app, msg)


def email_notification(cust_name, cust_email, tix):

    send_email("[Support Ticket #{tix}]!".format(tix=tix),
               config_f['MAIL_USERNAME'],
               [cust_email],
               render_template("ticket_email.html",
                               c_name=cust_name, tix=tix))
from src.notifications import email_notification

@app.route('/')
def home():
    form = TicketForm()

    if form.validate_on_submit() and request.method == 'POST':

        # Handle form here ....

        email_notification(cust_f_name, cust_email, tix_num)
import json
import os
import sys

from flask_admin import Admin
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_socketio import SocketIO
from flask_sqlalchemy import SQLAlchemy

from src import app

# JSON config file
with open('src/config_values.json') as f:
    config_f = json.load(f)
def db_uri(system):
    """
    Check system type for database URI setup

    :param system: `sys.platform()` will be passed in
    :return: system type
    """
    # Mac
    if system == 'darwin':
        uri = 'sqlite:////' + os.getcwd() + '/ticket_system.sqlite'
    # Windows
    elif system == 'win32':
        uri = r'sqlite:///' + os.getcwd() + '\ticket_system.sqlite'
    # Linux
    elif system == 'linux':
        uri = 'sqlite:////' + os.getcwd() + '/ticket_system.sqlite'
    # Linux2
    elif system == 'linux2':
        uri = 'sqlite:////' + os.getcwd() + '/ticket_system.sqlite'
    # If system could not be determined
    else:
        raise FileNotFoundError('SQLite File was not able to be found')
    # Return system type
    return uri


# All configuration needed for Flask
app.secret_key = os.urandom(24)
app.config['SQLALCHEMY_DATABASE_URI'] = db_uri(sys.platform)
app.config['DATABASE_FILE'] = config_f['DATABASE_FILE']
app.config['SQLALCHEMY_ECHO'] = config_f['SQLALCHEMY_ECHO']
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = config_f['SQLALCHEMY_TRACK_MODIFICATIONS']
app.config['MAIL_SERVER'] = config_f['MAIL_SERVER']
app.config['MAIL_PORT'] = config_f['MAIL_PORT']
app.config['MAIL_USERNAME'] = config_f['MAIL_USERNAME']
app.config['MAIL_PASSWORD'] = config_f['MAIL_PASSWORD']
app.config['MAIL_USE_TLS'] = config_f['MAIL_USE_TLS']
app.config['MAIL_USE_SSL'] = config_f['MAIL_USE_SSL']
app.config['RECAPTCHA_PUBLIC_KEY'] = config_f['cap_pub']
app.config['RECAPTCHA_PRIVATE_KEY'] = config_f['cap_sec']

Bootstrap(app)
db = SQLAlchemy(app)
mail = Mail(app)
admin = Admin(app, name='Tickets', template_mode='bootstrap3')
socketio = SocketIO(app)
from flask import Flask

app = Flask(__name__)
from src.views import app
from src.notifications import email_notification
@app.route('/')
def home():
    form = TicketForm()

    if form.validate_on_submit() and request.method == 'POST':

        # Handle form here ....

        email_notification.delay(cust_f_name, cust_email, tix_num)
这是我的整个文件夹结构

Ticket-System\
    src\
        __init__.py
        config.json
        config_values.json
        decorators.py
        forms.py
        models.py
        notifications.py
        views.py
    venv\
    api_check.py
    requirements.txt
    run.py

当您使用
芹菜
异步执行任务时,您将向代理发送一条消息。因此在引擎盖下有消息的序列化,这意味着传递给任务的参数也被序列化。由于
Celery v4.0
默认序列化程序是JSON

在任务
send\u async\u email
中,您传递了一个参数
app
,该参数可能不可JSON序列化,这就是您出错的原因

在我看来,如果可以的话,最好避免将对象实例传递给任务。所以在你的情况下,我会这样做:

通知。py

@celery.task()
def email_notification(cust_name, cust_email, tix):
    subject = "[Support Ticket #{tix}]!".format(tix=tix)
    sender = config_f['MAIL_USERNAME']
    recipients = [cust_email]
    html_body =  render_template("ticket_email.html", c_name=cust_name, tix=tix)

    msg = Message(subject, sender=sender, recipients=recipients)
    msg.html = html_body
    with app.app_context():
        mail.send(msg)
视图.py

import json

from flask import render_template
from flask_mail import Message

from src import app
from src.config import mail

from celery import Celery

with open('src/config_values.json') as f:
    config_f = json.load(f)

celery = Celery('tasks', broker='amqp://localhost//')

@celery.task()
def send_async_email(app, msg):

    with app.app_context():
        mail.send(msg)


def send_email(subject, sender, recipients, html_body):

    msg = Message(subject, sender=sender, recipients=recipients)
    msg.html = html_body
    send_async_email.delay(app, msg)


def email_notification(cust_name, cust_email, tix):

    send_email("[Support Ticket #{tix}]!".format(tix=tix),
               config_f['MAIL_USERNAME'],
               [cust_email],
               render_template("ticket_email.html",
                               c_name=cust_name, tix=tix))
from src.notifications import email_notification

@app.route('/')
def home():
    form = TicketForm()

    if form.validate_on_submit() and request.method == 'POST':

        # Handle form here ....

        email_notification(cust_f_name, cust_email, tix_num)
import json
import os
import sys

from flask_admin import Admin
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_socketio import SocketIO
from flask_sqlalchemy import SQLAlchemy

from src import app

# JSON config file
with open('src/config_values.json') as f:
    config_f = json.load(f)
def db_uri(system):
    """
    Check system type for database URI setup

    :param system: `sys.platform()` will be passed in
    :return: system type
    """
    # Mac
    if system == 'darwin':
        uri = 'sqlite:////' + os.getcwd() + '/ticket_system.sqlite'
    # Windows
    elif system == 'win32':
        uri = r'sqlite:///' + os.getcwd() + '\ticket_system.sqlite'
    # Linux
    elif system == 'linux':
        uri = 'sqlite:////' + os.getcwd() + '/ticket_system.sqlite'
    # Linux2
    elif system == 'linux2':
        uri = 'sqlite:////' + os.getcwd() + '/ticket_system.sqlite'
    # If system could not be determined
    else:
        raise FileNotFoundError('SQLite File was not able to be found')
    # Return system type
    return uri


# All configuration needed for Flask
app.secret_key = os.urandom(24)
app.config['SQLALCHEMY_DATABASE_URI'] = db_uri(sys.platform)
app.config['DATABASE_FILE'] = config_f['DATABASE_FILE']
app.config['SQLALCHEMY_ECHO'] = config_f['SQLALCHEMY_ECHO']
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = config_f['SQLALCHEMY_TRACK_MODIFICATIONS']
app.config['MAIL_SERVER'] = config_f['MAIL_SERVER']
app.config['MAIL_PORT'] = config_f['MAIL_PORT']
app.config['MAIL_USERNAME'] = config_f['MAIL_USERNAME']
app.config['MAIL_PASSWORD'] = config_f['MAIL_PASSWORD']
app.config['MAIL_USE_TLS'] = config_f['MAIL_USE_TLS']
app.config['MAIL_USE_SSL'] = config_f['MAIL_USE_SSL']
app.config['RECAPTCHA_PUBLIC_KEY'] = config_f['cap_pub']
app.config['RECAPTCHA_PRIVATE_KEY'] = config_f['cap_sec']

Bootstrap(app)
db = SQLAlchemy(app)
mail = Mail(app)
admin = Admin(app, name='Tickets', template_mode='bootstrap3')
socketio = SocketIO(app)
from flask import Flask

app = Flask(__name__)
from src.views import app
from src.notifications import email_notification
@app.route('/')
def home():
    form = TicketForm()

    if form.validate_on_submit() and request.method == 'POST':

        # Handle form here ....

        email_notification.delay(cust_f_name, cust_email, tix_num)

你能把你正在实例化你的
应用程序的文件的内容包括进来吗?@errata我已经对帖子做了编辑,src.views导入应用程序
的目的是什么。既然
views.py
是我创建所有路线的地方,为什么不使用Flask蓝图导入路线?您得到的错误(
TypeError:is not JSON serializable
)真的很奇怪,从我的头脑中我会说这是导入的问题。@peter谢谢您,当我删除
app
参数时,我会得到以下错误
kombu.exceptions.EncodeError:is not JSON serializable
。如何序列化
Flask Mail
消息对象?我不会序列化它。我会在任务中创建工作完美的message对象(请参见我的编辑),谢谢!但是由于某些原因,我的
芹菜任务在控制台中没有得到任何输出。我所说的输出是指任务已经完成。但它工作得很好。我在django应用程序中遇到了这个错误,因为我在参数中传递了
Model
类,芹菜无法序列化它。传递字符串反而解决了我的问题。谢谢