python sql语句异常捕获_如何从sqlalchemy@validate d捕获烧瓶中的异常

我有个有趣的问题。基本上我有一个Flask restful API应用程序,其中我有一个HTML页面,登录用户可以在该页面上创建API用户。这是由SQLAlchemy模型类Apiusers处理的,我在其中使用validates decorator来确保用户名和电子邮件地址遵守规则。所有的工作都很好,当用户输入无效信息时,它会抛出一个异常,但无论如何我都无法在烧瓶中捕捉到它。我想捕捉它并向用户闪回一条关于它的消息,但它却抛出了一个内置的.AssertionError当不在调试模式下时,它会给出500个内部服务器错误页。在

尝试使用不同类型的异常-ValueError,定义自定义异常类,最后用except:捕获所有错误,但异常最终总是无法处理。我也遇到了类似的问题:https://github.com/marshmallow-code/webargs/issues/122其中提到flask restful劫持了所有HTTP异常的处理,但这是从2016年开始的。在任何一种情况下,我都能够在使用validates之前在同一个位置捕捉到SQLAlchemy惟一约束异常,所以我不认为这是个问题。在models.py:

from sqlalchemy.orm import validates

class Apiusers(db.Model):

__tablename__ = 'apiusers'

id = db.Column(db.Integer, primary_key=True)

username = db.Column(db.String(64), index=True, unique=True)

email = db.Column(db.String(120), index=True)

password_hash = db.Column(db.String(128))

def __repr__(self):

return self.username

@validates('username')

def validate_username(self, key, username):

if not username:

raise AssertError('No username provided')

if Apiusers.query.filter(Apiusers.username == username).first():

raise AssertError('Username is already in use')

if len(username) < 5 or len(username) > 20:

raise AssertError('Username must be between 5 and 20 characters')

return username

@validates('email')

def validate_email(self, key, email):

if not email:

raise AssertError('No email provided')

if not re.match("[^@]+@[^@]+\.[^@]+", email):

raise AssertError('Provided email is not an email address')

return email

views.py:

@app.route('/register', methods=['GET', 'POST'])

def register():

if request.method == 'POST':

_user = request.form['username']

_email = request.form['emails']

record = Apiusers(username=_user, email=_email)

try:

db.session.add(record)

db.session.commit()

except AssertError as e:

flash('{}'.format(str(e)), 'danger')

return render_template("register.html")

return render_template("regresult.html")

以下是尝试添加空用户名时的stacktrace:

^{pr2}$

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值