Python CS50财务查找在有效输入上返回200无

Python CS50财务查找在有效输入上返回200无,python,api,cs50,finance,Python,Api,Cs50,Finance,我一直在努力让我的烧瓶输入函数工作。我正在努力解决CS50 2020的财务问题。可以找到有关该问题的文档。下面的代码块是当我尝试使用索引函数运行时在控制台中得到的错误消息。我使用的api密钥是有效的,当为get请求插入整个url时,我得到了预期的信息。代码可能有点凌乱,我还没有清理和优化它,因为我无法让它工作 DEBUG: SELECT quantity FROM oStocks WHERE userID = 5 AND stock = 'AAPL' DEBUG: Starting new HT

我一直在努力让我的烧瓶输入函数工作。我正在努力解决CS50 2020的财务问题。可以找到有关该问题的文档。下面的代码块是当我尝试使用索引函数运行时在控制台中得到的错误消息。我使用的api密钥是有效的,当为get请求插入整个url时,我得到了预期的信息。代码可能有点凌乱,我还没有清理和优化它,因为我无法让它工作

DEBUG: SELECT quantity FROM oStocks WHERE userID = 5 AND stock = 'AAPL'
DEBUG: Starting new HTTPS connection (1): cloud.iexapis.com:443
DEBUG: https://cloud.iexapis.com:443 "GET /stable/stock/GOOGL-AF/quote?token=<MY_API_KEY> HTTP/1.1" 200 None
查找功能:

def lookup(symbol):
    """Look up quote for symbol."""

    # Contact API
    try:
        api_key = os.environ.get("API_KEY")
        response = requests.get(f"https://cloud.iexapis.com/stable/stock/{urllib.parse.quote_plus(symbol)}/quote?token={api_key}")
        response.raise_for_status()
    except requests.RequestException:
        return None

    # Parse response
    try:
        quote = response.json()
        return {
            "name": quote["companyName"],
            "price": float(quote["latestPrice"]),
            "symbol": quote["symbol"]
        }
    except (KeyError, TypeError, ValueError):
        return None
组合html:

{% extends "layout.html" %}

{% block title %}
    Portfolio
{% endblock %}

{% block main %}

<div>
    <table class="table table-hover">
      <thead>
        <tr class="font-weight-bold">
          <th scope="col">Symbol</th>
          <th scope="col">Name</th>
          <th scope="col">Shares</th>
          <th scope="col">Price</th>
          <th scope="col">Total</th>
        </tr>
      </thead>
      <tbody>
        {% for stock in stocks %}
          <tr>
            <th scope="row">{{ stock['symbol'] }}</th>
            <td>{{ stock['name'] }}</td>
            <td>{{ stock['shares'] }}</td>
            <td>{{ stock['price'] }}</td>
            <td>{{ stock['total'] }}</td>
          </tr>
        {% endfor %}

      </tbody>
    </table>

</div>
{% endblock %}
{%extends“layout.html”%}
{%block title%}
文件夹
{%endblock%}
{%block main%}
象征
名称
分享
价格
全部的
{库存百分比为%}
{{stock['symbol']}
{{stock['name']}
{{股票['shares']}
{{股票['price']}
{{stock['total']}
{%endfor%}
{%endblock%}

我已经找到了解决方案,现在找到了,我觉得在所有错误的地方找了这么久都很愚蠢。我的错误是迭代和调用传入flask模板的字典中的值。经过多次搜索,我终于意识到并解决了我的问题

我最初的方法是:

{% for stock in stocks %}
    <tr>
        <th scope="row">{{ stock['symbol'] }}</th>
        <td>{{ stock['name'] }}</td>
        <td>{{ stock['shares'] }}</td>
        <td>{{ stock['price'] }}</td>
        <td>{{ stock['total'] }}</td>
    </tr>
{% endfor %}

请注意,您刚刚透露了API密钥。您应该撤销/删除它并创建一个新的。我建议您永远不要在代码中放入API键,而是将它们作为环境变量或配置文件提供,这样它们就不会在任何地方提交/提交。我刚刚意识到您已经遵循了该最佳实践,但无论如何,调试消息包含API键。实际问题在哪里?您发布的调试行显示该请求一切正常<代码>查找似乎正在工作。也就是说,如果出现问题,
lookup
将返回调用
lookup
的代码无法处理的
None
。非常感谢您的回复,我刚刚从调试消息中删除了api密钥。奇怪的是,它报告HTTP代码200表示成功,但lookup函数也返回none,就好像请求未成功一样。当尝试引用
quote=lookup(symbol)
price=quote['price']
时,我得到一个错误
messageTypeError:“NoneType”对象对于尝试初始化和设置价格的行是不可订阅的。感谢您的帮助!你的评论帮助我走上了正确的道路。当你说“真正的问题在哪里?”这帮助我重新评估我的问题可能真正在哪里。我不知道我怎么没有真的认为这是我的模板。我吸取了教训。
{% for stock in stocks %}
    <tr>
        <th scope="row">{{ stock['symbol'] }}</th>
        <td>{{ stock['name'] }}</td>
        <td>{{ stock['shares'] }}</td>
        <td>{{ stock['price'] }}</td>
        <td>{{ stock['total'] }}</td>
    </tr>
{% endfor %}
{% for stock, value in stocks.items() %}
  <tr>
    <th scope="row">{{ value['symbol']['stock'] }}</th>
    <td>{{ value['name'] }}</td>
    <td>{{ value['shares'] }}</td>
    <td>{{ value['price'] }}</td>
    <td>{{ value['value'] }}</td>
  </tr>
{% endfor %}
def index():
    userid = session["user_id"]
    owned = db.execute("SELECT stock, quantity FROM oStocks WHERE userID = :userid", userid=userid)

    stockInfo = {}
    for item in owned:
        print(item)
        itemInfo = lookup(item['stock'])
        quantity = item['quantity']
        name = itemInfo['name']
        sharePrice = float(itemInfo['price'])
        value = quantity * sharePrice

        stockInfo[item['stock']] = {}
        stockInfo[item['stock']]['symbol'] = item
        stockInfo[item['stock']]['name'] = name
        stockInfo[item['stock']]['shares'] = quantity
        stockInfo[item['stock']]['price'] = sharePrice
        stockInfo[item['stock']]['value'] = value
    return render_template("portfolio.html", stocks=stockInfo)