首页 > 解决方案 > 尝试进行 API 调用,但不断收到 TypeError

问题描述

我无法在 Django 中进行简单的 API 调用来搜索可用航班。

根据 API 文档,它接受'MM/DD/YYYY' 字符串格式date_fromdate_to参数。

我正在尝试使用将输入日期格式从 HTML 表单('YYYY-MM-DD')转换为'MM/DD/YYYY' strptimestrftime但它似乎不起作用。

我收到“/strptime() 参数 1 处的 TypeError 必须是 str,而不是 None”

我究竟做错了什么?

主页.html

<!DOCTYPE html>
{% load static %}
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Home</title>
  </head>
  <body>
    {{ response }}
    <form method="post">
      {% csrf_token %}
      <h3>Search Form</h3>
      <p>
        <input type="text" name="Origin" id="inputOrigin" placeholder="From" required>
      </p>

      <p>
        <input type="text" name="Destination" id="inputDestination" placeholder="To" required>
      </p>

      <p>
        <input type="date" name="Departuredate" id="idDeparturedate" required>
      </p>

      <p>
        <input type="number" name="Adults" id="idAdults" required>
      </p>

      <input type="Submit" name="Submit" value="Submit">
    </form>
  </body>
</html>

视图.py

from django.shortcuts import render
import requests
import datetime as dt

# Create your views here.
def home(request):

    origin = request.POST.get('Origin')
    destination = request.POST.get('Destination')
    dep_date = request.POST.get('Departuredate')
    adults = request.POST.get('Adults')
    departure_date = dt.datetime.strptime(dep_date,'%Y-%m-%d').strftime('%d/%m/%Y')

    kwargs = {
                'apikey':'UkyTNeGok4791FIGnTeFMD6UrooUWXoI',
                'fly_from':origin,
                'fly_to':destination,
                'date_from':departure_date,
                'date_to':departure_date,
                'adults':adults
            }

    r = requests.get('https://tequila-api.kiwi.com/',params=kwargs).json()
    return render(request,'searchmyflight/home.html',{'response':r})

标签: pythondjangoapi

解决方案


当您第一次打开网页时,您正在发送一个 GET 请求。

在此视图中,即使当前方法是 GET,您也试图获取 POST 值。POST 值为无。所以它给了你这个错误。

您可以做的是request.method仅在方法为 POST 时使用 POST 值执行部分。见下文。

from django.shortcuts import render
import requests
from django.conf import settings
import datetime as dt

def home(request):
    r = None
    if request.method == 'POST':
        origin = request.POST.get('Origin')
        destination = request.POST.get('Destination')
        dep_date = request.POST.get('Departuredate')
        adults = request.POST.get('Adults')
        departure_date = dt.datetime.strptime(dep_date, '%Y-%m-%d').strftime('%d/%m/%Y')

        kwargs = {
            'apikey': settings.API_KEY,
            'fly_from': origin,
            'fly_to': destination,
            'date_from': departure_date,
            'date_to': departure_date,
            'adults': adults
        }

        r = requests.get('https://tequila-api.kiwi.com/', params=kwargs).json()
    return render(request, 'searchmyflight/home.html', {'response': r})

另外,作为旁注,您可能希望查看将 API 密钥存储在设置文件中。


推荐阅读