我在使用 Flask 进行 google 身份验证时遇到问题,我已经实现了 github oauth,看起来效果很好,但是使用 google auth,我无法将身份验证 ID、电子邮件等添加到 postgresql 数据库,并且无法查询数据
`sqlalchemy.exc.DataError:(psycopg2.errors.NumericValueOutOfRange)值“102734810329599019513”超出整数类型的范围 第 1 行:...th (user_id、provider、created_at、token) VALUES ('102734810... ^
[SQL:插入flask_dance_oauth(user_id,provider,created_at,token)值(%(user_id)s,%(provider)s,%(created_at)s,%(token)s)返回flask_dance_oauth.id] [参数: {'user_id': '102734810329599019513', 'provider': 'google', 'created_at': datetime.datetime(2023, 10, 24, 22, 33, 40, 232815), 'token': '{" access_token": "ya29.a0AfB_byDRRI73viV12s8KegSDmRuM2Y_AjdpFN7_x_-mNmBFj0HoO2Y_X8GS9MdheuAyLFpWC9tcIuOjNTCl_xCRb_tOqd4r_QLO_QcuwOOc68kh5IBz3Dzzhknsc ...(截断 1185 个字符)已完成)... ZHnFVTXZBv8nm0AvQrtIIkD2vyeNl49KagRJ94MIk7e5Kd7Afd2BiVnIn_1Km38CffgoZOXow8Uc3-s5vE_mcTnz3M0JVt1Wz0CoHnCyfKUVQNLLw”,“expires_at”:1698190418.52 01585}'}] (此错误的背景位于:https://sqlalche.me/e/20/9h9h)`
__tablename__ = 'Users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True)
email = db.Column(db.String(64), unique=True)
password = db.Column(db.LargeBinary)
oauth_github = db.Column(db.String(100), nullable=True)
oauth_google = db.Column(db.String(100), nullable=True)
api_token = db.Column(db.String(100))
api_token_ts = db.Column(db.Integer)
def __init__(self, **kwargs):
for property, value in kwargs.items():
# depending on whether value is an iterable or not, we must
# unpack it's value (when **kwargs is request.form, some values
# will be a 1-element list)
if hasattr(value, '__iter__') and not isinstance(value, str):
# the ,= unpack of a singleton fails PEP8 (travis flake8 test)
value = value[0]
if property == 'password':
value = hash_pass(value) # we need bytes here (not plain str)
setattr(self, property, value)
def __repr__(self):
return str(self.username)
@login_manager.user_loader
def user_loader(id):
return Users.query.filter_by(id=id).first()
@login_manager.request_loader
def request_loader(request):
username = request.form.get('username')
user = Users.query.filter_by(username=username).first()
return user if user else None
class OAuth(OAuthConsumerMixin, db.Model):
user_id = db.Column(db.Integer, db.ForeignKey("Users.id", ondelete="cascade"), nullable=False)
user = db.relationship(Users)
@oauth_authorized.connect_via(google_blueprint)
def google_logged_in(blueprint, token):
info = google.get('/oauth2/v1/userinfo')
if info.ok:
account_info = info.json()
print(account_info, "infoooo1")
user_id = account_info['id']
query = Users.query.filter_by(oauth_google=user_id)
try:
user = query.one()
login_user(user)
except NoResultFound:
oauth = OAuth(
provider=blueprint.name,
token=token,
user_id=user_id
)
user = Users()
user.username = 'google_' + account_info['given_name']
user.email = account_info['email']
user.oauth_google = user_id
db.session.add_all([user, oauth])
db.session.commit()
login_user(user)
我尝试将 id 更改为字符串,但这些都不起作用,似乎是与 postgresql 数据库交互时出现的错误,似乎无法找出错误帮助,非常感谢
正如错误消息所述,您作为
user_id
传递的值(即 102734810329599019513
)超出了 PostgreSQL 中整数字段的范围。 (PostgreSQL 数字字段范围)。
要解决此问题,只需将字段类型更改为
bigint
,在 SqlAlchemy 中对应于 BigInteger
更换即可
db.Integer
与
db.BigInteger
在用户表的
user_id
和id
中