【问题标题】:Flask Json json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)Flask Json json.decoder.JSONDecodeError:期望值:第 1 行第 1 列(字符 0)
【发布时间】:2017-05-09 14:47:31
【问题描述】:

我已经彻底搜索了堆栈溢出和谷歌关于此错误的信息,但我找不到解决我的情况的解决方案。

我正在使用 marshmallow 序列化/反序列化我的 api 获取请求。

@post_user_blueprint.route('/api/v1/get_current_profile', methods=['GET'])
@login_required
def get_profile():
    query_user_by_order = User.query.join(Sample) \
        .join(Individual) \
        .join(Ordering) \
        .join(Family) \
        .join(Sequence) \
        .filter(User.id == Sample.fk_user_id) \
        .filter(Individual.id == Sample.fk_individual_id) \
        .filter(Sample.id == Sequence.fk_sample_id) \
        .filter(Individual.id == Ordering.fk_individual_id) \
        .filter(Family.id == Individual.fk_family_id) \
        .filter(User.email == current_user.email)\ ***********
        .all()

    result = profile_users_schema.dump(query_user_by_order)
    return jsonify({'user': result.data})


@login_required
@post_user_blueprint.route('/profile', methods=['GET', 'POST'])
def profile():
    response = requests.get('http://127.0.0.1:5000/api/v1/get_current_profile')
    response = response.text
    data = json.loads(response) $$$$$$$$$$$$$$$$$
    return render_template('profile.html', user_object = data)

***** :当我省略这一行时,它工作正常,我添加该行的唯一原因是显示登录他/她的个人资料的人,而不是显示每个人的个人资料。 $$$$$ :这是错误行。

完整追溯

File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 2000, in __call__
return self.wsgi_app(environ, start_response)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1991, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask_restful/__init__.py", line 271, in error_router
return original_handler(e)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1567, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1988, in wsgi_app
response = self.full_dispatch_request()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1641, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask_restful/__init__.py", line 271, in error_router
return original_handler(e)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1544, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1639, in full_dispatch_request
rv = self.dispatch_request()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1625, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/genomics/PycharmProjects/sample_accessioning/app/views/post_inputs.py", line 209, in profile
profile = response.json()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/models.py", line 826, in json
return complexjson.loads(self.text, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 319, in loads
return _default_decoder.decode(s)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 357, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

我不明白为什么会发生这种情况,在我将@login_required 放在 def get_profile 上方之后,****** 行没有直接显示其错误。但是当@login_required 不存在时,它正在抛出

AttributeError: 'AnonymousUser' object has no attribute 'email'

如果可能的话,我想知道一种获取当前用户电子邮件的方法,这样我就可以查询当前用户的个人资料而不是全部。另外,我真的很想知道为什么会发生以下错误。

 json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 

谢谢,

【问题讨论】:

    标签: python json flask


    【解决方案1】:

    这就是我认为正在发生的事情:

    您正在使用 @login_required 装饰器向您自己的服务器发出请求(我假设您使用的是 flask-login 或类似的)。这会创建一个不同的会话,其中您期望登录的“当前用户”实际上并未经过身份验证(您可能收到 401 响应,未经授权)。

    如果您希望在不丢失当前经过身份验证的用户的情况下获得来自不同端点的响应,您可以尝试以下操作:

    @login_required
    @post_user_blueprint.route('/profile', methods=['GET', 'POST'])
    def profile():
        response = get_profile().get_data(as_text=True)
        data = json.loads(response)
        return render_template('profile.html', user_object = data)
    

    【讨论】:

    • @AArias: 我得到 "TypeError: the JSON object must be str, not 'bytes'" ,因为 HTTP 响应返回字节而不是字符串,我尝试使用这个 stackoverflow 答案stackoverflow.com/questions/6862770/… 对其进行解码,但它仍然抛出同样的错误
    • 您的更新解决方案完美运行。干净整洁,谢谢
    【解决方案2】:

    好的,所以我找到了解决方案,我将全部功劳归功于 AArias,因为他提出了一种更简洁的方法来获取响应数据。所以由于HTTP返回的是字节而不是字符串,你需要将其显式解码为utf-8,而现有的很多synthax都不起作用..我不知道为什么。 下面的代码有效。

    response = get_profile().data
    data = json.loads(response.decode('utf-8'))
    

    如果有人尝试使用 .read() 或 .readall() 对其进行解码,它将无法正常工作,因为响应对象没有 read 或 readall 方法。最好的方法是最简单的方法,只需预先解码并使用 'loads' ,而不是 'load' 。 希望它可以帮助某人

    【讨论】:

    • 很高兴您找到了答案。实际上,有一种更好的方法可以将响应作为 unicode 字符串获取,而无需在响应上使用 decode 方法。只需使用get_data() 方法。 data 属性实际上最终会被弃用,如下所述:flask.pocoo.org/docs/0.12/api/#flask.Response.data 抱歉,我的错。您应该将.data 更改为.get_data(as_text=True),然后您应该能够避免使用.decode('utf-8')。我更新了我的答案以反映这一点,请让我知道它是否有效!
    • 为什么不接受我的回答,如果它在 9 个月后仍然有效,并且实际上解决了您的问题?不酷,因为我花时间帮助你。
    猜你喜欢
    • 2023-03-25
    • 2020-11-11
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    相关资源
    最近更新 更多