Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果访问被禁止,服务器端方法是否应该抛出异常?_Javascript_Jquery_Python_Ajax_Flask - Fatal编程技术网

Javascript 如果访问被禁止,服务器端方法是否应该抛出异常?

Javascript 如果访问被禁止,服务器端方法是否应该抛出异常?,javascript,jquery,python,ajax,flask,Javascript,Jquery,Python,Ajax,Flask,我的Javascript中有一个(jQuery)AJAX调用,它调用一个Python方法serverside来验证一个人是否有凭证,然后Python发回所需的信息 如果此人未登录或没有凭据,则会抛出一个错误,我用jQuery AJAX函数中的错误块捕获错误,告诉用户发生了错误 我的问题是,我无法显示什么类型的错误,只是发生了一个错误,服务器返回了一个500代码。我是否应该在用户没有凭据的情况下成功完成该方法,而不是返回“禁止”或“未登录”的消息,而不是返回所需的数据 基本上,我的问题是,当用户没

我的Javascript中有一个(jQuery)AJAX调用,它调用一个Python方法serverside来验证一个人是否有凭证,然后Python发回所需的信息

如果此人未登录或没有凭据,则会抛出一个错误,我用jQuery AJAX函数中的错误块捕获错误,告诉用户发生了错误

我的问题是,我无法显示什么类型的错误,只是发生了一个错误,服务器返回了一个500代码。我是否应该在用户没有凭据的情况下成功完成该方法,而不是返回“禁止”或“未登录”的消息,而不是返回所需的数据


基本上,我的问题是,当用户没有访问某些信息的权限时,我是否应该强制该方法引发异常?

是的,您应该引发异常。您不应该在服务器错误上返回成功响应,因为服务的使用者可能不知道您实际存储的是特定信息,无论它是否是错误,如果是,是什么类型的错误


此外,您可以将响应消息修改为“发送回”,这实际上表示授权失败。

A
401
错误用于身份验证,
403
用于授权。flasky的方法是使用自定义错误处理程序:

from flask import Flask, abort, Response, jsonify
app = Flask(__name__)


@app.errorhandler(403)
def not_authorized(e):
    response = jsonify({'code': 403,'message': 'Not damn authorized'})
    response.status_code = 403
    return response


@app.errorhandler(401)
def not_authenticated(e):
    response = jsonify({'code': 401,'message': 'Not damn authenticated'})
    response.status_code = 401
    return response

@app.route("/unauthorized")
def unauthorized():
    abort(403)


@app.route("/unauthenticated")
def unauthenticated():
    abort(401)


@app.route("/")
def index():
    return jsonify({"message":"hello world!"})

#Another way to do it perhaps, without using global error handler functions. 
@app.route("/test/<var>")
def test(var):
    if var == 1:
        response = jsonify({'code': 403,'message': 'Not damn authorized'})
        response.status_code = 403
        return response
    else:
        response = jsonify({'code': 403,'message': 'Some other message'})
        response.status_code = 403
        return response


if __name__ == "__main__":
    app.run(port=8080, debug=True)
从烧瓶导入烧瓶,中止,响应,jsonify
app=烧瓶(名称)
@app.errorhandler(403)
def未经授权(e):
response=jsonify({'code':403,'message':'Not damn authorized'})
response.status_code=403
返回响应
@app.errorhandler(401)
def未通过身份验证(e):
response=jsonify({'code':401,'message':'Not damn authenticated'})
response.status_code=401
返回响应
@应用程序路径(“/未授权”)
def unauthorized():
中止(403)
@应用程序路线(“/未经验证”)
def unauthenticated():
中止(401)
@附件路线(“/”)
def index():
返回jsonify({“message”:“helloworld!”})
#可能还有另一种方法,不使用全局错误处理函数。
@应用程序路径(“/test/”)
def测试(var):
如果var==1:
response=jsonify({'code':403,'message':'Not damn authorized'})
response.status_code=403
返回响应
其他:
response=jsonify({'code':403,'message':'someothermessage'})
response.status_code=403
返回响应
如果名称=“\uuuuu main\uuuuuuuu”:
运行(端口=8080,调试=True)

谢谢。我正在使用abort(403)方法[Flask],但我不确定如何发送带有403错误的额外JSON,以便客户端可以区分403(因为用户未登录)和403(因为用户没有正确的凭据)。我该怎么做?谢谢。这是否意味着对于同一个错误代码,我不能有两条消息?您可以这样做,而不是使用全局错误处理程序,返回与路由中上述对象类似的响应对象。更新了示例,尚未测试它,但类似的操作应该可以工作。