#python #sql #postgresql #flask #adminer
#python #sql #postgresql #flask #администратор
Вопрос:
При попытке вставить имя пользователя и пароль в таблицу базы данных PostgreSQL я получаю следующую ошибку:
TypeError
TypeError: can't pickle _thread._local objects
Traceback (most recent call last)
File "c:usersalexappdatalocalprogramspythonpython37-32libsite-packagesflaskapp.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)
File "c:usersalexappdatalocalprogramspythonpython37-32libsite-packagesflaskapp.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "c:usersalexappdatalocalprogramspythonpython37-32libsite-packagesflaskapp.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "c:usersalexappdatalocalprogramspythonpython37-32libsite-packagesflask_compat.py", line 35, in reraise
raise value
File "c:usersalexappdatalocalprogramspythonpython37-32libsite-packagesflaskapp.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "c:usersalexappdatalocalprogramspythonpython37-32libsite-packagesflaskapp.py", line 1816, in full_dispatch_request
return self.finalize_request(rv)
File "c:usersalexappdatalocalprogramspythonpython37-32libsite-packagesflaskapp.py", line 1833, in finalize_request
response = self.process_response(response)
File "c:usersalexappdatalocalprogramspythonpython37-32libsite-packagesflaskapp.py", line 2114, in process_response
self.session_interface.save_session(self, ctx.session, response)
File "c:usersalexappdatalocalprogramspythonpython37-32libsite-packagesflask_sessionsessions.py", line 355, in save_session
total_seconds(app.permanent_session_lifetime))
File "c:usersalexappdatalocalprogramspythonpython37-32libsite-packageswerkzeugcontribcache.py", line 839, in set
pickle.dump(value, f, pickle.HIGHEST_PROTOCOL)
TypeError: can't pickle _thread._local objects
Я не уверен, что все это означает, но предполагаю, что это код, вызывающий проблему:
user_id = db.execute("INSERT INTO users (username, password) VALUES(:username, :password)", {"username": username, "password": password})
if not user_id:
return render_template("error.html", message="username already taken")
# stores users id
session["user_id"] = user_id
return redirect("/")
В моей базе данных есть три поля: имя пользователя (текст), пароль (текст) и идентификатор пользователя (целое число)
В моем файле python application.py использует следующий код для подключения моего приложения flask к базе данных.
# Set up database
engine = create_engine(os.getenv("DATABASE_URL"))
db = scoped_session(sessionmaker(bind=engine))
Комментарии:
1. Можете ли вы указать дополнительную информацию, например, какой пакет вы используете и как вы подключаетесь к базе данных.
2. Я добавил код в свой файл python, который подключается к базе данных
3. Из трассировки стека эта ошибка, по-видимому, связана с пакетом flask-session, а не с предоставленным вами кодом базы данных.
4. Что мне нужно сделать, чтобы исправить эту проблему?
5. Я добавил еще немного кода на Python
Ответ №1:
Я знаю, что это довольно поздно, но на всякий случай, если кто-то все еще сталкивается с этой проблемой, я думаю, вы забыли включить fetchone()
или fetchall()
. Таким образом, строка user_id должна читать user_id = db.execute("SELECT user_id FROM users WHERE username = :username", {"username": username}).fetchone()
или что-то в этом роде, предполагая, что у вас есть уникальный идентификатор пользователя для каждого пользователя в таблице.
Аналогично, я полагаю, вы захотите выполнить запуск db.commit()
после любой строки, которая пытается вставить строки в вашу таблицу.
И строка сеанса должна гласить session["user_id"] = user_id[0]
. Надеюсь, это поможет.