python - 尝试进行 API 调用,但不断收到 TypeError
问题描述
我无法在 Django 中进行简单的 API 调用来搜索可用航班。
根据 API 文档,它接受'MM/DD/YYYY' 字符串格式date_from
的date_to
参数。
我正在尝试使用将输入日期格式从 HTML 表单('YYYY-MM-DD')转换为'MM/DD/YYYY' strptime
,strftime
但它似乎不起作用。
我收到“/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})
解决方案
当您第一次打开网页时,您正在发送一个 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 密钥存储在设置文件中。
推荐阅读
- vue.js - 将 Jitsi 视频会议嵌入到 Vuejs 应用程序中
- css - 字体可以防止禁用连字吗?
- apache-kafka-streams - KStream to KStream Join- 输出记录在窗口内没有匹配记录的情况下发布可配置的时间
- apache-kafka - Kafka fetch max bytes 无法按预期工作
- django - RecursionError:超出最大递归深度
- c++ - 函数内部的模板结构
- sql-server - 使用 bak 文件恢复数据库。备份集保存现有数据库以外的数据库的备份
- ruby - RGeo:如何使用 SRID 将投影坐标转换为纬度/经度
- macos - 如何覆盖 DriverKit OSData 内部缓冲区的一部分?
- websocket - 如何更好地解决空手道中的 websocket 握手失败