我正在尝试使用Django自定义管理命令测试模型中的有效URL。我有下面的模型,我需要测试是否有不活动的URL(HTTP404错误(。
class Association(models.Model):
name = models.CharField(max_length=25, blank=True, null=False)
publication_doi_url = models.TextField(blank=True)
有些URL具有多个重定向;因此,我编写了一个函数来获取最终的URL。它主要起作用,但很少起作用。例如,URLhttps://doi.org/10.1603/EC11207重定向将其显示为最终URLhttps://academic.oup.com/jee/article-lookup/doi/10.1603/EC11207.然而,这返回的HTTP响应代码是302。还有一个重定向。如何获取最终URL?我认为期刊允许基于IP的访问。该网站不需要用户名/密码。任何指针都会有所帮助。
def return_final_url(url_link):
response = requests.get(url_link)
finalurl = ''
if response.history:
for resp in response.history:
pass
finalurl = response.url
return finalurl
class Command(BaseCommand):
help = 'Prints inactive urls (HTTP 404 error)'
def handle(self, *args, **kwargs):
for item in Association.objects.all():
base_url = "https://doi.org/"
url = base_url + item.publication
finalurl = return_final_url(url)
print("finalurl", finalurl)
response = requests.get(finalurl)
try:
response.raise_for_status()
except requests.exceptions.HTTPError:
print("HTTPError")
首先可以查看本章https://docs.python-requests.org/en/master/user/quickstart/#redirection-和历史,在那里你可以找到重定向背后的逻辑。
r = requests.get('http://original.url/')
>>> r.url
'https://redirected.url/'
>>> r.history
[<Response [301]>]
请看以下段落:
如果请求超过配置的最大重定向次数,则会引发TooManyRedirects异常。
引发此错误的次数限制为30次。