TypeError: __init__() takes 1 positional argument but 2 were given wile try to send email with flask mail
Closed this issue · 1 comments
Stink-Po commented
I developing a simpel website that use fastapi and i mount flask on fastapi i this in my app.init :
from flask import Flask
from flask_bootstrap import Bootstrap
from app.config import DevelopmentConfig
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from fastapi import FastAPI, Request
from fastapi.middleware.wsgi import WSGIMiddleware
from flask_migrate import Migrate
app = FastAPI()
flask_app = Flask(__name__)
app.mount("/", WSGIMiddleware(flask_app))
this is run file :
from app import app
import uvicorn
if __name__ == "__main__":
uvicorn.run(app)
i have route for sending email conformation when i test the app i face this error :
msg = Message("Confirm Email",sender=site_mail)
TypeError: __init__() takes 1 positional argument but 2 were given
i use flask mail dcoument and i dont know how can i fix the problem and why i get this error
this is my view file :
from app import flask_app
from flask import render_template, request, redirect, url_for, abort, flash
from itsdangerous import URLSafeTimedSerializer, TimestampSigner
from flask_mail import Mail, Message
mail = Mail()
mail.init_app(flask_app)
serializer = URLSafeTimedSerializer(flask_app.config["SECRET_KEY"])
timestamp = TimestampSigner(flask_app.config["SECRET_KEY"])
@flask_app.route("/confirm", methods=["POST", "GET"])
@login_required
def confirm():
image = get_photo("cafe")
user_email = current_user.email
message = "Please Confirm your Email address with the link blow"
token = serializer.dumps(user_email, salt="email-confirm")
unsubscribe_token = serializer.dumps(user_email, salt="unsubscribe")
link = url_for("confirm_email", token=token, _external=True)
unsubscribe = url_for("unsubscribe", token=unsubscribe_token, _external=True)
site_mail = flask_app.config["MAIL_USERNAME"]
print(site_mail)
msg = Message("Confirm Email", sender=site_mail, recipients=user_email)
msg.body = render_template("public/email/single-news.html",
user=current_user,
link=link,
image=image,
message=message,
unsubscribe=unsubscribe)
msg.html = render_template("public/email/single-news.html",
user=current_user,
link=link,
image=image,
message=message,
unsubscribe=unsubscribe)
mail.send(msg)
return redirect(url_for("index"))
and its config for flask app :
class Config:
DEBUG = True
TESTING = False
SESSION_COOKIE_SECURE = True
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:tool789@localhost/city"
SQLALCHEMY_TRACK_MODIFICATIONS = False
JSON_AS_ASCII = True
JSON_SORT_KEYS = True
IJSONFY_MIMETYPE = 'application/json'
SECRET_KEY = "b'\xf1L\xdb5D\x96M\xe5\xd1\x9f\x16+\xf4%A\x1e\xb9\xafm\xb8g\x1ct\x0e'"
MAIL_SERVER = "smtp.gmail.com"
MAIL_USERNAME = "myemail"
MAIL_PASSWORD = "password"
MAIL_PORT = 465
MAIL_DEBUG = False
MAIL_USE_SSL = True
MAIL_USE_TSL = False
this is full error i get :
INFO: 127.0.0.1:60517 - "GET /confirm HTTP/1.1" 500 Internal Server Error
ERROR: Exception in ASGI application
Traceback (most recent call last):
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 429, in run_asgi
result = await app( # type: ignore[func-returns-value]
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\uvicorn\middleware\proxy_headers.py", line 78, in __call__
return await self.app(scope, receive, send)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\fastapi\applications.py", line 276, in __call__
await super().__call__(scope, receive, send)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\starlette\applications.py", line 122, in __call__
await self.middleware_stack(scope, receive, send)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\starlette\middleware\errors.py", line 184, in __call__
raise exc
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\starlette\middleware\errors.py", line 162, in __call__
await self.app(scope, receive, _send)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\starlette\middleware\exceptions.py", line 79, in __call__
raise exc
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\starlette\middleware\exceptions.py", line 68, in __call__
await self.app(scope, receive, sender)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\fastapi\middleware\asyncexitstack.py", line 21, in __call__
raise e
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\fastapi\middleware\asyncexitstack.py", line 18, in __call__
await self.app(scope, receive, send)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\starlette\routing.py", line 718, in __call__
await route.handle(scope, receive, send)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\starlette\routing.py", line 443, in handle
await self.app(scope, receive, send)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\starlette\middleware\wsgi.py", line 71, in __call__
await responder(receive, send)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\starlette\middleware\wsgi.py", line 98, in __call__
await anyio.to_thread.run_sync(self.wsgi, environ, self.start_response)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\anyio\to_thread.py", line 31, in run_sync
return await get_asynclib().run_sync_in_worker_thread(
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\anyio\_backends\_asyncio.py", line 937, in run_sync_in_worker_thread
return await future
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\anyio\_backends\_asyncio.py", line 867, in run
result = context.run(func, *args)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\starlette\middleware\wsgi.py", line 132, in wsgi
for chunk in self.app(environ, start_response):
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\flask\app.py", line 2551, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\flask\app.py", line 2531, in wsgi_app
response = self.handle_exception(e)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\flask\app.py", line 2528, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\flask\app.py", line 1825, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\flask\app.py", line 1823, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\flask\app.py", line 1799, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\flask_login\utils.py", line 290, in decorated_view
return current_app.ensure_sync(func)(*args, **kwargs)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\app\views.py", line 260, in confirm
msg = Message("Confirm Email", sender=site_mail, recipients=user_email)
TypeError: __init__() takes 1 positional argument but 2 were given
if i just use flask not with fastapi i get this error :
127.0.0.1 - - [09/Apr/2023 18:21:09] "GET /confirm HTTP/1.1" 500 -
Traceback (most recent call last):
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\flask\app.py", line 2551, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\flask\app.py", line 2531, in wsgi_app
response = self.handle_exception(e)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\flask\app.py", line 2528, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\flask\app.py", line 1825, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\flask\app.py", line 1823, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\flask\app.py", line 1799, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\venv\lib\site-packages\flask_login\utils.py", line 290, in decorated_view
return current_app.ensure_sync(func)(*args, **kwargs)
File "C:\Users\Pourya\PycharmProjects\favoritecafe\app\views.py", line 258, in confirm
msg = Message("Confirm", sender=site_mail, recipients=user_email)
TypeError: __init__() takes 1 positional argument but 2 were given
davidism commented
I can't reproduce this issue. Creating a Message
instance as shown does not raise the given traceback.